├── .git-blame-ignore-revs ├── .gitignore ├── .gitlab-ci.yml ├── .kde-ci.yml ├── CMakeLists.txt ├── KF6SuConfig.cmake.in ├── LICENSES ├── CC0-1.0.txt ├── GPL-2.0-only.txt ├── LGPL-2.0-or-later.txt ├── LGPL-2.1-only.txt ├── LGPL-3.0-only.txt └── LicenseRef-KDE-Accepted-LGPL.txt ├── README.md ├── autotests ├── CMakeLists.txt ├── config-kdesutest.h.cmake ├── kdesutest.cpp ├── su └── sudo ├── docs └── Doxyfile.local ├── metainfo.yaml ├── po ├── ar │ └── kdesud6.po ├── ast │ └── kdesud6.po ├── az │ └── kdesud6.po ├── bg │ └── kdesud6.po ├── bs │ └── kdesud6.po ├── ca │ └── kdesud6.po ├── ca@valencia │ └── kdesud6.po ├── cs │ └── kdesud6.po ├── da │ └── kdesud6.po ├── de │ └── kdesud6.po ├── el │ └── kdesud6.po ├── en_GB │ └── kdesud6.po ├── eo │ └── kdesud6.po ├── es │ └── kdesud6.po ├── et │ └── kdesud6.po ├── eu │ └── kdesud6.po ├── fi │ └── kdesud6.po ├── fr │ └── kdesud6.po ├── gd │ └── kdesud6.po ├── gl │ └── kdesud6.po ├── he │ └── kdesud6.po ├── hi │ └── kdesud6.po ├── hu │ └── kdesud6.po ├── ia │ └── kdesud6.po ├── id │ └── kdesud6.po ├── is │ └── kdesud6.po ├── it │ └── kdesud6.po ├── ja │ └── kdesud6.po ├── ka │ └── kdesud6.po ├── ko │ └── kdesud6.po ├── lt │ └── kdesud6.po ├── lv │ └── kdesud6.po ├── ml │ └── kdesud6.po ├── nb │ └── kdesud6.po ├── nds │ └── kdesud6.po ├── nl │ └── kdesud6.po ├── nn │ └── kdesud6.po ├── pa │ └── kdesud6.po ├── pl │ └── kdesud6.po ├── pt │ └── kdesud6.po ├── pt_BR │ └── kdesud6.po ├── ro │ └── kdesud6.po ├── ru │ └── kdesud6.po ├── sa │ └── kdesud6.po ├── se │ └── kdesud6.po ├── sk │ └── kdesud6.po ├── sl │ └── kdesud6.po ├── sr │ └── kdesud6.po ├── sr@ijekavian │ └── kdesud6.po ├── sr@ijekavianlatin │ └── kdesud6.po ├── sr@latin │ └── kdesud6.po ├── sv │ └── kdesud6.po ├── ta │ └── kdesud6.po ├── tg │ └── kdesud6.po ├── tr │ └── kdesud6.po ├── uk │ └── kdesud6.po ├── vi │ └── kdesud6.po ├── zh_CN │ └── kdesud6.po └── zh_TW │ └── kdesud6.po └── src ├── CMakeLists.txt ├── README ├── client.cpp ├── client.h ├── config-kdesu.h.cmake ├── defaults.h ├── kcookie.cpp ├── kcookie_p.h ├── kdesu-index.qdoc ├── kdesu.qdoc ├── kdesu.qdocconf ├── kdesu_stub.c ├── kdesud ├── CMakeLists.txt ├── Messages.sh ├── autotests │ ├── CMakeLists.txt │ ├── config-kdesudtest.h.cmake │ └── kdesudtest.cpp ├── config-kdesud.h.cmake ├── handler.cpp ├── handler.h ├── kdesud.cpp ├── lexer.cpp ├── lexer.h ├── repo.cpp ├── repo.h ├── secure.cpp └── secure.h ├── ptyprocess.cpp ├── ptyprocess.h ├── ptyprocess_p.h ├── sshprocess.cpp ├── sshprocess.h ├── stubprocess.cpp ├── stubprocess.h ├── stubprocess_p.h ├── suprocess.cpp └── suprocess.h /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | #clang-format/tidy 2 | 691c88fc043d0869f45b2599dd50f0d24fe354bf 3 | 4f93a935a58cd83eb16da36b2230509d98a272b3 4 | 92eab58db2b4bb520387ef6e7610753f798d314c 5 | c70f6b8ddb8a5136f1686179c3a0cbf7c8fa1134 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore the following files 2 | *~ 3 | *.[oa] 4 | *.diff 5 | *.kate-swp 6 | *.kdev4 7 | .kdev_include_paths 8 | *.kdevelop.pcs 9 | *.moc 10 | *.moc.cpp 11 | *.orig 12 | *.user 13 | .*.swp 14 | .swp.* 15 | Doxyfile 16 | Makefile 17 | avail 18 | random_seed 19 | /build*/ 20 | CMakeLists.txt.user* 21 | *.unc-backup* 22 | .cmake/ 23 | /.clang-format 24 | /compile_commands.json 25 | .clangd 26 | .idea 27 | /cmake-build* 28 | .cache 29 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 Volker Krause 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | include: 5 | - project: sysadmin/ci-utilities 6 | file: 7 | - /gitlab-templates/linux-qt6.yml 8 | - /gitlab-templates/linux-qt6-next.yml 9 | - /gitlab-templates/alpine-qt6.yml 10 | - /gitlab-templates/freebsd-qt6.yml 11 | - /gitlab-templates/xml-lint.yml 12 | - /gitlab-templates/yaml-lint.yml 13 | -------------------------------------------------------------------------------- /.kde-ci.yml: -------------------------------------------------------------------------------- 1 | Dependencies: 2 | - 'on': ['Linux', 'FreeBSD'] 3 | 'require': 4 | 'frameworks/extra-cmake-modules': '@same' 5 | 'frameworks/kconfig': '@same' 6 | 'frameworks/kcoreaddons': '@same' 7 | 'frameworks/kpty': '@same' 8 | 9 | Options: 10 | test-before-installing: True 11 | require-passing-tests-on: ['Linux', 'FreeBSD'] 12 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.16) 2 | 3 | set(KF_VERSION "6.15.0") # handled by release scripts 4 | set(KF_DEP_VERSION "6.14.0") # handled by release scripts 5 | project(KDESu VERSION ${KF_VERSION}) 6 | 7 | include(FeatureSummary) 8 | find_package(ECM 6.14.0 NO_MODULE) 9 | set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules") 10 | feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) 11 | set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) 12 | 13 | include(KDEInstallDirs) 14 | include(KDECMakeSettings) 15 | include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) 16 | 17 | include(ECMGenerateExportHeader) 18 | include(ECMSetupVersion) 19 | include(ECMGenerateHeaders) 20 | include(ECMMarkNonGuiExecutable) 21 | include(ECMQtDeclareLoggingCategory) 22 | include(ECMGenerateQDoc) 23 | include(ECMDeprecationSettings) 24 | 25 | set(REQUIRED_QT_VERSION 6.7.0) 26 | find_package(Qt6Core ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE) 27 | 28 | find_package(KF6Config ${KF_DEP_VERSION} REQUIRED) 29 | find_package(KF6CoreAddons ${KF_DEP_VERSION} REQUIRED) 30 | find_package(KF6I18n ${KF_DEP_VERSION} REQUIRED) 31 | find_package(KF6Pty ${KF_DEP_VERSION} REQUIRED) 32 | 33 | #optional features 34 | find_package(X11) 35 | set(HAVE_X11 ${X11_FOUND}) 36 | 37 | set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].") 38 | 39 | option(KDESU_USE_SUDO_DEFAULT "Set On to use sudo instead of su [default=Off]" Off) 40 | option(KDESU_USE_DOAS_DEFAULT "Set On to use doas instead of su and sudo [default=Off]" Off) 41 | if(KDESU_USE_SUDO_DEFAULT AND KDESU_USE_DOAS_DEFAULT) 42 | message(FATAL_ERROR "Choose between sudo(1) or doas(1)") 43 | elseif(KDESU_USE_SUDO_DEFAULT) 44 | message("Using sudo as default") 45 | elseif(KDESU_USE_DOAS_DEFAULT) 46 | message("Using doas as default") 47 | else() 48 | message("Using su as default (set KDESU_USE_SUDO_DEFAULT=On to use sudo)") 49 | endif() 50 | 51 | set(kdesu_version_header "${CMAKE_CURRENT_BINARY_DIR}/src/kdesu_version.h") 52 | ecm_setup_version(PROJECT VARIABLE_PREFIX KDESU 53 | VERSION_HEADER "${kdesu_version_header}" 54 | PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF6SuConfigVersion.cmake" 55 | SOVERSION 6) 56 | ecm_set_disabled_deprecation_versions( 57 | QT 6.9.0 58 | KF 6.13.0 59 | ) 60 | 61 | ki18n_install(po) 62 | add_subdirectory(src) 63 | 64 | # create a Config.cmake and a ConfigVersion.cmake file and install them 65 | set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF6Su") 66 | 67 | include(CMakePackageConfigHelpers) 68 | 69 | configure_package_config_file( 70 | "${CMAKE_CURRENT_SOURCE_DIR}/KF6SuConfig.cmake.in" 71 | "${CMAKE_CURRENT_BINARY_DIR}/KF6SuConfig.cmake" 72 | INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} 73 | ) 74 | 75 | install(FILES 76 | "${CMAKE_CURRENT_BINARY_DIR}/KF6SuConfig.cmake" 77 | "${CMAKE_CURRENT_BINARY_DIR}/KF6SuConfigVersion.cmake" 78 | DESTINATION "${CMAKECONFIG_INSTALL_DIR}" 79 | COMPONENT Devel 80 | ) 81 | 82 | install(EXPORT KF6SuTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF6SuTargets.cmake NAMESPACE KF6:: ) 83 | 84 | install(FILES 85 | ${kdesu_version_header} 86 | DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KDESu COMPONENT Devel 87 | ) 88 | 89 | if(BUILD_TESTING) 90 | add_subdirectory(autotests) 91 | endif() 92 | 93 | include(ECMFeatureSummary) 94 | ecm_feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) 95 | -------------------------------------------------------------------------------- /KF6SuConfig.cmake.in: -------------------------------------------------------------------------------- 1 | @PACKAGE_INIT@ 2 | 3 | include(CMakeFindDependencyMacro) 4 | find_dependency(KF6Pty "@KF_DEP_VERSION@") 5 | 6 | include("${CMAKE_CURRENT_LIST_DIR}/KF6SuTargets.cmake") 7 | -------------------------------------------------------------------------------- /LICENSES/CC0-1.0.txt: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /LICENSES/LGPL-3.0-only.txt: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | 3 | Version 3, 29 June 2007 4 | 5 | Copyright (C) 2007 Free Software Foundation, Inc. 6 | 7 | Everyone is permitted to copy and distribute verbatim copies of this license 8 | document, but changing it is not allowed. 9 | 10 | This version of the GNU Lesser General Public License incorporates the terms 11 | and conditions of version 3 of the GNU General Public License, supplemented 12 | by the additional permissions listed below. 13 | 14 | 0. Additional Definitions. 15 | 16 | 17 | 18 | As used herein, "this License" refers to version 3 of the GNU Lesser General 19 | Public License, and the "GNU GPL" refers to version 3 of the GNU General Public 20 | License. 21 | 22 | 23 | 24 | "The Library" refers to a covered work governed by this License, other than 25 | an Application or a Combined Work as defined below. 26 | 27 | 28 | 29 | An "Application" is any work that makes use of an interface provided by the 30 | Library, but which is not otherwise based on the Library. Defining a subclass 31 | of a class defined by the Library is deemed a mode of using an interface provided 32 | by the Library. 33 | 34 | 35 | 36 | A "Combined Work" is a work produced by combining or linking an Application 37 | with the Library. The particular version of the Library with which the Combined 38 | Work was made is also called the "Linked Version". 39 | 40 | 41 | 42 | The "Minimal Corresponding Source" for a Combined Work means the Corresponding 43 | Source for the Combined Work, excluding any source code for portions of the 44 | Combined Work that, considered in isolation, are based on the Application, 45 | and not on the Linked Version. 46 | 47 | 48 | 49 | The "Corresponding Application Code" for a Combined Work means the object 50 | code and/or source code for the Application, including any data and utility 51 | programs needed for reproducing the Combined Work from the Application, but 52 | excluding the System Libraries of the Combined Work. 53 | 54 | 1. Exception to Section 3 of the GNU GPL. 55 | 56 | You may convey a covered work under sections 3 and 4 of this License without 57 | being bound by section 3 of the GNU GPL. 58 | 59 | 2. Conveying Modified Versions. 60 | 61 | If you modify a copy of the Library, and, in your modifications, a facility 62 | refers to a function or data to be supplied by an Application that uses the 63 | facility (other than as an argument passed when the facility is invoked), 64 | then you may convey a copy of the modified version: 65 | 66 | a) under this License, provided that you make a good faith effort to ensure 67 | that, in the event an Application does not supply the function or data, the 68 | facility still operates, and performs whatever part of its purpose remains 69 | meaningful, or 70 | 71 | b) under the GNU GPL, with none of the additional permissions of this License 72 | applicable to that copy. 73 | 74 | 3. Object Code Incorporating Material from Library Header Files. 75 | 76 | The object code form of an Application may incorporate material from a header 77 | file that is part of the Library. You may convey such object code under terms 78 | of your choice, provided that, if the incorporated material is not limited 79 | to numerical parameters, data structure layouts and accessors, or small macros, 80 | inline functions and templates (ten or fewer lines in length), you do both 81 | of the following: 82 | 83 | a) Give prominent notice with each copy of the object code that the Library 84 | is used in it and that the Library and its use are covered by this License. 85 | 86 | b) Accompany the object code with a copy of the GNU GPL and this license document. 87 | 88 | 4. Combined Works. 89 | 90 | You may convey a Combined Work under terms of your choice that, taken together, 91 | effectively do not restrict modification of the portions of the Library contained 92 | in the Combined Work and reverse engineering for debugging such modifications, 93 | if you also do each of the following: 94 | 95 | a) Give prominent notice with each copy of the Combined Work that the Library 96 | is used in it and that the Library and its use are covered by this License. 97 | 98 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 99 | document. 100 | 101 | c) For a Combined Work that displays copyright notices during execution, include 102 | the copyright notice for the Library among these notices, as well as a reference 103 | directing the user to the copies of the GNU GPL and this license document. 104 | 105 | d) Do one of the following: 106 | 107 | 0) Convey the Minimal Corresponding Source under the terms of this License, 108 | and the Corresponding Application Code in a form suitable for, and under terms 109 | that permit, the user to recombine or relink the Application with a modified 110 | version of the Linked Version to produce a modified Combined Work, in the 111 | manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 112 | 113 | 1) Use a suitable shared library mechanism for linking with the Library. A 114 | suitable mechanism is one that (a) uses at run time a copy of the Library 115 | already present on the user's computer system, and (b) will operate properly 116 | with a modified version of the Library that is interface-compatible with the 117 | Linked Version. 118 | 119 | e) Provide Installation Information, but only if you would otherwise be required 120 | to provide such information under section 6 of the GNU GPL, and only to the 121 | extent that such information is necessary to install and execute a modified 122 | version of the Combined Work produced by recombining or relinking the Application 123 | with a modified version of the Linked Version. (If you use option 4d0, the 124 | Installation Information must accompany the Minimal Corresponding Source and 125 | Corresponding Application Code. If you use option 4d1, you must provide the 126 | Installation Information in the manner specified by section 6 of the GNU GPL 127 | for conveying Corresponding Source.) 128 | 129 | 5. Combined Libraries. 130 | 131 | You may place library facilities that are a work based on the Library side 132 | by side in a single library together with other library facilities that are 133 | not Applications and are not covered by this License, and convey such a combined 134 | library under terms of your choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based on the 137 | Library, uncombined with any other library facilities, conveyed under the 138 | terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it is a work 141 | based on the Library, and explaining where to find the accompanying uncombined 142 | form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions of the 147 | GNU Lesser General Public License from time to time. Such new versions will 148 | be similar in spirit to the present version, but may differ in detail to address 149 | new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the Library as you 152 | received it specifies that a certain numbered version of the GNU Lesser General 153 | Public License "or any later version" applies to it, you have the option of 154 | following the terms and conditions either of that published version or of 155 | any later version published by the Free Software Foundation. If the Library 156 | as you received it does not specify a version number of the GNU Lesser General 157 | Public License, you may choose any version of the GNU Lesser General Public 158 | License ever published by the Free Software Foundation. 159 | 160 | If the Library as you received it specifies that a proxy can decide whether 161 | future versions of the GNU Lesser General Public License shall apply, that 162 | proxy's public statement of acceptance of any version is permanent authorization 163 | for you to choose that version for the Library. 164 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KDESU 2 | 3 | User interface for running shell commands with root privileges 4 | 5 | ## Introduction 6 | 7 | KDESU provides functionality for building GUI front ends for 8 | (password asking) console mode programs. For example, kdesu and 9 | kdessh use it to interface with su and ssh respectively. 10 | 11 | -------------------------------------------------------------------------------- /autotests/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | include(ECMAddTests) 2 | find_package(Qt6Test REQUIRED) 3 | configure_file(config-kdesutest.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kdesutest.h) 4 | ecm_add_test(kdesutest.cpp TEST_NAME kdesutest LINK_LIBRARIES Qt6::Test KF6::Su KF6::CoreAddons KF6::ConfigCore) 5 | 6 | if(KDESU_USE_SUDO_DEFAULT) 7 | target_compile_definitions(kdesutest PRIVATE -DKDESU_USE_SUDO_DEFAULT="true") 8 | elseif(KDESU_USE_DOAS_DEFAULT) 9 | target_compile_definitions(kdesutest PRIVATE -DKDESU_USE_DOAS_DEFAULT="true") 10 | endif() 11 | -------------------------------------------------------------------------------- /autotests/config-kdesutest.h.cmake: -------------------------------------------------------------------------------- 1 | #define CMAKE_HOME_DIRECTORY "${CMAKE_HOME_DIRECTORY}" 2 | #define CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" 3 | -------------------------------------------------------------------------------- /autotests/kdesutest.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | SPDX-FileCopyrightText: 2019 Jonathan Riddell 3 | 4 | SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 5 | */ 6 | 7 | #define MYPASSWORD "ilovekde" 8 | #define ROOTPASSWORD "ilovekde" 9 | #include "config-kdesutest.h" 10 | 11 | #include 12 | #include 13 | #include 14 | 15 | #include 16 | #include 17 | #include 18 | 19 | #include "suprocess.h" 20 | 21 | namespace KDESu 22 | { 23 | class KdeSuTest : public QObject 24 | { 25 | Q_OBJECT 26 | private Q_SLOTS: 27 | void initTestCase() 28 | { 29 | QStandardPaths::setTestModeEnabled(true); 30 | } 31 | 32 | void editConfig(QString command, QString commandPath) 33 | { 34 | KSharedConfig::Ptr config = KSharedConfig::openConfig(); 35 | KConfigGroup group(config, QStringLiteral("super-user-command")); 36 | group.writeEntry("super-user-command", command); 37 | QString kdesuStubPath = QString::fromLocal8Bit(CMAKE_RUNTIME_OUTPUT_DIRECTORY) + QString::fromLocal8Bit("/kdesu_stub"); 38 | group.writeEntry("kdesu_stub_path", kdesuStubPath); 39 | group.writeEntry("command", commandPath); 40 | } 41 | 42 | void sudoGoodPassword() 43 | { 44 | editConfig(QString::fromLocal8Bit("sudo"), QString::fromLocal8Bit(CMAKE_HOME_DIRECTORY) + QString::fromLocal8Bit("/autotests/sudo")); 45 | 46 | KDESu::SuProcess suProcess("root", "ls"); 47 | QString suapp = suProcess.superUserCommand(); 48 | QVERIFY(suapp == QLatin1String("sudo")); 49 | int result = suProcess.exec(MYPASSWORD, 0); 50 | QVERIFY(result == 0); 51 | } 52 | 53 | void sudoBadPassword() 54 | { 55 | editConfig(QString::fromLocal8Bit("sudo"), QString::fromLocal8Bit(CMAKE_HOME_DIRECTORY) + QString::fromLocal8Bit("/autotests/sudo")); 56 | 57 | KDESu::SuProcess suProcess("root", "ls"); 58 | QString suapp = suProcess.superUserCommand(); 59 | QVERIFY(suapp == QLatin1String("sudo")); 60 | int result2 = suProcess.exec("broken", 0); 61 | QVERIFY(result2 == KDESu::SuProcess::SuIncorrectPassword); 62 | } 63 | 64 | void doasBadPassword() 65 | { 66 | editConfig(QString::fromLocal8Bit("doas"), QString::fromLocal8Bit(CMAKE_HOME_DIRECTORY) + QString::fromLocal8Bit("/autotests/sudo")); 67 | 68 | KDESu::SuProcess suProcess("root", "ls"); 69 | QString suapp = suProcess.superUserCommand(); 70 | QVERIFY(suapp == QLatin1String("doas")); 71 | int result2 = suProcess.exec("broken", 0); 72 | QVERIFY(result2 == KDESu::SuProcess::SuIncorrectPassword); 73 | } 74 | 75 | void doasGoodPassword() 76 | { 77 | editConfig(QString::fromLocal8Bit("doas"), QString::fromLocal8Bit(CMAKE_HOME_DIRECTORY) + QString::fromLocal8Bit("/autotests/sudo")); 78 | 79 | KDESu::SuProcess suProcess("root", "ls"); 80 | QString suapp = suProcess.superUserCommand(); 81 | QVERIFY(suapp == QLatin1String("doas")); 82 | int result = suProcess.exec(MYPASSWORD, 0); 83 | QVERIFY(result == 0); 84 | } 85 | 86 | void suGoodPassword() 87 | { 88 | editConfig(QString::fromLocal8Bit("su"), QString::fromLocal8Bit(CMAKE_HOME_DIRECTORY) + QString::fromLocal8Bit("/autotests/su")); 89 | 90 | KDESu::SuProcess suProcess("root", "ls"); 91 | QString suapp = suProcess.superUserCommand(); 92 | QVERIFY(suapp == QLatin1String("su")); 93 | int result2 = suProcess.exec(ROOTPASSWORD, 0); 94 | QVERIFY(result2 == 0); 95 | } 96 | 97 | void suBadPassword() 98 | { 99 | editConfig(QString::fromLocal8Bit("su"), QString::fromLocal8Bit(CMAKE_HOME_DIRECTORY) + QString::fromLocal8Bit("/autotests/su")); 100 | 101 | KDESu::SuProcess suProcess("root", "ls"); 102 | QString suapp = suProcess.superUserCommand(); 103 | QVERIFY(suapp == QLatin1String("su")); 104 | int result2 = suProcess.exec("broken", 0); 105 | QVERIFY(result2 == KDESu::SuProcess::SuIncorrectPassword); 106 | } 107 | }; 108 | } 109 | 110 | #include 111 | QTEST_MAIN(KDESu::KdeSuTest) 112 | -------------------------------------------------------------------------------- /autotests/su: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import sys 4 | import getpass 5 | from enum import Enum, unique 6 | from subprocess import call 7 | 8 | 9 | @unique 10 | class State(Enum): 11 | NEW = 1 12 | SECOND = 2 13 | THIRD = 3 14 | GOOD = 4 15 | FAIL = 5 16 | 17 | class Su: 18 | 19 | def __init__(self): 20 | self.state = State.NEW 21 | self.read = None 22 | self.password = 'ilovekde' 23 | 24 | def process(self): 25 | if self.state == State.NEW: 26 | self.read = getpass.getpass('Password: ') 27 | if self.read == self.password: 28 | self.state = State.GOOD 29 | call([sys.argv[3]]) 30 | exit(0) 31 | else: 32 | self.state = State.FAIL 33 | print("su: Authentication failure") 34 | exit(1) 35 | 36 | su = Su() 37 | while True: 38 | su.process() 39 | -------------------------------------------------------------------------------- /autotests/sudo: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import sys 4 | import getpass 5 | from enum import Enum, unique 6 | from subprocess import call 7 | 8 | 9 | @unique 10 | class State(Enum): 11 | NEW = 1 12 | SECOND = 2 13 | THIRD = 3 14 | GOOD = 4 15 | FAIL = 5 16 | 17 | class Sudo: 18 | 19 | def __init__(self): 20 | self.state = State.NEW 21 | self.read = None 22 | self.password = 'ilovekde' 23 | 24 | def process(self): 25 | if self.state == State.NEW: 26 | self.read = getpass.getpass('[sudo] password for jr: ') 27 | if self.read == self.password: 28 | self.state = State.GOOD 29 | call([sys.argv[3]]) 30 | exit(0) 31 | else: 32 | self.state = State.SECOND 33 | elif self.state == State.SECOND: 34 | print('Sorry, try again.') 35 | self.read = getpass.getpass('[sudo] password for jr: ') 36 | if self.read == self.password: 37 | self.state = State.GOOD 38 | exit(0) 39 | else: 40 | self.state = State.THIRD 41 | elif self.state == State.THIRD: 42 | print('Sorry, try again.') 43 | self.read = getpass.getpass('[sudo] password for jr: ') 44 | if self.read == self.password: 45 | self.state = State.GOOD 46 | exit(0) 47 | else: 48 | print("sudo: 3 incorrect password attempts") 49 | self.state = State.FAIL 50 | exit(1) 51 | 52 | sudo = Sudo() 53 | while True: 54 | sudo.process() 55 | -------------------------------------------------------------------------------- /docs/Doxyfile.local: -------------------------------------------------------------------------------- 1 | ### KApiDox Project-specific Overrides File 2 | 3 | # define so that deprecated API is not skipped 4 | PREDEFINED += \ 5 | "KDESU_ENABLE_DEPRECATED_SINCE(x, y)=1" \ 6 | "KDESU_BUILD_DEPRECATED_SINCE(x, y)=1" \ 7 | "KDESU_DEPRECATED_VERSION(x, y, t)=" 8 | -------------------------------------------------------------------------------- /metainfo.yaml: -------------------------------------------------------------------------------- 1 | maintainer: 2 | description: Integration with su for elevated privileges 3 | tier: 3 4 | type: integration 5 | platforms: 6 | - name: Linux 7 | - name: FreeBSD 8 | portingAid: false 9 | deprecated: false 10 | release: true 11 | libraries: 12 | - cmake: "KF6::Su" 13 | cmakename: KF6Su 14 | 15 | public_lib: true 16 | group: Frameworks 17 | subgroup: Tier 3 18 | -------------------------------------------------------------------------------- /po/ar/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # Safa Alfulaij , 2014, 2018. 4 | msgid "" 5 | msgstr "" 6 | "Project-Id-Version: \n" 7 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 8 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 9 | "PO-Revision-Date: 2018-06-08 23:53+0300\n" 10 | "Last-Translator: Safa Alfulaij \n" 11 | "Language-Team: Arabic \n" 12 | "Language: ar\n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " 17 | "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" 18 | 19 | #, kde-format 20 | msgctxt "NAME OF TRANSLATORS" 21 | msgid "Your names" 22 | msgstr "صفا الفليج" 23 | 24 | #, kde-format 25 | msgctxt "EMAIL OF TRANSLATORS" 26 | msgid "Your emails" 27 | msgstr "safa1996alfulaij@gmail.com" 28 | 29 | #: kdesud.cpp:349 30 | #, kde-format 31 | msgid "KDE su daemon" 32 | msgstr "عفريت كِيدِي لِ‍ su" 33 | 34 | #: kdesud.cpp:351 35 | #, kde-format 36 | msgid "Daemon used by kdesu" 37 | msgstr "عفريت تستخدمه kdesu" 38 | 39 | #: kdesud.cpp:353 40 | #, kde-format 41 | msgid "Copyright (c) 1999,2000 Geert Jansen" 42 | msgstr "‏© 1999،2000 Geert Jansen" 43 | 44 | #: kdesud.cpp:354 45 | #, kde-format 46 | msgid "Geert Jansen" 47 | msgstr "Geert Jansen" 48 | 49 | #: kdesud.cpp:354 50 | #, kde-format 51 | msgid "Author" 52 | msgstr "المؤلف" 53 | -------------------------------------------------------------------------------- /po/ast/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2023 This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # SPDX-FileCopyrightText: 2022, 2023 Enol P. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2023-10-31 20:02+0100\n" 11 | "Last-Translator: Enol P. \n" 12 | "Language-Team: \n" 13 | "Language: ast\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.2\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Softastur" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "alministradores@softastur.org" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "Un degorriu de KDE pa su" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "El degorriu qu'usa kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "© 1999-2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Autor" 54 | -------------------------------------------------------------------------------- /po/az/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # Xəyyam , 2020. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2020-07-16 08:52+0400\n" 11 | "Last-Translator: Xəyyam Qocayev \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 20.04.3\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 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su vasitəsi" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "kdesu tərəfindən istifadə olunan vasitə" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Müəllif" 54 | -------------------------------------------------------------------------------- /po/bg/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Mincho Kondarev , 2022. 2 | msgid "" 3 | msgstr "" 4 | "Project-Id-Version: \n" 5 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 6 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 7 | "PO-Revision-Date: 2022-05-20 20:52+0200\n" 8 | "Last-Translator: Mincho Kondarev \n" 9 | "Language-Team: Bulgarian \n" 10 | "Language: bg\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 22.04.0\n" 16 | 17 | #, kde-format 18 | msgctxt "NAME OF TRANSLATORS" 19 | msgid "Your names" 20 | msgstr "Минчо Кондарев" 21 | 22 | #, kde-format 23 | msgctxt "EMAIL OF TRANSLATORS" 24 | msgid "Your emails" 25 | msgstr "mkondarev@yahoo.de" 26 | 27 | #: kdesud.cpp:349 28 | #, kde-format 29 | msgid "KDE su daemon" 30 | msgstr "su демон на KDE" 31 | 32 | #: kdesud.cpp:351 33 | #, kde-format 34 | msgid "Daemon used by kdesu" 35 | msgstr "Демон, използван от kdesu" 36 | 37 | #: kdesud.cpp:353 38 | #, kde-format 39 | msgid "Copyright (c) 1999,2000 Geert Jansen" 40 | msgstr "Авторско право (c) 1999,2000 Geert Jansen" 41 | 42 | #: kdesud.cpp:354 43 | #, kde-format 44 | msgid "Geert Jansen" 45 | msgstr "Geert Jansen" 46 | 47 | #: kdesud.cpp:354 48 | #, kde-format 49 | msgid "Author" 50 | msgstr "Автор" 51 | -------------------------------------------------------------------------------- /po/bs/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Bosnian translations for PACKAGE package 2 | # engleski prevodi za paket PACKAGE. 3 | # Copyright (C) 2015 This_file_is_part_of_KDE 4 | # This file is distributed under the same license as the PACKAGE package. 5 | # Samir ribic , 2015. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: kde5\n" 10 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 11 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 12 | "PO-Revision-Date: 2015-02-24 19:45+0100\n" 13 | "Last-Translator: Samir Ribić \n" 14 | "Language-Team: Bosnian\n" 15 | "Language: bs\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=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 20 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Samir Ribić" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "samir.ribic@etf.unsa.ba" 31 | 32 | #: kdesud.cpp:349 33 | #, kde-format 34 | msgid "KDE su daemon" 35 | msgstr "KDE su demon" 36 | 37 | #: kdesud.cpp:351 38 | #, kde-format 39 | msgid "Daemon used by kdesu" 40 | msgstr "Demon koji koristi kdesu" 41 | 42 | #: kdesud.cpp:353 43 | #, kde-format 44 | msgid "Copyright (c) 1999,2000 Geert Jansen" 45 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 46 | 47 | #: kdesud.cpp:354 48 | #, kde-format 49 | msgid "Geert Jansen" 50 | msgstr "Gert Jansen" 51 | 52 | #: kdesud.cpp:354 53 | #, kde-format 54 | msgid "Author" 55 | msgstr "Autor" 56 | -------------------------------------------------------------------------------- /po/ca/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud6.po to Catalan 2 | # Copyright (C) 2014 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 | # Josep M. Ferrer , 2014. 7 | # Antoni Bella Pérez , 2014. 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: kdesu\n" 11 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 12 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 13 | "PO-Revision-Date: 2014-06-25 15:58+0200\n" 14 | "Last-Translator: Antoni Bella Pérez \n" 15 | "Language-Team: Catalan \n" 16 | "Language: ca\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-Accelerator-Marker: &\n" 22 | "X-Generator: Lokalize 1.5\n" 23 | 24 | #, kde-format 25 | msgctxt "NAME OF TRANSLATORS" 26 | msgid "Your names" 27 | msgstr "Josep M. Ferrer" 28 | 29 | #, kde-format 30 | msgctxt "EMAIL OF TRANSLATORS" 31 | msgid "Your emails" 32 | msgstr "txemaq@gmail.com" 33 | 34 | #: kdesud.cpp:349 35 | #, kde-format 36 | msgid "KDE su daemon" 37 | msgstr "Dimoni «su» del KDE" 38 | 39 | #: kdesud.cpp:351 40 | #, kde-format 41 | msgid "Daemon used by kdesu" 42 | msgstr "Dimoni usat pel kdesu" 43 | 44 | #: kdesud.cpp:353 45 | #, kde-format 46 | msgid "Copyright (c) 1999,2000 Geert Jansen" 47 | msgstr "Copyright (c) 1999, 2000 Geert Jansen" 48 | 49 | #: kdesud.cpp:354 50 | #, kde-format 51 | msgid "Geert Jansen" 52 | msgstr "Geert Jansen" 53 | 54 | #: kdesud.cpp:354 55 | #, kde-format 56 | msgid "Author" 57 | msgstr "Autor" 58 | -------------------------------------------------------------------------------- /po/ca@valencia/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud6.po to Catalan (Valencian) 2 | # Copyright (C) 2014 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 | # Josep M. Ferrer , 2014. 7 | # Antoni Bella Pérez , 2014. 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: kdesu\n" 11 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 12 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 13 | "PO-Revision-Date: 2014-06-25 15:58+0200\n" 14 | "Last-Translator: Antoni Bella Pérez \n" 15 | "Language-Team: Catalan \n" 16 | "Language: ca@valencia\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-Accelerator-Marker: &\n" 22 | "X-Generator: Lokalize 1.5\n" 23 | 24 | #, kde-format 25 | msgctxt "NAME OF TRANSLATORS" 26 | msgid "Your names" 27 | msgstr "Josep M. Ferrer" 28 | 29 | #, kde-format 30 | msgctxt "EMAIL OF TRANSLATORS" 31 | msgid "Your emails" 32 | msgstr "txemaq@gmail.com" 33 | 34 | #: kdesud.cpp:349 35 | #, kde-format 36 | msgid "KDE su daemon" 37 | msgstr "Dimoni «su» de KDE" 38 | 39 | #: kdesud.cpp:351 40 | #, kde-format 41 | msgid "Daemon used by kdesu" 42 | msgstr "Dimoni utilitzat per kdesu" 43 | 44 | #: kdesud.cpp:353 45 | #, kde-format 46 | msgid "Copyright (c) 1999,2000 Geert Jansen" 47 | msgstr "Copyright (c) 1999, 2000 Geert Jansen" 48 | 49 | #: kdesud.cpp:354 50 | #, kde-format 51 | msgid "Geert Jansen" 52 | msgstr "Geert Jansen" 53 | 54 | #: kdesud.cpp:354 55 | #, kde-format 56 | msgid "Author" 57 | msgstr "Autoria" 58 | -------------------------------------------------------------------------------- /po/cs/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # Vit Pelcak , 2023. 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesud\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2023-02-24 11:09+0100\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 22.12.2\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Lukáš Tinkl" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "lukas@kde.org" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "Démon kdesu" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Démon používaný kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Autorská práva (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Autor" 54 | -------------------------------------------------------------------------------- /po/da/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Martin Schlander , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-09-21 15:38+0200\n" 11 | "Last-Translator: Martin Schlander \n" 12 | "Language-Team: Danish \n" 13 | "Language: da\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 1.5\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Martin Schlander" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "mschlander@opensuse.org" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su-dæmon" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Dæmon som bruges af kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Ophavsret (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Ophavsmand" 54 | -------------------------------------------------------------------------------- /po/de/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Burkhard Lück , 2014. 2 | msgid "" 3 | msgstr "" 4 | "Project-Id-Version: kdesud6\n" 5 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 6 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 7 | "PO-Revision-Date: 2014-03-29 10:24+0100\n" 8 | "Last-Translator: Burkhard Lück \n" 9 | "Language-Team: German \n" 10 | "Language: de\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 | 16 | #, kde-format 17 | msgctxt "NAME OF TRANSLATORS" 18 | msgid "Your names" 19 | msgstr "Deutsches KDE-Übersetzungsteam" 20 | 21 | #, kde-format 22 | msgctxt "EMAIL OF TRANSLATORS" 23 | msgid "Your emails" 24 | msgstr "kde-i18n-de@kde.org" 25 | 26 | #: kdesud.cpp:349 27 | #, kde-format 28 | msgid "KDE su daemon" 29 | msgstr "Der su-Dienst von KDE" 30 | 31 | #: kdesud.cpp:351 32 | #, kde-format 33 | msgid "Daemon used by kdesu" 34 | msgstr "Von kdesu verwendeter Dienst" 35 | 36 | #: kdesud.cpp:353 37 | #, kde-format 38 | msgid "Copyright (c) 1999,2000 Geert Jansen" 39 | msgstr "Copyright © 1999,2000 Geert Jansen" 40 | 41 | #: kdesud.cpp:354 42 | #, kde-format 43 | msgid "Geert Jansen" 44 | msgstr "Geert Jansen" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Author" 49 | msgstr "Autor" 50 | -------------------------------------------------------------------------------- /po/el/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Dimitris Kardarakos , 2015. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2015-11-05 16:15+0200\n" 11 | "Last-Translator: Dimitris Kardarakos \n" 12 | "Language-Team: Greek \n" 13 | "Language: el\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 2.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 "dimkard@gmail.com" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "Δαίμονας su του KDE" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Δαίμονας που χρησιμοποιείται από το kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Πνευματικά δικαιώματα (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Συγγραφέας" 54 | -------------------------------------------------------------------------------- /po/en_GB/kdesud6.po: -------------------------------------------------------------------------------- 1 | # translation of kdesud.po to British English 2 | # Copyright (C) 2008 Free Software Foundation, Inc. 3 | # Malcolm Hunter , 2008. 4 | # Andrew Coles , 2009. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesud\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2009-02-26 18:44+0000\n" 12 | "Last-Translator: Andrew Coles \n" 13 | "Language-Team: British English \n" 14 | "Language: en_GB\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 "Aston Clulow" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "clulow@upnaway.com" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su dæmon" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Dæmon used by kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Author" 54 | -------------------------------------------------------------------------------- /po/eo/kdesud6.po: -------------------------------------------------------------------------------- 1 | # translation of kdesud6.pot to Esperanto 2 | # Copyright (C) 2017 Free Software Foundation, Inc. 3 | # This file is distributed under the same license as the kdesu package. 4 | # Oliver Kellogg , 2023. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesu\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2023-04-28 23:02+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 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Oliver Kellogg" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "olivermkellogg@gmail.com" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "'su'-demono de KDE" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Demono uzata de kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Kopirajto (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Aŭtoro" 54 | -------------------------------------------------------------------------------- /po/es/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Spanish translations for kdesud6.po package. 2 | # Copyright (C) 2014-2025 This file is copyright: 3 | # This file is distributed under the same license as the kdesu package. 4 | # 5 | # SPDX-FileCopyrightText: 2014, 2025 Eloy Cuadra 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesud6\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2025-05-13 21:21+0100\n" 12 | "Last-Translator: Eloy Cuadra \n" 13 | "Language-Team: Spanish \n" 14 | "Language: es\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: Lokalize 1.5\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Eloy Cuadra" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "ecuadra@eloihr.net" 30 | 31 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "Demonio «su» de KDE" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "Demonio usado por kdesu" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "Copyright © 1999,2000 Geert Jansen" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "Geert Jansen" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "Autor" 55 | -------------------------------------------------------------------------------- /po/et/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Marek Laane , 2016. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2016-09-09 01:30+0300\n" 11 | "Last-Translator: Marek Laane \n" 12 | "Language-Team: Estonian \n" 13 | "Language: et\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 1.5\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Marek Laane" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "qiilaq69@gmail.com" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su deemon" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Rakenduse kdesu kasutatav deemon" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Autoriõigus (c) 1999,2000: Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Autor" 54 | -------------------------------------------------------------------------------- /po/eu/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud5.po to Euskara/Basque (eu) 2 | # Copyright (C) 1999-2017, Free Software Foundation, Inc. 3 | # This file is distributed under the same license as the frameworks package. 4 | # KDE Euskaratzeko proiektuaren arduraduna . 5 | # 6 | # Translators: 7 | # Iñigo Salvador Azurmendi , 2017. 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: kdesud5\n" 11 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 12 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 13 | "PO-Revision-Date: 2017-08-24 00:40+0100\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 2.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@euskalnet.net" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "KDE su daimona" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "kdesu-k erabiltzen duen daimona" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Geert Jansen" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "Author" 57 | -------------------------------------------------------------------------------- /po/fi/kdesud6.po: -------------------------------------------------------------------------------- 1 | # translation of kdesud.po to 2 | # KDE Finnish translation sprint participants: 3 | # Mikko Piippo , 2007. 4 | # Lasse Liehu , 2014. 5 | # Tommi Nieminen , 2020. 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesud\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2020-12-19 22:18+0200\n" 12 | "Last-Translator: Tommi Nieminen \n" 13 | "Language-Team: Finnish \n" 14 | "Language: fi\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 "Kim Enkovaara, Tommi Nieminen" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "kim.enkovaara@iki.fi, translator@legisign.org" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE:n su-palvelu" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "kdesun käyttämä palvelu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Tekijänoikeudet © 1999, 2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Tekijä" 54 | -------------------------------------------------------------------------------- /po/fr/kdesud6.po: -------------------------------------------------------------------------------- 1 | # translation of kdesud.po to 2 | # Copyright (C) 2007 Free Software Foundation, Inc. 3 | # aminesay , 2007. 4 | # Xavier Besnard , 2011. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesud\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2011-12-30 17:51+0100\n" 12 | "Last-Translator: xavier \n" 13 | "Language-Team: French \n" 14 | "Language: fr\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-Environment: kde\n" 20 | "X-Accelerator-Marker: &\n" 21 | "X-Text-Markup: kde4\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "François-Xavier Duranceau, Thibaut Cousin, Amine Say" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "duranceau@kde.org, cousin@kde.org, aminesay@yahoo.fr" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "Démon « su » de KDE" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "Démon utilisé par « kdesu »" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Geert Jansen" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "Auteur" 57 | -------------------------------------------------------------------------------- /po/gd/kdesud6.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR This_file_is_part_of_KDE 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # GunChleoc , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2015-11-04 15:12+0000\n" 11 | "Last-Translator: Michael Bauer \n" 12 | "Language-Team: Fòram na Gàidhlig\n" 13 | "Language: gd\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 || n==11) ? 0 : (n==2 || n==12) ? 1 : " 18 | "(n > 2 && n < 20) ? 2 : 3;\n" 19 | "X-Generator: Poedit 1.8.4\n" 20 | "X-Project-Style: kde\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "GunChleoc" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "fios@foramnagaidhlig.net" 31 | 32 | #: kdesud.cpp:349 33 | #, kde-format 34 | msgid "KDE su daemon" 35 | msgstr "Daemon su airson KDE" 36 | 37 | #: kdesud.cpp:351 38 | #, kde-format 39 | msgid "Daemon used by kdesu" 40 | msgstr "An daemon a chleachdas kdesu" 41 | 42 | #: kdesud.cpp:353 43 | #, kde-format 44 | msgid "Copyright (c) 1999,2000 Geert Jansen" 45 | msgstr "Còir-lethbhreac (c) 1999,2000 Geert Jansen" 46 | 47 | #: kdesud.cpp:354 48 | #, kde-format 49 | msgid "Geert Jansen" 50 | msgstr "Geert Jansen" 51 | 52 | #: kdesud.cpp:354 53 | #, kde-format 54 | msgid "Author" 55 | msgstr "Ùghdar" 56 | -------------------------------------------------------------------------------- /po/gl/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Marce Villarino , 2014. 5 | # Adrián Chaves (Gallaecio) , 2017. 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2017-10-11 07:14+0100\n" 12 | "Last-Translator: Adrián Chaves (Gallaecio) \n" 13 | "Language-Team: Galician \n" 14 | "Language: gl\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 "Marce Villarino" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "mvillarino@kde-espana.org" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "Servizo de su de KDE" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "O servizo usado por kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "© 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Autor" 54 | -------------------------------------------------------------------------------- /po/he/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # SPDX-FileCopyrightText: 2024 Yaron Shahrabani 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2024-03-19 08:00+0200\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 23.08.5\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 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "סוכן su ל־KDE" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "סוכן שמשמש את kdesu" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "כל הזכויות שמורות (c) 1999‏,2000 גירט ג׳נסן" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "גירט ג׳נסן" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "יוצר" 55 | -------------------------------------------------------------------------------- /po/hi/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # Sameer Singh , 2021. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2021-04-25 17:45+0530\n" 11 | "Last-Translator: Sameer Singh \n" 12 | "Language-Team: Kde-hindi\n" 13 | "Language: hi\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 21.04.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 "lumarzeli30@gmail.com" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "केडीई एसयू डेमन" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "केडीईसयू के द्वारा उपयोग में डेमन" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "सर्वाधिकार (c) १९९९,२००० गीर्त जानसन" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "गीर्त जानसन" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "लेखक" 54 | -------------------------------------------------------------------------------- /po/hu/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Kristóf Kiszel , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-03-29 22:09+0100\n" 11 | "Last-Translator: Kristóf 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 1.5\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@kubuntu.org" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su szolgáltatás" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "A kdesu által használt szolgáltatás" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "(c) Geert Jansen, 1999, 2000." 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Szerző" 54 | -------------------------------------------------------------------------------- /po/ia/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # G.Sora , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-03-31 16:14+0200\n" 11 | "Last-Translator: G.Sora \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 1.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 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "Daemon su de KDE" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Daemon usate per kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Autor" 54 | -------------------------------------------------------------------------------- /po/id/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Indonesian translations for kdesud package. 2 | # Copyright (C) 2009 This_file_is_part_of_KDE 3 | # This file is distributed under the same license as the kdesud package. 4 | # Andhika Padmawan , 2009. 5 | # Wantoyo , 2019. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: kdesud\n" 10 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 11 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 12 | "PO-Revision-Date: 2019-01-18 18:50+0700\n" 13 | "Last-Translator: Wantoyo \n" 14 | "Language-Team: Indonesian \n" 15 | "Language: id\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 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Andhika Padmawan" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "andhika.padmawan@gmail.com" 30 | 31 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "Daemon su KDE" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "Daemon yang digunakan oleh kdesu" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "Hak Cipta (c) 1999,2000 Geert Jansen" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "Geert Jansen" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "Penulis" 55 | -------------------------------------------------------------------------------- /po/is/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # Sveinn í Felli , 2022. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2022-09-21 17:43+0000\n" 11 | "Last-Translator: Sveinn í Felli \n" 12 | "Language-Team: Icelandic\n" 13 | "Language: is\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: Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Generator: Lokalize 21.12.3\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Sveinn í Felli" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "sv1@fellsnet.is" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su vaktari" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Bakgrunnsþjónusta (deamon) sem kdesu notar" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Höfundur" 54 | -------------------------------------------------------------------------------- /po/it/kdesud6.po: -------------------------------------------------------------------------------- 1 | # translation of kdesud.po to Italian 2 | # Copyright (C) 2007 Free Software Foundation, Inc. 3 | # Andrea Rizzi , 2007. 4 | # Vincenzo Reale , 2023. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesud\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2023-03-20 09:56+0100\n" 12 | "Last-Translator: Vincenzo Reale \n" 13 | "Language-Team: Italian \n" 14 | "Language: it\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: Lokalize 22.12.3\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Vincenzo Reale,Federico Cozzi" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "smart2128vr@gmail.com," 30 | 31 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "Demone su di KDE" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "Demone usato da kdesu" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "Geert Jansen" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "Autore" 55 | -------------------------------------------------------------------------------- /po/ja/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud into Japanese. 2 | # This file is distributed under the same license as the kdebase package. 3 | # Sinohara , 2001. 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesud\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2001-01-10 23:12GMT\n" 11 | "Last-Translator: Sinohara \n" 12 | "Language-Team: Japanese \n" 13 | "Language: ja\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Generator: KBabel 0.7.1\n" 18 | "Plural-Forms: nplurals=1; plural=0;\n" 19 | "X-Accelerator-Marker: &\n" 20 | "X-Text-Markup: kde4\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Noboru Sinohara" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "shinobo@leo.bekkoame.ne.jp" 31 | 32 | #: kdesud.cpp:349 33 | #, kde-format 34 | msgid "KDE su daemon" 35 | msgstr "KDE su デーモン" 36 | 37 | #: kdesud.cpp:351 38 | #, kde-format 39 | msgid "Daemon used by kdesu" 40 | msgstr "kdesu が使用するデーモン" 41 | 42 | #: kdesud.cpp:353 43 | #, kde-format 44 | msgid "Copyright (c) 1999,2000 Geert Jansen" 45 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 46 | 47 | #: kdesud.cpp:354 48 | #, kde-format 49 | msgid "Geert Jansen" 50 | msgstr "Geert Jansen" 51 | 52 | #: kdesud.cpp:354 53 | #, kde-format 54 | msgid "Author" 55 | msgstr "作者" 56 | -------------------------------------------------------------------------------- /po/ka/kdesud6.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR This file is copyright: 3 | # This file is distributed under the same license as the kdesu package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesu\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2022-05-09 07:00+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.0.1\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 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "KDE-ის su-ის დემონი" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "KDEsu-ის მიერ გამოყენებული დემონი" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "(c) 1999,2000 Geert Jansen, ყველა უფლება დაცულია" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "Geert Jansen" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "ავტორი" 55 | -------------------------------------------------------------------------------- /po/ko/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud to Korean. 2 | # Copyright (C) 2001, 2007. 3 | # Yu-Chan, Park , 2001. 4 | # Shinjo Park , 2007. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesud\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2007-12-01 15:16+0900\n" 12 | "Last-Translator: Shinjo Park \n" 13 | "Language-Team: Korean \n" 14 | "Language: ko\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=1; plural=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 "kde@peremen.name" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su 데몬" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "kdesu에서 사용하는 데몬" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "작성자" 54 | -------------------------------------------------------------------------------- /po/lt/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Lithuanian translations for trunk-kf package. 2 | # Copyright (C) 2014 This_file_is_part_of_KDE 3 | # This file is distributed under the same license as the trunk-kf package. 4 | # 5 | # Automatically generated, 2014. 6 | # Liudas Ališauskas , 2014. 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: trunk-kf 5\n" 10 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 11 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 12 | "PO-Revision-Date: 2014-11-11 00:15+0200\n" 13 | "Last-Translator: Liudas Ališauskas \n" 14 | "Language-Team: Lithuanian \n" 15 | "Language: lt\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=4; plural=(n==1 ? 0 : n%10>=2 && (n%100<10 || n" 20 | "%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3);\n" 21 | "X-Generator: Lokalize 1.5\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Liudas Ališauskas" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "liudas@akmc.lt" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "KDE su tarnyba" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "Tarnyba, kurią naudoja „kdesu“" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Geert Jansen" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "Autorius" 57 | -------------------------------------------------------------------------------- /po/lv/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # Māris Nartišs , 2024. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2024-01-16 10:08+0200\n" 11 | "Last-Translator: Māris Nartišs \n" 12 | "Language-Team: \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 22.12.3\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Māris Nartišs" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "maris.kde@gmail.com" 30 | 31 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "KDE su dēmons" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "Dēmons, ko izmanto kdesu" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "Autortiesības (c) 1999,2000 Geert Jansen" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "Geert Jansen" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "Autors" 55 | -------------------------------------------------------------------------------- /po/ml/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Malayalam translations for kdesu package. 2 | # Copyright (C) 2019 This file is copyright: 3 | # This file is distributed under the same license as the kdesu package. 4 | # Automatically generated, 2019. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesu\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2019-12-12 21:01+0000\n" 12 | "Last-Translator: Vivek KJ Pazhedath \n" 13 | "Language-Team: Swathanthra|സ്വതന്ത്ര Malayalam|മലയാളം Computing|കമ്പ്യൂട്ടിങ്ങ് \n" 15 | "Language: ml\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 | 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 "shijualexonline@gmail.com,snalledam@dataone.in,vivekkj2004@gmail.com" 30 | 31 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "" 55 | -------------------------------------------------------------------------------- /po/nb/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud6 to Norwegian Bokmål 2 | # 3 | # Hans Petter Bieker , 2000. 4 | msgid "" 5 | msgstr "" 6 | "Project-Id-Version: kdesud\n" 7 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 8 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 9 | "PO-Revision-Date: 2007-09-20 21:25+0200\n" 10 | "Last-Translator: MagicPO 0.3 (automated)\n" 11 | "Language-Team: Norwegian Bokmål \n" 12 | "Language: nb\n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "X-Generator: MagicPO 0.3\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Environment: kde\n" 19 | "X-Accelerator-Marker: &\n" 20 | "X-Text-Markup: kde4\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Christian A. Strømmen" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "number1@realityx.net" 31 | 32 | #: kdesud.cpp:349 33 | #, kde-format 34 | msgid "KDE su daemon" 35 | msgstr "KDE su-daemon" 36 | 37 | #: kdesud.cpp:351 38 | #, kde-format 39 | msgid "Daemon used by kdesu" 40 | msgstr "Daemon brukt av kdesu" 41 | 42 | #: kdesud.cpp:353 43 | #, kde-format 44 | msgid "Copyright (c) 1999,2000 Geert Jansen" 45 | msgstr "Copyright © 1999,2000 Geert Jansen" 46 | 47 | #: kdesud.cpp:354 48 | #, kde-format 49 | msgid "Geert Jansen" 50 | msgstr "Geert Jansen" 51 | 52 | #: kdesud.cpp:354 53 | #, kde-format 54 | msgid "Author" 55 | msgstr "Forfatter" 56 | -------------------------------------------------------------------------------- /po/nds/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud.po to Low Saxon 2 | # Copyright (C) 2004, 2006, 2007, 2008 Free Software Foundation, Inc. 3 | # Heiko Evermann , 2004. 4 | # Volker Jockheck , 2004. 5 | # Sönke Dibbern , 2006, 2007, 2008. 6 | # Manfred Wiese , 2010, 2011. 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: kdesud\n" 11 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 12 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 13 | "PO-Revision-Date: 2011-06-22 05:49+0200\n" 14 | "Last-Translator: Manfred Wiese \n" 15 | "Language-Team: Low Saxon \n" 16 | "Language: nds\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "X-Generator: Lokalize 1.0\n" 21 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Sönke Dibbern" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "s_dibbern@web.de" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "su-Dämoon vun KDE" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "Vun \"kdesu\" bruukt Dämoon" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "Copyright © 1999, 2000 Geert Jansen" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Geert Jansen" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "Autor" 57 | -------------------------------------------------------------------------------- /po/nl/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Freek de Kruijf , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-03-29 10:11+0100\n" 11 | "Last-Translator: Freek de Kruijf \n" 12 | "Language-Team: Dutch \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 1.5\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Freek de Kruijf" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "freekdekruijf@kde.nl" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su-daemon" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Daemon gebruikt door kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Auteur" 54 | -------------------------------------------------------------------------------- /po/nn/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud6 to Norwegian Nynorsk 2 | # 3 | # Gaute Hvoslef Kvalnes , 2000. 4 | # Karl Ove Hufthammer , 2007, 2008. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesud\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2008-08-03 19:20+0200\n" 11 | "Last-Translator: Karl Ove Hufthammer \n" 12 | "Language-Team: Norwegian Nynorsk \n" 13 | "Language: nn\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Generator: KBabel 1.11.4\n" 18 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 19 | "X-Environment: kde\n" 20 | "X-Accelerator-Marker: &\n" 21 | "X-Text-Markup: kde4\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Gaute Hvoslef Kvalnes" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "gaute@verdsveven.com" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "KDE su-demon" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "Demonen kdesu brukar" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "Copyright © 1999–2000 Geert Jansen" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Geert Jansen" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "Opphavsperson" 57 | -------------------------------------------------------------------------------- /po/pa/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # A S Alam , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-07-08 14:28-0500\n" 11 | "Last-Translator: A S Alam \n" 12 | "Language-Team: Punjabi/Panjabi \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 1.5\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ (A S Alam)" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "aalam@users.sf.net" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su ਡੈਮਨ" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "kdesu ਰਾਹੀਂ ਵਰਤੀ ਜਾਂਦੀ ਡੈਮਨ" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "ਗਰੀਟ ਜਾਨਸਨ" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "ਲੇਖਕ" 54 | -------------------------------------------------------------------------------- /po/pl/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Łukasz Wojniłowicz , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-03-29 07:15+0100\n" 11 | "Last-Translator: Łukasz Wojniłowicz \n" 12 | "Language-Team: Polish \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 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Łukasz Wojniłowicz" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "lukasz.wojnilowicz@gmail.com" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "Usługa su dla KDE" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Usługa używana przez kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Autor" 54 | -------------------------------------------------------------------------------- /po/pt/kdesud6.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: kdesud\n" 4 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 5 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 6 | "PO-Revision-Date: 2014-03-29 12:14+0000\n" 7 | "Last-Translator: José Nuno Coelho Pires \n" 8 | "Language-Team: Portuguese \n" 9 | "Language: pt\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "X-POFile-SpellExtra: Jansen Geert su kdesu\n" 14 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 15 | 16 | #, kde-format 17 | msgctxt "NAME OF TRANSLATORS" 18 | msgid "Your names" 19 | msgstr "José Nuno Pires" 20 | 21 | #, kde-format 22 | msgctxt "EMAIL OF TRANSLATORS" 23 | msgid "Your emails" 24 | msgstr "zepires@gmail.com" 25 | 26 | #: kdesud.cpp:349 27 | #, kde-format 28 | msgid "KDE su daemon" 29 | msgstr "Servidor do 'su' do KDE" 30 | 31 | #: kdesud.cpp:351 32 | #, kde-format 33 | msgid "Daemon used by kdesu" 34 | msgstr "O servidor usado pelo kdesu" 35 | 36 | #: kdesud.cpp:353 37 | #, kde-format 38 | msgid "Copyright (c) 1999,2000 Geert Jansen" 39 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 40 | 41 | #: kdesud.cpp:354 42 | #, kde-format 43 | msgid "Geert Jansen" 44 | msgstr "Geert Jansen" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Author" 49 | msgstr "Autoria" 50 | -------------------------------------------------------------------------------- /po/pt_BR/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud5.po to Brazilian Portuguese 2 | # Copyright (C) 2014 This_file_is_part_of_KDE 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # André Marcelo Alvarenga , 2014. 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: kdesud5\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2014-03-31 23:30-0300\n" 12 | "Last-Translator: André Marcelo Alvarenga \n" 13 | "Language-Team: Brazilian Portuguese \n" 14 | "Language: pt_BR\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: Lokalize 1.5\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "André Marcelo Alvarenga" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "alvarenga@kde.org" 30 | 31 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "Serviço su do KDE" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "Serviço utilizado pelo kdesu" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "Geert Jansen" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "Autor" 55 | -------------------------------------------------------------------------------- /po/ro/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # Sergiu Bivol , 2014. 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-08-16 14:50+0300\n" 11 | "Last-Translator: Sergiu Bivol \n" 12 | "Language-Team: Romanian \n" 13 | "Language: ro\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==0 || (n%100 > 0 && n%100 < " 18 | "20)) ? 1 : 2;\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Sergiu Bivol" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "sergiu@cip.md" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "Demon KDE pentru „su”" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Demon utilizat de kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Drept de autor (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Autor" 54 | -------------------------------------------------------------------------------- /po/ru/kdesud6.po: -------------------------------------------------------------------------------- 1 | # KDE2 kdesud.pot Russian translation 2 | # Copyright (C) 2000, KDE Team. 3 | # 4 | # Igor Azarniy , 2000. 5 | # Andrey Cherepanov , 2009. 6 | # Alexander Potashev , 2014. 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: kdesud\n" 10 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 11 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 12 | "PO-Revision-Date: 2014-06-25 04:02+0400\n" 13 | "Last-Translator: Alexander Potashev \n" 14 | "Language-Team: Russian \n" 15 | "Language: ru\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "X-Generator: Lokalize 1.5\n" 20 | "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" 21 | "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 22 | "X-Environment: kde\n" 23 | "X-Accelerator-Marker: &\n" 24 | "X-Text-Markup: kde4\n" 25 | 26 | #, kde-format 27 | msgctxt "NAME OF TRANSLATORS" 28 | msgid "Your names" 29 | msgstr "Igor Azarniy, Николай Шафоростов, Александр Поташев" 30 | 31 | #, kde-format 32 | msgctxt "EMAIL OF TRANSLATORS" 33 | msgid "Your emails" 34 | msgstr "azarniy@usa.net, shaforostoff@kde.ru, aspotashev@gmail.com" 35 | 36 | #: kdesud.cpp:349 37 | #, kde-format 38 | msgid "KDE su daemon" 39 | msgstr "Служба KDE su" 40 | 41 | #: kdesud.cpp:351 42 | #, kde-format 43 | msgid "Daemon used by kdesu" 44 | msgstr "Служба, используемая kdesu" 45 | 46 | #: kdesud.cpp:353 47 | #, kde-format 48 | msgid "Copyright (c) 1999,2000 Geert Jansen" 49 | msgstr "© Geert Jansen, 1999, 2000" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Geert Jansen" 54 | msgstr "Geert Jansen" 55 | 56 | #: kdesud.cpp:354 57 | #, kde-format 58 | msgid "Author" 59 | msgstr "Автор" 60 | 61 | #~ msgid "" 62 | #~ "_: NAME OF TRANSLATORS\n" 63 | #~ "Your names" 64 | #~ msgstr "Igor Azarniy" 65 | 66 | #~ msgid "" 67 | #~ "_: EMAIL OF TRANSLATORS\n" 68 | #~ "Your emails" 69 | #~ msgstr "azarniy@usa.net" 70 | -------------------------------------------------------------------------------- /po/sa/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # SPDX-FileCopyrightText: 2024 kali 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2024-12-24 20:39+0530\n" 11 | "Last-Translator: kali \n" 12 | "Language-Team: Sanskrit \n" 13 | "Language: sa\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Generator: Lokalize 24.08.2\n" 18 | "X-Poedit-Bookmarks: -1,4,-1,-1,-1,-1,-1,-1,-1,-1\n" 19 | "Plural-Forms: nplurals=2; plural=(n>2);\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 "skkalwar999@gmail.com" 30 | 31 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "KDE su daemon" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "Kdesu इत्यनेन प्रयुक्तः daemon" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "Copyright (c) १९९९,२००० गेर्ट् जान्सेन्" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "गेर्ट् जान्सेन्" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "लेखकः" 55 | -------------------------------------------------------------------------------- /po/se/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud6 to Northern Sami 2 | # 3 | # Børre Gaup , 2002, 2003, 2007. 4 | msgid "" 5 | msgstr "" 6 | "Project-Id-Version: kdesud\n" 7 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 8 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 9 | "PO-Revision-Date: 2007-12-10 05:00+0100\n" 10 | "Last-Translator: Børre Gaup \n" 11 | "Language-Team: Northern Sami \n" 12 | "Language: se\n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "X-Generator: KBabel 1.11.4\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Environment: kde\n" 19 | "X-Accelerator-Marker: &\n" 20 | "X-Text-Markup: kde4\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Børre Gaup" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "boerre@skolelinux.no" 31 | 32 | #: kdesud.cpp:349 33 | #, kde-format 34 | msgid "KDE su daemon" 35 | msgstr "KDE su daemon" 36 | 37 | #: kdesud.cpp:351 38 | #, kde-format 39 | msgid "Daemon used by kdesu" 40 | msgstr "Deamona maid kdesu geavaha" 41 | 42 | #: kdesud.cpp:353 43 | #, kde-format 44 | msgid "Copyright (c) 1999,2000 Geert Jansen" 45 | msgstr "Copyright © 1999–2000 Geert Jansen" 46 | 47 | #: kdesud.cpp:354 48 | #, kde-format 49 | msgid "Geert Jansen" 50 | msgstr "Geert Jansen" 51 | 52 | #: kdesud.cpp:354 53 | #, kde-format 54 | msgid "Author" 55 | msgstr "Čálli" 56 | -------------------------------------------------------------------------------- /po/sk/kdesud6.po: -------------------------------------------------------------------------------- 1 | # translation of kdesud.po to Slovak 2 | # Roman Paholik , 2014. 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: kdesud\n" 6 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 7 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 8 | "PO-Revision-Date: 2021-11-17 19:38+0100\n" 9 | "Last-Translator: Dušan Kazik \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: Poedit 3.0\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,Dušan Kazik" 22 | 23 | #, kde-format 24 | msgctxt "EMAIL OF TRANSLATORS" 25 | msgid "Your emails" 26 | msgstr "wizzardsk@gmail.com,prescott66@gmail.com" 27 | 28 | #: kdesud.cpp:349 29 | #, kde-format 30 | msgid "KDE su daemon" 31 | msgstr "Démon KDE su" 32 | 33 | #: kdesud.cpp:351 34 | #, kde-format 35 | msgid "Daemon used by kdesu" 36 | msgstr "Démon používaný nástrojom kdesu" 37 | 38 | #: kdesud.cpp:353 39 | #, kde-format 40 | msgid "Copyright (c) 1999,2000 Geert Jansen" 41 | msgstr "Autorské práva (c) 1999,2000 Geert Jansen" 42 | 43 | #: kdesud.cpp:354 44 | #, kde-format 45 | msgid "Geert Jansen" 46 | msgstr "Geert Jansen" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Author" 51 | msgstr "Tvorca" 52 | -------------------------------------------------------------------------------- /po/sl/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Andrej Mernik , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-06-12 14:47+0200\n" 11 | "Last-Translator: Andrej Mernik \n" 12 | "Language-Team: Slovenian \n" 13 | "Language: sl\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%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" 18 | "%100==4 ? 3 : 0);\n" 19 | "X-Generator: Lokalize 1.5\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Andrej Mernik" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "andrejm@ubuntu.si" 30 | 31 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "Ozadnji program su za KDE" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "Ozadnji program, ki ga uporablja kdesu" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "Avtorske pravice © 1999, 2000 Geert Jansen" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "Geert Jansen" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "Avtor" 55 | -------------------------------------------------------------------------------- /po/sr/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud5.po into Serbian. 2 | # Marko Rosic , 2000. 3 | # Toplica Tanaskovic , 2003. 4 | # Chusslove Illich , 2007, 2017. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesud5\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2017-09-28 17:57+0200\n" 11 | "Last-Translator: Chusslove Illich \n" 12 | "Language-Team: Serbian \n" 13 | "Language: sr\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-Accelerator-Marker: &\n" 20 | "X-Text-Markup: kde4\n" 21 | "X-Environment: kde\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Часлав Илић" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "caslav.ilic@gmx.net" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "КДЕ‑ов демон за su" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "Демон КДЕ суа" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "© 1999-2000, Герт Јансен" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Герт Јансен" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "аутор" 57 | -------------------------------------------------------------------------------- /po/sr@ijekavian/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud5.po into Serbian. 2 | # Marko Rosic , 2000. 3 | # Toplica Tanaskovic , 2003. 4 | # Chusslove Illich , 2007, 2017. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesud5\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2017-09-28 17:57+0200\n" 11 | "Last-Translator: Chusslove Illich \n" 12 | "Language-Team: Serbian \n" 13 | "Language: sr@ijekavian\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-Accelerator-Marker: &\n" 20 | "X-Text-Markup: kde4\n" 21 | "X-Environment: kde\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Часлав Илић" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "caslav.ilic@gmx.net" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "КДЕ‑ов демон за su" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "Демон КДЕ суа" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "© 1999-2000, Герт Јансен" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Герт Јансен" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "аутор" 57 | -------------------------------------------------------------------------------- /po/sr@ijekavianlatin/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud5.po into Serbian. 2 | # Marko Rosic , 2000. 3 | # Toplica Tanaskovic , 2003. 4 | # Chusslove Illich , 2007, 2017. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesud5\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2017-09-28 17:57+0200\n" 11 | "Last-Translator: Chusslove Illich \n" 12 | "Language-Team: Serbian \n" 13 | "Language: sr@ijekavianlatin\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-Accelerator-Marker: &\n" 20 | "X-Text-Markup: kde4\n" 21 | "X-Environment: kde\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Časlav Ilić" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "caslav.ilic@gmx.net" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "KDE‑ov demon za su" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "Demon KDE sua" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "© 1999-2000, Gert Jansen" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Gert Jansen" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "autor" 57 | -------------------------------------------------------------------------------- /po/sr@latin/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud5.po into Serbian. 2 | # Marko Rosic , 2000. 3 | # Toplica Tanaskovic , 2003. 4 | # Chusslove Illich , 2007, 2017. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesud5\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2017-09-28 17:57+0200\n" 11 | "Last-Translator: Chusslove Illich \n" 12 | "Language-Team: Serbian \n" 13 | "Language: sr@latin\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-Accelerator-Marker: &\n" 20 | "X-Text-Markup: kde4\n" 21 | "X-Environment: kde\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Časlav Ilić" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "caslav.ilic@gmx.net" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "KDE‑ov demon za su" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "Demon KDE sua" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "© 1999-2000, Gert Jansen" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Gert Jansen" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "autor" 57 | -------------------------------------------------------------------------------- /po/sv/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Stefan Asserhäll , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-04-01 21:06+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 1.4\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 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE-demon för administratörsläge" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Demon som används av kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright © 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Upphovsman" 54 | -------------------------------------------------------------------------------- /po/ta/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # SPDX-FileCopyrightText: 2024 Kishore G 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2024-02-18 18:48+0530\n" 11 | "Last-Translator: Kishore G \n" 12 | "Language-Team: Tamil \n" 13 | "Language: ta\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 "கிஷோர்" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "kishore96@gmail.com" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "கே.டீ.யீ. su பின்னணி சேவை" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "kdesu பயன்படுத்தும் பின்னணி சேவை" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "பதிப்புரிமை (c) 1999,2000 கீற்ட்டு யான்சன்" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "கீற்ட்டு யான்சன்" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "இயற்றியவர்" 54 | -------------------------------------------------------------------------------- /po/tg/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # Victor Ibragimov , 2019. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2019-08-16 19:20+0500\n" 11 | "Last-Translator: Victor Ibragimov \n" 12 | "Language-Team: English \n" 13 | "Language: tg\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 19.04.3\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Victor Ibragimov" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "victor.ibragimov@gmail.com" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "Раванди дохилии KDE su" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Раванди дохилие, ки бо kdesu истифода мешавад" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Ҳуқуқи муаллиф (c) 1999, 2000 Гирт Ҷансен (Geert Jansen)" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Гирт Ҷансен (Geert Jansen)" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Муаллиф" 54 | -------------------------------------------------------------------------------- /po/tr/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Volkan Gezer , 2015. 5 | # SPDX-FileCopyrightText: 2022, 2023, 2024 Emir SARI 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 11 | "PO-Revision-Date: 2024-09-23 15:20+0300\n" 12 | "Last-Translator: Emir SARI \n" 13 | "Language-Team: Turkish \n" 14 | "Language: tr\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: Lokalize 24.11.70\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Volkan Gezer" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "volkangezer@gmail.com" 30 | 31 | #: kdesud.cpp:349 32 | #, kde-format 33 | msgid "KDE su daemon" 34 | msgstr "KDE su ardalan süreci" 35 | 36 | #: kdesud.cpp:351 37 | #, kde-format 38 | msgid "Daemon used by kdesu" 39 | msgstr "Kdesu tarafından kullanılan ardalan süreci" 40 | 41 | #: kdesud.cpp:353 42 | #, kde-format 43 | msgid "Copyright (c) 1999,2000 Geert Jansen" 44 | msgstr "© 1999, 2000 Geert Jansen" 45 | 46 | #: kdesud.cpp:354 47 | #, kde-format 48 | msgid "Geert Jansen" 49 | msgstr "Geert Jansen" 50 | 51 | #: kdesud.cpp:354 52 | #, kde-format 53 | msgid "Author" 54 | msgstr "Yazar" 55 | -------------------------------------------------------------------------------- /po/uk/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Translation of kdesud5.po to Ukrainian 2 | # Copyright (C) 2018 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 | # Yuri Chornoivan , 2014. 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: kdesud5\n" 10 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 11 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 12 | "PO-Revision-Date: 2014-03-29 07:52+0200\n" 13 | "Last-Translator: Yuri Chornoivan \n" 14 | "Language-Team: Ukrainian \n" 15 | "Language: uk\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=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" 20 | "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 21 | "X-Generator: Lokalize 1.5\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Andriy Rysin" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "rysin@kde.org" 32 | 33 | #: kdesud.cpp:349 34 | #, kde-format 35 | msgid "KDE su daemon" 36 | msgstr "Фонова служба su для KDE" 37 | 38 | #: kdesud.cpp:351 39 | #, kde-format 40 | msgid "Daemon used by kdesu" 41 | msgstr "Фонова служба, що використовується для kdesu" 42 | 43 | #: kdesud.cpp:353 44 | #, kde-format 45 | msgid "Copyright (c) 1999,2000 Geert Jansen" 46 | msgstr "© Geert Jansen, 1999, 2000" 47 | 48 | #: kdesud.cpp:354 49 | #, kde-format 50 | msgid "Geert Jansen" 51 | msgstr "Geert Jansen" 52 | 53 | #: kdesud.cpp:354 54 | #, kde-format 55 | msgid "Author" 56 | msgstr "Автор" 57 | -------------------------------------------------------------------------------- /po/vi/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This file is copyright: 2 | # This file is distributed under the same license as the kdesu package. 3 | # 4 | # Phu Hung Nguyen , 2022. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: kdesu\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2022-05-12 16:54+0200\n" 11 | "Last-Translator: Phu Hung Nguyen \n" 12 | "Language-Team: Vietnamese \n" 13 | "Language: vi\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 21.12.2\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Nguyễn Hùng Phú" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "phu.nguyen@kdemail.net" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "Trình nền su KDE" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "Trình nền cho kdesu" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Bản quyền (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "Tác giả" 54 | -------------------------------------------------------------------------------- /po/zh_CN/kdesud6.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: 2022-09-23 00:41+0000\n" 6 | "PO-Revision-Date: 2024-04-22 15:58\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/kdesu/kdesud6.pot\n" 18 | "X-Crowdin-File-ID: 42873\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "KDE 中国" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "fundawang@gmail.com, i@guoyunhe.me, tds00@qq.com" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su 守护程序" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "kdesu 使用的守护程序" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "作者" 54 | -------------------------------------------------------------------------------- /po/zh_TW/kdesud6.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This_file_is_part_of_KDE 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Franklin Weng , 2014. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2022-09-23 00:41+0000\n" 10 | "PO-Revision-Date: 2014-04-22 10:30+0800\n" 11 | "Last-Translator: Franklin Weng \n" 12 | "Language-Team: Chinese Traditional \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 1.5\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Franklin Weng" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "franklin@nospam.goodhorse.idv.tw" 29 | 30 | #: kdesud.cpp:349 31 | #, kde-format 32 | msgid "KDE su daemon" 33 | msgstr "KDE su 伺服程式" 34 | 35 | #: kdesud.cpp:351 36 | #, kde-format 37 | msgid "Daemon used by kdesu" 38 | msgstr "kdesu 使用的伺服程式" 39 | 40 | #: kdesud.cpp:353 41 | #, kde-format 42 | msgid "Copyright (c) 1999,2000 Geert Jansen" 43 | msgstr "Copyright (c) 1999,2000 Geert Jansen" 44 | 45 | #: kdesud.cpp:354 46 | #, kde-format 47 | msgid "Geert Jansen" 48 | msgstr "Geert Jansen" 49 | 50 | #: kdesud.cpp:354 51 | #, kde-format 52 | msgid "Author" 53 | msgstr "作者" 54 | -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_subdirectory(kdesud) 2 | 3 | include(CheckTypeSize) 4 | include(CheckIncludeFiles) 5 | include(CheckFunctionExists) 6 | 7 | check_function_exists(setpriority HAVE_SETPRIORITY) 8 | check_function_exists(getpeereid HAVE_GETPEEREID) 9 | check_function_exists(initgroups HAVE_INITGROUPS) 10 | 11 | check_include_files(sys/select.h HAVE_SYS_SELECT_H) 12 | 13 | set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h) 14 | check_type_size("struct ucred" STRUCT_UCRED) #defines HAVE_STRUCT_UCRED (bool) and STRUCT_UCRED (size, unused) 15 | set(CMAKE_EXTRA_INCLUDE_FILES) #reset CMAKE_EXTRA_INCLUDE_FILES 16 | 17 | configure_file(config-kdesu.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kdesu.h) 18 | 19 | add_library(KF6Su) 20 | add_library(KF6::Su ALIAS KF6Su) 21 | 22 | set_target_properties(KF6Su PROPERTIES 23 | VERSION ${KDESU_VERSION} 24 | SOVERSION ${KDESU_SOVERSION} 25 | EXPORT_NAME Su 26 | ) 27 | 28 | target_sources(KF6Su PRIVATE 29 | client.cpp 30 | ptyprocess.cpp 31 | kcookie.cpp 32 | suprocess.cpp 33 | sshprocess.cpp 34 | stubprocess.cpp 35 | ) 36 | 37 | ecm_qt_declare_logging_category(KF6Su 38 | HEADER ksu_debug.h 39 | IDENTIFIER KSU_LOG 40 | CATEGORY_NAME kf.su 41 | DESCRIPTION "KSu (KDESu)" 42 | EXPORT KSU 43 | ) 44 | 45 | ecm_generate_export_header(KF6Su 46 | EXPORT_FILE_NAME kdesu/kdesu_export.h 47 | BASE_NAME KDESu 48 | GROUP_BASE_NAME KF 49 | VERSION ${KF_VERSION} 50 | USE_VERSION_HEADER 51 | DEPRECATED_BASE_VERSION 0 52 | DEPRECATION_VERSIONS 53 | EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT} 54 | ) 55 | 56 | if(KDESU_USE_SUDO_DEFAULT) 57 | target_compile_definitions(KF6Su PRIVATE -DKDESU_USE_SUDO_DEFAULT="true") 58 | elseif(KDESU_USE_DOAS_DEFAULT) 59 | target_compile_definitions(KF6Su PRIVATE -DKDESU_USE_DOAS_DEFAULT="true") 60 | endif() 61 | 62 | target_include_directories(KF6Su PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..) 63 | 64 | # Apps must include or 65 | target_include_directories(KF6Su INTERFACE "$") 66 | 67 | target_link_libraries(KF6Su 68 | PUBLIC 69 | KF6::Pty 70 | PRIVATE 71 | KF6::CoreAddons # KUser::loginName 72 | KF6::ConfigCore # KConfigGroup 73 | ) 74 | 75 | 76 | ecm_generate_headers(KDESu_CamelCase_HEADERS 77 | HEADER_NAMES 78 | PtyProcess 79 | SuProcess 80 | SshProcess 81 | StubProcess 82 | Client 83 | 84 | PREFIX KDESu 85 | REQUIRED_HEADERS KDESu_HEADERS 86 | ) 87 | 88 | ecm_generate_qdoc(KF6Su kdesu.qdocconf) 89 | 90 | install(FILES ${KDESu_CamelCase_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KDESu/KDESu COMPONENT Devel) 91 | 92 | install(TARGETS KF6Su EXPORT KF6SuTargets ${KF_INSTALL_TARGETS_DEFAULT_ARGS}) 93 | 94 | ########### next target ############### 95 | 96 | include(ECMMarkNonGuiExecutable) 97 | 98 | set_source_files_properties(kdesu_stub.c PROPERTIES 99 | COMPILE_DEFINITIONS "_XOPEN_SOURCE;_BSD_SOURCE") 100 | 101 | add_executable(kdesu_stub kdesu_stub.c) 102 | set_property(TARGET kdesu_stub PROPERTY POSITION_INDEPENDENT_CODE ON) 103 | ecm_mark_nongui_executable(kdesu_stub) 104 | 105 | install(TARGETS kdesu_stub DESTINATION ${KDE_INSTALL_LIBEXECDIR_KF}) 106 | 107 | ########### install files ############### 108 | install(FILES 109 | defaults.h 110 | ${CMAKE_CURRENT_BINARY_DIR}/kdesu/kdesu_export.h 111 | ${KDESu_HEADERS} 112 | DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KDESu/kdesu COMPONENT Devel 113 | ) 114 | 115 | ecm_qt_install_logging_categories( 116 | EXPORT KSU 117 | FILE ksu.categories 118 | DESTINATION "${KDE_INSTALL_LOGGINGCATEGORIESDIR}" 119 | ) 120 | -------------------------------------------------------------------------------- /src/README: -------------------------------------------------------------------------------- 1 | Maintainer: Adriaan de Groot 2 | Maintainer: kdesu was maintained by Alan Eldridge until his 3 | death in 2003. 4 | 5 | README for libkdesu. 6 | 7 | Libkdesu provides functionality for building GUI front ends for 8 | (password asking) console mode programs. For example, kdesu and 9 | kdessh use it to interface with su and ssh respectively. 10 | 11 | libkdesu is Copyright (c) 1999,2000 Geert Jansen 12 | 13 | Distributed under the GNU Library General Public License, version 2. 14 | -------------------------------------------------------------------------------- /src/client.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | 7 | client.h: client to access kdesud. 8 | */ 9 | 10 | #ifndef KDESUCLIENT_H 11 | #define KDESUCLIENT_H 12 | 13 | #include 14 | 15 | #include 16 | #include 17 | #include 18 | 19 | #ifdef Q_OS_UNIX 20 | 21 | namespace KDESu 22 | { 23 | /*! 24 | * \class KDESu::Client 25 | * \inmodule KDESu 26 | * \inheaderfile KDESu/Client 27 | * 28 | * \brief A client class to access kdesud, the KDE su daemon. 29 | * 30 | * Kdesud can assist in password caching in two ways: 31 | * 32 | * For high security passwords, like for su and ssh, it executes the 33 | * password requesting command for you. It feeds the password to the 34 | * command, without ever returning it to you, the user. 35 | * See exec, setPass, delCommand. 36 | * 37 | * For lower security passwords, like web and ftp passwords, it can act 38 | * as a persistent storage for string variables. These variables are 39 | * returned to the user. 40 | * See setVar, delVar, delGroup. 41 | * 42 | * Porting from KF5 to KF6: 43 | * 44 | * The class KDESu::KDEsuClient was renamed to KDESu::Client. 45 | * 46 | * \since 6.0 47 | */ 48 | class KDESU_EXPORT Client 49 | { 50 | public: 51 | /*! 52 | * 53 | */ 54 | Client(); 55 | ~Client(); 56 | 57 | Client(const Client &) = delete; 58 | Client &operator=(const Client &) = delete; 59 | 60 | /*! 61 | * Lets kdesud execute a command. If the daemon does not have a password 62 | * for this command, this will fail and you need to call setPass(). 63 | * 64 | * \a command The command to execute. 65 | * 66 | * \a user The user to run the command as. 67 | * 68 | * \a options Extra options. 69 | * 70 | * \a env Extra environment variables. 71 | * 72 | * Returns Zero on success, -1 on failure. 73 | */ 74 | int exec(const QByteArray &command, const QByteArray &user, const QByteArray &options = nullptr, const QList &env = QList()); 75 | 76 | /*! 77 | * Wait for the last command to exit and return the exit code. 78 | * 79 | * Returns the exit code of last command, -1 on failure. 80 | */ 81 | int exitCode(); 82 | 83 | /*! 84 | * Set root's password, lasts one session. 85 | * 86 | * \a pass Root's password. 87 | * 88 | * \a timeout The time that a password will live. 89 | * 90 | * Returns zero on success, -1 on failure. 91 | */ 92 | int setPass(const char *pass, int timeout); 93 | 94 | /*! 95 | * Set the target host (optional). 96 | */ 97 | int setHost(const QByteArray &host); 98 | 99 | /*! 100 | * Set the desired priority (optional), see StubProcess. 101 | */ 102 | int setPriority(int priority); 103 | 104 | /*! 105 | * Set the desired scheduler (optional), see StubProcess. 106 | */ 107 | int setScheduler(int scheduler); 108 | 109 | /*! 110 | * Remove a password for a user/command. 111 | * 112 | * \a command The command. 113 | * 114 | * \a user The user. 115 | * 116 | * Return zero on success, -1 on an error 117 | */ 118 | int delCommand(const QByteArray &command, const QByteArray &user); 119 | 120 | /*! 121 | * Set a persistent variable. 122 | * 123 | * \a key The name of the variable. 124 | * 125 | * \a value Its value. 126 | * 127 | * \a timeout The timeout in seconds for this key. Zero means 128 | * no timeout. 129 | * 130 | * \a group Make the key part of a group. See delGroup. 131 | * 132 | * Return zero on success, -1 on failure. 133 | */ 134 | int setVar(const QByteArray &key, const QByteArray &value, int timeout = 0, const QByteArray &group = nullptr); 135 | 136 | /*! 137 | * Get a persistent variable. 138 | * 139 | * \a key The name of the variable. 140 | * 141 | * Returns its value. 142 | */ 143 | QByteArray getVar(const QByteArray &key); 144 | 145 | /*! 146 | * Gets all the keys that are membes of the given group. 147 | * 148 | * \a group the group name of the variables. 149 | * 150 | * Returns a list of the keys in the group. 151 | */ 152 | QList getKeys(const QByteArray &group); 153 | 154 | /*! 155 | * Returns true if the specified group exists is 156 | * cached. 157 | * 158 | * \a group the group key 159 | * 160 | * Returns true if the group is found 161 | */ 162 | bool findGroup(const QByteArray &group); 163 | 164 | /*! 165 | * Delete a persistent variable. 166 | * 167 | * \a key The name of the variable. 168 | * 169 | * Returns zero on success, -1 on failure. 170 | */ 171 | int delVar(const QByteArray &key); 172 | 173 | /*! 174 | * Delete all persistent variables with the given key. 175 | * 176 | * A specicalized variant of delVar(QByteArray) that removes all 177 | * subsets of the cached variables given by \a key. In order for all 178 | * cached variables related to this key to be deleted properly, the 179 | * value given to the \a group argument when the setVar function 180 | * was called, must be a subset of the argument given here and the key 181 | * 182 | * \note Simply supplying the group key here WILL not necessarily 183 | * work. If you only have a group key, then use delGroup instead. 184 | * 185 | * \a special_key the name of the variable. 186 | * 187 | * Returns zero on success, -1 on failure. 188 | */ 189 | int delVars(const QByteArray &special_key); 190 | 191 | /*! 192 | * Delete all persistent variables in a group. 193 | * 194 | * \a group the group name. See setVar. 195 | */ 196 | int delGroup(const QByteArray &group); 197 | 198 | /*! 199 | * Ping kdesud. This can be used for diagnostics. 200 | * 201 | * Returns zero on success, -1 on failure 202 | */ 203 | int ping(); 204 | 205 | /*! 206 | * Stop the daemon. 207 | */ 208 | int stopServer(); 209 | 210 | /*! 211 | * Try to start up kdesud 212 | */ 213 | int startServer(); 214 | 215 | private: 216 | KDESU_NO_EXPORT int connect(); 217 | 218 | KDESU_NO_EXPORT int command(const QByteArray &cmd, QByteArray *result = nullptr); 219 | KDESU_NO_EXPORT QByteArray escape(const QByteArray &str); 220 | 221 | private: 222 | std::unique_ptr const d; 223 | }; 224 | 225 | } // END namespace KDESu 226 | 227 | #endif // Q_OS_UNIX 228 | 229 | #endif // KDESUCLIENT_H 230 | -------------------------------------------------------------------------------- /src/config-kdesu.h.cmake: -------------------------------------------------------------------------------- 1 | #cmakedefine01 HAVE_STRUCT_UCRED 2 | #cmakedefine01 HAVE_SETPRIORITY 3 | #cmakedefine01 HAVE_GETPEEREID 4 | #cmakedefine01 HAVE_X11 5 | #cmakedefine01 HAVE_INITGROUPS 6 | #cmakedefine01 HAVE_SYS_SELECT_H 7 | #define CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" 8 | #define KDE_INSTALL_FULL_LIBEXECDIR_KF "${KDE_INSTALL_FULL_LIBEXECDIR_KF}" 9 | -------------------------------------------------------------------------------- /src/defaults.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | */ 7 | 8 | #ifndef KDESUDEFAULTS_H 9 | #define KDESUDEFAULTS_H 10 | 11 | namespace KDESu 12 | { 13 | const int defTimeout = 120 * 60; 14 | const int defEchoMode = 0; 15 | const bool defKeep = false; 16 | 17 | } 18 | 19 | #endif 20 | -------------------------------------------------------------------------------- /src/kcookie.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | 7 | kcookie.cpp: KDE authentication cookies. 8 | */ 9 | 10 | #include "kcookie_p.h" 11 | 12 | #include 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | extern int kdesuDebugArea(); 20 | 21 | namespace KDESu 22 | { 23 | namespace KDESuPrivate 24 | { 25 | class KCookiePrivate 26 | { 27 | public: 28 | QByteArray display; 29 | #if HAVE_X11 30 | QByteArray displayAuth; 31 | #endif 32 | }; 33 | 34 | KCookie::KCookie() 35 | : d(new KCookiePrivate) 36 | { 37 | #if HAVE_X11 38 | getXCookie(); 39 | #endif 40 | } 41 | 42 | KCookie::~KCookie() = default; 43 | 44 | QByteArray KCookie::display() const 45 | { 46 | return d->display; 47 | } 48 | 49 | #if HAVE_X11 50 | QByteArray KCookie::displayAuth() const 51 | { 52 | return d->displayAuth; 53 | } 54 | #endif 55 | 56 | void KCookie::getXCookie() 57 | { 58 | #if HAVE_X11 59 | d->display = qgetenv("DISPLAY"); 60 | if (d->display.isEmpty()) { 61 | // maybe we are on Wayland? 62 | d->display = qgetenv("WAYLAND_DISPLAY"); 63 | if (!d->display.isEmpty()) { 64 | // don't go into the xauth code path 65 | return; 66 | } 67 | } 68 | #else 69 | d->display = qgetenv("QWS_DISPLAY"); 70 | #endif 71 | if (d->display.isEmpty()) { 72 | qCCritical(KSU_LOG) << "[" << __FILE__ << ":" << __LINE__ << "] " 73 | << "$DISPLAY is not set."; 74 | return; 75 | } 76 | #if HAVE_X11 // No need to mess with X Auth stuff 77 | QByteArray disp = d->display; 78 | if (disp.startsWith("localhost:")) { // krazy:exclude=strings 79 | disp.remove(0, 9); 80 | } 81 | 82 | const QString xauthExec = QStandardPaths::findExecutable(QStringLiteral("xauth")); 83 | if (xauthExec.isEmpty()) { 84 | qCCritical(KSU_LOG) << "[" << __FILE__ << ":" << __LINE__ << "] " 85 | << "Could not run xauth, not found in path"; 86 | return; 87 | } 88 | 89 | QProcess proc; 90 | proc.start(xauthExec, QStringList{QStringLiteral("list"), QString::fromUtf8(disp)}); 91 | if (!proc.waitForStarted()) { 92 | qCCritical(KSU_LOG) << "[" << __FILE__ << ":" << __LINE__ << "] " 93 | << "Could not run xauth. Found in path:" << xauthExec; 94 | return; 95 | } 96 | proc.waitForReadyRead(100); 97 | 98 | QByteArray output = proc.readLine().simplified(); 99 | if (output.isEmpty()) { 100 | qCWarning(KSU_LOG) << "No X authentication info set for display" << d->display; 101 | return; 102 | } 103 | 104 | QList lst = output.split(' '); 105 | if (lst.count() != 3) { 106 | qCCritical(KSU_LOG) << "[" << __FILE__ << ":" << __LINE__ << "] " 107 | << "parse error."; 108 | return; 109 | } 110 | d->displayAuth = (lst[1] + ' ' + lst[2]); 111 | proc.waitForFinished(100); // give QProcess a chance to clean up gracefully 112 | #endif 113 | } 114 | 115 | } // namespace KDESuPrivate 116 | } // namespace KDESu 117 | -------------------------------------------------------------------------------- /src/kcookie_p.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | */ 7 | 8 | #ifndef KDESUKCOOKIE_H 9 | #define KDESUKCOOKIE_H 10 | 11 | #include 12 | 13 | #include 14 | 15 | #include 16 | 17 | namespace KDESu 18 | { 19 | namespace KDESuPrivate 20 | { 21 | /*! 22 | * Utility class to access the authentication tokens needed to run a KDE 23 | * program (X11 cookies on X11, for instance). 24 | * \internal 25 | */ 26 | class KCookie 27 | { 28 | public: 29 | KCookie(); 30 | ~KCookie(); 31 | 32 | KCookie(const KCookie &) = delete; 33 | KCookie &operator=(const KCookie &) = delete; 34 | 35 | /*! 36 | * Returns the X11 display. 37 | */ 38 | QByteArray display() const; 39 | 40 | #if HAVE_X11 41 | /*! 42 | * Returns the X11 magic cookie, if available. 43 | */ 44 | QByteArray displayAuth() const; 45 | #endif 46 | 47 | private: 48 | void getXCookie(); 49 | 50 | private: 51 | std::unique_ptr const d; 52 | }; 53 | 54 | } 55 | } 56 | 57 | #endif // KDESUKCOOKIE_H 58 | -------------------------------------------------------------------------------- /src/kdesu-index.qdoc: -------------------------------------------------------------------------------- 1 | /*! 2 | \page kdesu-index.html 3 | \title KDESu 4 | 5 | User interface for running shell commands with root privileges. 6 | 7 | KDESU provides functionality for building GUI front ends for 8 | (password asking) console mode programs. For example, kdesu and 9 | kdessh use it to interface with su and ssh respectively. 10 | 11 | \section1 Using the Module 12 | 13 | \include {module-use.qdocinc} {using the c++ api} 14 | 15 | \section2 Building with CMake 16 | 17 | \include {module-use.qdocinc} {building with cmake} {KF6} {Su} {KF6::Su} 18 | 19 | \section1 API Reference 20 | 21 | \list 22 | \li \l{KDESu C++ Classes} 23 | \endlist 24 | */ 25 | -------------------------------------------------------------------------------- /src/kdesu.qdoc: -------------------------------------------------------------------------------- 1 | /*! 2 | \module KDESu 3 | \title KDESu C++ Classes 4 | \ingroup modules 5 | \cmakepackage KF6 6 | \cmakecomponent Su 7 | 8 | \brief User interface for running shell commands with root privileges. 9 | 10 | KDESU provides functionality for building GUI front ends for 11 | (password asking) console mode programs. For example, kdesu and 12 | kdessh use it to interface with su and ssh respectively. 13 | */ 14 | -------------------------------------------------------------------------------- /src/kdesu.qdocconf: -------------------------------------------------------------------------------- 1 | include($KDE_DOCS/global/qt-module-defaults.qdocconf) 2 | 3 | project = KDESu 4 | description = Additions to Qt Core 5 | 6 | documentationinheaders = true 7 | 8 | headerdirs += . 9 | sourcedirs += . 10 | 11 | excludedirs = kdesud 12 | 13 | outputformats = HTML 14 | 15 | navigation.landingpage = "KDESu" 16 | 17 | depends += \ 18 | kde \ 19 | qtcore \ 20 | qtgui 21 | 22 | qhp.projects = KDESu 23 | 24 | qhp.KDESu.file = kdesu.qhp 25 | qhp.KDESu.namespace = org.kde.kdesu.$QT_VERSION_TAG 26 | qhp.KDESu.virtualFolder = kdesu 27 | qhp.KDESu.indexTitle = KDESu 28 | qhp.KDESu.indexRoot = 29 | 30 | qhp.KDESu.subprojects = classes 31 | qhp.KDESu.subprojects.classes.title = C++ Classes 32 | qhp.KDESu.subprojects.classes.indexTitle = KDESu C++ Classes 33 | qhp.KDESu.subprojects.classes.selectors = class fake:headerfile 34 | qhp.KDESu.subprojects.classes.sortPages = true 35 | 36 | tagfile = kdesu.tags 37 | -------------------------------------------------------------------------------- /src/kdesu_stub.c: -------------------------------------------------------------------------------- 1 | /* 2 | kdesu_stub.c: KDE su executes this stub through su or ssh. This stub in turn 3 | executes the target program. Before that, startup parameters 4 | are sent through stdin. 5 | 6 | This file is part of the KDE project, module kdesu. 7 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 8 | 9 | SPDX-License-Identifier: LGPL-2.0-or-later 10 | 11 | 12 | Available parameters: 13 | 14 | Parameter Description Format (csl = comma separated list) 15 | 16 | - kdesu_stub Header "ok" | "stop" 17 | - display X11 display string 18 | - display_auth X11 authentication "type cookie" pair 19 | - command Command to run string 20 | - path PATH env. var string 21 | - build_sycoca Rebuild sycoca? "yes" | "no" 22 | - user Target user string 23 | - priority Process priority 0 <= int <= 100 24 | - scheduler Process scheduler "fifo" | "normal" 25 | - app_startup_id DESKTOP_STARTUP_ID string 26 | - environment Additional envvars strings, last one is empty 27 | */ 28 | 29 | #include 30 | 31 | #include 32 | #include 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include 38 | #include 39 | 40 | #if HAVE_INITGROUPS 41 | #include 42 | #endif 43 | 44 | #include 45 | #include 46 | #include 47 | #include 48 | #include 49 | 50 | #ifdef POSIX1B_SCHEDULING 51 | #include 52 | #endif 53 | 54 | /*! 55 | * Params sent by the peer. 56 | */ 57 | 58 | struct param_struct { 59 | const char *name; 60 | char *value; 61 | }; 62 | 63 | struct param_struct params[] = {{"kdesu_stub", 0L}, 64 | {"display", 0L}, 65 | {"display_auth", 0L}, 66 | {"command", 0L}, 67 | {"path", 0L}, 68 | {"xwindows_only", 0L}, 69 | {"user", 0L}, 70 | {"priority", 0L}, 71 | {"scheduler", 0L}, 72 | /* obsoleted by app_startup_id { "app_start_pid", 0L } */ 73 | {"app_startup_id", 0L}}; 74 | 75 | #define P_HEADER 0 76 | #define P_DISPLAY 1 77 | #define P_DISPLAY_AUTH 2 78 | #define P_COMMAND 3 79 | #define P_PATH 4 80 | #define P_XWIN_ONLY 5 81 | #define P_USER 6 82 | #define P_PRIORITY 7 83 | #define P_SCHEDULER 8 84 | #define P_APP_STARTUP_ID 9 85 | #define P_LAST 10 86 | 87 | /*! 88 | * Safe malloc functions. 89 | */ 90 | char *xmalloc(size_t size) 91 | { 92 | char *ptr = malloc(size); 93 | if (ptr) { 94 | return ptr; 95 | } 96 | perror("malloc()"); 97 | exit(1); 98 | } 99 | 100 | char **xrealloc(char **ptr, int size) 101 | { 102 | ptr = realloc(ptr, size); 103 | if (ptr) { 104 | return ptr; 105 | } 106 | perror("realloc()"); 107 | exit(1); 108 | } 109 | 110 | /*! 111 | * Solaris does not have a setenv()... 112 | */ 113 | int xsetenv(const char *name, const char *value) 114 | { 115 | char *s = malloc(strlen(name) + strlen(value) + 2); 116 | if (!s) { 117 | return -1; 118 | } 119 | strcpy(s, name); 120 | strcat(s, "="); 121 | strcat(s, value); 122 | return putenv(s); /* yes: no free()! */ 123 | } 124 | 125 | /*! 126 | * Safe strdup and strip newline 127 | */ 128 | char *xstrdup(char *src) 129 | { 130 | int len = strlen(src); 131 | char *dst = xmalloc(len + 1); 132 | strcpy(dst, src); 133 | if (dst[len - 1] == '\n') { 134 | dst[len - 1] = '\000'; 135 | } 136 | return dst; 137 | } 138 | 139 | /*! 140 | * Split comma separated list. 141 | */ 142 | char **xstrsep(char *str) 143 | { 144 | int i = 0; 145 | int size = 10; 146 | char **list = (char **)xmalloc(size * sizeof(char *)); 147 | char *ptr = str; 148 | char *nptr; 149 | while ((nptr = strchr(ptr, ',')) != 0L) { 150 | if (i > size - 2) { 151 | list = xrealloc(list, (size *= 2) * sizeof(char *)); 152 | } 153 | *nptr = '\000'; 154 | list[i++] = ptr; 155 | ptr = nptr + 1; 156 | } 157 | if (*ptr != '\000') { 158 | list[i++] = ptr; 159 | } 160 | list[i] = 0L; 161 | return list; 162 | } 163 | 164 | #define BUFSIZE 8192 165 | 166 | static void dequote(char *buf) 167 | { 168 | char *in; 169 | char *out; 170 | for (in = buf, out = buf; *in; in++, out++) { 171 | char c = *in; 172 | if (c == '\\') { 173 | c = *++in; 174 | if (c == '/') { 175 | *out = '\\'; 176 | } else { 177 | *out = c - '@'; 178 | } 179 | } else { 180 | *out = c; 181 | } 182 | } 183 | *out = 0; 184 | } 185 | 186 | /*! 187 | * The main program 188 | */ 189 | 190 | int main() 191 | { 192 | char buf[BUFSIZE + 1]; 193 | char xauthority[200]; 194 | int i; 195 | int prio; 196 | pid_t pid; 197 | FILE *fout; 198 | struct passwd *pw; 199 | const char *kdesu_lc_all; 200 | 201 | xauthority[0] = '\0'; 202 | 203 | /* Get startup parameters. */ 204 | 205 | for (i = 0; i < P_LAST; i++) { 206 | printf("%s\n", params[i].name); 207 | fflush(stdout); 208 | if (fgets(buf, BUFSIZE, stdin) == 0L) { 209 | printf("end\n"); 210 | fflush(stdout); 211 | perror("kdesu_stub: fgets()"); 212 | exit(1); 213 | } 214 | params[i].value = xstrdup(buf); 215 | /* Installation check? */ 216 | if (i == 0 && !strcmp(params[i].value, "stop")) { 217 | printf("end\n"); 218 | exit(0); 219 | } 220 | } 221 | printf("environment\n"); 222 | fflush(stdout); 223 | for (;;) { 224 | char *tmp; 225 | if (fgets(buf, BUFSIZE, stdin) == 0L) { 226 | printf("end\n"); 227 | fflush(stdout); 228 | perror("kdesu_stub: fgets()"); 229 | exit(1); 230 | } 231 | dequote(buf); 232 | tmp = xstrdup(buf); 233 | if (tmp[0] == '\0') { /* terminator */ 234 | break; 235 | } 236 | putenv(tmp); 237 | } 238 | 239 | printf("end\n"); 240 | fflush(stdout); 241 | 242 | xsetenv("PATH", params[P_PATH].value); 243 | xsetenv("DESKTOP_STARTUP_ID", params[P_APP_STARTUP_ID].value); 244 | 245 | kdesu_lc_all = getenv("KDESU_LC_ALL"); 246 | if (kdesu_lc_all != NULL) { 247 | xsetenv("LC_ALL", kdesu_lc_all); 248 | } else { 249 | unsetenv("LC_ALL"); 250 | } 251 | 252 | unsetenv("XDG_RUNTIME_DIR"); 253 | 254 | /* Do we need to change uid? */ 255 | 256 | pw = getpwnam(params[P_USER].value); 257 | if (pw == 0L) { 258 | printf("kdesu_stub: user %s does not exist!\n", params[P_USER].value); 259 | exit(1); 260 | } 261 | xsetenv("HOME", pw->pw_dir); 262 | 263 | /* New user won't be able to connect it anyway. */ 264 | unsetenv("DBUS_SESSION_BUS_ADDRESS"); 265 | 266 | /* Set scheduling/priority */ 267 | 268 | prio = atoi(params[P_PRIORITY].value); 269 | if (!strcmp(params[P_SCHEDULER].value, "realtime")) { 270 | #ifdef POSIX1B_SCHEDULING 271 | struct sched_param sched; 272 | int min = sched_get_priority_min(SCHED_FIFO); 273 | int max = sched_get_priority_max(SCHED_FIFO); 274 | sched.sched_priority = min + (int)(((double)prio) * (max - min) / 100 + 0.5); 275 | sched_setscheduler(0, SCHED_FIFO, &sched); 276 | #else 277 | printf("kdesu_stub: realtime scheduling not supported\n"); 278 | #endif 279 | } else { 280 | #if HAVE_SETPRIORITY 281 | int val = 20 - (int)(((double)prio) * 40 / 100 + 0.5); 282 | setpriority(PRIO_PROCESS, getpid(), val); 283 | #endif 284 | } 285 | 286 | /* Drop privileges (this is permanent) */ 287 | 288 | if (getuid() != pw->pw_uid) { 289 | if (setgid(pw->pw_gid) == -1) { 290 | perror("kdesu_stub: setgid()"); 291 | exit(1); 292 | } 293 | #if HAVE_INITGROUPS 294 | if (initgroups(pw->pw_name, pw->pw_gid) == -1) { 295 | perror("kdesu_stub: initgroups()"); 296 | exit(1); 297 | } 298 | #endif 299 | if (setuid(pw->pw_uid) == -1) { 300 | perror("kdesu_stub: setuid()"); 301 | exit(1); 302 | } 303 | xsetenv("HOME", pw->pw_dir); 304 | } 305 | 306 | /* Handle display */ 307 | 308 | if (strcmp(params[P_DISPLAY].value, "no")) { 309 | xsetenv("DISPLAY", params[P_DISPLAY].value); 310 | if (params[P_DISPLAY_AUTH].value[0]) { 311 | int fd2; 312 | /* 313 | ** save umask and set to 077, so we create those files only 314 | ** readable for root. (if someone else could read them, we 315 | ** are in deep shit). 316 | */ 317 | int oldumask = umask(077); 318 | const char *disp = params[P_DISPLAY].value; 319 | if (strncmp(disp, "localhost:", 10) == 0) { 320 | disp += 9; 321 | } 322 | 323 | strcpy(xauthority, "/tmp/xauth.XXXXXXXXXX"); 324 | fd2 = mkstemp(xauthority); 325 | umask(oldumask); 326 | 327 | if (fd2 == -1) { 328 | perror("kdesu_stub: mkstemp()"); 329 | exit(1); 330 | } else { 331 | close(fd2); 332 | } 333 | xsetenv("XAUTHORITY", xauthority); 334 | 335 | fout = popen("xauth >/dev/null 2>&1", "w"); 336 | if (fout == NULL) { 337 | perror("kdesu_stub: popen(xauth)"); 338 | exit(1); 339 | } 340 | fprintf(fout, "add %s %s\n", disp, params[P_DISPLAY_AUTH].value); 341 | pclose(fout); 342 | } 343 | } 344 | 345 | /* Rebuild the sycoca and start kdeinit? */ 346 | 347 | if (strcmp(params[P_XWIN_ONLY].value, "no")) { 348 | system("kdeinit5 --suicide"); 349 | } 350 | 351 | /* Execute the command */ 352 | 353 | pid = fork(); 354 | if (pid == -1) { 355 | perror("kdesu_stub: fork()"); 356 | exit(1); 357 | } 358 | if (pid) { 359 | /* Parent: wait for child, delete tempfiles and return. */ 360 | int ret; 361 | int state; 362 | int xit = 1; 363 | while (1) { 364 | ret = waitpid(pid, &state, 0); 365 | if (ret == -1) { 366 | if (errno == EINTR) { 367 | continue; 368 | } 369 | if (errno != ECHILD) { 370 | perror("kdesu_stub: waitpid()"); 371 | } 372 | break; 373 | } 374 | if (WIFEXITED(state)) { 375 | xit = WEXITSTATUS(state); 376 | } 377 | } 378 | 379 | if (*xauthority) { 380 | unlink(xauthority); 381 | } 382 | exit(xit); 383 | } else { 384 | setsid(); 385 | /* Child: exec command. */ 386 | sprintf(buf, "%s", params[P_COMMAND].value); 387 | dequote(buf); 388 | execl("/bin/sh", "sh", "-c", buf, (void *)0); 389 | perror("kdesu_stub: exec()"); 390 | _exit(1); 391 | } 392 | } 393 | -------------------------------------------------------------------------------- /src/kdesud/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | include(CheckFunctionExists) 2 | check_function_exists(getpeereid HAVE_GETPEEREID) # openbsd style 3 | check_function_exists(getpeereucred HAVE_GETPEERUCRED) # solaris style 4 | 5 | check_symbol_exists(close_range "unistd.h" HAVE_CLOSE_RANGE) 6 | 7 | configure_file (config-kdesud.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kdesud.h ) 8 | 9 | add_executable(kdesud) 10 | ecm_mark_nongui_executable(kdesud) 11 | 12 | target_sources(kdesud PRIVATE 13 | kdesud.cpp 14 | repo.cpp 15 | lexer.cpp 16 | handler.cpp 17 | secure.cpp 18 | ) 19 | 20 | ecm_qt_declare_logging_category(kdesud 21 | HEADER ksud_debug.h 22 | IDENTIFIER KSUD_LOG 23 | CATEGORY_NAME kf.su.kdesud 24 | DESCRIPTION "kdesud (KDESu)" 25 | EXPORT KSU 26 | ) 27 | 28 | target_link_libraries(kdesud KF6::Su KF6::I18n ${X11_LIBRARIES}) 29 | if(HAVE_X11) 30 | target_include_directories(kdesud PRIVATE ${X11_X11_INCLUDE_PATH}) 31 | endif() 32 | 33 | if(BUILD_TESTING) 34 | add_subdirectory(autotests) 35 | endif() 36 | 37 | ########### install files ############### 38 | 39 | install(TARGETS kdesud DESTINATION ${KDE_INSTALL_LIBEXECDIR_KF}) 40 | 41 | -------------------------------------------------------------------------------- /src/kdesud/Messages.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | $XGETTEXT *.cpp -o $podir/kdesud6.pot 3 | -------------------------------------------------------------------------------- /src/kdesud/autotests/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | include(ECMAddTests) 2 | find_package(Qt6Test REQUIRED) 3 | configure_file(config-kdesudtest.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kdesudtest.h) 4 | ecm_add_test(kdesudtest.cpp ../lexer.cpp TEST_NAME kdesudtest LINK_LIBRARIES Qt6::Test KF6::CoreAddons KF6::ConfigCore) 5 | -------------------------------------------------------------------------------- /src/kdesud/autotests/config-kdesudtest.h.cmake: -------------------------------------------------------------------------------- 1 | #define CMAKE_HOME_DIRECTORY "${CMAKE_HOME_DIRECTORY}" 2 | #define CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" 3 | -------------------------------------------------------------------------------- /src/kdesud/autotests/kdesudtest.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | SPDX-FileCopyrightText: 2020 Aleksei Nikiforov 3 | 4 | SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 5 | */ 6 | 7 | #include "config-kdesudtest.h" 8 | 9 | #include 10 | #include 11 | 12 | #include "../lexer.h" 13 | 14 | namespace KDESu 15 | { 16 | class KdeSudTest : public QObject 17 | { 18 | Q_OBJECT 19 | private Q_SLOTS: 20 | void initTestCase() 21 | { 22 | } 23 | 24 | // copy of KDESu::Client::escape 25 | QByteArray escape(const QByteArray &str) 26 | { 27 | QByteArray copy; 28 | copy.reserve(str.size() + 4); 29 | copy.append('"'); 30 | for (const uchar c : str) { 31 | if (c < 32) { 32 | copy.append('\\'); 33 | copy.append('^'); 34 | copy.append(c + '@'); 35 | } else { 36 | if (c == '\\' || c == '"') { 37 | copy.append('\\'); 38 | } 39 | copy.append(c); 40 | } 41 | } 42 | copy.append('"'); 43 | return copy; 44 | } 45 | 46 | void commandWithDoubleQuotes() 47 | { 48 | // Process command like in KDESu::Client::exec 49 | QByteArray cmd; 50 | cmd = "EXEC "; 51 | cmd += escape("bash -c \"ls -la\""); 52 | cmd += ' '; 53 | cmd += escape("testuser"); 54 | cmd += '\n'; 55 | 56 | // Now handle command like in ConnectionHandler::doCommand 57 | Lexer l(cmd); 58 | QVERIFY(l.lex() == Lexer::Tok_exec); 59 | 60 | QVERIFY(l.lex() == Lexer::Tok_str); 61 | QVERIFY(l.lval() == "bash -c \"ls -la\""); 62 | 63 | QVERIFY(l.lex() == Lexer::Tok_str); 64 | QVERIFY(l.lval() == "testuser"); 65 | 66 | QVERIFY(l.lex() == '\n'); 67 | } 68 | }; 69 | } 70 | 71 | #include 72 | QTEST_MAIN(KDESu::KdeSudTest) 73 | -------------------------------------------------------------------------------- /src/kdesud/config-kdesud.h.cmake: -------------------------------------------------------------------------------- 1 | /* config-kdesud.h. Generated by cmake from config-kdesud.h.cmake */ 2 | 3 | /* Define to 1 if you have the `getpeereid' function. */ 4 | #cmakedefine01 HAVE_GETPEEREID 5 | 6 | /* Define to 1 if you have the `getpeerucred' function. */ 7 | #cmakedefine01 HAVE_GETPEERUCRED 8 | 9 | #cmakedefine01 HAVE_CLOSE_RANGE 10 | -------------------------------------------------------------------------------- /src/kdesud/handler.h: -------------------------------------------------------------------------------- 1 | /* vi: ts=8 sts=4 sw=4 2 | 3 | This file is part of the KDE project, module kdesu. 4 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 5 | */ 6 | 7 | #ifndef __Handler_h_included__ 8 | #define __Handler_h_included__ 9 | 10 | #include 11 | 12 | #include "secure.h" 13 | #include 14 | 15 | /*! 16 | * A ConnectionHandler handles a client. It is called from the main program 17 | * loop whenever there is data to read from a corresponding socket. 18 | * It keeps reading data until a newline is read. Then, a command is parsed 19 | * and executed. 20 | */ 21 | 22 | class ConnectionHandler : public SocketSecurity 23 | { 24 | public: 25 | ConnectionHandler(int fd); 26 | ~ConnectionHandler(); 27 | 28 | ConnectionHandler(const ConnectionHandler &) = delete; 29 | ConnectionHandler &operator=(const ConnectionHandler &) = delete; 30 | 31 | /*! Handle incoming data. */ 32 | int handle(); 33 | 34 | /* Send back exit code. */ 35 | void sendExitCode(); 36 | 37 | private: 38 | enum Results { 39 | Res_OK, 40 | Res_NO, 41 | }; 42 | 43 | int doCommand(QByteArray buf); 44 | void respond(int ok, const QByteArray &s = QByteArray()); 45 | QByteArray makeKey(int namspace, const QByteArray &s1, const QByteArray &s2 = QByteArray(), const QByteArray &s3 = QByteArray()) const; 46 | 47 | int m_Fd, m_Timeout; 48 | int m_Priority, m_Scheduler; 49 | QByteArray m_Buf, m_Pass, m_Host; 50 | 51 | public: 52 | int m_exitCode; 53 | bool m_hasExitCode; 54 | bool m_needExitCode; 55 | pid_t m_pid; 56 | }; 57 | 58 | #endif 59 | -------------------------------------------------------------------------------- /src/kdesud/lexer.cpp: -------------------------------------------------------------------------------- 1 | /* vi: ts=8 sts=4 sw=4 2 | 3 | This file is part of the KDE project, module kdesu. 4 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 5 | 6 | lexer.cpp: A lexer for the kdesud protocol. See kdesud.cpp for a 7 | description of the protocol. 8 | */ 9 | 10 | #include "lexer.h" 11 | 12 | #include 13 | 14 | Lexer::Lexer(const QByteArray &input) 15 | { 16 | m_Input = input; 17 | in = 0; 18 | } 19 | 20 | Lexer::~Lexer() 21 | { 22 | // Erase buffers 23 | m_Input.fill('x'); 24 | m_Output.fill('x'); 25 | } 26 | 27 | QByteArray &Lexer::lval() 28 | { 29 | return m_Output; 30 | } 31 | 32 | /* 33 | * lex() is the lexer. There is no end-of-input check here so that has to be 34 | * done by the caller. 35 | */ 36 | 37 | int Lexer::lex() 38 | { 39 | char c; 40 | 41 | c = m_Input[in++]; 42 | m_Output.fill('x'); 43 | m_Output.resize(0); 44 | 45 | while (1) { 46 | // newline? 47 | if (c == '\n') { 48 | return '\n'; 49 | } 50 | 51 | // No control characters 52 | if (iscntrl(c)) { 53 | return Tok_none; 54 | } 55 | 56 | if (isspace(c)) { 57 | while (isspace(c = m_Input[in++])) { 58 | ; 59 | } 60 | } 61 | 62 | // number? 63 | if (isdigit(c)) { 64 | m_Output += c; 65 | while (isdigit(c = m_Input[in++])) { 66 | m_Output += c; 67 | } 68 | in--; 69 | return Tok_num; 70 | } 71 | 72 | // quoted string? 73 | if (c == '"') { 74 | c = m_Input[in++]; 75 | while ((c != '"') && !iscntrl(c)) { 76 | // handle escaped characters 77 | if (c == '\\') { 78 | c = m_Input[in++]; 79 | if (iscntrl(c)) { 80 | return Tok_none; 81 | } 82 | if (c == '^') { 83 | c = m_Input[in++]; 84 | if ((c == '"') || iscntrl(c)) { 85 | return Tok_none; 86 | } 87 | m_Output += c - '@'; 88 | } else { 89 | m_Output += c; 90 | } 91 | } else { 92 | m_Output += c; 93 | } 94 | c = m_Input[in++]; 95 | } 96 | if (c == '"') { 97 | return Tok_str; 98 | } 99 | return Tok_none; 100 | } 101 | 102 | // normal string 103 | while (!isspace(c) && !iscntrl(c)) { 104 | m_Output += c; 105 | c = m_Input[in++]; 106 | } 107 | in--; 108 | 109 | // command? 110 | if (m_Output.length() <= 4) { 111 | if (m_Output == "EXEC") { 112 | return Tok_exec; 113 | } 114 | if (m_Output == "PASS") { 115 | return Tok_pass; 116 | } 117 | if (m_Output == "DEL") { 118 | return Tok_delCmd; 119 | } 120 | if (m_Output == "PING") { 121 | return Tok_ping; 122 | } 123 | if (m_Output == "EXIT") { 124 | return Tok_exit; 125 | } 126 | if (m_Output == "STOP") { 127 | return Tok_stop; 128 | } 129 | if (m_Output == "SET") { 130 | return Tok_set; 131 | } 132 | if (m_Output == "GET") { 133 | return Tok_get; 134 | } 135 | if (m_Output == "HOST") { 136 | return Tok_host; 137 | } 138 | if (m_Output == "SCHD") { 139 | return Tok_sched; 140 | } 141 | if (m_Output == "PRIO") { 142 | return Tok_prio; 143 | } 144 | if (m_Output == "DELV") { 145 | return Tok_delVar; 146 | } 147 | if (m_Output == "DELG") { 148 | return Tok_delGroup; 149 | } 150 | if (m_Output == "DELS") { 151 | return Tok_delSpecialKey; 152 | } 153 | if (m_Output == "GETK") { 154 | return Tok_getKeys; 155 | } 156 | if (m_Output == "CHKG") { 157 | return Tok_chkGroup; 158 | } 159 | } 160 | 161 | return Tok_str; 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /src/kdesud/lexer.h: -------------------------------------------------------------------------------- 1 | /* vi: ts=8 sts=4 sw=4 2 | 3 | This file is part of the KDE project, module kdesu. 4 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 5 | */ 6 | 7 | #ifndef __Lexer_h_included__ 8 | #define __Lexer_h_included__ 9 | 10 | #include 11 | 12 | /*! 13 | * This is a lexer for the kdesud protocol. 14 | */ 15 | 16 | class Lexer 17 | { 18 | public: 19 | Lexer(const QByteArray &input); 20 | ~Lexer(); 21 | 22 | Lexer(const Lexer &) = delete; 23 | Lexer &operator=(const Lexer &) = delete; 24 | 25 | /*! Read next token. */ 26 | int lex(); 27 | 28 | /*! Return the token's value. */ 29 | QByteArray &lval(); 30 | 31 | enum Tokens { 32 | Tok_none, 33 | Tok_exec = 256, 34 | Tok_pass, 35 | Tok_delCmd, 36 | Tok_ping, 37 | Tok_str, 38 | Tok_num, 39 | Tok_stop, 40 | Tok_set, 41 | Tok_get, 42 | Tok_delVar, 43 | Tok_delGroup, 44 | Tok_host, 45 | Tok_prio, 46 | Tok_sched, 47 | Tok_getKeys, 48 | Tok_chkGroup, 49 | Tok_delSpecialKey, 50 | Tok_exit, 51 | }; 52 | 53 | private: 54 | QByteArray m_Input; 55 | QByteArray m_Output; 56 | 57 | int in; 58 | }; 59 | 60 | #endif 61 | -------------------------------------------------------------------------------- /src/kdesud/repo.cpp: -------------------------------------------------------------------------------- 1 | /* vi: ts=8 sts=4 sw=4 2 | 3 | This file is part of the KDE project, module kdesu. 4 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 5 | */ 6 | 7 | #include "repo.h" 8 | 9 | #include 10 | 11 | #include 12 | #include 13 | 14 | #include 15 | 16 | Repository::Repository() 17 | { 18 | head_time = (unsigned)-1; 19 | } 20 | 21 | Repository::~Repository() 22 | { 23 | } 24 | 25 | void Repository::add(const QByteArray &key, Data_entry &data) 26 | { 27 | RepoIterator it = repo.find(key); 28 | if (it != repo.end()) { 29 | remove(key); 30 | } 31 | if (data.timeout == 0) { 32 | data.timeout = (unsigned)-1; 33 | } else { 34 | data.timeout += time(nullptr); 35 | } 36 | head_time = qMin(head_time, data.timeout); 37 | repo.insert(key, data); 38 | } 39 | 40 | int Repository::remove(const QByteArray &key) 41 | { 42 | if (key.isEmpty()) { 43 | return -1; 44 | } 45 | 46 | RepoIterator it = repo.find(key); 47 | if (it == repo.end()) { 48 | return -1; 49 | } 50 | it.value().value.fill('x'); 51 | it.value().group.fill('x'); 52 | repo.erase(it); 53 | return 0; 54 | } 55 | 56 | int Repository::removeSpecialKey(const QByteArray &key) 57 | { 58 | int found = -1; 59 | if (!key.isEmpty()) { 60 | QStack rm_keys; 61 | for (RepoCIterator it = repo.constBegin(); it != repo.constEnd(); ++it) { 62 | if (key.indexOf(it.value().group) == 0 && it.key().indexOf(key) >= 0) { 63 | rm_keys.push(it.key()); 64 | found = 0; 65 | } 66 | } 67 | while (!rm_keys.isEmpty()) { 68 | qCDebug(KSUD_LOG) << "Removed key: " << rm_keys.top(); 69 | remove(rm_keys.pop()); 70 | } 71 | } 72 | return found; 73 | } 74 | 75 | int Repository::removeGroup(const QByteArray &group) 76 | { 77 | int found = -1; 78 | if (!group.isEmpty()) { 79 | QStack rm_keys; 80 | for (RepoCIterator it = repo.constBegin(); it != repo.constEnd(); ++it) { 81 | if (it.value().group == group) { 82 | rm_keys.push(it.key()); 83 | found = 0; 84 | } 85 | } 86 | while (!rm_keys.isEmpty()) { 87 | qCDebug(KSUD_LOG) << "Removed key: " << rm_keys.top(); 88 | remove(rm_keys.pop()); 89 | } 90 | } 91 | return found; 92 | } 93 | 94 | int Repository::hasGroup(const QByteArray &group) const 95 | { 96 | if (!group.isEmpty()) { 97 | RepoCIterator it; 98 | for (it = repo.begin(); it != repo.end(); ++it) { 99 | if (it.value().group == group) { 100 | return 0; 101 | } 102 | } 103 | } 104 | return -1; 105 | } 106 | 107 | QByteArray Repository::findKeys(const QByteArray &group, const char *sep) const 108 | { 109 | QByteArray list = ""; 110 | if (!group.isEmpty()) { 111 | qCDebug(KSUD_LOG) << "Looking for matching key with group key: " << group; 112 | int pos; 113 | QByteArray key; 114 | RepoCIterator it; 115 | for (it = repo.begin(); it != repo.end(); ++it) { 116 | if (it.value().group == group) { 117 | key = it.key(); 118 | qCDebug(KSUD_LOG) << "Matching key found: " << key; 119 | pos = key.lastIndexOf(sep); 120 | key.truncate(pos); 121 | key.remove(0, 2); 122 | if (!list.isEmpty()) { 123 | // Add the same keys only once please :) 124 | if (!list.contains(key)) { 125 | qCDebug(KSUD_LOG) << "Key added to list: " << key; 126 | list += '\007'; // I do not know 127 | list.append(key); 128 | } 129 | } else { 130 | list = key; 131 | } 132 | } 133 | } 134 | } 135 | return list; 136 | } 137 | 138 | QByteArray Repository::find(const QByteArray &key) const 139 | { 140 | if (key.isEmpty()) { 141 | return nullptr; 142 | } 143 | 144 | RepoCIterator it = repo.find(key); 145 | if (it == repo.end()) { 146 | return nullptr; 147 | } 148 | return it.value().value; 149 | } 150 | 151 | int Repository::expire() 152 | { 153 | unsigned current = time(nullptr); 154 | if (current < head_time) { 155 | return 0; 156 | } 157 | 158 | unsigned t; 159 | QStack keys; 160 | head_time = (unsigned)-1; 161 | RepoIterator it; 162 | for (it = repo.begin(); it != repo.end(); ++it) { 163 | t = it.value().timeout; 164 | if (t <= current) { 165 | keys.push(it.key()); 166 | } else { 167 | head_time = qMin(head_time, t); 168 | } 169 | } 170 | 171 | int n = keys.count(); 172 | while (!keys.isEmpty()) { 173 | remove(keys.pop()); 174 | } 175 | return n; 176 | } 177 | -------------------------------------------------------------------------------- /src/kdesud/repo.h: -------------------------------------------------------------------------------- 1 | /* vi: ts=8 sts=4 sw=4 2 | 3 | This file is part of the KDE project, module kdesu. 4 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 5 | */ 6 | 7 | #ifndef __Repo_h_included__ 8 | #define __Repo_h_included__ 9 | 10 | #include 11 | #include 12 | 13 | /*! 14 | * Used internally. 15 | */ 16 | struct Data_entry { 17 | QByteArray value; 18 | QByteArray group; 19 | unsigned int timeout; 20 | }; 21 | 22 | /*! 23 | * String repository. 24 | * 25 | * This class implements a string repository with expiration. 26 | */ 27 | class Repository 28 | { 29 | public: 30 | Repository(); 31 | ~Repository(); 32 | 33 | /*! Remove data elements which are expired. */ 34 | int expire(); 35 | 36 | /*! Add a data element */ 37 | void add(const QByteArray &key, Data_entry &data); 38 | 39 | /*! Delete a data element. */ 40 | int remove(const QByteArray &key); 41 | 42 | /*! Delete all data entries having the given group. */ 43 | int removeGroup(const QByteArray &group); 44 | 45 | /*! Delete all data entries based on key. */ 46 | int removeSpecialKey(const QByteArray &key); 47 | 48 | /*! Checks for the existence of the specified group. */ 49 | int hasGroup(const QByteArray &group) const; 50 | 51 | /*! Return a data value. */ 52 | QByteArray find(const QByteArray &key) const; 53 | 54 | /*! Returns the key values for the given group. */ 55 | QByteArray findKeys(const QByteArray &group, const char *sep = "-") const; 56 | 57 | private: 58 | QMap repo; 59 | typedef QMap::Iterator RepoIterator; 60 | typedef QMap::ConstIterator RepoCIterator; 61 | unsigned head_time; 62 | }; 63 | 64 | #endif 65 | -------------------------------------------------------------------------------- /src/kdesud/secure.cpp: -------------------------------------------------------------------------------- 1 | /* vi: ts=8 sts=4 sw=4 2 | * 3 | This file is part of the KDE project, module kdesu. 4 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 5 | 6 | secure.cpp: Peer credentials for a UNIX socket. 7 | */ 8 | 9 | #include "secure.h" 10 | 11 | #include 12 | #include 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | #include 21 | 22 | // FIXME: This is just here to make it compile (since ksock* was removed from kdelibs). 23 | // It would be better to fix it more globally. (Caleb Tennis) 24 | typedef unsigned ksocklen_t; 25 | 26 | /*! 27 | * Under Linux, Socket_security is supported. 28 | */ 29 | 30 | #if HAVE_GETPEEREID 31 | 32 | SocketSecurity::SocketSecurity(int sockfd) 33 | : pid(-1) 34 | , gid(-1) 35 | , uid(-1) 36 | { 37 | uid_t euid; 38 | gid_t egid; 39 | if (getpeereid(sockfd, &euid, &egid) == 0) { 40 | uid = euid; 41 | gid = egid; 42 | pid = -1; 43 | } 44 | } 45 | 46 | #elif HAVE_GETPEERUCRED 47 | 48 | #include 49 | 50 | SocketSecurity::SocketSecurity(int sockfd) 51 | : pid(-1) 52 | , gid(-1) 53 | , uid(-1) 54 | { 55 | ucred_t *ucred = 0; 56 | 57 | if (getpeerucred(sockfd, &ucred) == 0) { 58 | uid = ucred_geteuid(ucred); 59 | gid = ucred_getrgid(ucred); 60 | pid = -1; 61 | ucred_free(ucred); 62 | } 63 | } 64 | 65 | #elif defined(SO_PEERCRED) 66 | 67 | SocketSecurity::SocketSecurity(int sockfd) 68 | : pid(-1) 69 | , gid(-1) 70 | , uid(-1) 71 | { 72 | ucred cred; 73 | ksocklen_t len = sizeof(struct ucred); 74 | if (getsockopt(sockfd, SOL_SOCKET, SO_PEERCRED, &cred, &len) < 0) { 75 | qCCritical(KSUD_LOG) << "getsockopt(SO_PEERCRED) " << strerror(errno); 76 | return; 77 | } 78 | pid = cred.pid; 79 | gid = cred.gid; 80 | uid = cred.uid; 81 | } 82 | 83 | #else 84 | #ifdef __GNUC__ 85 | #warning SocketSecurity support for your platform not implemented/available! 86 | #endif 87 | /*! 88 | * The default version does nothing. 89 | */ 90 | 91 | SocketSecurity::SocketSecurity(int sockfd) 92 | : pid(-1) 93 | , gid(-1) 94 | , uid(-1) 95 | { 96 | static bool warned_him = false; 97 | 98 | if (!warned_him) { 99 | qCWarning(KSUD_LOG) << "Using void socket security. Please add support for your"; 100 | qCWarning(KSUD_LOG) << "platform to src/kdesud/secure.cpp"; 101 | warned_him = true; 102 | } 103 | 104 | // This passes the test made in handler.cpp 105 | uid = getuid(); 106 | } 107 | 108 | #endif 109 | -------------------------------------------------------------------------------- /src/kdesud/secure.h: -------------------------------------------------------------------------------- 1 | /* vi: ts=8 sts=4 sw=4 2 | 3 | This file is part of the KDE project, module kdesu. 4 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 5 | */ 6 | 7 | #ifndef __Secure_h_included__ 8 | #define __Secure_h_included__ 9 | 10 | #include 11 | #include 12 | 13 | /*! 14 | * The Socket_security class authenticates the peer for you. It provides 15 | * the process-id, user-id and group-id plus the MD5 sum of the connected 16 | * binary. 17 | */ 18 | 19 | class SocketSecurity 20 | { 21 | public: 22 | explicit SocketSecurity(int fd); 23 | 24 | /*! Returns the peer's process-id. */ 25 | int peerPid() const 26 | { 27 | return pid; 28 | } 29 | 30 | /*! Returns the peer's user-id */ 31 | int peerUid() const 32 | { 33 | return uid; 34 | } 35 | 36 | /*! Returns the peer's group-id */ 37 | int peerGid() const 38 | { 39 | return gid; 40 | } 41 | 42 | private: 43 | int pid; 44 | int gid; 45 | int uid; 46 | }; 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /src/ptyprocess.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | */ 7 | 8 | #ifndef KDESUPTYPROCESS_H 9 | #define KDESUPTYPROCESS_H 10 | 11 | #include 12 | #include 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #include 20 | 21 | #include 22 | 23 | namespace KDESu 24 | { 25 | class PtyProcessPrivate; 26 | 27 | /*! 28 | * \class KDESu::PtyProcess 29 | * \inmodule KDESu 30 | * \inheaderfile KDESu/PtyProcess 31 | * 32 | * \brief Synchronous communication with tty programs. 33 | * 34 | * PtyProcess provides synchronous communication with tty based programs. 35 | * The communications channel used is a pseudo tty (as opposed to a pipe) 36 | * This means that programs which require a terminal will work. 37 | */ 38 | class KDESU_EXPORT PtyProcess 39 | { 40 | public: 41 | /*! 42 | * Error return values for checkPidExited() 43 | * 44 | * \value Error No child 45 | * \value NotExited Child hasn't exited 46 | * \value Killed Child terminated by signal 47 | */ 48 | enum checkPidStatus { 49 | Error = -1, 50 | NotExited = -2, 51 | Killed = -3, 52 | }; 53 | 54 | PtyProcess(); 55 | virtual ~PtyProcess(); 56 | 57 | /*! 58 | * Forks off and execute a command. 59 | * 60 | * The command's standard in and output 61 | * are connected to the pseudo tty. They are accessible with readLine 62 | * and writeLine. 63 | * 64 | * \a command The command to execute. 65 | * 66 | * \a args The arguments to the command. 67 | * 68 | * Returns 0 on success, -1 on error. errno might give more information then. 69 | */ 70 | int exec(const QByteArray &command, const QList &args); 71 | 72 | /*! 73 | * Reads a line from the program's standard out. Depending on the \a block 74 | * parameter, this call blocks until something was read. 75 | * 76 | * Note that in some situations this function will return less than a full 77 | * line of output, but never more. Newline characters are stripped. 78 | * 79 | * \a block Block until a full line is read? 80 | * 81 | * Returns the output string. 82 | */ 83 | QByteArray readLine(bool block = true); 84 | 85 | /*! 86 | * Read all available output from the program's standard out. 87 | * 88 | * \a block If no output is in the buffer, should the function block 89 | * (else it will return an empty QByteArray)? 90 | * 91 | * Returns the output. 92 | */ 93 | QByteArray readAll(bool block = true); 94 | 95 | /*! 96 | * Writes a line of text to the program's standard in. 97 | * 98 | * \a line The text to write. 99 | * 100 | * \a addNewline Adds a '\n' to the line. 101 | */ 102 | void writeLine(const QByteArray &line, bool addNewline = true); 103 | 104 | /*! 105 | * Puts back a line of input. 106 | * 107 | * \a line The line to put back. 108 | * 109 | * \a addNewline Adds a '\n' to the line. 110 | */ 111 | void unreadLine(const QByteArray &line, bool addNewline = true); 112 | 113 | /*! 114 | * Sets the exit string. If a line of program output matches this, 115 | * waitForChild() will terminate the program and return. 116 | */ 117 | void setExitString(const QByteArray &exit); 118 | 119 | /*! 120 | * Waits for the child to exit. See also setExitString. 121 | */ 122 | int waitForChild(); 123 | 124 | /*! 125 | * Waits until the pty has cleared the ECHO flag. This is useful 126 | * when programs write a password prompt before they disable ECHO. 127 | * Disabling it might flush any input that was written. 128 | */ 129 | int waitSlave(); 130 | 131 | /*! 132 | * Enables/disables local echo on the pseudo tty. 133 | */ 134 | int enableLocalEcho(bool enable = true); 135 | 136 | /*! 137 | * Enables/disables terminal output. Relevant only to some subclasses. 138 | */ 139 | void setTerminal(bool terminal); 140 | 141 | /*! 142 | * Overwrites the password as soon as it is used. Relevant only to 143 | * some subclasses. 144 | */ 145 | void setErase(bool erase); 146 | 147 | /*! 148 | * Set additinal environment variables. 149 | */ 150 | void setEnvironment(const QList &env); 151 | 152 | /*! 153 | * Returns the filedescriptor of the process. 154 | */ 155 | int fd() const; 156 | 157 | /*! 158 | * Returns the pid of the process. 159 | */ 160 | int pid() const; 161 | 162 | /* 163 | * This is a collection of static functions that can be 164 | * used for process control inside kdesu. I'd suggest 165 | * against using this publicly. There are probably 166 | * nicer Qt based ways to do what you want. 167 | */ 168 | 169 | /*! 170 | * Wait \a ms milliseconds (ie. 1/10th of a second is 100ms), 171 | * using \a fd as a filedescriptor to wait on. 172 | * 173 | * Returns 174 | * select(2)'s result, which is -1 on error, 0 on timeout, 175 | * or positive if there is data on one of the selected fd's. 176 | * 177 | * \a ms must be in the range 0..999 (i.e. the maximum wait 178 | * duration is 999ms, almost one second). 179 | */ 180 | static int waitMS(int fd, int ms); 181 | 182 | /*! 183 | * Basic check for the existence of \a pid. 184 | * 185 | * Returns true iff \a pid is an extant process, 186 | * (one you could kill - see man kill(2) for signal 0). 187 | */ 188 | static bool checkPid(pid_t pid); 189 | 190 | /*! 191 | * Check process exit status for process \a pid. 192 | * 193 | * If child \a pid has exited, return its exit status, 194 | * (which may be zero). 195 | * 196 | * On error (no child, no exit), return -1. 197 | * 198 | * If child \a has not exited, return -2. 199 | */ 200 | static int checkPidExited(pid_t pid); 201 | 202 | protected: 203 | KDESU_NO_EXPORT explicit PtyProcess(PtyProcessPrivate &dd); 204 | 205 | /* Standard hack to add virtual methods in a BC way. Unused. */ 206 | virtual void virtual_hook(int id, void *data); 207 | QList environment() const; 208 | 209 | // KF6 TODO: move to PtyProcessPrivate 210 | bool m_erase; 211 | bool m_terminal; /* Indicates running in a terminal, causes additional 212 | newlines to be printed after output. Set to @c false 213 | in constructors */ 214 | int m_pid; /* PID of child process */ 215 | QByteArray m_command; /* Unused */ 216 | QByteArray m_exitString; /* String to scan for in output that indicates child has exited. */ 217 | 218 | private: 219 | KDESU_NO_EXPORT int init(); 220 | KDESU_NO_EXPORT int setupTTY(); 221 | 222 | protected: 223 | std::unique_ptr const d_ptr; 224 | 225 | private: 226 | Q_DECLARE_PRIVATE(PtyProcess) 227 | }; 228 | 229 | } 230 | 231 | #endif // KDESUPTYPROCESS_H 232 | -------------------------------------------------------------------------------- /src/ptyprocess_p.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | SPDX-FileCopyrightText: 1997, 1998 Lars Doelle 5 | 6 | SPDX-License-Identifier: GPL-2.0-only 7 | */ 8 | 9 | #ifndef KDESUPTYPROCESS_P_H 10 | #define KDESUPTYPROCESS_P_H 11 | 12 | #include 13 | 14 | #include 15 | #include 16 | 17 | namespace KDESu 18 | { 19 | class PtyProcessPrivate 20 | { 21 | public: 22 | PtyProcessPrivate() 23 | { 24 | } 25 | virtual ~PtyProcessPrivate() 26 | { 27 | delete pty; 28 | } 29 | 30 | QList env; 31 | KPty *pty = nullptr; 32 | QByteArray inputBuffer; 33 | // Whether to keep echo on after PTY creation 34 | bool wantLocalEcho = true; 35 | }; 36 | 37 | } 38 | 39 | #endif 40 | -------------------------------------------------------------------------------- /src/sshprocess.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | 7 | ssh.cpp: Execute a program on a remote machine using ssh. 8 | */ 9 | 10 | #include "sshprocess.h" 11 | 12 | #include "kcookie_p.h" 13 | #include "stubprocess_p.h" 14 | #include 15 | 16 | #include 17 | #include 18 | #include 19 | 20 | extern int kdesuDebugArea(); 21 | 22 | namespace KDESu 23 | { 24 | using namespace KDESuPrivate; 25 | 26 | class SshProcessPrivate : public StubProcessPrivate 27 | { 28 | public: 29 | SshProcessPrivate(const QByteArray &host) 30 | : host(host) 31 | , stub("kdesu_stub") 32 | { 33 | } 34 | QByteArray prompt; 35 | QByteArray host; 36 | QByteArray error; 37 | QByteArray stub; 38 | }; 39 | 40 | SshProcess::SshProcess(const QByteArray &host, const QByteArray &user, const QByteArray &command) 41 | : StubProcess(*new SshProcessPrivate(host)) 42 | { 43 | m_user = user; 44 | m_command = command; 45 | srand(time(nullptr)); 46 | } 47 | 48 | SshProcess::~SshProcess() = default; 49 | 50 | void SshProcess::setHost(const QByteArray &host) 51 | { 52 | Q_D(SshProcess); 53 | 54 | d->host = host; 55 | } 56 | 57 | void SshProcess::setStub(const QByteArray &stub) 58 | { 59 | Q_D(SshProcess); 60 | 61 | d->stub = stub; 62 | } 63 | 64 | int SshProcess::checkInstall(const char *password) 65 | { 66 | return exec(password, 1); 67 | } 68 | 69 | int SshProcess::checkNeedPassword() 70 | { 71 | return exec(nullptr, 2); 72 | } 73 | 74 | int SshProcess::exec(const char *password, int check) 75 | { 76 | Q_D(SshProcess); 77 | 78 | if (check) { 79 | setTerminal(true); 80 | } 81 | 82 | QList args; 83 | args += "-l"; 84 | args += m_user; 85 | args += "-o"; 86 | args += "StrictHostKeyChecking=no"; 87 | args += d->host; 88 | args += d->stub; 89 | 90 | if (StubProcess::exec("ssh", args) < 0) { 91 | return check ? SshNotFound : -1; 92 | } 93 | 94 | int ret = converseSsh(password, check); 95 | if (ret < 0) { 96 | if (!check) { 97 | qCCritical(KSU_LOG) << "[" << __FILE__ << ":" << __LINE__ << "] " 98 | << "Conversation with ssh failed."; 99 | } 100 | return ret; 101 | } 102 | if (check == 2) { 103 | if (ret == 1) { 104 | kill(m_pid, SIGTERM); 105 | waitForChild(); 106 | } 107 | return ret; 108 | } 109 | 110 | if (m_erase && password) { 111 | memset(const_cast(password), 0, qstrlen(password)); 112 | } 113 | 114 | ret = converseStub(check); 115 | if (ret < 0) { 116 | if (!check) { 117 | qCCritical(KSU_LOG) << "[" << __FILE__ << ":" << __LINE__ << "] " 118 | << "Conversation with kdesu_stub failed."; 119 | } 120 | return ret; 121 | } else if (ret == 1) { 122 | kill(m_pid, SIGTERM); 123 | waitForChild(); 124 | ret = SshIncorrectPassword; 125 | } 126 | 127 | if (check == 1) { 128 | waitForChild(); 129 | return 0; 130 | } 131 | 132 | setExitString("Waiting for forwarded connections to terminate"); 133 | ret = waitForChild(); 134 | return ret; 135 | } 136 | 137 | QByteArray SshProcess::prompt() const 138 | { 139 | Q_D(const SshProcess); 140 | 141 | return d->prompt; 142 | } 143 | 144 | QByteArray SshProcess::error() const 145 | { 146 | Q_D(const SshProcess); 147 | 148 | return d->error; 149 | } 150 | 151 | /* 152 | * Conversation with ssh. 153 | * If check is 0, this waits for either a "Password: " prompt, 154 | * or the header of the stub. If a prompt is received, the password is 155 | * written back. Used for running a command. 156 | * If check is 1, operation is the same as 0 except that if a stub header is 157 | * received, the stub is stopped with the "stop" command. This is used for 158 | * checking a password. 159 | * If check is 2, operation is the same as 1, except that no password is 160 | * written. The prompt is saved to prompt. Used for checking the need for 161 | * a password. 162 | */ 163 | int SshProcess::converseSsh(const char *password, int check) 164 | { 165 | Q_D(SshProcess); 166 | 167 | unsigned i; 168 | unsigned j; 169 | unsigned colon; 170 | 171 | QByteArray line; 172 | int state = 0; 173 | 174 | while (state < 2) { 175 | line = readLine(); 176 | const uint len = line.length(); 177 | if (line.isNull()) { 178 | return -1; 179 | } 180 | 181 | switch (state) { 182 | case 0: 183 | // Check for "kdesu_stub" header. 184 | if (line == "kdesu_stub") { 185 | unreadLine(line); 186 | return 0; 187 | } 188 | 189 | // Match "Password: " with the regex ^[^:]+:[\w]*$. 190 | for (i = 0, j = 0, colon = 0; i < len; ++i) { 191 | if (line[i] == ':') { 192 | j = i; 193 | colon++; 194 | continue; 195 | } 196 | if (!isspace(line[i])) { 197 | j++; 198 | } 199 | } 200 | if ((colon == 1) && (line[j] == ':')) { 201 | if (check == 2) { 202 | d->prompt = line; 203 | return SshNeedsPassword; 204 | } 205 | if (waitSlave()) { 206 | return -1; 207 | } 208 | write(fd(), password, strlen(password)); 209 | write(fd(), "\n", 1); 210 | state++; 211 | break; 212 | } 213 | 214 | // Warning/error message. 215 | d->error += line; 216 | d->error += '\n'; 217 | if (m_terminal) { 218 | fprintf(stderr, "ssh: %s\n", line.constData()); 219 | } 220 | break; 221 | 222 | case 1: 223 | if (line.isEmpty()) { 224 | state++; 225 | break; 226 | } 227 | return -1; 228 | } 229 | } 230 | return 0; 231 | } 232 | 233 | // Display redirection is handled by ssh natively. 234 | QByteArray SshProcess::display() 235 | { 236 | return "no"; 237 | } 238 | 239 | QByteArray SshProcess::displayAuth() 240 | { 241 | return "no"; 242 | } 243 | 244 | void SshProcess::virtual_hook(int id, void *data) 245 | { 246 | StubProcess::virtual_hook(id, data); 247 | } 248 | 249 | } // namespace KDESu 250 | -------------------------------------------------------------------------------- /src/sshprocess.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | */ 7 | 8 | #ifndef KDESUSSHPROCESS_H 9 | #define KDESUSSHPROCESS_H 10 | 11 | #include "stubprocess.h" 12 | 13 | #include 14 | 15 | namespace KDESu 16 | { 17 | class SshProcessPrivate; 18 | 19 | /*! 20 | * \class KDESu::SshProcess 21 | * \inmodule KDESu 22 | * \inheaderfile KDESu/SshProcess 23 | * 24 | * \brief Executes a remote command, using ssh. 25 | */ 26 | class KDESU_EXPORT SshProcess : public StubProcess 27 | { 28 | public: 29 | /*! 30 | * \value SshNotFound 31 | * \value SshNeedsPassword 32 | * \value SshIncorrectPassword 33 | */ 34 | enum Errors { 35 | SshNotFound = 1, 36 | SshNeedsPassword, 37 | SshIncorrectPassword, 38 | }; 39 | 40 | /*! 41 | * 42 | */ 43 | explicit SshProcess(const QByteArray &host = QByteArray(), const QByteArray &user = QByteArray(), const QByteArray &command = QByteArray()); 44 | ~SshProcess() override; 45 | 46 | /*! 47 | * Sets the target host. 48 | */ 49 | void setHost(const QByteArray &host); 50 | 51 | /*! 52 | * Sets the location of the remote stub. 53 | */ 54 | void setStub(const QByteArray &stub); 55 | 56 | // TODO The return doc is so obviously wrong that the C code needs to be checked. 57 | /*! 58 | * Checks if the current user\@host needs a password. 59 | * 60 | * Returns the prompt for the password if a password is required. A null 61 | * string otherwise. 62 | */ 63 | int checkNeedPassword(); 64 | 65 | /*! 66 | * Checks if the stub is installed and if the password is correct. 67 | * 68 | * Returns zero if everything is correct, nonzero otherwise. 69 | */ 70 | int checkInstall(const char *password); 71 | 72 | /*! 73 | * Executes the command. 74 | */ 75 | int exec(const char *password, int check = 0); 76 | 77 | /*! 78 | * 79 | */ 80 | QByteArray prompt() const; 81 | 82 | /*! 83 | * 84 | */ 85 | QByteArray error() const; 86 | 87 | protected: 88 | void virtual_hook(int id, void *data) override; 89 | QByteArray display() override; 90 | QByteArray displayAuth() override; 91 | 92 | private: 93 | KDESU_NO_EXPORT int converseSsh(const char *password, int check); 94 | 95 | private: 96 | Q_DECLARE_PRIVATE(SshProcess) 97 | }; 98 | 99 | } 100 | 101 | #endif // KDESUSSHPROCESS_H 102 | -------------------------------------------------------------------------------- /src/stubprocess.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | 7 | stubprocess.cpp: Conversation with kdesu_stub. 8 | */ 9 | 10 | #include "stubprocess.h" 11 | #include "kcookie_p.h" 12 | #include "stubprocess_p.h" 13 | 14 | #include 15 | #include 16 | 17 | #include 18 | 19 | extern int kdesuDebugArea(); 20 | 21 | namespace KDESu 22 | { 23 | using namespace KDESuPrivate; 24 | 25 | StubProcess::StubProcess() 26 | : StubProcess(*new StubProcessPrivate) 27 | { 28 | } 29 | 30 | StubProcess::StubProcess(StubProcessPrivate &dd) 31 | : PtyProcess(dd) 32 | { 33 | m_user = "root"; 34 | m_scheduler = SchedNormal; 35 | m_priority = 50; 36 | m_cookie = new KCookie; 37 | m_XOnly = true; 38 | } 39 | 40 | StubProcess::~StubProcess() 41 | { 42 | delete m_cookie; 43 | } 44 | 45 | void StubProcess::setCommand(const QByteArray &command) 46 | { 47 | m_command = command; 48 | } 49 | 50 | void StubProcess::setUser(const QByteArray &user) 51 | { 52 | m_user = user; 53 | } 54 | 55 | void StubProcess::setXOnly(bool xonly) 56 | { 57 | m_XOnly = xonly; 58 | } 59 | 60 | void StubProcess::setPriority(int prio) 61 | { 62 | if (prio > 100) { 63 | m_priority = 100; 64 | } else if (prio < 0) { 65 | m_priority = 0; 66 | } else { 67 | m_priority = prio; 68 | } 69 | } 70 | 71 | void StubProcess::setScheduler(int sched) 72 | { 73 | m_scheduler = sched; 74 | } 75 | 76 | void StubProcess::writeString(const QByteArray &str) 77 | { 78 | QByteArray out; 79 | out.reserve(str.size() + 8); 80 | for (const uchar c : str) { 81 | if (c < 32) { 82 | out.append('\\'); 83 | out.append(c + '@'); 84 | } else if (c == '\\') { 85 | out.append('\\'); 86 | out.append('/'); 87 | } else { 88 | out.append(c); 89 | } 90 | } 91 | writeLine(out); 92 | } 93 | 94 | /* 95 | * Map pid_t to a signed integer type that makes sense for QByteArray; 96 | * only the most common sizes 16 bit and 32 bit are special-cased. 97 | */ 98 | template 99 | struct PIDType { 100 | typedef pid_t PID_t; 101 | }; 102 | template<> 103 | struct PIDType<2> { 104 | typedef qint16 PID_t; 105 | }; 106 | template<> 107 | struct PIDType<4> { 108 | typedef qint32 PID_t; 109 | }; 110 | 111 | /* 112 | * Conversation with kdesu_stub. This is how we pass the authentication 113 | * tokens (X11) and other stuff to kdesu_stub. 114 | * return values: -1 = error, 0 = ok, 1 = kill me 115 | */ 116 | 117 | int StubProcess::converseStub(int check) 118 | { 119 | QByteArray line; 120 | QByteArray tmp; 121 | 122 | while (1) { 123 | line = readLine(); 124 | if (line.isNull()) { 125 | return -1; 126 | } 127 | 128 | if (line == "kdesu_stub") { 129 | // This makes parsing a lot easier. 130 | enableLocalEcho(false); 131 | if (check) { 132 | writeLine("stop"); 133 | } else { 134 | writeLine("ok"); 135 | } 136 | break; 137 | } 138 | } 139 | 140 | while (1) { 141 | line = readLine(); 142 | if (line.isNull()) { 143 | return -1; 144 | } 145 | 146 | if (line == "display") { 147 | writeLine(display()); 148 | } else if (line == "display_auth") { 149 | #if HAVE_X11 150 | writeLine(displayAuth()); 151 | #else 152 | writeLine(""); 153 | #endif 154 | } else if (line == "command") { 155 | writeString(m_command); 156 | } else if (line == "path") { 157 | QByteArray path = qgetenv("PATH"); 158 | if (!path.isEmpty() && path[0] == ':') { 159 | path = path.mid(1); 160 | } 161 | if (m_user == "root") { 162 | if (!path.isEmpty()) { 163 | path = "/sbin:/bin:/usr/sbin:/usr/bin:" + path; 164 | } else { 165 | path = "/sbin:/bin:/usr/sbin:/usr/bin"; 166 | } 167 | } 168 | writeLine(path); 169 | } else if (line == "user") { 170 | writeLine(m_user); 171 | } else if (line == "priority") { 172 | tmp.setNum(m_priority); 173 | writeLine(tmp); 174 | } else if (line == "scheduler") { 175 | if (m_scheduler == SchedRealtime) { 176 | writeLine("realtime"); 177 | } else { 178 | writeLine("normal"); 179 | } 180 | } else if (line == "xwindows_only") { 181 | if (m_XOnly) { 182 | writeLine("no"); 183 | } else { 184 | writeLine("yes"); 185 | } 186 | } else if (line == "app_startup_id") { 187 | const QList env = environment(); 188 | QByteArray tmp; 189 | static const char startup_env[] = "DESKTOP_STARTUP_ID="; 190 | static const std::size_t size = sizeof(startup_env); 191 | for (const auto &var : env) { 192 | if (var.startsWith(startup_env)) { 193 | tmp = var.mid(size - 1); 194 | } 195 | } 196 | if (tmp.isEmpty()) { 197 | tmp = "0"; // krazy:exclude=doublequote_chars 198 | } 199 | writeLine(tmp); 200 | } else if (line == "app_start_pid") { // obsolete 201 | // Force the pid_t returned from getpid() into 202 | // something QByteArray understands; avoids ambiguity 203 | // between short and unsigned short in particular. 204 | tmp.setNum((PIDType::PID_t)(getpid())); 205 | writeLine(tmp); 206 | } else if (line == "environment") { // additional env vars 207 | const QList env = environment(); 208 | for (const auto &var : env) { 209 | writeString(var); 210 | } 211 | writeLine(""); 212 | } else if (line == "end") { 213 | return 0; 214 | } else { 215 | qCWarning(KSU_LOG) << "[" << __FILE__ << ":" << __LINE__ << "] " 216 | << "Unknown request:" << line; 217 | return 1; 218 | } 219 | } 220 | 221 | return 0; 222 | } 223 | 224 | QByteArray StubProcess::display() 225 | { 226 | return m_cookie->display(); 227 | } 228 | 229 | QByteArray StubProcess::displayAuth() 230 | { 231 | #if HAVE_X11 232 | return m_cookie->displayAuth(); 233 | #else 234 | return QByteArray(); 235 | #endif 236 | } 237 | 238 | void StubProcess::virtual_hook(int id, void *data) 239 | { 240 | PtyProcess::virtual_hook(id, data); 241 | } 242 | 243 | } // namespace KDESu 244 | -------------------------------------------------------------------------------- /src/stubprocess.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | */ 7 | 8 | #ifndef KDESUSTUBPROCESS_H 9 | #define KDESUSTUBPROCESS_H 10 | 11 | #include "ptyprocess.h" 12 | 13 | #include 14 | 15 | #include 16 | #include 17 | 18 | namespace KDESu 19 | { 20 | namespace KDESuPrivate 21 | { 22 | class KCookie; 23 | } 24 | class StubProcessPrivate; 25 | 26 | /*! 27 | * \class KDESu::StubProcess 28 | * \inmodule KDESu 29 | * \inheaderfile KDESu/StubProcess 30 | * 31 | * \brief Chat with kdesu_stub. 32 | * 33 | * StubProcess extends PtyProcess with functionality to chat with kdesu_stub. 34 | */ 35 | class KDESU_EXPORT StubProcess : public PtyProcess 36 | { 37 | public: 38 | /*! 39 | * Different schedulers. SchedNormal is the normal Unix timesharing 40 | * scheduler, while SchedRealtime is a POSIX.1b realtime scheduler. 41 | * 42 | * \value SchedNormal 43 | * \value SchedRealtime 44 | */ 45 | enum Scheduler { 46 | SchedNormal, 47 | SchedRealtime, 48 | }; 49 | 50 | /*! 51 | * 52 | */ 53 | StubProcess(); 54 | ~StubProcess() override; 55 | 56 | /*! 57 | * Set the command. 58 | */ 59 | void setCommand(const QByteArray &command); 60 | 61 | /*! 62 | * Set the target user. 63 | */ 64 | void setUser(const QByteArray &user); 65 | 66 | /*! 67 | * Set to "X only mode": Sycoca is not built and kdeinit is not launched. 68 | */ 69 | void setXOnly(bool xonly); 70 | 71 | /*! 72 | * Set the priority of the process. The priority value must be between 0 73 | * and 100, 0 being the lowest priority. This value is mapped to the 74 | * scheduler and system dependent priority range of the OS. 75 | */ 76 | void setPriority(int prio); 77 | 78 | /*! 79 | * Set the scheduler type. 80 | */ 81 | void setScheduler(int sched); 82 | 83 | protected: 84 | void virtual_hook(int id, void *data) override; 85 | 86 | /*! 87 | * Exchange all parameters with kdesu_stub. 88 | */ 89 | int converseStub(int check); 90 | 91 | /*! 92 | * This virtual function can be overloaded when special behavior is 93 | * desired. By default, it returns the value returned by KCookie. 94 | */ 95 | virtual QByteArray display(); 96 | 97 | /*! 98 | * See display. 99 | */ 100 | virtual QByteArray displayAuth(); 101 | 102 | // KF6 TODO: move to StubProcessPrivate 103 | bool m_XOnly; 104 | int m_priority; 105 | int m_scheduler; 106 | QByteArray m_command; 107 | QByteArray m_user; 108 | KDESuPrivate::KCookie *m_cookie; 109 | 110 | private: 111 | KDESU_NO_EXPORT void writeString(const QByteArray &str); 112 | 113 | protected: 114 | KDESU_NO_EXPORT explicit StubProcess(StubProcessPrivate &dd); 115 | 116 | private: 117 | Q_DECLARE_PRIVATE(StubProcess) 118 | }; 119 | 120 | } 121 | 122 | #endif // KDESUSTUBPROCESS_H 123 | -------------------------------------------------------------------------------- /src/stubprocess_p.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | */ 7 | 8 | #ifndef KDESUSTUBPROCESS_P_H 9 | #define KDESUSTUBPROCESS_P_H 10 | 11 | #include "ptyprocess_p.h" 12 | 13 | namespace KDESu 14 | { 15 | class StubProcessPrivate : public PtyProcessPrivate 16 | { 17 | }; 18 | 19 | } 20 | 21 | #endif 22 | -------------------------------------------------------------------------------- /src/suprocess.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | Sudo support added by Jonathan Riddell 6 | SPDX-FileCopyrightText: 2005 Canonical Ltd // krazy:exclude=copyright (no email) 7 | 8 | SPDX-License-Identifier: GPL-2.0-only 9 | 10 | su.cpp: Execute a program as another user with "class SuProcess". 11 | */ 12 | 13 | #include "suprocess.h" 14 | 15 | #include "kcookie_p.h" 16 | #include "stubprocess_p.h" 17 | #include 18 | 19 | #include 20 | #include 21 | #include 22 | 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | #if defined(KDESU_USE_SUDO_DEFAULT) 29 | #define DEFAULT_SUPER_USER_COMMAND QStringLiteral("sudo") 30 | #elif defined(KDESU_USE_DOAS_DEFAULT) 31 | #define DEFAULT_SUPER_USER_COMMAND QStringLiteral("doas") 32 | #else 33 | #define DEFAULT_SUPER_USER_COMMAND QStringLiteral("su") 34 | #endif 35 | 36 | namespace KDESu 37 | { 38 | using namespace KDESuPrivate; 39 | 40 | class SuProcessPrivate : public StubProcessPrivate 41 | { 42 | public: 43 | bool isPrivilegeEscalation() const; 44 | QString superUserCommand; 45 | }; 46 | 47 | bool SuProcessPrivate::isPrivilegeEscalation() const 48 | { 49 | return (superUserCommand == QLatin1String("sudo") || superUserCommand == QLatin1String("doas")); 50 | } 51 | 52 | SuProcess::SuProcess(const QByteArray &user, const QByteArray &command) 53 | : StubProcess(*new SuProcessPrivate) 54 | { 55 | Q_D(SuProcess); 56 | 57 | m_user = user; 58 | m_command = command; 59 | 60 | KSharedConfig::Ptr config = KSharedConfig::openConfig(); 61 | KConfigGroup group(config, QStringLiteral("super-user-command")); 62 | d->superUserCommand = group.readEntry("super-user-command", DEFAULT_SUPER_USER_COMMAND); 63 | 64 | if (!d->isPrivilegeEscalation() && d->superUserCommand != QLatin1String("su")) { 65 | qCWarning(KSU_LOG) << "unknown super user command."; 66 | d->superUserCommand = DEFAULT_SUPER_USER_COMMAND; 67 | } 68 | } 69 | 70 | SuProcess::~SuProcess() = default; 71 | 72 | QString SuProcess::superUserCommand() 73 | { 74 | Q_D(SuProcess); 75 | 76 | return d->superUserCommand; 77 | } 78 | 79 | bool SuProcess::useUsersOwnPassword() 80 | { 81 | Q_D(SuProcess); 82 | 83 | if (d->isPrivilegeEscalation() && m_user == "root") { 84 | return true; 85 | } 86 | 87 | KUser user; 88 | return user.loginName() == QString::fromUtf8(m_user); 89 | } 90 | 91 | int SuProcess::checkInstall(const char *password) 92 | { 93 | return exec(password, Install); 94 | } 95 | 96 | int SuProcess::checkNeedPassword() 97 | { 98 | return exec(nullptr, NeedPassword); 99 | } 100 | 101 | /* 102 | * Execute a command with su(1). 103 | */ 104 | int SuProcess::exec(const char *password, int check) 105 | { 106 | Q_D(SuProcess); 107 | 108 | if (check) { 109 | setTerminal(true); 110 | } 111 | 112 | // since user may change after constructor (due to setUser()) 113 | // we need to override sudo with su for non-root here 114 | if (m_user != QByteArray("root")) { 115 | d->superUserCommand = QStringLiteral("su"); 116 | } 117 | 118 | QList args; 119 | if (d->isPrivilegeEscalation()) { 120 | args += "-u"; 121 | } 122 | 123 | if (m_scheduler != SchedNormal || m_priority > 50) { 124 | args += "root"; 125 | } else { 126 | args += m_user; 127 | } 128 | 129 | if (d->superUserCommand == QLatin1String("su")) { 130 | args += "-c"; 131 | } 132 | // Get the kdesu_stub and su command from a config file if set, used in test 133 | KSharedConfig::Ptr config = KSharedConfig::openConfig(); 134 | KConfigGroup group(config, QStringLiteral("super-user-command")); 135 | const QString defaultPath = QStringLiteral(KDE_INSTALL_FULL_LIBEXECDIR_KF) + QStringLiteral("/kdesu_stub"); 136 | const QString kdesuStubPath = group.readEntry("kdesu_stub_path", defaultPath); 137 | args += kdesuStubPath.toLocal8Bit(); 138 | args += "-"; // krazy:exclude=doublequote_chars (QList, not QString) 139 | 140 | const QString commandString = group.readEntry("command", QStandardPaths::findExecutable(d->superUserCommand)); 141 | const QByteArray command = commandString.toLocal8Bit(); 142 | if (command.isEmpty()) { 143 | return check ? SuNotFound : -1; 144 | } 145 | 146 | // Turn echo off for conversion with kdesu_stub. Needs to be done before 147 | // it's started so that sudo copies this option to its internal PTY. 148 | enableLocalEcho(false); 149 | 150 | if (StubProcess::exec(command, args) < 0) { 151 | return check ? SuNotFound : -1; 152 | } 153 | 154 | SuErrors ret = (SuErrors)converseSU(password); 155 | 156 | if (ret == error) { 157 | if (!check) { 158 | qCCritical(KSU_LOG) << "[" << __FILE__ << ":" << __LINE__ << "] " 159 | << "Conversation with" << d->superUserCommand << "failed."; 160 | } 161 | return ret; 162 | } 163 | if (check == NeedPassword) { 164 | if (ret == killme) { 165 | if (d->isPrivilegeEscalation()) { 166 | // sudo can not be killed, just return 167 | return ret; 168 | } 169 | if (kill(m_pid, SIGKILL) < 0) { 170 | // FIXME SIGKILL doesn't work for sudo, 171 | // why is this different from su? 172 | // A: because sudo runs as root. Perhaps we could write a Ctrl+C to its stdin, instead? 173 | ret = error; 174 | } else { 175 | int iret = waitForChild(); 176 | if (iret < 0) { 177 | ret = error; 178 | } 179 | } 180 | } 181 | return ret; 182 | } 183 | 184 | if (m_erase && password) { 185 | memset(const_cast(password), 0, qstrlen(password)); 186 | } 187 | 188 | if (ret != ok) { 189 | kill(m_pid, SIGKILL); 190 | if (d->isPrivilegeEscalation()) { 191 | waitForChild(); 192 | } 193 | return SuIncorrectPassword; 194 | } 195 | 196 | int iret = converseStub(check); 197 | if (iret < 0) { 198 | if (!check) { 199 | qCCritical(KSU_LOG) << "[" << __FILE__ << ":" << __LINE__ << "] " 200 | << "Conversation with kdesu_stub failed."; 201 | } 202 | return iret; 203 | } else if (iret == 1) { 204 | kill(m_pid, SIGKILL); 205 | waitForChild(); 206 | return SuIncorrectPassword; 207 | } 208 | 209 | if (check == Install) { 210 | waitForChild(); 211 | return 0; 212 | } 213 | 214 | iret = waitForChild(); 215 | return iret; 216 | } 217 | 218 | /* 219 | * Conversation with su: feed the password. 220 | * Return values: -1 = error, 0 = ok, 1 = kill me, 2 not authorized 221 | */ 222 | int SuProcess::converseSU(const char *password) 223 | { 224 | enum { 225 | WaitForPrompt, 226 | CheckStar, 227 | HandleStub, 228 | } state = WaitForPrompt; 229 | int colon; 230 | unsigned i; 231 | unsigned j; 232 | 233 | QByteArray line; 234 | while (true) { 235 | line = readLine(); 236 | // return if problem. sudo checks for a second prompt || su gets a blank line 237 | if ((line.contains(':') && state != WaitForPrompt) || line.isNull()) { 238 | return (state == HandleStub ? notauthorized : error); 239 | } 240 | 241 | if (line == "kdesu_stub") { 242 | unreadLine(line); 243 | return ok; 244 | } 245 | 246 | switch (state) { 247 | case WaitForPrompt: { 248 | if (waitMS(fd(), 100) > 0) { 249 | // There is more output available, so this line 250 | // couldn't have been a password prompt (the definition 251 | // of prompt being that there's a line of output followed 252 | // by a colon, and then the process waits). 253 | continue; 254 | } 255 | 256 | const uint len = line.length(); 257 | // Match "Password: " with the regex ^[^:]+:[\w]*$. 258 | for (i = 0, j = 0, colon = 0; i < len; ++i) { 259 | if (line[i] == ':') { 260 | j = i; 261 | colon++; 262 | continue; 263 | } 264 | if (!isspace(line[i])) { 265 | j++; 266 | } 267 | } 268 | if (colon == 1 && line[j] == ':') { 269 | if (password == nullptr) { 270 | return killme; 271 | } 272 | if (waitSlave()) { 273 | return error; 274 | } 275 | write(fd(), password, strlen(password)); 276 | write(fd(), "\n", 1); 277 | state = CheckStar; 278 | } 279 | break; 280 | } 281 | ////////////////////////////////////////////////////////////////////////// 282 | case CheckStar: { 283 | const QByteArray s = line.trimmed(); 284 | if (s.isEmpty()) { 285 | state = HandleStub; 286 | break; 287 | } 288 | const bool starCond = std::any_of(s.cbegin(), s.cend(), [](const char c) { 289 | return c != '*'; 290 | }); 291 | if (starCond) { 292 | return error; 293 | } 294 | state = HandleStub; 295 | break; 296 | } 297 | ////////////////////////////////////////////////////////////////////////// 298 | case HandleStub: 299 | break; 300 | ////////////////////////////////////////////////////////////////////////// 301 | } // end switch 302 | } // end while (true) 303 | return ok; 304 | } 305 | 306 | void SuProcess::virtual_hook(int id, void *data) 307 | { 308 | StubProcess::virtual_hook(id, data); 309 | } 310 | 311 | } // namespace KDESu 312 | -------------------------------------------------------------------------------- /src/suprocess.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of the KDE project, module kdesu. 3 | SPDX-FileCopyrightText: 1999, 2000 Geert Jansen 4 | 5 | SPDX-License-Identifier: GPL-2.0-only 6 | */ 7 | 8 | #ifndef KDESUSUPROCESS_H 9 | #define KDESUSUPROCESS_H 10 | 11 | #include 12 | 13 | #include "stubprocess.h" 14 | 15 | namespace KDESu 16 | { 17 | class SuProcessPrivate; 18 | 19 | /*! 20 | * \class KDESu::SuProcess 21 | * \inmodule KDESu 22 | * \inheaderfile KDESu/SuProcess 23 | * 24 | * \brief Executes a command under elevated privileges, using su. 25 | */ 26 | 27 | class KDESU_EXPORT SuProcess : public StubProcess 28 | { 29 | public: 30 | /*! 31 | * \value SuNotFound 32 | * \value SuNotAllowed 33 | * \value SuIncorrectPassword 34 | */ 35 | enum Errors { 36 | SuNotFound = 1, 37 | SuNotAllowed, 38 | SuIncorrectPassword, 39 | }; 40 | 41 | /*! 42 | * Executes the command. This will wait for the command to finish. 43 | * 44 | * \value NoCheck 45 | * \value Install 46 | * \value NeedPassword 47 | */ 48 | enum checkMode { 49 | NoCheck = 0, 50 | Install = 1, 51 | NeedPassword = 2, 52 | }; 53 | 54 | /*! 55 | * 56 | */ 57 | explicit SuProcess(const QByteArray &user = nullptr, const QByteArray &command = nullptr); 58 | ~SuProcess() override; 59 | 60 | /*! 61 | * 62 | */ 63 | int exec(const char *password, int check = NoCheck); 64 | 65 | /*! 66 | * Checks if the stub is installed and the password is correct. 67 | * 68 | * Returns zero if everything is correct, nonzero otherwise. 69 | */ 70 | int checkInstall(const char *password); 71 | 72 | /*! 73 | * Checks if a password is needed. 74 | */ 75 | int checkNeedPassword(); 76 | 77 | /*! 78 | * Checks what the default super user command is, e.g. sudo, su, etc 79 | * 80 | * Returns the default super user command 81 | */ 82 | QString superUserCommand(); 83 | 84 | /*! 85 | * Checks whether or not the user's password is being asked for or another 86 | * user's password. Due to usage of systems such as sudo, even when attempting 87 | * to switch to another user one may need to enter their own password. 88 | */ 89 | bool useUsersOwnPassword(); 90 | 91 | protected: 92 | void virtual_hook(int id, void *data) override; 93 | 94 | private: 95 | enum SuErrors { 96 | error = -1, 97 | ok = 0, 98 | killme = 1, 99 | notauthorized = 2, 100 | }; 101 | 102 | KDESU_NO_EXPORT int converseSU(const char *password); 103 | 104 | private: 105 | Q_DECLARE_PRIVATE(SuProcess) 106 | }; 107 | 108 | } 109 | 110 | #endif // KDESUSUPROCESS_H 111 | --------------------------------------------------------------------------------