⬆️ Update qtkeychain
This commit is contained in:
		
							
								
								
									
										8
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| # Set update schedule for GitHub Actions | ||||
| version: 2 | ||||
| updates: | ||||
|   - package-ecosystem: "github-actions" | ||||
|     directory: "/" | ||||
|     schedule: | ||||
|       # Check for updates to GitHub Actions every weekday | ||||
|       interval: "weekly" | ||||
							
								
								
									
										77
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| --- | ||||
| name: Build | ||||
|  | ||||
| on: [push, pull_request] | ||||
|  | ||||
| jobs: | ||||
|   build-msvc: | ||||
|     name: Build Windows | ||||
|     runs-on: windows-latest | ||||
|     env: | ||||
|       BUILD_TOOLS_PATH: C:\apps\build-tools\ | ||||
|     steps: | ||||
|       - run: echo $env:BUILD_TOOLS_PATH | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | ||||
|  | ||||
|       - uses: actions/checkout@v2.3.4 | ||||
|         with: | ||||
|           submodules: true | ||||
|  | ||||
|       - name: Install JOM | ||||
|         shell: cmake -P {0} | ||||
|         run: | | ||||
|           file(MAKE_DIRECTORY $ENV{BUILD_TOOLS_PATH}) | ||||
|           file(DOWNLOAD http://prdownloads.sourceforge.net/rigs-of-rods/build-tools.zip "$ENV{TMP}/build-tools.zip" SHOW_PROGRESS) | ||||
|           execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf "$ENV{TMP}/build-tools.zip" WORKING_DIRECTORY "$ENV{BUILD_TOOLS_PATH}") | ||||
|  | ||||
|       - name: Enable Developer Command Prompt | ||||
|         uses: ilammy/msvc-dev-cmd@v1.8.0 | ||||
|  | ||||
|       - name: Cache Qt | ||||
|         id: cache-qt | ||||
|         uses: actions/cache@v1 | ||||
|         with: | ||||
|           path: ../Qt | ||||
|           key: ${{ runner.os }}-QtCache | ||||
|  | ||||
|       - name: Install Qt | ||||
|         uses: jurplel/install-qt-action@v2 | ||||
|         with: | ||||
|           cached: ${{ steps.cache-qt.outputs.cache-hit }} | ||||
|           modules: qtwebengine | ||||
|  | ||||
|       - name: Build | ||||
|         run: | | ||||
|             mkdir build | ||||
|             cd build | ||||
|             cmake -G"NMake Makefiles JOM" .. | ||||
|             jom | ||||
|         shell: cmd | ||||
|  | ||||
|   build-gcc: | ||||
|     name: Build Linux | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v2.3.4 | ||||
|         with: | ||||
|           submodules: true | ||||
|  | ||||
|       - name: Cache Qt | ||||
|         id: cache-qt | ||||
|         uses: actions/cache@v1 | ||||
|         with: | ||||
|           path: ../Qt | ||||
|           key: ${{ runner.os }}-QtCache | ||||
|  | ||||
|       - name: Install Qt | ||||
|         uses: jurplel/install-qt-action@v2 | ||||
|         with: | ||||
|           cached: ${{ steps.cache-qt.outputs.cache-hit }} | ||||
|           modules: qtwebengine | ||||
|  | ||||
|       - name: Build | ||||
|         run: | | ||||
|             mkdir build | ||||
|             cd build | ||||
|             cmake -DCMAKE_BUILD_TYPE=Release .. | ||||
|             make -j8 | ||||
|         shell: bash | ||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -43,3 +43,5 @@ target_wrapper.* | ||||
| CMakeLists.txt.user* | ||||
|  | ||||
| *.qm | ||||
| /build* | ||||
| .idea/ | ||||
							
								
								
									
										10
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -1,10 +0,0 @@ | ||||
| dist: bionic | ||||
| language: cpp | ||||
|  | ||||
| install: | ||||
|   - sudo apt-get update | ||||
|   - sudo apt-get install qt5-default qtwebengine5-dev qttools5-dev-tools -y | ||||
|  | ||||
| script: | ||||
|  - qmake fuel.pro | ||||
|  - make | ||||
							
								
								
									
										154
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,154 @@ | ||||
| cmake_minimum_required(VERSION 3.10) | ||||
| cmake_policy(SET CMP0087 NEW) | ||||
| include(FeatureSummary) | ||||
|  | ||||
| # Setup paths | ||||
| SET(RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/") | ||||
| SET(LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/") | ||||
| SET(ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/") | ||||
| SET(EXECUTABLE_OUTPUT_PATH ${RUNTIME_OUTPUT_DIRECTORY}) | ||||
| SET(LIBRARY_OUTPUT_PATH ${RUNTIME_OUTPUT_DIRECTORY}) | ||||
| # Fix executable paths for windows | ||||
| SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${RUNTIME_OUTPUT_DIRECTORY}) | ||||
| SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${RUNTIME_OUTPUT_DIRECTORY}) | ||||
| SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${RUNTIME_OUTPUT_DIRECTORY}) | ||||
| SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${RUNTIME_OUTPUT_DIRECTORY}) | ||||
|  | ||||
| project(Fuel) | ||||
|  | ||||
| option(UPDATE_TRANSLATIONS "Update translations" OFF) | ||||
|  | ||||
| set(CMAKE_AUTOMOC ON) | ||||
| set(CMAKE_AUTORCC ON) | ||||
| set(CMAKE_AUTOUIC ON) | ||||
| set(CMAKE_AUTOUIC_SEARCH_PATHS "${CMAKE_SOURCE_DIR}/ui") | ||||
|  | ||||
| find_package(Qt5 COMPONENTS Core Gui WebEngineWidgets REQUIRED) | ||||
|  | ||||
| set(FORMS | ||||
|         ui/MainWindow.ui | ||||
|         ui/CommitDialog.ui | ||||
|         ui/FileActionDialog.ui | ||||
|         ui/SettingsDialog.ui | ||||
|         ui/FslSettingsDialog.ui | ||||
|         ui/CloneDialog.ui | ||||
|         ui/BrowserWidget.ui | ||||
|         ui/RevisionDialog.ui | ||||
|         ui/RemoteDialog.ui | ||||
|         ui/AboutDialog.ui) | ||||
|  | ||||
| set(SOURCES | ||||
|         src/main.cpp | ||||
|         src/MainWindow.cpp | ||||
|         src/CommitDialog.cpp | ||||
|         src/FileActionDialog.cpp | ||||
|         src/SettingsDialog.cpp | ||||
|         src/FslSettingsDialog.cpp | ||||
|         src/CloneDialog.cpp | ||||
|         src/RevisionDialog.cpp | ||||
|         src/Utils.cpp | ||||
|         src/FileTableView.cpp | ||||
|         src/LoggedProcess.cpp | ||||
|         src/BrowserWidget.cpp | ||||
|         src/CustomWebView.cpp | ||||
|         src/Fossil.cpp | ||||
|         src/Workspace.cpp | ||||
|         src/SearchBox.cpp | ||||
|         src/AppSettings.cpp | ||||
|         src/RemoteDialog.cpp | ||||
|         src/AboutDialog.cpp) | ||||
|  | ||||
| set(HEADERS | ||||
|         src/MainWindow.h | ||||
|         src/CommitDialog.h | ||||
|         src/FileActionDialog.h | ||||
|         src/SettingsDialog.h | ||||
|         src/FslSettingsDialog.h | ||||
|         src/CloneDialog.h | ||||
|         src/RevisionDialog.h | ||||
|         src/Utils.h | ||||
|         src/FileTableView.h | ||||
|         src/LoggedProcess.h | ||||
|         src/BrowserWidget.h | ||||
|         src/CustomWebView.h | ||||
|         src/Fossil.h | ||||
|         src/Workspace.h | ||||
|         src/SearchBox.h | ||||
|         src/AppSettings.h | ||||
|         src/RemoteDialog.h | ||||
|         src/AboutDialog.h | ||||
|         src/WorkspaceCommon.h) | ||||
|  | ||||
|  | ||||
| set(RESOURCES | ||||
|         rsrc/resources.qrc) | ||||
|  | ||||
| set(TRANSLATIONS | ||||
|         intl/en_US.ts | ||||
|         intl/el_GR.ts | ||||
|         intl/de_DE.ts | ||||
|         intl/es_ES.ts | ||||
|         intl/fr_FR.ts | ||||
|         intl/ru_RU.ts | ||||
|         intl/pt_PT.ts | ||||
|         intl/it_IT.ts | ||||
|         intl/nl_NL.ts | ||||
|         intl/ko_KR.ts) | ||||
|  | ||||
| set_source_files_properties(${TRANSLATIONS} PROPERTIES OUTPUT_LOCATION "${RUNTIME_OUTPUT_DIRECTORY}translations") | ||||
|  | ||||
| find_package(Qt5LinguistTools) | ||||
| if (Qt5LinguistTools_FOUND) | ||||
|     if (UPDATE_TRANSLATIONS) | ||||
|         qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR}/ui ${CMAKE_SOURCE_DIR}/src ${TRANSLATIONS}) | ||||
|     else () | ||||
|         qt5_add_translation(QM_FILES ${TRANSLATIONS}) | ||||
|     endif () | ||||
|     install(FILES ${QM_FILES} DESTINATION ./translations) | ||||
| else () | ||||
|     message("Qt5LinguistTools not found") | ||||
| endif () | ||||
|  | ||||
| if (WIN32) | ||||
|     # clang-cl doesn't support resource files | ||||
|     if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") | ||||
|         list(APPEND SOURCES "${CMAKE_SOURCE_DIR}/rsrc/fuel.rc") | ||||
|     endif () | ||||
| elseif (APPLE) | ||||
|     list(APPEND SOURCES "${CMAKE_SOURCE_DIR}/rsrc/icons/fuel.icns") | ||||
| endif () | ||||
|  | ||||
| add_subdirectory("${CMAKE_SOURCE_DIR}/ext/qtkeychain" EXCLUDE_FROM_ALL) | ||||
|  | ||||
| add_executable(${PROJECT_NAME} | ||||
|         ${FORMS} | ||||
|         ${HEADERS} | ||||
|         ${SOURCES} | ||||
|         ${QM_FILES} | ||||
|         ${RESOURCES}) | ||||
|  | ||||
| target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR} | ||||
|         ${CMAKE_SOURCE_DIR}/ui/ | ||||
|         ${CMAKE_SOURCE_DIR}/src/) | ||||
| target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::WebEngineCore Qt5::WebEngineWidgets qt5keychain) | ||||
|  | ||||
| if (WIN32) | ||||
|     set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE TRUE) | ||||
|  | ||||
|     get_target_property(Qt5_Core_Location Qt5::Core LOCATION) | ||||
|     get_filename_component(QT_BIN_DIR ${Qt5_Core_Location} DIRECTORY) | ||||
|  | ||||
|     add_custom_target(copy_dll | ||||
|             COMMAND ${QT_BIN_DIR}/windeployqt.exe $<TARGET_FILE:${PROJECT_NAME}> --release --no-compiler-runtime --no-translations --no-opengl-sw | ||||
|             WORKING_DIRECTORY ${CMAKE_BINARY_DIR} | ||||
|             ) | ||||
|  | ||||
|     install(TARGETS ${PROJECT_NAME} | ||||
|             RUNTIME DESTINATION . | ||||
|             ) | ||||
|  | ||||
|     install(CODE "execute_process(COMMAND ${QT_BIN_DIR}/windeployqt.exe $<TARGET_FILE:${PROJECT_NAME}> --release --no-compiler-runtime --no-translations --no-opengl-sw --dir \${CMAKE_INSTALL_PREFIX})") | ||||
| endif () | ||||
|  | ||||
|  | ||||
| feature_summary(WHAT ALL) | ||||
							
								
								
									
										35
									
								
								appveyor.yml
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								appveyor.yml
									
									
									
									
									
								
							| @@ -1,35 +0,0 @@ | ||||
| version: "{build}" | ||||
| image: Visual Studio 2017 | ||||
| pull_requests: | ||||
|   do_not_increment_build_number: true | ||||
| shallow_clone: true | ||||
|  | ||||
| install: | ||||
| - cmd: >- | ||||
|     set QTDIR=C:\Qt\5.13\msvc2017_64 | ||||
|  | ||||
|     set PATH=%PATH%;%QTDIR%\bin | ||||
|  | ||||
|     call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 | ||||
| build_script: | ||||
| - cmd: >- | ||||
|     dir | ||||
|  | ||||
|     mkdir build | ||||
|  | ||||
|     cd build | ||||
|  | ||||
|     qmake ../fuel.pro | ||||
|  | ||||
|     set cl=/MP | ||||
|  | ||||
|     nmake /S /NOLOGO | ||||
|  | ||||
|     windeployqt release/fuel.exe --release --no-compiler-runtime --no-opengl-sw --dir fuel-scm/ | ||||
|  | ||||
|     cp release/fuel.exe fuel-scm/ | ||||
|  | ||||
|  | ||||
| artifacts: | ||||
| - path: build/fuel-scm | ||||
|   name: fuel-scm | ||||
							
								
								
									
										9
									
								
								ext/qtkeychain.pri
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								ext/qtkeychain.pri
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| freebsd { | ||||
|     INCLUDEPATH += /usr/local/include/qt5keychain | ||||
|     LIBS += -lqt5keychain | ||||
| } else { | ||||
|     unix:!android:!macx:!ios { | ||||
|         DEFINES += KEYCHAIN_DBUS | ||||
|     } | ||||
|    include(qtkeychain/qt5keychain.pri) | ||||
| } | ||||
							
								
								
									
										50
									
								
								ext/qtkeychain/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								ext/qtkeychain/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| #CMake files | ||||
| CMakeCache.txt | ||||
| CMakeFiles | ||||
| CMakeScripts | ||||
| cmake_install.cmake | ||||
|  | ||||
| #Keychain temporary files | ||||
| Qt5KeychainBuildTreeSettings.cmake | ||||
| Qt5KeychainConfig.cmake | ||||
| Qt5KeychainConfigVersion.cmake | ||||
| QtKeychainBuildTreeSettings.cmake | ||||
| QtKeychainConfig.cmake | ||||
| QtKeychainConfigVersion.cmake | ||||
| kwallet_interface.cpp | ||||
| kwallet_interface.h | ||||
| kwallet_interface.moc | ||||
| moc_keychain.* | ||||
| moc_keychain_p.* | ||||
| moc_gnomekeyring_p.* | ||||
| qkeychain_export.h | ||||
| qt_Qt5Keychain.pri | ||||
|  | ||||
| #Qt files | ||||
| *_parameters | ||||
| *.qm | ||||
|  | ||||
| #General build files | ||||
| Debug | ||||
| Release | ||||
| Makefile | ||||
|  | ||||
| #Linux build files | ||||
| libqt5keychain.* | ||||
| testclient | ||||
|  | ||||
| #Windows build files | ||||
| install_manifest.txt | ||||
| *.manifest | ||||
| *.lib | ||||
| *.exe | ||||
|  | ||||
| #Mac build files | ||||
| qtkeychain.xcodeproj | ||||
| qtkeychain.build | ||||
|  | ||||
| #Temporary files | ||||
| *.sw? | ||||
| *~ | ||||
|  | ||||
|  | ||||
| @@ -1,195 +1,307 @@ | ||||
| cmake_minimum_required(VERSION 2.8) | ||||
| project(qtkeychain) | ||||
| cmake_minimum_required(VERSION 3.3) | ||||
|  | ||||
| ### | ||||
| set(QTKEYCHAIN_VERSION 0.12.90) | ||||
| set(QTKEYCHAIN_SOVERSION 1) | ||||
|  | ||||
| set(QTKEYCHAIN_VERSION 0.5.90) | ||||
| set(QTKEYCHAIN_SOVERSION 0) | ||||
| project(qtkeychain VERSION ${QTKEYCHAIN_VERSION} LANGUAGES CXX) | ||||
|  | ||||
| # Enable C++11 | ||||
| SET(CMAKE_CXX_STANDARD 11) | ||||
|  | ||||
| include(FindPkgConfig) | ||||
|  | ||||
| ### | ||||
|  | ||||
| set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${PROJECT_SOURCE_DIR}/cmake/Modules") | ||||
| include(GNUInstallDirs) | ||||
| include(GenerateExportHeader) | ||||
| include(CMakePackageConfigHelpers) | ||||
| include(ECMSetupVersion) | ||||
| include(ECMGeneratePriFile) | ||||
|  | ||||
| option(BUILD_WITH_QT4 "Build qtkeychain with Qt4 no matter if Qt5 was found" OFF) | ||||
| option(BUILD_WITH_QT6 "Build qtkeychain with Qt 6" OFF) | ||||
| option(BUILD_TEST_APPLICATION "Build test application" ON) | ||||
| option(BUILD_TRANSLATIONS "Build translations" ON) | ||||
| option(QTKEYCHAIN_STATIC "Build static library" OFF) | ||||
|  | ||||
| if (CMAKE_SYSTEM_NAME STREQUAL Android) | ||||
|     set(ANDROID 1) | ||||
| endif () | ||||
|  | ||||
| if( NOT BUILD_WITH_QT4 ) | ||||
|     # try Qt5 first, and prefer that if found | ||||
|     find_package(Qt5Core QUIET) | ||||
| endif() | ||||
| if (CMAKE_SYSTEM_NAME STREQUAL Haiku) | ||||
|     set(HAIKU 1) | ||||
| endif () | ||||
|  | ||||
| if (Qt5Core_FOUND) | ||||
|   set(QTKEYCHAIN_VERSION_INFIX 5) | ||||
|   if(UNIX AND NOT APPLE) | ||||
|     find_package(Qt5DBus REQUIRED) | ||||
|     include_directories(${Qt5DBus_INCLUDE_DIRS}) | ||||
|     set(QTDBUS_LIBRARIES ${Qt5DBus_LIBRARIES}) | ||||
|     macro(qt_add_dbus_interface) | ||||
|       qt5_add_dbus_interface(${ARGN}) | ||||
| if (WIN32) | ||||
|     option(USE_CREDENTIAL_STORE "Build with windows CredentialStore support" ON) | ||||
|  | ||||
|     if (USE_CREDENTIAL_STORE) | ||||
|         add_definitions(-DUSE_CREDENTIAL_STORE=1) | ||||
|     endif () | ||||
| endif () | ||||
|  | ||||
| if (NOT BUILD_WITH_QT6) | ||||
|     find_package(Qt5 COMPONENTS Core REQUIRED) | ||||
| endif () | ||||
|  | ||||
| if (Qt5Core_FOUND AND NOT BUILD_WITH_QT6) | ||||
|     set(QTKEYCHAIN_VERSION_INFIX 5) | ||||
|  | ||||
|     if (ANDROID) | ||||
|         if (Qt5Core_VERSION VERSION_LESS 5.7) | ||||
|             find_package(Qt5 COMPONENTS Core REQUIRED Private) | ||||
|             include_directories(${Qt5Core_PRIVATE_INCLUDE_DIRS}) | ||||
|         endif () | ||||
|  | ||||
|         find_package(Qt5 COMPONENTS AndroidExtras REQUIRED) | ||||
|         include_directories(${Qt5AndroidExtras_INCLUDE_DIRS}) | ||||
|         set(QTANDROIDEXTRAS_LIBRARIES ${Qt5AndroidExtras_LIBRARIES}) | ||||
|     endif () | ||||
|  | ||||
|     if (UNIX AND NOT APPLE AND NOT ANDROID AND NOT HAIKU) | ||||
|         find_package(Qt5 COMPONENTS DBus REQUIRED) | ||||
|         include_directories(${Qt5DBus_INCLUDE_DIRS}) | ||||
|         set(QTDBUS_LIBRARIES ${Qt5DBus_LIBRARIES}) | ||||
|         macro(qt_add_dbus_interface) | ||||
|             qt5_add_dbus_interface(${ARGN}) | ||||
|         endmacro() | ||||
|     endif () | ||||
|  | ||||
|     if (BUILD_TRANSLATIONS) | ||||
|         find_package(Qt5 COMPONENTS LinguistTools REQUIRED) | ||||
|         macro(qt_add_translation) | ||||
|             qt5_add_translation(${ARGN}) | ||||
|         endmacro(qt_add_translation) | ||||
|         macro(qt_create_translation) | ||||
|             qt5_create_translation(${ARGN}) | ||||
|         endmacro(qt_create_translation) | ||||
|     endif () | ||||
|  | ||||
|     macro(qt_wrap_cpp) | ||||
|         qt5_wrap_cpp(${ARGN}) | ||||
|     endmacro() | ||||
|   endif() | ||||
|   find_package(Qt5LinguistTools REQUIRED) | ||||
|   macro(qt_add_translation) | ||||
|     qt5_add_translation(${ARGN}) | ||||
|   endmacro(qt_add_translation) | ||||
|   macro(qt_create_translation) | ||||
|     qt5_create_translation(${ARGN}) | ||||
|   endmacro(qt_create_translation) | ||||
|   macro(qt_wrap_cpp) | ||||
|     qt5_wrap_cpp(${ARGN}) | ||||
|   endmacro() | ||||
|  | ||||
|   set(QTCORE_LIBRARIES ${Qt5Core_LIBRARIES}) | ||||
|   include_directories(${Qt5Core_INCLUDE_DIRS}) | ||||
|     set(QTCORE_LIBRARIES ${Qt5Core_LIBRARIES}) | ||||
|     include_directories(${Qt5Core_INCLUDE_DIRS}) | ||||
| else () | ||||
|     find_package(Qt6 COMPONENTS Core REQUIRED) | ||||
|     set(QTKEYCHAIN_VERSION_INFIX 6) | ||||
|  | ||||
|   if (Qt5_POSITION_INDEPENDENT_CODE) | ||||
|     if (CMAKE_VERSION VERSION_LESS 2.8.9) # TODO remove once we increase the cmake requirement | ||||
|       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") | ||||
|     else() | ||||
|       set(CMAKE_POSITION_INDEPENDENT_CODE ON) | ||||
|     endif() | ||||
|   endif() | ||||
| else() | ||||
|   set(QTKEYCHAIN_VERSION_INFIX "") | ||||
|   if(UNIX AND NOT APPLE) | ||||
|     find_package(Qt4 COMPONENTS QtCore QtDBus REQUIRED) | ||||
|     set(QTDBUS_LIBRARIES ${QT_QTDBUS_LIBRARY}) | ||||
|     macro(qt_add_dbus_interface) | ||||
|       qt4_add_dbus_interface(${ARGN}) | ||||
|     if (ANDROID) | ||||
|         find_package(Qt6 COMPONENTS AndroidExtras REQUIRED) | ||||
|         include_directories(${Qt6AndroidExtras_INCLUDE_DIRS}) | ||||
|         set(QTANDROIDEXTRAS_LIBRARIES ${Qt6AndroidExtras_LIBRARIES}) | ||||
|     endif () | ||||
|  | ||||
|     if (UNIX AND NOT APPLE AND NOT ANDROID AND NOT HAIKU) | ||||
|         find_package(Qt6 COMPONENTS DBus REQUIRED) | ||||
|         include_directories(${Qt6DBus_INCLUDE_DIRS}) | ||||
|         set(QTDBUS_LIBRARIES ${Qt6DBus_LIBRARIES}) | ||||
|         macro(qt_add_dbus_interface) | ||||
|             qt6_add_dbus_interface(${ARGN}) | ||||
|         endmacro() | ||||
|     endif () | ||||
|  | ||||
|     if (BUILD_TRANSLATIONS) | ||||
|         find_package(Qt6 COMPONENTS LinguistTools REQUIRED) | ||||
|         macro(qt_add_translation) | ||||
|             qt6_add_translation(${ARGN}) | ||||
|         endmacro(qt_add_translation) | ||||
|         macro(qt_create_translation) | ||||
|             qt6_create_translation(${ARGN}) | ||||
|         endmacro(qt_create_translation) | ||||
|     endif () | ||||
|  | ||||
|     macro(qt_wrap_cpp) | ||||
|         qt6_wrap_cpp(${ARGN}) | ||||
|     endmacro() | ||||
|   else() | ||||
|     find_package(Qt4 COMPONENTS QtCore REQUIRED) | ||||
|   endif() | ||||
|   include_directories(${QT_INCLUDES}) | ||||
|   set(QTCORE_LIBRARIES ${QT_QTCORE_LIBRARY}) | ||||
|   macro(qt_add_translation) | ||||
|     qt4_add_translation(${ARGN}) | ||||
|   endmacro(qt_add_translation) | ||||
|   macro(qt_create_translation) | ||||
|     qt4_create_translation(${ARGN}) | ||||
|   endmacro(qt_create_translation) | ||||
|   macro(qt_wrap_cpp) | ||||
|     qt4_wrap_cpp(${ARGN}) | ||||
|   endmacro() | ||||
| endif() | ||||
|  | ||||
|     set(QTCORE_LIBRARIES ${Qt6Core_LIBRARIES}) | ||||
| endif () | ||||
|  | ||||
|  | ||||
| include_directories(${CMAKE_CURRENT_BINARY_DIR}) | ||||
|  | ||||
| list(APPEND qtkeychain_LIBRARIES ${QTCORE_LIBRARIES}) | ||||
| set(qtkeychain_SOURCES | ||||
|     keychain.cpp | ||||
| ) | ||||
|         keychain.cpp | ||||
|         qkeychain_export.h | ||||
|         keychain.h | ||||
|         ) | ||||
|  | ||||
| ADD_DEFINITIONS( -Wall ) | ||||
| if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") | ||||
|     # CMake < 3.15 sneaks in /W# flags for us, so we need a replacement, | ||||
|     # or we'll get a warning (cf. CMP0092) | ||||
|     if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") | ||||
|         string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | ||||
|     else () | ||||
|         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") | ||||
|     endif () | ||||
| else () | ||||
|     # MSVC's STL / Qt headers are not MSVC -Wall clean, so don't enable it there | ||||
|     add_definitions(-Wall) | ||||
| endif () | ||||
|  | ||||
| if(WIN32) | ||||
| if (WIN32) | ||||
|     list(APPEND qtkeychain_SOURCES keychain_win.cpp) | ||||
|     list(APPEND qtkeychain_LIBRARIES crypt32) | ||||
|     if (NOT USE_CREDENTIAL_STORE) | ||||
|         list(APPEND qtkeychain_LIBRARIES crypt32) | ||||
|         list(APPEND qtkeychain_SOURCES plaintextstore.cpp) | ||||
|     endif () | ||||
|     #FIXME: mingw bug; otherwise getting undefined refs to RtlSecureZeroMemory there | ||||
|     if(MINGW) | ||||
|         add_definitions( -O2 ) | ||||
|     endif() | ||||
| endif() | ||||
|     if (MINGW) | ||||
|         add_definitions(-O2) | ||||
|     endif () | ||||
| endif () | ||||
|  | ||||
| if(APPLE) | ||||
|     list(APPEND qtkeychain_SOURCES keychain_mac.cpp) | ||||
| if (APPLE) | ||||
|     list(APPEND qtkeychain_SOURCES keychain_apple.mm) | ||||
|     list(APPEND qtkeychain_LIBRARIES "-framework Foundation" "-framework Security") | ||||
| endif () | ||||
|  | ||||
|     find_library(COREFOUNDATION_LIBRARY CoreFoundation) | ||||
|     list(APPEND qtkeychain_LIBRARIES ${COREFOUNDATION_LIBRARY}) | ||||
| if (HAIKU) | ||||
|     list(APPEND qtkeychain_SOURCES keychain_haiku.cpp) | ||||
|  | ||||
|     find_library(SECURITY_LIBRARY Security) | ||||
|     list(APPEND qtkeychain_LIBRARIES ${SECURITY_LIBRARY}) | ||||
| endif() | ||||
|     find_library(BE_LIBRARY be REQUIRED) | ||||
|     list(APPEND qtkeychain_LIBRARIES ${BE_LIBRARY}) | ||||
| endif () | ||||
|  | ||||
| if(UNIX AND NOT APPLE) | ||||
|     list(APPEND qtkeychain_SOURCES keychain_unix.cpp gnomekeyring.cpp) | ||||
| if (UNIX AND NOT APPLE AND NOT ANDROID AND NOT HAIKU) | ||||
|     option(LIBSECRET_SUPPORT "Build with libsecret support" ON) | ||||
|  | ||||
|     if (LIBSECRET_SUPPORT) | ||||
|         pkg_check_modules(LIBSECRET libsecret-1) | ||||
|  | ||||
|         if (LIBSECRET_FOUND) | ||||
|             add_definitions(-DHAVE_LIBSECRET=1) | ||||
|         endif () | ||||
|         INCLUDE_DIRECTORIES(${LIBSECRET_INCLUDE_DIRS}) | ||||
|         LINK_DIRECTORIES(${LIBSECRET_LIBRARY_DIRS}) | ||||
|         list(APPEND qtkeychain_LIBRARIES_PRIVATE ${LIBSECRET_LIBRARIES}) | ||||
|     endif () | ||||
|  | ||||
|     add_definitions(-DKEYCHAIN_DBUS=1) | ||||
|     list(APPEND qtkeychain_SOURCES keychain_unix.cpp gnomekeyring.cpp libsecret.cpp plaintextstore.cpp) | ||||
|     qt_add_dbus_interface(qtkeychain_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/org.kde.KWallet.xml kwallet_interface KWalletInterface) | ||||
|     list(APPEND qtkeychain_LIBRARIES ${QTDBUS_LIBRARIES}) | ||||
| endif() | ||||
| endif () | ||||
|  | ||||
| QT_WRAP_CPP(qtkeychain_MOC_OUTFILES keychain.h keychain_p.h) | ||||
| if (ANDROID) | ||||
|     list(APPEND qtkeychain_SOURCES keychain_android.cpp androidkeystore.cpp plaintextstore.cpp) | ||||
|     list(APPEND qtkeychain_LIBRARIES ${QTANDROIDEXTRAS_LIBRARIES}) | ||||
| endif () | ||||
|  | ||||
| QT_WRAP_CPP(qtkeychain_MOC_OUTFILES keychain.h keychain_p.h gnomekeyring_p.h) | ||||
|  | ||||
| set(qtkeychain_TR_FILES | ||||
|       translations/qtkeychain_de.ts | ||||
|       translations/qtkeychain_ro.ts | ||||
| ) | ||||
|         translations/qtkeychain_de.ts | ||||
|         translations/qtkeychain_fr.ts | ||||
|         translations/qtkeychain_ro.ts | ||||
|         translations/qtkeychain_ru.ts | ||||
|         translations/qtkeychain_zh.ts | ||||
|         ) | ||||
|  | ||||
| file(GLOB qtkeychain_TR_SOURCES *.cpp *.h *.ui) | ||||
| qt_create_translation(qtkeychain_MESSAGES ${qtkeychain_TR_SOURCES} ${qtkeychain_TR_FILES}) | ||||
| qt_add_translation(qtkeychain_QM_FILES ${qtkeychain_TR_FILES}) | ||||
| add_custom_target(messages DEPENDS ${qtkeychain_MESSAGES}) | ||||
| add_custom_target(translations DEPENDS ${qtkeychain_QM_FILES}) | ||||
| if (BUILD_TRANSLATIONS) | ||||
|     qt_create_translation(qtkeychain_MESSAGES ${qtkeychain_TR_SOURCES} ${qtkeychain_TR_FILES}) | ||||
|     qt_add_translation(qtkeychain_QM_FILES ${qtkeychain_TR_FILES}) | ||||
|     add_custom_target(messages DEPENDS ${qtkeychain_MESSAGES}) | ||||
|     add_custom_target(translations DEPENDS ${qtkeychain_QM_FILES}) | ||||
|  | ||||
| if(NOT QT_TRANSLATIONS_DIR) | ||||
|     # If this directory is missing, we are in a Qt5 environment. | ||||
|     # Extract the qmake executable location | ||||
|     get_target_property(QT5_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) | ||||
|     # Ask Qt5 where to put the translations | ||||
|     execute_process( COMMAND ${QT5_QMAKE_EXECUTABLE} -query QT_INSTALL_TRANSLATIONS | ||||
|         OUTPUT_VARIABLE qt_translations_dir OUTPUT_STRIP_TRAILING_WHITESPACE ) | ||||
|     # make sure we have / and not \ as qmake gives on windows | ||||
|     FILE(TO_CMAKE_PATH "${qt_translations_dir}" qt_translations_dir) | ||||
|     SET(QT_TRANSLATIONS_DIR ${qt_translations_dir} CACHE PATH "The | ||||
|     location of the Qt translations" FORCE) | ||||
| endif() | ||||
|     if (QTKEYCHAIN_VERSION_INFIX EQUAL 5 AND QT_TRANSLATIONS_DIR AND NOT QTKEYCHAIN_TRANSLATIONS_DIR) | ||||
|         # Back compatibility with pre-0.11 versions | ||||
|         message(WARNING "QT_TRANSLATIONS_DIR is deprecated, use QTKEYCHAIN_TRANSLATIONS_DIR instead") | ||||
|         set(QTKEYCHAIN_TRANSLATIONS_DIR ${QT_TRANSLATIONS_DIR} | ||||
|                 CACHE PATH "The location of the QtKeychain translations" FORCE) | ||||
|     else () | ||||
|         set(QTKEYCHAIN_TRANSLATIONS_DIR | ||||
|                 ${CMAKE_INSTALL_DATADIR}/qt${QTKEYCHAIN_VERSION_INFIX}keychain/translations | ||||
|                 CACHE PATH "The location of the QtKeychain translations") | ||||
|     endif () | ||||
|  | ||||
| install(FILES ${qtkeychain_QM_FILES} | ||||
|         DESTINATION ${QT_TRANSLATIONS_DIR}) | ||||
|     install(FILES ${qtkeychain_QM_FILES} | ||||
|             DESTINATION ${QTKEYCHAIN_TRANSLATIONS_DIR}) | ||||
| endif (BUILD_TRANSLATIONS) | ||||
|  | ||||
| set(QTKEYCHAIN_TARGET_NAME qt${QTKEYCHAIN_VERSION_INFIX}keychain) | ||||
| if(NOT QTKEYCHAIN_STATIC) | ||||
| if (NOT QTKEYCHAIN_STATIC) | ||||
|     add_library(${QTKEYCHAIN_TARGET_NAME} SHARED ${qtkeychain_SOURCES} ${qtkeychain_MOC_OUTFILES} ${qtkeychain_QM_FILES}) | ||||
|     set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES COMPILE_DEFINITIONS QKEYCHAIN_BUILD_QKEYCHAIN_LIB) | ||||
|     target_link_libraries(${QTKEYCHAIN_TARGET_NAME} ${qtkeychain_LIBRARIES}) | ||||
| else() | ||||
| else () | ||||
|     add_library(${QTKEYCHAIN_TARGET_NAME} STATIC ${qtkeychain_SOURCES} ${qtkeychain_MOC_OUTFILES} ${qtkeychain_QM_FILES}) | ||||
|     set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES COMPILE_DEFINITIONS QKEYCHAIN_STATICLIB) | ||||
| endif() | ||||
| endif () | ||||
| if (WIN32) | ||||
|     set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES DEBUG_POSTFIX "d") | ||||
| endif () | ||||
|  | ||||
| target_link_libraries(${QTKEYCHAIN_TARGET_NAME} PUBLIC ${qtkeychain_LIBRARIES} PRIVATE ${qtkeychain_LIBRARIES_PRIVATE}) | ||||
| if (NOT INTERFACE_INCLUDE_SUFFIX) | ||||
|     set(INTERFACE_INCLUDE_SUFFIX include) | ||||
| endif () | ||||
| target_include_directories(${QTKEYCHAIN_TARGET_NAME} PUBLIC | ||||
|         "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_BINARY_DIR}>" | ||||
|         $<INSTALL_INTERFACE:${INTERFACE_INCLUDE_SUFFIX}/> | ||||
|         ) | ||||
|  | ||||
| generate_export_header(${QTKEYCHAIN_TARGET_NAME} | ||||
|         EXPORT_FILE_NAME qkeychain_export.h | ||||
|         EXPORT_MACRO_NAME QKEYCHAIN_EXPORT | ||||
|         ) | ||||
|  | ||||
| set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES | ||||
|     VERSION ${QTKEYCHAIN_VERSION} | ||||
|     SOVERSION ${QTKEYCHAIN_SOVERSION} | ||||
|     MACOSX_RPATH 1 | ||||
|     INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" | ||||
| ) | ||||
|         VERSION ${QTKEYCHAIN_VERSION} | ||||
|         SOVERSION ${QTKEYCHAIN_SOVERSION} | ||||
|         MACOSX_RPATH 1 | ||||
|         INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" | ||||
|         INSTALL_RPATH_USE_LINK_PATH TRUE | ||||
|         ) | ||||
|  | ||||
| install(FILES keychain.h qkeychain_export.h | ||||
| install(FILES keychain.h ${CMAKE_CURRENT_BINARY_DIR}/qkeychain_export.h | ||||
|         DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/qt${QTKEYCHAIN_VERSION_INFIX}keychain/ | ||||
| ) | ||||
|         ) | ||||
|  | ||||
| install(TARGETS ${QTKEYCHAIN_TARGET_NAME} | ||||
|   EXPORT Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends | ||||
|   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} | ||||
|   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | ||||
|   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | ||||
| ) | ||||
|         EXPORT Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends | ||||
|         RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} | ||||
|         LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | ||||
|         ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | ||||
|         ) | ||||
|  | ||||
| add_executable( testclient testclient.cpp ) | ||||
| target_link_libraries( testclient ${QTKEYCHAIN_TARGET_NAME}) | ||||
| if (BUILD_TEST_APPLICATION) | ||||
|     add_executable(testclient testclient.cpp) | ||||
|     target_link_libraries(testclient ${QTKEYCHAIN_TARGET_NAME}) | ||||
| endif () | ||||
|  | ||||
|  | ||||
| ### | ||||
| ### CMake config file | ||||
| ### | ||||
|  | ||||
| export(TARGETS ${QTKEYCHAIN_TARGET_NAME} FILE "${PROJECT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends.cmake") | ||||
| export(PACKAGE Qt${QTKEYCHAIN_VERSION_INFIX}Keychain) | ||||
| configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/QtKeychainConfig.cmake.in" | ||||
|         "${CMAKE_CURRENT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfig.cmake" | ||||
|         INSTALL_DESTINATION Qt${QTKEYCHAIN_VERSION_INFIX}Keychain) | ||||
|  | ||||
| ecm_setup_version("${QTKEYCHAIN_VERSION}" VARIABLE_PREFIX SNORE | ||||
|         PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfigVersion.cmake" | ||||
|         SOVERSION ${QTKEYCHAIN_VERSION}) | ||||
|  | ||||
| if (UNIX AND NOT APPLE AND NOT ANDROID AND NOT HAIKU) | ||||
|     set(PRI_EXTRA_DEPS "dbus") | ||||
| endif () | ||||
| ecm_generate_pri_file(BASE_NAME Qt${QTKEYCHAIN_VERSION_INFIX}Keychain | ||||
|         LIB_NAME ${QTKEYCHAIN_TARGET_NAME} | ||||
|         DEPS "core ${PRI_EXTRA_DEPS}" | ||||
|         INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} | ||||
|         FILENAME_VAR pri_filename) | ||||
|  | ||||
| install(FILES ${pri_filename} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) | ||||
|  | ||||
| configure_file(QtKeychainBuildTreeSettings.cmake.in | ||||
|   "${PROJECT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainBuildTreeSettings.cmake" @ONLY) | ||||
| configure_file(QtKeychainConfig.cmake.in | ||||
|   "${PROJECT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfig.cmake" @ONLY) | ||||
| configure_file(QtKeychainConfigVersion.cmake.in | ||||
|   "${PROJECT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfigVersion.cmake" @ONLY) | ||||
|  | ||||
| install(EXPORT Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends | ||||
|     DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Qt${QTKEYCHAIN_VERSION_INFIX}Keychain" | ||||
| ) | ||||
|         DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Qt${QTKEYCHAIN_VERSION_INFIX}Keychain" | ||||
|         ) | ||||
|  | ||||
| install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfig.cmake | ||||
|               ${CMAKE_CURRENT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfigVersion.cmake | ||||
|         ${CMAKE_CURRENT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfigVersion.cmake | ||||
|         DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Qt${QTKEYCHAIN_VERSION_INFIX}Keychain | ||||
| ) | ||||
|         ) | ||||
|  | ||||
|   | ||||
| @@ -7,6 +7,9 @@ are met: | ||||
| 2. Redistributions in binary form must reproduce the above copyright | ||||
|    notice, this list of conditions and the following disclaimer in the | ||||
|    documentation and/or other materials provided with the distribution. | ||||
| 3. The name of the author may not be used to | ||||
|    endorse or promote products derived from this software without | ||||
|    specific prior written permission. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | ||||
| IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||||
|   | ||||
| @@ -1,6 +1,65 @@ | ||||
| ChangeLog | ||||
| ========= | ||||
|  | ||||
| version 0.12.0 (release 2020-12-16) | ||||
|  | ||||
|   * Add Qt 6 support, drop Qt 4 support | ||||
|   * Require C++11 | ||||
|   * Add Android support (Mathias Hasselmann) | ||||
|  | ||||
| version 0.11.1 (release 2020-09-08) | ||||
|  | ||||
|   * Build system fixes | ||||
|  | ||||
| version 0.11.0 (release 2020-09-08) | ||||
|  | ||||
|   * Important: Debug builds on Windows now get the "d" suffix | ||||
|   * Various build system fixes | ||||
|   * Add Haiku support (François Revol <revol@free.fr>) | ||||
|   * Translation: Russian (Alexander Gorishnyak <kefir500@gmail.com>) | ||||
|   * Translation: Update French (David Geiger <david.david@mageialinux-online.org>) | ||||
|  | ||||
| version 0.10.0 (release 2019-12-17) | ||||
|  | ||||
|   * Detect XFCE desktop correctly. (Sandro Knauß <hefee@debian.org>) | ||||
|   * Windows Use CRED_PERSIST_ENTERPRISE (Olivier Goffart <ogoffart@woboq.com>) | ||||
|   * Windows: Improve CredWrite() error handling (Christian Kamm <mail@ckamm.de>) | ||||
|   * Fix build with Qt 5.12.x (Sergey Ilinykh <rion4ik@gmail.com>) | ||||
|   * Fix Qt 4 build (Robert-André Mauchin <zebob.m@gmail.com>) | ||||
|   * Translation: Mandarin (Taiwan) (Poren Chiang <ren.chiang@gmail.com>) | ||||
|   * Translation: French (François Revol <revol@free.fr>) | ||||
|  | ||||
| version 0.9.1 (release 2018-08-20) | ||||
|   * Windows Credential Store: Use CRED_PERSIST_ENTERPRISE (Olivier Goffart <ogoffart@woboq.com>) | ||||
|   * Secret: Don't match the schema name #114 (Christian Kamm <mail@ckamm.de>) | ||||
|   * Fix qmake build on Windows (Alexander Gorishnyak <kefir500@gmail.com>) | ||||
|  | ||||
| version 0.9.0 (release 2018-07-13) | ||||
|   * Fall back on libsecret if kwallet is not available (Christian Kamm <mail@ckamm.de>) | ||||
|   * Only require QtLinguist if building translations (Victor Kropp <victor.kropp@jetbrains.com>) | ||||
|   * Fix building on Windows without credential store (Dmitry Ivanov <dm.vl.ivanov@gmail.com>) | ||||
|   * Fix Qt 4 build (Sandro Knauß <hefee@debian.org>) | ||||
|   * Make build of test application optional (Boris Pek <tehnick-8@yandex.ru>) | ||||
|  | ||||
| version 0.8.0 (release 2017-04-19) | ||||
|   * Buildsystem improvements (Kristofer Tingdahl <kristofer.tingdahl@dgbes.com>, Hannah von Reth <hannah.vonreth@kdab.com>, Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>) | ||||
|   * Enable C++11 support for Qt >= 5.7 (Dmitry Ivanov <dm.vl.ivanov@gmail.com>) | ||||
|   * Doxygen documentation ( Elvis Angelaccio <elvis.angelaccio@kdemail.net>) | ||||
|   * Libsecret support (Armin Novak <armin.novak@thincast.com>) | ||||
|   * iOS support (Mathias Hasselmann <mathias.hasselmann@kdab.com>) | ||||
|  | ||||
| version 0.7.0 (release 2016-05-23) | ||||
|   * Bump SO version due to 0.6 being binary-incompatible to previous releases | ||||
|  | ||||
| version 0.6.2 (release 2016-04-04) | ||||
|   * KWallet: Fixes a crash when storing passwords, seen on Debian/KDE4 | ||||
|  | ||||
| version 0.6.1 (release 2016-03-31) | ||||
|   * Fix KWallet not working (regressions in 0.6.0) | ||||
|  | ||||
| version 0.6.0 (release 2016-03-18) | ||||
|   * Added support for the Windows Credential Store | ||||
|  | ||||
| version 0.5.0 (release 2015-05-04) | ||||
|   * Added support for KWallet5 (KDE5/KF) | ||||
|   | ||||
|   | ||||
| @@ -1,4 +0,0 @@ | ||||
| set(QTKEYCHAIN_INCLUDE_DIRS | ||||
|   "@PROJECT_SOURCE_DIR@" | ||||
|   "@PROJECT_BINARY_DIR@" | ||||
| ) | ||||
| @@ -3,19 +3,17 @@ | ||||
| #  QTKEYCHAIN_INCLUDE_DIRS - include directories for QtKeychain | ||||
| #  QTKEYCHAIN_LIBRARIES    - libraries to link against | ||||
|  | ||||
| # Compute paths | ||||
| get_filename_component(QTKEYCHAIN_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) | ||||
| if(EXISTS "${QTKEYCHAIN_CMAKE_DIR}/CMakeCache.txt") | ||||
|    # In build tree | ||||
|    include("${QTKEYCHAIN_CMAKE_DIR}/Qt@QTKEYCHAIN_VERSION_INFIX@KeychainBuildTreeSettings.cmake") | ||||
| else() | ||||
|    set(QTKEYCHAIN_INCLUDE_DIRS "@CMAKE_INSTALL_FULL_INCLUDEDIR@") | ||||
| @PACKAGE_INIT@ | ||||
|  | ||||
| include("${CMAKE_CURRENT_LIST_DIR}/Qt@QTKEYCHAIN_VERSION_INFIX@KeychainLibraryDepends.cmake") | ||||
|  | ||||
| include(CMakeFindDependencyMacro) | ||||
|  | ||||
| find_dependency(Qt@QTKEYCHAIN_VERSION_INFIX@Core) | ||||
|  | ||||
| if(UNIX AND NOT APPLE) | ||||
|     find_dependency(Qt@QTKEYCHAIN_VERSION_INFIX@DBus) | ||||
| endif() | ||||
|  | ||||
| # Our library dependencies (contains definitions for IMPORTED targets) | ||||
| include("${QTKEYCHAIN_CMAKE_DIR}/Qt@QTKEYCHAIN_VERSION_INFIX@KeychainLibraryDepends.cmake") | ||||
|  | ||||
| # These are IMPORTED targets created by FooBarLibraryDepends.cmake | ||||
| set(QTKEYCHAIN_LIBRARIES "@QTKEYCHAIN_TARGET_NAME@") | ||||
|  | ||||
| set(QTKEYCHAIN_FOUND TRUE) | ||||
| get_target_property(QTKEYCHAIN_INCLUDE_DIRS "@QTKEYCHAIN_TARGET_NAME@" INTERFACE_INCLUDE_DIRECTORIES) | ||||
|   | ||||
| @@ -1,11 +0,0 @@ | ||||
| set(PACKAGE_VERSION "@QTKEYCHAIN_VERSION@") | ||||
|  | ||||
| # Check whether the requested PACKAGE_FIND_VERSION is compatible | ||||
| if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") | ||||
|   set(PACKAGE_VERSION_COMPATIBLE FALSE) | ||||
| else() | ||||
|   set(PACKAGE_VERSION_COMPATIBLE TRUE) | ||||
|   if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") | ||||
|     set(PACKAGE_VERSION_EXACT TRUE) | ||||
|   endif() | ||||
| endif() | ||||
| @@ -1,15 +0,0 @@ | ||||
| QtKeychain | ||||
| ========== | ||||
|  | ||||
| QtKeychain is a Qt API to store passwords and other secret data securely. How the data is stored depends on the platform: | ||||
|  | ||||
|  * **Mac OS X:** Passwords are stored in the OS X Keychain. | ||||
|  | ||||
|  * **Linux/Unix:** If running, GNOME Keyring is used, otherwise  | ||||
| qtkeychain tries to use KWallet (via D-Bus), if available. | ||||
|  | ||||
|  * **Windows:** Windows does not provide a service for secure storage. QtKeychain uses the Windows API function [CryptProtectData](http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261%28v=vs.85%29.aspx "CryptProtectData function") to encrypt the password with the user's logon credentials. The encrypted data is then persisted via QSettings. | ||||
|  | ||||
| In unsupported environments QtKeychain will report an error. It will not store any data unencrypted unless explicitly requested (setInsecureFallback( true )). | ||||
|  | ||||
| **License:** QtKeychain is available under the [Modified BSD License](http://www.gnu.org/licenses/license-list.html#ModifiedBSD). See the file COPYING for details. | ||||
							
								
								
									
										35
									
								
								ext/qtkeychain/ReadMe.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								ext/qtkeychain/ReadMe.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| QtKeychain | ||||
| ========== | ||||
|  | ||||
| QtKeychain is a Qt API to store passwords and other secret data securely. How the data is stored depends on the platform: | ||||
|  | ||||
|  * **macOS:** Passwords are stored in the macOS Keychain. | ||||
|  | ||||
|  * **Linux/Unix:** If running, GNOME Keyring is used, otherwise QtKeychain tries to use KWallet (via D-Bus), if available. Libsecret (common API for desktop-specific solutions) | ||||
|    is also supported. | ||||
|  | ||||
|  * **Windows:** By default, the Windows Credential Store is used (requires Windows 7 or newer). | ||||
| Pass `-DUSE_CREDENTIAL_STORE=OFF` to cmake to disable it. If disabled, QtKeychain uses the Windows API function | ||||
| [CryptProtectData](http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261%28v=vs.85%29.aspx "CryptProtectData function") | ||||
| to encrypt the password with the user's logon credentials. The encrypted data is then persisted via QSettings. | ||||
|  | ||||
|  * **Android and iOS:** Passwords are stored in the Android keystore system and iOS keychain, respectively. | ||||
|  | ||||
| In unsupported environments QtKeychain will report an error. It will not store any data unencrypted unless explicitly requested (`setInsecureFallback( true )`). | ||||
|  | ||||
|  | ||||
| Requirements | ||||
| ------------ | ||||
|  | ||||
| QtKeychain 0.12 and newer supports Qt 5 and Qt 6 and requires a compiler with C++11 support. Older versions support Qt 4 and Qt 5. | ||||
|  | ||||
| License | ||||
| ------- | ||||
|  | ||||
| QtKeychain is available under the [Modified BSD License](http://www.gnu.org/licenses/license-list.html#ModifiedBSD). See the file COPYING for details. | ||||
|  | ||||
| Changes made in this fork (Chatterino/qtkeychain) | ||||
| ------- | ||||
|  | ||||
| Updated the .pri file to point to the right mac/apple-specific file | ||||
| Added `#undef singals` in libsecret.cpp to fix compilation. | ||||
| @@ -1,15 +0,0 @@ | ||||
| QtKeychain | ||||
| ========== | ||||
|  | ||||
| QtKeychain is a Qt API to store passwords and other secret data securely. How the data is stored depends on the platform: | ||||
|  | ||||
|  * **Mac OS X:** Passwords are stored in the OS X Keychain. | ||||
|  | ||||
|  * **Linux/Unix:** If running, GNOME Keyring is used, otherwise  | ||||
| qtkeychain tries to use KWallet (via D-Bus), if available. | ||||
|  | ||||
|  * **Windows:** Windows does not provide a service for secure storage. QtKeychain uses the Windows API function [CryptProtectData](http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261%28v=vs.85%29.aspx "CryptProtectData function") to encrypt the password with the user's logon credentials. The encrypted data is then persisted via QSettings. | ||||
|  | ||||
| In unsupported environments QtKeychain will report an error. It will not store any data unencrypted unless explicitly requested (setInsecureFallback( true )). | ||||
|  | ||||
| **License:** QtKeychain is available under the [Modified BSD License](http://www.gnu.org/licenses/license-list.html#ModifiedBSD). See the file COPYING for details. | ||||
							
								
								
									
										302
									
								
								ext/qtkeychain/androidkeystore.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								ext/qtkeychain/androidkeystore.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,302 @@ | ||||
| #include "androidkeystore_p.h" | ||||
|  | ||||
| #if QT_VERSION < QT_VERSION_CHECK(5, 7, 0) | ||||
| #include "private/qjni_p.h" | ||||
| #endif | ||||
|  | ||||
| #include <QAndroidJniEnvironment> | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| using namespace android::content; | ||||
| using namespace android::security; | ||||
|  | ||||
| using namespace java::io; | ||||
| using namespace java::lang; | ||||
| using namespace java::math; | ||||
| using namespace java::util; | ||||
| using namespace java::security; | ||||
| using namespace java::security::spec; | ||||
|  | ||||
| using namespace javax::crypto; | ||||
| using namespace javax::security::auth::x500; | ||||
| using namespace javax::security::cert; | ||||
|  | ||||
| const BigInteger BigInteger::ONE = BigInteger::getStaticObjectField("java/math/BigInteger", "ONE", "Ljava/math/BigInteger;"); | ||||
|  | ||||
| const int Calendar::YEAR = Calendar::getStaticField<jint>("java/util/Calendar", "YEAR"); | ||||
|  | ||||
| const int Cipher::DECRYPT_MODE = Cipher::getStaticField<jint>("javax/crypto/Cipher", "DECRYPT_MODE"); | ||||
| const int Cipher::ENCRYPT_MODE = Cipher::getStaticField<jint>("javax/crypto/Cipher", "ENCRYPT_MODE"); | ||||
|  | ||||
| namespace { | ||||
|  | ||||
| #if QT_VERSION < QT_VERSION_CHECK(5, 7, 0) | ||||
|  | ||||
| struct JNIObject | ||||
| { | ||||
|     JNIObject(QSharedPointer<QJNIObjectPrivate> d): d(d) {} | ||||
|  | ||||
|     static JNIObject fromLocalRef(jobject o) | ||||
|     { | ||||
|         return JNIObject(QSharedPointer<QJNIObjectPrivate>::create(QJNIObjectPrivate::fromLocalRef(o))); | ||||
|     } | ||||
|  | ||||
|     jobject object() const { return d->object(); } | ||||
|     QSharedPointer<QJNIObjectPrivate> d; | ||||
| }; | ||||
|  | ||||
| #else | ||||
|  | ||||
| using JNIObject = QAndroidJniObject; | ||||
|  | ||||
| #endif | ||||
|  | ||||
| QByteArray fromArray(const jbyteArray array) | ||||
| { | ||||
|     QAndroidJniEnvironment env; | ||||
|     jbyte *const bytes = env->GetByteArrayElements(array, Q_NULLPTR); | ||||
|     const QByteArray result(reinterpret_cast<const char *>(bytes), env->GetArrayLength(array)); | ||||
|     env->ReleaseByteArrayElements(array, bytes, JNI_ABORT); | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| JNIObject toArray(const QByteArray &bytes) | ||||
| { | ||||
|     QAndroidJniEnvironment env; | ||||
|     const int length = bytes.length(); | ||||
|     JNIObject array = JNIObject::fromLocalRef(env->NewByteArray(length)); | ||||
|     env->SetByteArrayRegion(static_cast<jbyteArray>(array.object()), | ||||
|                             0, length, reinterpret_cast<const jbyte *>(bytes.constData())); | ||||
|     return array; | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| bool Object::handleExceptions() | ||||
| { | ||||
|     QAndroidJniEnvironment env; | ||||
|  | ||||
|     if (env->ExceptionCheck()) { | ||||
|         env->ExceptionDescribe(); | ||||
|         env->ExceptionClear(); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
|  | ||||
| KeyPairGenerator KeyPairGenerator::getInstance(const QString &algorithm, const QString &provider) | ||||
| { | ||||
|     return handleExceptions(callStaticObjectMethod("java/security/KeyPairGenerator", "getInstance", | ||||
|                                                    "(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyPairGenerator;", | ||||
|                                                    fromString(algorithm).object(), fromString(provider).object())); | ||||
| } | ||||
|  | ||||
| KeyPair KeyPairGenerator::generateKeyPair() const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("generateKeyPair", "()Ljava/security/KeyPair;")); | ||||
| } | ||||
|  | ||||
| bool KeyPairGenerator::initialize(const AlgorithmParameterSpec &spec) const | ||||
| { | ||||
|     callMethod<void>("initialize", "(Ljava/security/spec/AlgorithmParameterSpec;)V", spec.object()); | ||||
|     return handleExceptions(); | ||||
| } | ||||
|  | ||||
| bool KeyStore::containsAlias(const QString &alias) const | ||||
| { | ||||
|     return handleExceptions(callMethod<jboolean>("containsAlias", "(Ljava/lang/String;)Z", | ||||
|                                                  fromString(alias).object())); | ||||
| } | ||||
|  | ||||
| bool KeyStore::deleteEntry(const QString &alias) const | ||||
| { | ||||
|     callMethod<void>("deleteEntry", "(Ljava/lang/String;)Z", fromString(alias).object()); | ||||
|     return handleExceptions(); | ||||
| } | ||||
|  | ||||
| KeyStore KeyStore::getInstance(const QString &type) | ||||
| { | ||||
|     return handleExceptions(callStaticObjectMethod("java/security/KeyStore", "getInstance", | ||||
|                                                    "(Ljava/lang/String;)Ljava/security/KeyStore;", | ||||
|                                                    fromString(type).object())); | ||||
| } | ||||
|  | ||||
| KeyStore::Entry KeyStore::getEntry(const QString &alias, const KeyStore::ProtectionParameter ¶m) const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("getEntry", | ||||
|                                              "(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;", | ||||
|                                              fromString(alias).object(), param.object())); | ||||
| } | ||||
|  | ||||
| bool KeyStore::load(const KeyStore::LoadStoreParameter ¶m) const | ||||
| { | ||||
|     callMethod<void>("load", "(Ljava/security/KeyStore$LoadStoreParameter;)V", param.object()); | ||||
|     return handleExceptions(); | ||||
| } | ||||
|  | ||||
|  | ||||
| Calendar Calendar::getInstance() | ||||
| { | ||||
|     return handleExceptions(callStaticObjectMethod("java/util/Calendar", "getInstance", | ||||
|                                                    "()Ljava/util/Calendar;")); | ||||
|  | ||||
| } | ||||
|  | ||||
| bool Calendar::add(int field, int amount) const | ||||
| { | ||||
|     callMethod<void>("add", "(II)V", field, amount); | ||||
|     return handleExceptions(); | ||||
| } | ||||
|  | ||||
| Date Calendar::getTime() const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("getTime", "()Ljava/util/Date;")); | ||||
| } | ||||
|  | ||||
| KeyPairGeneratorSpec::Builder::Builder(const Context &context) | ||||
|     : Object(QAndroidJniObject("android/security/KeyPairGeneratorSpec$Builder", | ||||
|                                "(Landroid/content/Context;)V", | ||||
|                                context.object())) | ||||
| { | ||||
|     handleExceptions(); | ||||
| } | ||||
|  | ||||
| KeyPairGeneratorSpec::Builder KeyPairGeneratorSpec::Builder::setAlias(const QString &alias) const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("setAlias", | ||||
|                                              "(Ljava/lang/String;)Landroid/security/KeyPairGeneratorSpec$Builder;", | ||||
|                                              fromString(alias).object())); | ||||
| } | ||||
|  | ||||
| KeyPairGeneratorSpec::Builder KeyPairGeneratorSpec::Builder::setSubject(const X500Principal &subject) const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("setSubject", | ||||
|                                              "(Ljavax/security/auth/x500/X500Principal;)Landroid/security/KeyPairGeneratorSpec$Builder;", | ||||
|                                              subject.object())); | ||||
| } | ||||
|  | ||||
| KeyPairGeneratorSpec::Builder KeyPairGeneratorSpec::Builder::setSerialNumber(const BigInteger &serial) const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("setSerialNumber", | ||||
|                                              "(Ljava/math/BigInteger;)Landroid/security/KeyPairGeneratorSpec$Builder;", | ||||
|                                              serial.object())); | ||||
| } | ||||
|  | ||||
| KeyPairGeneratorSpec::Builder KeyPairGeneratorSpec::Builder::setStartDate(const Date &date) const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("setStartDate", | ||||
|                                              "(Ljava/util/Date;)Landroid/security/KeyPairGeneratorSpec$Builder;", | ||||
|                                              date.object())); | ||||
| } | ||||
|  | ||||
| KeyPairGeneratorSpec::Builder KeyPairGeneratorSpec::Builder::setEndDate(const Date &date) const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("setEndDate", | ||||
|                                              "(Ljava/util/Date;)Landroid/security/KeyPairGeneratorSpec$Builder;", | ||||
|                                              date.object())); | ||||
| } | ||||
|  | ||||
| KeyPairGeneratorSpec KeyPairGeneratorSpec::Builder::build() const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("build", "()Landroid/security/KeyPairGeneratorSpec;")); | ||||
| } | ||||
|  | ||||
| X500Principal::X500Principal(const QString &name) | ||||
|     : Object(QAndroidJniObject("javax/security/auth/x500/X500Principal", | ||||
|                                "(Ljava/lang/String;)V", | ||||
|                                fromString(name).object())) | ||||
| { | ||||
|     handleExceptions(); | ||||
| } | ||||
|  | ||||
| Certificate KeyStore::PrivateKeyEntry::getCertificate() const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("getCertificate", "()Ljava/security/cert/Certificate;")); | ||||
| } | ||||
|  | ||||
| PrivateKey KeyStore::PrivateKeyEntry::getPrivateKey() const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("getPrivateKey", "()Ljava/security/PrivateKey;")); | ||||
| } | ||||
|  | ||||
| PublicKey Certificate::getPublicKey() const | ||||
| { | ||||
|     return handleExceptions(callObjectMethod("getPublicKey", "()Ljava/security/PublicKey;")); | ||||
| } | ||||
|  | ||||
| ByteArrayInputStream::ByteArrayInputStream(const QByteArray &bytes) | ||||
|     : InputStream(QAndroidJniObject("java/io/ByteArrayInputStream", "([B)V", toArray(bytes).object())) | ||||
| { | ||||
| } | ||||
|  | ||||
| ByteArrayOutputStream::ByteArrayOutputStream() | ||||
|     : OutputStream(QAndroidJniObject("java/io/ByteArrayOutputStream")) | ||||
| { | ||||
|     handleExceptions(); | ||||
| } | ||||
|  | ||||
| QByteArray ByteArrayOutputStream::toByteArray() const | ||||
| { | ||||
|     const QAndroidJniObject wrapper = callObjectMethod<jbyteArray>("toByteArray"); | ||||
|  | ||||
|     if (!handleExceptions()) | ||||
|         return QByteArray(); | ||||
|  | ||||
|     return fromArray(static_cast<jbyteArray>(wrapper.object())); | ||||
| } | ||||
|  | ||||
| int InputStream::read() const | ||||
| { | ||||
|     return handleExceptions(callMethod<int>("read"), -1); | ||||
| } | ||||
|  | ||||
| bool OutputStream::write(const QByteArray &bytes) const | ||||
| { | ||||
|     callMethod<void>("write", "([B)V", toArray(bytes).object()); | ||||
|     return handleExceptions(); | ||||
| } | ||||
|  | ||||
| bool OutputStream::close() const | ||||
| { | ||||
|     callMethod<void>("close"); | ||||
|     return handleExceptions(); | ||||
| } | ||||
|  | ||||
| bool OutputStream::flush() const | ||||
| { | ||||
|     callMethod<void>("flush"); | ||||
|     return handleExceptions(); | ||||
| } | ||||
|  | ||||
| Cipher Cipher::getInstance(const QString &transformation) | ||||
| { | ||||
|     return handleExceptions(callStaticObjectMethod("javax/crypto/Cipher", "getInstance", | ||||
|                                                    "(Ljava/lang/String;)Ljavax/crypto/Cipher;", | ||||
|                                                    fromString(transformation).object())); | ||||
| } | ||||
|  | ||||
| bool Cipher::init(int opMode, const Key &key) const | ||||
| { | ||||
|     callMethod<void>("init", "(ILjava/security/Key;)V", opMode, key.object()); | ||||
|     return handleExceptions(); | ||||
| } | ||||
|  | ||||
|  | ||||
| CipherOutputStream::CipherOutputStream(const OutputStream &stream, const Cipher &cipher) | ||||
|     : FilterOutputStream(QAndroidJniObject("javax/crypto/CipherOutputStream", | ||||
|                                            "(Ljava/io/OutputStream;Ljavax/crypto/Cipher;)V", | ||||
|                                            stream.object(), cipher.object())) | ||||
| { | ||||
|     handleExceptions(); | ||||
| } | ||||
|  | ||||
| CipherInputStream::CipherInputStream(const InputStream &stream, const Cipher &cipher) | ||||
|     : FilterInputStream(QAndroidJniObject("javax/crypto/CipherInputStream", | ||||
|                                           "(Ljava/io/InputStream;Ljavax/crypto/Cipher;)V", | ||||
|                                           stream.object(), cipher.object())) | ||||
| { | ||||
|     handleExceptions(); | ||||
| } | ||||
							
								
								
									
										371
									
								
								ext/qtkeychain/androidkeystore_p.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										371
									
								
								ext/qtkeychain/androidkeystore_p.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,371 @@ | ||||
| /****************************************************************************** | ||||
|  *   Copyright (C) 2016 Mathias Hasselmann <mathias.hasselmann@kdab.com>      * | ||||
|  *                                                                            * | ||||
|  * This program is distributed in the hope that it will be useful, but        * | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||||
|  * or FITNESS FOR A PARTICULAR PURPOSE. For licensing and distribution        * | ||||
|  * details, check the accompanying file 'COPYING'.                            * | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| #ifndef QTKEYCHAIN_ANDROIDKEYSTORE_P_H | ||||
| #define QTKEYCHAIN_ANDROIDKEYSTORE_P_H | ||||
|  | ||||
| #include <QAndroidJniObject> | ||||
|  | ||||
| namespace QKeychain { | ||||
|  | ||||
| namespace javax { | ||||
| namespace security { | ||||
|  | ||||
| namespace auth { namespace x500 { class X500Principal; } } | ||||
| namespace cert { class Certificate; } | ||||
|  | ||||
| } | ||||
| } | ||||
|  | ||||
| namespace java { | ||||
| namespace lang { | ||||
|  | ||||
| class Object : protected QAndroidJniObject | ||||
| { | ||||
| public: | ||||
|     inline Object(jobject object) : QAndroidJniObject(object) {} | ||||
|     inline Object(const QAndroidJniObject &object) : QAndroidJniObject(object) {} | ||||
|     inline operator bool() const { return isValid(); } | ||||
|  | ||||
|     using QAndroidJniObject::object; | ||||
|     using QAndroidJniObject::toString; | ||||
|  | ||||
| protected: | ||||
|     static bool handleExceptions(); | ||||
|  | ||||
|     template<typename T> | ||||
|     static T handleExceptions(const T &result, const T &resultOnError = T()); | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| inline T Object::handleExceptions(const T &result, const T &resultOnError) | ||||
| { | ||||
|     if (!handleExceptions()) | ||||
|         return resultOnError; | ||||
|  | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| } // namespace lang | ||||
|  | ||||
| namespace io { | ||||
|  | ||||
| class InputStream : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
|  | ||||
|     int read() const; | ||||
| }; | ||||
|  | ||||
| class ByteArrayInputStream : public InputStream | ||||
| { | ||||
| public: | ||||
|     using InputStream::InputStream; | ||||
|  | ||||
|     explicit ByteArrayInputStream(const QByteArray &bytes); | ||||
| }; | ||||
|  | ||||
| class FilterInputStream : public InputStream | ||||
| { | ||||
| public: | ||||
|     using InputStream::InputStream; | ||||
| }; | ||||
|  | ||||
| class OutputStream : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
|  | ||||
|     bool write(const QByteArray &bytes) const; | ||||
|     bool flush() const; | ||||
|     bool close() const; | ||||
| }; | ||||
|  | ||||
| class ByteArrayOutputStream : public OutputStream | ||||
| { | ||||
| public: | ||||
|     using OutputStream::OutputStream; | ||||
|  | ||||
|     ByteArrayOutputStream(); | ||||
|  | ||||
|     QByteArray toByteArray() const; | ||||
| }; | ||||
|  | ||||
| class FilterOutputStream : public OutputStream | ||||
| { | ||||
| public: | ||||
|     using OutputStream::OutputStream; | ||||
| }; | ||||
|  | ||||
| } // namespace io | ||||
|  | ||||
| namespace math { | ||||
|  | ||||
| class BigInteger : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
|  | ||||
|     static const BigInteger ZERO; | ||||
|     static const BigInteger ONE; | ||||
|     static const BigInteger TEN; | ||||
| }; | ||||
|  | ||||
| } // namespace math | ||||
|  | ||||
| namespace util { | ||||
|  | ||||
| class Date : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
| }; | ||||
|  | ||||
| class Calendar : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
|  | ||||
|     static const int YEAR; | ||||
|     static const int MONTH; | ||||
|     static const int DAY; | ||||
|     static const int HOUR; | ||||
|     static const int MINUTE; | ||||
|     static const int SECOND; | ||||
|     static const int MILLISECOND; | ||||
|  | ||||
|     static Calendar getInstance(); | ||||
|  | ||||
|     bool add(int field, int amount) const; | ||||
|     Date getTime() const; | ||||
| }; | ||||
|  | ||||
| } // namespace util | ||||
|  | ||||
| namespace security { | ||||
| namespace spec { | ||||
|  | ||||
| class AlgorithmParameterSpec : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
| }; | ||||
|  | ||||
| } // namespace spec | ||||
|  | ||||
| class Key : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
| }; | ||||
|  | ||||
| class PrivateKey : public Key | ||||
| { | ||||
| public: | ||||
|     using Key::Key; | ||||
|  | ||||
|     PrivateKey(const Key &init): Key(init) {} | ||||
| }; | ||||
|  | ||||
| class PublicKey : public Key | ||||
| { | ||||
| public: | ||||
|     using Key::Key; | ||||
|  | ||||
|     PublicKey(const Key &init): Key(init) {} | ||||
| }; | ||||
|  | ||||
| class KeyPair : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
| }; | ||||
|  | ||||
| class KeyPairGenerator : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
|  | ||||
|     static KeyPairGenerator getInstance(const QString &algorithm, const QString &provider); | ||||
|     KeyPair generateKeyPair() const; | ||||
|     bool initialize(const spec::AlgorithmParameterSpec &spec) const; | ||||
|  | ||||
| }; | ||||
|  | ||||
| class KeyStore : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     class Entry : public java::lang::Object | ||||
|     { | ||||
|     public: | ||||
|         using Object::Object; | ||||
|     }; | ||||
|  | ||||
|     class PrivateKeyEntry : public Entry | ||||
|     { | ||||
|     public: | ||||
|         using Entry::Entry; | ||||
|  | ||||
|         inline PrivateKeyEntry(const Entry &init): Entry(init) {} | ||||
|  | ||||
|         javax::security::cert::Certificate getCertificate() const; | ||||
|         java::security::PrivateKey getPrivateKey() const; | ||||
|     }; | ||||
|  | ||||
|     class LoadStoreParameter : public java::lang::Object | ||||
|     { | ||||
|     public: | ||||
|         using Object::Object; | ||||
|     }; | ||||
|  | ||||
|     class ProtectionParameter : public java::lang::Object | ||||
|     { | ||||
|     public: | ||||
|         using Object::Object; | ||||
|     }; | ||||
|  | ||||
|     using Object::Object; | ||||
|  | ||||
|     bool containsAlias(const QString &alias) const; | ||||
|     bool deleteEntry(const QString &alias) const; | ||||
|     static KeyStore getInstance(const QString &type); | ||||
|     Entry getEntry(const QString &alias, const ProtectionParameter ¶m = Q_NULLPTR) const; | ||||
|     bool load(const LoadStoreParameter ¶m = Q_NULLPTR) const; | ||||
| }; | ||||
|  | ||||
| namespace interfaces { | ||||
|  | ||||
| class RSAPrivateKey : public PrivateKey | ||||
| { | ||||
| public: | ||||
|     using PrivateKey::PrivateKey; | ||||
|  | ||||
|     RSAPrivateKey(const PrivateKey &init): PrivateKey(init) {} | ||||
| }; | ||||
|  | ||||
| class RSAPublicKey : public PublicKey | ||||
| { | ||||
| public: | ||||
|     using PublicKey::PublicKey; | ||||
|  | ||||
|     RSAPublicKey(const PublicKey &init): PublicKey(init) {} | ||||
| }; | ||||
|  | ||||
| } // namespace interfaces | ||||
|  | ||||
| } // namespace security | ||||
| } // namespace java | ||||
|  | ||||
| namespace android { | ||||
| namespace content { | ||||
|  | ||||
| class Context : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
| }; | ||||
|  | ||||
| } // namespace content | ||||
|  | ||||
| namespace security { | ||||
|  | ||||
| class KeyPairGeneratorSpec : public java::security::spec::AlgorithmParameterSpec | ||||
| { | ||||
| public: | ||||
|     class Builder : public java::lang::Object | ||||
|     { | ||||
|     public: | ||||
|         using Object::Object; | ||||
|  | ||||
|         explicit Builder(const android::content::Context &context); | ||||
|  | ||||
|         Builder setAlias(const QString &alias) const; | ||||
|         Builder setSubject(const javax::security::auth::x500::X500Principal &subject) const; | ||||
|         Builder setSerialNumber(const java::math::BigInteger &serial) const; | ||||
|         Builder setStartDate(const java::util::Date &date) const; | ||||
|         Builder setEndDate(const java::util::Date &date) const; | ||||
|         KeyPairGeneratorSpec build() const; | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     using AlgorithmParameterSpec::AlgorithmParameterSpec; | ||||
| }; | ||||
|  | ||||
| } // namespace security | ||||
| } // namespace android | ||||
|  | ||||
| namespace javax { | ||||
| namespace crypto { | ||||
|  | ||||
| class Cipher : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     static const int DECRYPT_MODE; | ||||
|     static const int ENCRYPT_MODE; | ||||
|  | ||||
|     using Object::Object; | ||||
|  | ||||
|     static Cipher getInstance(const QString &transformation); | ||||
|     bool init(int opMode, const java::security::Key &key) const; | ||||
| }; | ||||
|  | ||||
| class CipherInputStream : public java::io::FilterInputStream | ||||
| { | ||||
| public: | ||||
|     using FilterInputStream::FilterInputStream; | ||||
|  | ||||
|     explicit CipherInputStream(const InputStream &stream, const Cipher &cipher); | ||||
| }; | ||||
|  | ||||
| class CipherOutputStream : public java::io::FilterOutputStream | ||||
| { | ||||
| public: | ||||
|     using FilterOutputStream::FilterOutputStream; | ||||
|  | ||||
|     explicit CipherOutputStream(const OutputStream &stream, const Cipher &cipher); | ||||
| }; | ||||
|  | ||||
| } | ||||
|  | ||||
| namespace security { | ||||
| namespace auth { | ||||
| namespace x500 { | ||||
|  | ||||
| class X500Principal; | ||||
|  | ||||
| class X500Principal : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
|  | ||||
|     explicit X500Principal(const QString &name); | ||||
| }; | ||||
|  | ||||
| } // namespace x500 | ||||
| } // namespace auth | ||||
|  | ||||
| namespace cert { | ||||
|  | ||||
| class Certificate : public java::lang::Object | ||||
| { | ||||
| public: | ||||
|     using Object::Object; | ||||
|  | ||||
|     java::security::PublicKey getPublicKey() const; | ||||
| }; | ||||
|  | ||||
| } // namespace cert | ||||
|  | ||||
| } // namespace security | ||||
| } // namespace javax | ||||
|  | ||||
| } // namespace QKeychain | ||||
|  | ||||
| #endif // QTKEYCHAIN_ANDROIDKEYSTORE_P_H | ||||
							
								
								
									
										31
									
								
								ext/qtkeychain/appveyor.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								ext/qtkeychain/appveyor.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| version: '{build}' | ||||
|     | ||||
| build_script: | ||||
|     - ps: | | ||||
|         $ErrorActionPreference="Stop" | ||||
|         Import-Module $env:APPVEYOR_BUILD_FOLDER\appveyorHelp.psm1 | ||||
|          | ||||
|         Init @("ninja") | ||||
|         mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\build\$env:APPVEYOR_PROJECT_NAME | ||||
|         cd $env:APPVEYOR_BUILD_FOLDER\work\build\$env:APPVEYOR_PROJECT_NAME | ||||
|         LogExec cmake -G"Ninja" $env:APPVEYOR_BUILD_FOLDER -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_ROOT" | ||||
|          | ||||
|         CmakeImageInstall | ||||
|  | ||||
| test: off | ||||
|  | ||||
| cache: | ||||
|     - work\install -> appveyor.yml | ||||
|     - C:\ProgramData\chocolatey\bin -> appveyor.yml | ||||
|     - C:\ProgramData\chocolatey\lib -> appveyor.yml | ||||
|      | ||||
| environment: | ||||
|     QT_VER: 5.7 | ||||
|      | ||||
|     matrix: | ||||
|     - COMPILER: msvc2015 | ||||
|     - COMPILER: msvc2015_64 | ||||
|     - COMPILER: mingw53_32  | ||||
|  | ||||
|  | ||||
|      | ||||
							
								
								
									
										362
									
								
								ext/qtkeychain/appveyorHelp.psm1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										362
									
								
								ext/qtkeychain/appveyorHelp.psm1
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,362 @@ | ||||
| Write-Host "Appveyor Helper scrips https://github.com/TheOneRing/appVeyorHelp" | ||||
|  | ||||
| $ErrorActionPreference="Stop" | ||||
|  | ||||
| $script:INSTALL_DIR="$env:APPVEYOR_BUILD_FOLDER\work\install" | ||||
| $CMAKE_INSTALL_ROOT="`"$INSTALL_DIR`"" -replace "\\", "/" | ||||
| $env:PATH="$env:PATH;$script:INSTALL_DIR" | ||||
|  | ||||
| if(!$env:CI -eq "true") | ||||
| { | ||||
|     function Push-AppveyorArtifact() | ||||
|     { | ||||
|         Write-Host "Push-AppveyorArtifact $ARGS" | ||||
|     } | ||||
|     function Start-FileDownload([string] $url, [string] $out) | ||||
|     { | ||||
|         if(!$out) | ||||
|         { | ||||
|             $out = $url.SubString($url.LastIndexOf("/")) | ||||
|         } | ||||
|         wget $url -Outfile $out | ||||
|     } | ||||
| } | ||||
|  | ||||
| function LogExec() | ||||
| { | ||||
|     $OldErrorActionPreference=$ErrorActionPreference | ||||
|     $ErrorActionPreference="Continue" | ||||
|     $LastExitCode = 0 | ||||
|     Write-Host $Args[0], $Args[1..(($Args.Count)-1)] | ||||
|     & $Args[0] $Args[1..(($Args.Count)-1)] | ||||
|     if(!$LastExitCode -eq 0) | ||||
|     { | ||||
|         exit $LastExitCode | ||||
|     } | ||||
|     $ErrorActionPreference=$OldErrorActionPreference | ||||
| } | ||||
|  | ||||
| #Set environment variables for Visual Studio Command Prompt | ||||
| #http://stackoverflow.com/questions/2124753/how-i-can-use-powershell-with-the-visual-studio-command-prompt | ||||
| function BAT-CALL([string] $path, [string] $arg) | ||||
| { | ||||
|     Write-Host "Calling `"$path`" `"$arg`"" | ||||
|     cmd /c  "$path" "$arg" `&`& set `|`| exit 1| | ||||
|     foreach { | ||||
|       if ($_ -match "=") { | ||||
|         $v = $_.split("=") | ||||
|         #Write-Host "ENV:\$($v[0])=$($v[1])" | ||||
|         set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])" | ||||
|       } | ||||
|     } | ||||
|     if($LastExitCode -eq 1) { | ||||
|         Write-Error "$path not found." | ||||
|     } | ||||
| } | ||||
|  | ||||
| function Get-QtDir() | ||||
| { | ||||
|     $ver = 5.5 | ||||
|     if($env:QT_VER) | ||||
|     { | ||||
|         $ver = $env:QT_VER | ||||
|     } | ||||
|     return "C:\Qt\$ver\$env:COMPILER\" | ||||
| } | ||||
|  | ||||
| function SETUP-QT() | ||||
| { | ||||
|     [string] $compiler=$env:COMPILER | ||||
|     $qtDir = Get-QtDir | ||||
|     $script:QT_BINARY_DIRS = @($qtDir) | ||||
|  | ||||
|     BAT-CALL  "$qtDir\bin\qtenv2.bat" | ||||
|     if ($compiler.StartsWith("mingw49")) | ||||
|     { | ||||
|         #remove sh.exe from path | ||||
|         $env:PATH=$env:PATH -replace "C:\\Program Files \(x86\)\\Git\\bin", "" | ||||
|         $script:MAKE="mingw32-make" | ||||
|         $script:CMAKE_GENERATOR="MinGW Makefiles" | ||||
|         $script:STRIP=@("strip", "-s") | ||||
|         $script:QT_BINARY_DIRS += (Resolve-Path "$qtDir\..\..\Tools\mingw492_32\opt\") | ||||
|     } | ||||
|     elseif ($compiler.StartsWith("msvc")) | ||||
|     { | ||||
|         $arch = "x86" | ||||
|         if($compiler.EndsWith("64")) | ||||
|         { | ||||
|             $arch = "amd64" | ||||
|         } | ||||
|         $compilerDirs = @{ | ||||
|                 "msvc2010" = "VS100COMNTOOLS"; | ||||
|                 "msvc2012" = "VS110COMNTOOLS"; | ||||
|                 "msvc2013" = "VS120COMNTOOLS"; | ||||
|                 "msvc2015" = "VS140COMNTOOLS" | ||||
|             } | ||||
|  | ||||
|         $compilerVar = $compilerDirs[$compiler.Split("_")[0]] | ||||
|         $compilerDir = (get-item -path "env:\$($compilerVar)").Value | ||||
|         BAT-CALL "$compilerDir\..\..\VC\vcvarsall.bat" $arch | ||||
|         $script:MAKE="nmake" | ||||
|         $script:CMAKE_GENERATOR="NMake Makefiles" | ||||
|         if($arch -eq "x86") | ||||
|         { | ||||
|             $script:QT_BINARY_DIRS += ("C:\OpenSSL-Win32") | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             $script:QT_BINARY_DIRS += ("C:\OpenSSL-Win64") | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| function Install-ChocolatelyModule([string] $module, [string[]] $myargs) | ||||
| { | ||||
|     Write-Host "Install chocolately package $module" | ||||
|     LogExec cinst $module @myargs -y | ||||
| } | ||||
|  | ||||
| function Install-CmakeGitModule([string] $url, [hashtable] $arguments) | ||||
| { | ||||
|     $module = $url.SubString($url.LastIndexOf("/")+1) | ||||
|     $module = $module.Substring(0,$module.Length - 4) | ||||
|     if(!$arguments.Contains("branch")) | ||||
|     { | ||||
|         $arguments["branch"] = "master" | ||||
|     } | ||||
|     if(!$arguments.Contains("buildType")) | ||||
|     { | ||||
|         $arguments["buildType"] = "Release" | ||||
|     } | ||||
|     mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\build\$module | ||||
|     pushd $env:APPVEYOR_BUILD_FOLDER\work\git | ||||
|     LogExec git clone -q --depth 1 --branch ([string]$arguments["branch"]) $url $module | ||||
|     popd | ||||
|     pushd  $env:APPVEYOR_BUILD_FOLDER\work\build\$module | ||||
|     LogExec cmake -G $script:CMAKE_GENERATOR  ("-DCMAKE_BUILD_TYPE=`"{0}`"" -f [string]$arguments["buildType"]) $env:APPVEYOR_BUILD_FOLDER\work\git\$module -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_ROOT" $arguments["options"] | ||||
|     LogExec  $script:MAKE install | ||||
|     popd | ||||
| } | ||||
|  | ||||
| function Init([string[]] $chocoDeps, [System.Collections.Specialized.OrderedDictionary] $cmakeModules) | ||||
| { | ||||
|     $script:MAKE="" | ||||
|     $script:CMAKE_GENERATOR="" | ||||
|     $script:STRIP=$null | ||||
|  | ||||
|     mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\image | Out-Null | ||||
|     mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\build | Out-Null | ||||
|  | ||||
|     SETUP-QT | ||||
|  | ||||
|     if($chocoDeps -contains "ninja") { | ||||
|         $script:CMAKE_GENERATOR="Ninja" | ||||
|         $script:MAKE="ninja" | ||||
|     } | ||||
|  | ||||
|     if ( !(Test-Path "$env:APPVEYOR_BUILD_FOLDER\work\install" ) ) | ||||
|     { | ||||
|         mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\install | Out-Null | ||||
|         mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\git | Out-Null | ||||
|  | ||||
|         foreach($module in $chocoDeps) { | ||||
|             if($module -eq "nsis") | ||||
|             { | ||||
|                 Install-ChocolatelyModule "nsis.portable" @("-pre") | ||||
|                 continue | ||||
|             } | ||||
|             Install-ChocolatelyModule $module | ||||
|         } | ||||
|  | ||||
|         foreach($key in $cmakeModules.Keys) { | ||||
|             Install-CmakeGitModule $key $cmakeModules[$key] | ||||
|         } | ||||
|  | ||||
|         [string] $compiler=$env:COMPILER | ||||
|         if($compiler.StartsWith("msvc")) | ||||
|         { | ||||
|             Write-Host "Downloading vcredist.exe" | ||||
|             if ($compiler.StartsWith("msvc2015")) | ||||
|             { | ||||
|                 if($compiler.EndsWith("64")) | ||||
|                 { | ||||
|                     Start-FileDownload https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe $env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     Start-FileDownload https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x86.exe $env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if($compiler.EndsWith("64")) | ||||
|                 { | ||||
|                     Start-FileDownload http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe $env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     Start-FileDownload http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe $env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| function relativePath([string] $root, [string] $path) | ||||
| { | ||||
|     pushd $root | ||||
|     $out = Resolve-Path -Relative $path | ||||
|     popd | ||||
|     return $out | ||||
| } | ||||
|  | ||||
| function StripFile([string] $name) | ||||
| { | ||||
|     if($script:STRIP) { | ||||
|         if( $name.EndsWith(".dll") -or $name.EndsWith(".exe")) | ||||
|         { | ||||
|             Write-Host "strip file $name" | ||||
|             LogExec @script:STRIP $name | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| function Get-DeployImageName() | ||||
| { | ||||
|     $version = Get-Version | ||||
|     if($env:APPVEYOR_REPO_TAG -eq "true") { | ||||
|         return "$env:APPVEYOR_PROJECT_NAME`_$version`_Qt$env:QT_VER`_$env:COMPILER" | ||||
|     }else{ | ||||
|         return "$env:APPVEYOR_PROJECT_NAME`_$env:APPVEYOR_REPO_BRANCH`_$version`_Qt$env:QT_VER`_$env:COMPILER" | ||||
|     } | ||||
| } | ||||
|  | ||||
| function Get-Version() | ||||
| { | ||||
|     if($env:APPVEYOR_REPO_TAG -eq "true") { | ||||
|         return $env:APPVEYOR_REPO_TAG_NAME | ||||
|     }else{ | ||||
|         $commit = ([string]$env:APPVEYOR_REPO_COMMIT).SubString(0,6) | ||||
|         return $commit | ||||
|     } | ||||
| } | ||||
|  | ||||
| function CmakeImageInstall() | ||||
| { | ||||
|     $imageName = Get-DeployImageName | ||||
|     $destDir = "$env:APPVEYOR_BUILD_FOLDER\work\cmakeDeployImage\$imageName" | ||||
|     $env:DESTDIR = $destDir | ||||
|     LogExec $script:MAKE install | ||||
|     $env:DESTDIR = $null | ||||
|     if(!$LastExitCode -eq 0) | ||||
|     { | ||||
|         Write-Error "Build Failed" | ||||
|     } | ||||
|     $env:DESTDIR=$null | ||||
|     $prefix=$script:INSTALL_DIR | ||||
|     if( $prefix.substring(1,1) -eq ":") | ||||
|     { | ||||
|         $prefix=$prefix.substring(3) | ||||
|     } | ||||
|     Write-Host "move $destDir\$prefix to $destDir" | ||||
|     mv -Force "$destDir\$prefix\*" "$destDir" | ||||
|     $rootLeftOver = $prefix.substring(0, $prefix.indexOf("\")) | ||||
|     rm -Recurse "$destDir\$rootLeftOver" | ||||
| } | ||||
|  | ||||
| function CreateDeployImage([string[]] $whiteList, [string[]] $blackList) | ||||
| { | ||||
|     $imageName = Get-DeployImageName | ||||
|     $deployPath = "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName" | ||||
|  | ||||
|     function copyWithWhitelist([string] $root) | ||||
|     { | ||||
|         $files = ls $root -Recurse | ||||
|         foreach($fileName in $files.FullName) | ||||
|         { | ||||
|             $relPath = (relativePath $root $fileName).SubString(2) | ||||
|             if($whiteList | Where {$relPath -match $_}) | ||||
|             { | ||||
|                 if($blackList | Where {$relPath -match $_}) | ||||
|                 { | ||||
|                     continue | ||||
|                 } | ||||
|                 if(!(Test-Path $deployPath\$relPath)) | ||||
|                 { | ||||
|                     Write-Host "copy $fileName to $deployPath\$relPath" | ||||
|                     mkdir -Force (Split-Path -Parent $deployPath\$relPath) | Out-Null | ||||
|                     cp -Force $fileName $deployPath\$relPath | ||||
|                     StripFile $deployPath\$relPath | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     Write-Host "CreateDeployImage $imageName" | ||||
|     mkdir $deployPath | Out-Null | ||||
|  | ||||
|     copyWithWhitelist "$env:APPVEYOR_BUILD_FOLDER\work\cmakeDeployImage\$imageName" | ||||
|     copyWithWhitelist "$env:APPVEYOR_BUILD_FOLDER\work\install\" | ||||
|     foreach($folder in $script:QT_BINARY_DIRS) | ||||
|     { | ||||
|         copyWithWhitelist $folder | ||||
|     } | ||||
|     Write-Host "Deploy path $deployPath" | ||||
|     return $deployPath | ||||
| } | ||||
|  | ||||
| function 7ZipDeployImage() | ||||
| { | ||||
|     $imageName = Get-DeployImageName | ||||
|     LogExec 7za a "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName.7z" "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName" | ||||
|     Push-AppveyorArtifact "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName.7z" | ||||
| } | ||||
|  | ||||
| function NsisDeployImage([string] $scriptName) | ||||
| { | ||||
|     $imageName = Get-DeployImageName | ||||
|     $installerName = "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName.exe" | ||||
|     $version = Get-Version | ||||
|     if(([string]$env:COMPILER).StartsWith("msvc")) | ||||
|     { | ||||
|         $redist = "$env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe" | ||||
|     }else{ | ||||
|         $redist = "none" | ||||
|     } | ||||
|     if($env:COMPILER.EndsWith("64")) | ||||
|     { | ||||
|         $defaultinstdir = "`$PROGRAMFILES64" | ||||
|     }else{ | ||||
|         $defaultinstdir = "`$PROGRAMFILES" | ||||
|     } | ||||
|     LogExec makensis.exe /DgitDir=$env:APPVEYOR_BUILD_FOLDER /Dsetupname=$installerName /Dcaption=$imageName /Dversion=$version /Dcompiler=$env:COMPILER /Dvcredist=$redist /Ddefaultinstdir=$defaultinstdir /Dsrcdir=$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName $scriptName | ||||
|     Push-AppveyorArtifact $installerName | ||||
| } | ||||
|  | ||||
| # based on http://thesurlyadmin.com/2013/01/07/remove-empty-directories-recursively/ | ||||
| function DeleteEmptyFodlers([string] $root) | ||||
| { | ||||
|     $Folders = @() | ||||
|     foreach($Folder in (Get-ChildItem -Path $root -Recurse -Directory)) | ||||
|        { | ||||
|             $Folders += New-Object PSObject -Property @{ | ||||
|                 Object = $Folder | ||||
|                 Depth = ($Folder.FullName.Split("\")).Count | ||||
|             } | ||||
|     } | ||||
|     $Folders = $Folders | Sort Depth -Descending | ||||
|  | ||||
|     foreach($Folder in $Folders) | ||||
|     { | ||||
|        If ($Folder.Object.GetFileSystemInfos().Count -eq 0) | ||||
|        { | ||||
|             Write-Host "Delete empty dir:" $Folder.Object.FullName | ||||
|             Remove-Item -Path $Folder.Object.FullName -Force | ||||
|        } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| Write-Host "CMAKE_INSTALL_ROOT: $CMAKE_INSTALL_ROOT" | ||||
| Write-Host "Image-Name: ", (Get-DeployImageName) | ||||
|  | ||||
| Export-ModuleMember -Function @("Init","CmakeImageInstall", "CreateDeployImage", "LogExec", "7ZipDeployImage", "NsisDeployImage", "DeleteEmptyFodlers") -Variable @("CMAKE_INSTALL_ROOT") | ||||
							
								
								
									
										199
									
								
								ext/qtkeychain/cmake/Modules/ECMGeneratePriFile.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										199
									
								
								ext/qtkeychain/cmake/Modules/ECMGeneratePriFile.cmake
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,199 @@ | ||||
| #.rst: | ||||
| # ECMGeneratePriFile | ||||
| # ------------------ | ||||
| # | ||||
| # Generate a ``.pri`` file for the benefit of qmake-based projects. | ||||
| # | ||||
| # As well as the function below, this module creates the cache variable | ||||
| # ``ECM_MKSPECS_INSTALL_DIR`` and sets the default value to ``mkspecs/modules``. | ||||
| # This assumes Qt and the current project are both installed to the same | ||||
| # non-system prefix.  Packagers who use ``-DCMAKE_INSTALL_PREFIX=/usr`` will | ||||
| # certainly want to set ``ECM_MKSPECS_INSTALL_DIR`` to something like | ||||
| # ``share/qt5/mkspecs/modules``. | ||||
| # | ||||
| # The main thing is that this should be the ``modules`` subdirectory of either | ||||
| # the default qmake ``mkspecs`` directory or of a directory that will be in the | ||||
| # ``$QMAKEPATH`` environment variable when qmake is run. | ||||
| # | ||||
| # :: | ||||
| # | ||||
| #   ecm_generate_pri_file(BASE_NAME <baseName> | ||||
| #                         LIB_NAME <libName> | ||||
| #                         [DEPS "<dep> [<dep> [...]]"] | ||||
| #                         [FILENAME_VAR <filename_variable>] | ||||
| #                         [INCLUDE_INSTALL_DIR <dir>] | ||||
| #                         [LIB_INSTALL_DIR <dir>]) | ||||
| # | ||||
| # If your CMake project produces a Qt-based library, you may expect there to be | ||||
| # applications that wish to use it that use a qmake-based build system, rather | ||||
| # than a CMake-based one.  Creating a ``.pri`` file will make use of your | ||||
| # library convenient for them, in much the same way that CMake config files make | ||||
| # things convenient for CMake-based applications. | ||||
| # | ||||
| # ecm_generate_pri_file() generates just such a file.  It requires the | ||||
| # ``PROJECT_VERSION_STRING`` variable to be set.  This is typically set by | ||||
| # :module:`ECMSetupVersion`, although the project() command in CMake 3.0.0 and | ||||
| # later can also set this. | ||||
| # | ||||
| # BASE_NAME specifies the name qmake project (.pro) files should use to refer to | ||||
| # the library (eg: KArchive).  LIB_NAME is the name of the actual library to | ||||
| # link to (ie: the first argument to add_library()).  DEPS is a space-separated | ||||
| # list of the base names of other libraries (for Qt libraries, use the same | ||||
| # names you use with the ``QT`` variable in a qmake project file, such as "core" | ||||
| # for QtCore).  FILENAME_VAR specifies the name of a variable to store the path | ||||
| # to the generated file in. | ||||
| # | ||||
| # INCLUDE_INSTALL_DIR is the path (relative to ``CMAKE_INSTALL_PREFIX``) that | ||||
| # include files will be installed to. It defaults to | ||||
| # ``${INCLUDE_INSTALL_DIR}/<baseName>`` if the ``INCLUDE_INSTALL_DIR`` variable | ||||
| # is set. If that variable is not set, the ``CMAKE_INSTALL_INCLUDEDIR`` variable | ||||
| # is used instead, and if neither are set ``include`` is used.  LIB_INSTALL_DIR | ||||
| # operates similarly for the installation location for libraries; it defaults to | ||||
| # ``${LIB_INSTALL_DIR}``, ``${CMAKE_INSTALL_LIBDIR}`` or ``lib``, in that order. | ||||
| # | ||||
| # Example usage: | ||||
| # | ||||
| # .. code-block:: cmake | ||||
| # | ||||
| #   ecm_generate_pri_file( | ||||
| #       BASE_NAME KArchive | ||||
| #       LIB_NAME KF5KArchive | ||||
| #       DEPS "core" | ||||
| #       FILENAME_VAR pri_filename | ||||
| #   ) | ||||
| #   install(FILES ${pri_filename} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) | ||||
| # | ||||
| # A qmake-based project that wished to use this would then do:: | ||||
| # | ||||
| #   QT += KArchive | ||||
| # | ||||
| # in their ``.pro`` file. | ||||
| # | ||||
| # Since pre-1.0.0. | ||||
|  | ||||
| #============================================================================= | ||||
| # SPDX-FileCopyrightText: 2014 David Faure <faure@kde.org> | ||||
| # | ||||
| # SPDX-License-Identifier: BSD-3-Clause | ||||
|  | ||||
| # Replicate the logic from KDEInstallDirs.cmake as we can't depend on it | ||||
| # Ask qmake if we're using the same prefix as Qt | ||||
| set(_askqmake OFF) | ||||
| if(NOT DEFINED KDE_INSTALL_USE_QT_SYS_PATHS) | ||||
|     include(ECMQueryQmake) | ||||
|     query_qmake(qt_install_prefix_dir QT_INSTALL_PREFIX TRY) | ||||
|     if(qt_install_prefix_dir STREQUAL "${CMAKE_INSTALL_PREFIX}") | ||||
|         set(_askqmake ON) | ||||
|     endif() | ||||
| endif() | ||||
|  | ||||
| if(KDE_INSTALL_USE_QT_SYS_PATHS OR _askqmake) | ||||
|   include(ECMQueryQmake) | ||||
|   query_qmake(qt_host_data_dir QT_HOST_DATA) | ||||
|   set(ECM_MKSPECS_INSTALL_DIR ${qt_host_data_dir}/mkspecs/modules CACHE PATH "The directory where mkspecs will be installed to.") | ||||
| else() | ||||
|   set(ECM_MKSPECS_INSTALL_DIR mkspecs/modules CACHE PATH "The directory where mkspecs will be installed to.") | ||||
| endif() | ||||
|  | ||||
| function(ECM_GENERATE_PRI_FILE) | ||||
|   set(options ) | ||||
|   set(oneValueArgs BASE_NAME LIB_NAME DEPS FILENAME_VAR INCLUDE_INSTALL_DIR LIB_INSTALL_DIR) | ||||
|   set(multiValueArgs ) | ||||
|  | ||||
|   cmake_parse_arguments(EGPF "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||||
|  | ||||
|   if(EGPF_UNPARSED_ARGUMENTS) | ||||
|     message(FATAL_ERROR "Unknown keywords given to ECM_GENERATE_PRI_FILE(): \"${EGPF_UNPARSED_ARGUMENTS}\"") | ||||
|   endif() | ||||
|  | ||||
|   if(NOT EGPF_BASE_NAME) | ||||
|     message(FATAL_ERROR "Required argument BASE_NAME missing in ECM_GENERATE_PRI_FILE() call") | ||||
|   endif() | ||||
|   if(NOT EGPF_LIB_NAME) | ||||
|     message(FATAL_ERROR "Required argument LIB_NAME missing in ECM_GENERATE_PRI_FILE() call") | ||||
|   endif() | ||||
|   if(NOT PROJECT_VERSION_STRING) | ||||
|     message(FATAL_ERROR "Required variable PROJECT_VERSION_STRING not set before ECM_GENERATE_PRI_FILE() call. Did you call ecm_setup_version?") | ||||
|   endif() | ||||
|   if(NOT EGPF_INCLUDE_INSTALL_DIR) | ||||
|       if(INCLUDE_INSTALL_DIR) | ||||
|           set(EGPF_INCLUDE_INSTALL_DIR "${INCLUDE_INSTALL_DIR}/${EGPF_BASE_NAME}") | ||||
|       elseif(CMAKE_INSTALL_INCLUDEDIR) | ||||
|           set(EGPF_INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${EGPF_BASE_NAME}") | ||||
|       else() | ||||
|           set(EGPF_INCLUDE_INSTALL_DIR "include/${EGPF_BASE_NAME}") | ||||
|       endif() | ||||
|   endif() | ||||
|   if(NOT EGPF_LIB_INSTALL_DIR) | ||||
|       if(LIB_INSTALL_DIR) | ||||
|           set(EGPF_LIB_INSTALL_DIR "${LIB_INSTALL_DIR}") | ||||
|       elseif(CMAKE_INSTALL_LIBDIR) | ||||
|           set(EGPF_LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") | ||||
|       else() | ||||
|           set(EGPF_LIB_INSTALL_DIR "lib") | ||||
|       endif() | ||||
|   endif() | ||||
|  | ||||
|   string(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" PROJECT_VERSION_MAJOR "${PROJECT_VERSION_STRING}") | ||||
|   string(REGEX REPLACE "^[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" PROJECT_VERSION_MINOR "${PROJECT_VERSION_STRING}") | ||||
|   string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" PROJECT_VERSION_PATCH "${PROJECT_VERSION_STRING}") | ||||
|  | ||||
|   # Prepare the right number of "../.." to go from ECM_MKSPECS_INSTALL_DIR to the install prefix | ||||
|   # This allows to make the generated pri files relocatable (no absolute paths) | ||||
|   if (IS_ABSOLUTE ${ECM_MKSPECS_INSTALL_DIR}) | ||||
|      set(BASEPATH ${CMAKE_INSTALL_PREFIX}) | ||||
|   else() | ||||
|     string(REGEX REPLACE "[^/]+" ".." PRI_ROOT_RELATIVE_TO_MKSPECS ${ECM_MKSPECS_INSTALL_DIR}) | ||||
|     set(BASEPATH "$$PWD/${PRI_ROOT_RELATIVE_TO_MKSPECS}") | ||||
|  endif() | ||||
|  | ||||
|   set(PRI_TARGET_BASENAME ${EGPF_BASE_NAME}) | ||||
|   set(PRI_TARGET_LIBNAME ${EGPF_LIB_NAME}) | ||||
|   set(PRI_TARGET_QTDEPS ${EGPF_DEPS}) | ||||
|   if(IS_ABSOLUTE "${EGPF_INCLUDE_INSTALL_DIR}") | ||||
|       set(PRI_TARGET_INCLUDES "${EGPF_INCLUDE_INSTALL_DIR}") | ||||
|   else() | ||||
|       set(PRI_TARGET_INCLUDES "${BASEPATH}/${EGPF_INCLUDE_INSTALL_DIR}") | ||||
|   endif() | ||||
|   if(IS_ABSOLUTE "${EGPF_LIB_INSTALL_DIR}") | ||||
|       set(PRI_TARGET_LIBS "${EGPF_LIB_INSTALL_DIR}") | ||||
|   else() | ||||
|       set(PRI_TARGET_LIBS "${BASEPATH}/${EGPF_LIB_INSTALL_DIR}") | ||||
|   endif() | ||||
|   set(PRI_TARGET_DEFINES "") | ||||
|  | ||||
|   set(PRI_FILENAME ${CMAKE_CURRENT_BINARY_DIR}/qt_${PRI_TARGET_BASENAME}.pri) | ||||
|   if (EGPF_FILENAME_VAR) | ||||
|      set(${EGPF_FILENAME_VAR} ${PRI_FILENAME} PARENT_SCOPE) | ||||
|   endif() | ||||
|  | ||||
|   set(PRI_TARGET_MODULE_CONFIG "") | ||||
|   # backward compat: it was not obvious LIB_NAME needs to be a target name, | ||||
|   # and some projects where the target name was not the actual library output name | ||||
|   # passed the output name for LIB_NAME, so .name & .module prperties are correctly set. | ||||
|   # TODO: improve API dox, allow control over module name if target name != output name | ||||
|   if(TARGET ${EGPF_LIB_NAME}) | ||||
|     get_target_property(target_type ${EGPF_LIB_NAME} TYPE) | ||||
|     if (target_type STREQUAL "STATIC_LIBRARY") | ||||
|         set(PRI_TARGET_MODULE_CONFIG "staticlib") | ||||
|     endif() | ||||
|   endif() | ||||
|  | ||||
|   file(GENERATE | ||||
|      OUTPUT ${PRI_FILENAME} | ||||
|      CONTENT | ||||
|      "QT.${PRI_TARGET_BASENAME}.VERSION = ${PROJECT_VERSION_STRING} | ||||
| QT.${PRI_TARGET_BASENAME}.MAJOR_VERSION = ${PROJECT_VERSION_MAJOR} | ||||
| QT.${PRI_TARGET_BASENAME}.MINOR_VERSION = ${PROJECT_VERSION_MINOR} | ||||
| QT.${PRI_TARGET_BASENAME}.PATCH_VERSION = ${PROJECT_VERSION_PATCH} | ||||
| QT.${PRI_TARGET_BASENAME}.name = ${PRI_TARGET_LIBNAME} | ||||
| QT.${PRI_TARGET_BASENAME}.module = ${PRI_TARGET_LIBNAME} | ||||
| QT.${PRI_TARGET_BASENAME}.defines = ${PRI_TARGET_DEFINES} | ||||
| QT.${PRI_TARGET_BASENAME}.includes = ${PRI_TARGET_INCLUDES} | ||||
| QT.${PRI_TARGET_BASENAME}.private_includes = | ||||
| QT.${PRI_TARGET_BASENAME}.libs = ${PRI_TARGET_LIBS} | ||||
| QT.${PRI_TARGET_BASENAME}.depends = ${PRI_TARGET_QTDEPS} | ||||
| QT.${PRI_TARGET_BASENAME}.module_config = ${PRI_TARGET_MODULE_CONFIG} | ||||
| " | ||||
|   ) | ||||
| endfunction() | ||||
							
								
								
									
										202
									
								
								ext/qtkeychain/cmake/Modules/ECMPackageConfigHelpers.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								ext/qtkeychain/cmake/Modules/ECMPackageConfigHelpers.cmake
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,202 @@ | ||||
| #.rst: | ||||
| # ECMPackageConfigHelpers | ||||
| # ----------------------- | ||||
| # | ||||
| # Helper macros for generating CMake package config files. | ||||
| # | ||||
| # ``write_basic_package_version_file()`` is the same as the one provided by the | ||||
| # `CMakePackageConfigHelpers | ||||
| # <https://www.cmake.org/cmake/help/v2.8.12/cmake.html#module:CMakePackageConfigHelpers>`_ | ||||
| # module in CMake; see that module's documentation for | ||||
| # more information. | ||||
| # | ||||
| # :: | ||||
| # | ||||
| #   ecm_configure_package_config_file(<input> <output> | ||||
| #       INSTALL_DESTINATION <path> | ||||
| #       [PATH_VARS <var1> [<var2> [...]] | ||||
| #       [NO_SET_AND_CHECK_MACRO] | ||||
| #       [NO_CHECK_REQUIRED_COMPONENTS_MACRO]) | ||||
| # | ||||
| # | ||||
| # This behaves in the same way as configure_package_config_file() from CMake | ||||
| # 2.8.12, except that it adds an extra helper macro: find_dependency(). It is | ||||
| # highly recommended that you read the `documentation for | ||||
| # CMakePackageConfigHelpers | ||||
| # <https://www.cmake.org/cmake/help/v2.8.12/cmake.html#module:CMakePackageConfigHelpers>`_ | ||||
| # for more information, particularly with regard to the PATH_VARS argument. | ||||
| # | ||||
| # Note that there is no argument that will disable the find_dependency() macro; | ||||
| # if you do not require this macro, you should use | ||||
| # ``configure_package_config_file`` from the CMakePackageConfigHelpers module. | ||||
| # | ||||
| # CMake 3.0 includes a CMakeFindDependencyMacro module that provides the | ||||
| # find_dependency() macro (which you can ``include()`` in your package config | ||||
| # file), so this file is only useful for projects wishing to provide config | ||||
| # files that will work with CMake 2.8.12. | ||||
| # | ||||
| # Additional Config File Macros | ||||
| # ============================= | ||||
| # | ||||
| # :: | ||||
| # | ||||
| #   find_dependency(<dep> [<version> [EXACT]]) | ||||
| # | ||||
| # find_dependency() should be used instead of find_package() to find package | ||||
| # dependencies.  It forwards the correct parameters for EXACT, QUIET and | ||||
| # REQUIRED which were passed to the original find_package() call.  It also sets | ||||
| # an informative diagnostic message if the dependency could not be found. | ||||
| # | ||||
| # Since pre-1.0.0. | ||||
|  | ||||
| #============================================================================= | ||||
| # SPDX-FileCopyrightText: 2014 Alex Merry <alex.merry@kdemail.net> | ||||
| # SPDX-FileCopyrightText: 2013 Stephen Kelly <steveire@gmail.com> | ||||
| # | ||||
| # SPDX-License-Identifier: BSD-3-Clause | ||||
|  | ||||
| include(${CMAKE_ROOT}/Modules/CMakePackageConfigHelpers.cmake) | ||||
|  | ||||
| set(_ecm_package_config_helpers_included TRUE) | ||||
|  | ||||
| if(NOT CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.13) | ||||
|     message(AUTHOR_WARNING "Your project already requires a version of CMake that includes the find_dependency macro via the CMakeFindDependencyMacro module. You should use CMakePackageConfigHelpers instead of ECMPackageConfigHelpers.") | ||||
| endif() | ||||
|  | ||||
| function(ECM_CONFIGURE_PACKAGE_CONFIG_FILE _inputFile _outputFile) | ||||
|   set(options NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO) | ||||
|   set(oneValueArgs INSTALL_DESTINATION ) | ||||
|   set(multiValueArgs PATH_VARS ) | ||||
|  | ||||
|   cmake_parse_arguments(CCF "${options}" "${oneValueArgs}" "${multiValueArgs}"  ${ARGN}) | ||||
|  | ||||
|   if(CCF_UNPARSED_ARGUMENTS) | ||||
|     message(FATAL_ERROR "Unknown keywords given to CONFIGURE_PACKAGE_CONFIG_FILE(): \"${CCF_UNPARSED_ARGUMENTS}\"") | ||||
|   endif() | ||||
|  | ||||
|   if(NOT CCF_INSTALL_DESTINATION) | ||||
|     message(FATAL_ERROR "No INSTALL_DESTINATION given to CONFIGURE_PACKAGE_CONFIG_FILE()") | ||||
|   endif() | ||||
|  | ||||
|   if(IS_ABSOLUTE "${CCF_INSTALL_DESTINATION}") | ||||
|     set(absInstallDir "${CCF_INSTALL_DESTINATION}") | ||||
|   else() | ||||
|     set(absInstallDir "${CMAKE_INSTALL_PREFIX}/${CCF_INSTALL_DESTINATION}") | ||||
|   endif() | ||||
|  | ||||
|   file(RELATIVE_PATH PACKAGE_RELATIVE_PATH "${absInstallDir}" "${CMAKE_INSTALL_PREFIX}" ) | ||||
|  | ||||
|   foreach(var ${CCF_PATH_VARS}) | ||||
|     if(NOT DEFINED ${var}) | ||||
|       message(FATAL_ERROR "Variable ${var} does not exist") | ||||
|     else() | ||||
|       if(IS_ABSOLUTE "${${var}}") | ||||
|         string(REPLACE "${CMAKE_INSTALL_PREFIX}" "\${PACKAGE_PREFIX_DIR}" | ||||
|                         PACKAGE_${var} "${${var}}") | ||||
|       else() | ||||
|         set(PACKAGE_${var} "\${PACKAGE_PREFIX_DIR}/${${var}}") | ||||
|       endif() | ||||
|     endif() | ||||
|   endforeach() | ||||
|  | ||||
|   get_filename_component(inputFileName "${_inputFile}" NAME) | ||||
|  | ||||
|   set(PACKAGE_INIT " | ||||
| ####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() (ECM variant) ####### | ||||
| ####### Any changes to this file will be overwritten by the next CMake run            ####### | ||||
| ####### The input file was ${inputFileName}                                           ####### | ||||
|  | ||||
| get_filename_component(PACKAGE_PREFIX_DIR \"\${CMAKE_CURRENT_LIST_DIR}/${PACKAGE_RELATIVE_PATH}\" ABSOLUTE) | ||||
| ") | ||||
|  | ||||
|   if("${absInstallDir}" MATCHES "^(/usr)?/lib(64)?/.+") | ||||
|     # Handle "/usr move" symlinks created by some Linux distros. | ||||
|     set(PACKAGE_INIT "${PACKAGE_INIT} | ||||
| # Use original install prefix when loaded through a \"/usr move\" | ||||
| # cross-prefix symbolic link such as /lib -> /usr/lib. | ||||
| get_filename_component(_realCurr \"\${CMAKE_CURRENT_LIST_DIR}\" REALPATH) | ||||
| get_filename_component(_realOrig \"${absInstallDir}\" REALPATH) | ||||
| if(_realCurr STREQUAL _realOrig) | ||||
|   set(PACKAGE_PREFIX_DIR \"${CMAKE_INSTALL_PREFIX}\") | ||||
| endif() | ||||
| unset(_realOrig) | ||||
| unset(_realCurr) | ||||
| ") | ||||
|   endif() | ||||
|  | ||||
|   if(NOT CCF_NO_SET_AND_CHECK_MACRO) | ||||
|     set(PACKAGE_INIT "${PACKAGE_INIT} | ||||
| macro(set_and_check _var _file) | ||||
|   set(\${_var} \"\${_file}\") | ||||
|   if(NOT EXISTS \"\${_file}\") | ||||
|     message(FATAL_ERROR \"File or directory \${_file} referenced by variable \${_var} does not exist !\") | ||||
|   endif() | ||||
| endmacro() | ||||
|  | ||||
| include(CMakeFindDependencyMacro OPTIONAL RESULT_VARIABLE _CMakeFindDependencyMacro_FOUND) | ||||
|  | ||||
| if (NOT _CMakeFindDependencyMacro_FOUND) | ||||
|   macro(find_dependency dep) | ||||
|     if (NOT \${dep}_FOUND) | ||||
|  | ||||
|       set(ecm_fd_version) | ||||
|       if (\${ARGC} GREATER 1) | ||||
|         set(ecm_fd_version \${ARGV1}) | ||||
|       endif() | ||||
|       set(ecm_fd_exact_arg) | ||||
|       if(\${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION_EXACT) | ||||
|         set(ecm_fd_exact_arg EXACT) | ||||
|       endif() | ||||
|       set(ecm_fd_quiet_arg) | ||||
|       if(\${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) | ||||
|         set(ecm_fd_quiet_arg QUIET) | ||||
|       endif() | ||||
|       set(ecm_fd_required_arg) | ||||
|       if(\${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED) | ||||
|         set(ecm_fd_required_arg REQUIRED) | ||||
|       endif() | ||||
|  | ||||
|       find_package(\${dep} \${ecm_fd_version} | ||||
|           \${ecm_fd_exact_arg} | ||||
|           \${ecm_fd_quiet_arg} | ||||
|           \${ecm_fd_required_arg} | ||||
|       ) | ||||
|  | ||||
|       if (NOT \${dep}_FOUND) | ||||
|         set(\${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE \"\${CMAKE_FIND_PACKAGE_NAME} could not be found because dependency \${dep} could not be found.\") | ||||
|         set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND False) | ||||
|         return() | ||||
|       endif() | ||||
|  | ||||
|       set(ecm_fd_version) | ||||
|       set(ecm_fd_required_arg) | ||||
|       set(ecm_fd_quiet_arg) | ||||
|       set(ecm_fd_exact_arg) | ||||
|     endif() | ||||
|   endmacro() | ||||
| endif() | ||||
|  | ||||
| ") | ||||
|   endif() | ||||
|  | ||||
|  | ||||
|   if(NOT CCF_NO_CHECK_REQUIRED_COMPONENTS_MACRO) | ||||
|     set(PACKAGE_INIT "${PACKAGE_INIT} | ||||
| macro(check_required_components _NAME) | ||||
|   foreach(comp \${\${_NAME}_FIND_COMPONENTS}) | ||||
|     if(NOT \${_NAME}_\${comp}_FOUND) | ||||
|       if(\${_NAME}_FIND_REQUIRED_\${comp}) | ||||
|         set(\${_NAME}_FOUND FALSE) | ||||
|       endif() | ||||
|     endif() | ||||
|   endforeach() | ||||
| endmacro() | ||||
| ") | ||||
|   endif() | ||||
|  | ||||
|   set(PACKAGE_INIT "${PACKAGE_INIT} | ||||
| ####################################################################################") | ||||
|  | ||||
|   configure_file("${_inputFile}" "${_outputFile}" @ONLY) | ||||
|  | ||||
| endfunction() | ||||
							
								
								
									
										46
									
								
								ext/qtkeychain/cmake/Modules/ECMQueryQmake.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								ext/qtkeychain/cmake/Modules/ECMQueryQmake.cmake
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| find_package(Qt5Core QUIET) | ||||
|  | ||||
| if (Qt5Core_FOUND) | ||||
|     set(_qmake_executable_default "qmake-qt5") | ||||
| endif () | ||||
| if (TARGET Qt5::qmake) | ||||
|     get_target_property(_qmake_executable_default Qt5::qmake LOCATION) | ||||
| endif() | ||||
| set(QMAKE_EXECUTABLE ${_qmake_executable_default} | ||||
|     CACHE FILEPATH "Location of the Qt5 qmake executable") | ||||
|  | ||||
| # Helper method | ||||
| # This is not public API (yet)! | ||||
| # Usage: query_qmake(<result_variable> <qt_variable> [TRY]) | ||||
| # Passing TRY will result in the method not failing fatal if no qmake executable | ||||
| # has been found, but instead simply returning an empty string | ||||
| function(query_qmake result_variable qt_variable) | ||||
|     set(options TRY) | ||||
|     set(oneValueArgs ) | ||||
|     set(multiValueArgs ) | ||||
|  | ||||
|     cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||||
|  | ||||
|     if(NOT QMAKE_EXECUTABLE) | ||||
|         if(ARGS_TRY) | ||||
|             set(${result_variable} "" PARENT_SCOPE) | ||||
|             message(STATUS "No qmake Qt5 binary found. Can't check ${qt_variable}") | ||||
|             return() | ||||
|         else() | ||||
|             message(FATAL_ERROR "No qmake Qt5 binary found. Can't check ${qt_variable} as required") | ||||
|         endif() | ||||
|     endif() | ||||
|     execute_process( | ||||
|         COMMAND ${QMAKE_EXECUTABLE} -query "${qt_variable}" | ||||
|         RESULT_VARIABLE return_code | ||||
|         OUTPUT_VARIABLE output | ||||
|     ) | ||||
|     if(return_code EQUAL 0) | ||||
|         string(STRIP "${output}" output) | ||||
|         file(TO_CMAKE_PATH "${output}" output_path) | ||||
|         set(${result_variable} "${output_path}" PARENT_SCOPE) | ||||
|     else() | ||||
|         message(WARNING "Failed call: ${QMAKE_EXECUTABLE} -query \"${qt_variable}\"") | ||||
|         message(FATAL_ERROR "QMake call failed: ${return_code}") | ||||
|     endif() | ||||
| endfunction() | ||||
							
								
								
									
										202
									
								
								ext/qtkeychain/cmake/Modules/ECMSetupVersion.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								ext/qtkeychain/cmake/Modules/ECMSetupVersion.cmake
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,202 @@ | ||||
| #.rst: | ||||
| # ECMSetupVersion | ||||
| # --------------- | ||||
| # | ||||
| # Handle library version information. | ||||
| # | ||||
| # :: | ||||
| # | ||||
| #   ecm_setup_version(<version> | ||||
| #                     VARIABLE_PREFIX <prefix> | ||||
| #                     [SOVERSION <soversion>] | ||||
| #                     [VERSION_HEADER <filename>] | ||||
| #                     [PACKAGE_VERSION_FILE <filename> [COMPATIBILITY <compat>]] ) | ||||
| # | ||||
| # This parses a version string and sets up a standard set of version variables. | ||||
| # It can optionally also create a C version header file and a CMake package | ||||
| # version file to install along with the library. | ||||
| # | ||||
| # If the ``<version>`` argument is of the form ``<major>.<minor>.<patch>`` | ||||
| # (or ``<major>.<minor>.<patch>.<tweak>``), The following CMake variables are | ||||
| # set:: | ||||
| # | ||||
| #   <prefix>_VERSION_MAJOR  - <major> | ||||
| #   <prefix>_VERSION_MINOR  - <minor> | ||||
| #   <prefix>_VERSION_PATCH  - <patch> | ||||
| #   <prefix>_VERSION        - <version> | ||||
| #   <prefix>_VERSION_STRING - <version> (for compatibility: use <prefix>_VERSION instead) | ||||
| #   <prefix>_SOVERSION      - <soversion>, or <major> if SOVERSION was not given | ||||
| # | ||||
| # If CMake policy CMP0048 is not NEW, the following CMake variables will also | ||||
| # be set:: | ||||
| # | ||||
| #   PROJECT_VERSION_MAJOR   - <major> | ||||
| #   PROJECT_VERSION_MINOR   - <minor> | ||||
| #   PROJECT_VERSION_PATCH   - <patch> | ||||
| #   PROJECT_VERSION         - <version> | ||||
| #   PROJECT_VERSION_STRING  - <version> (for compatibility: use PROJECT_VERSION instead) | ||||
| # | ||||
| # If the VERSION_HEADER option is used, a simple C header is generated with the | ||||
| # given filename. If filename is a relative path, it is interpreted as relative | ||||
| # to CMAKE_CURRENT_BINARY_DIR.  The generated header contains the following | ||||
| # macros:: | ||||
| # | ||||
| #    <prefix>_VERSION_MAJOR  - <major> as an integer | ||||
| #    <prefix>_VERSION_MINOR  - <minor> as an integer | ||||
| #    <prefix>_VERSION_PATCH  - <patch> as an integer | ||||
| #    <prefix>_VERSION_STRING - <version> as a C string | ||||
| #    <prefix>_VERSION        - the version as an integer | ||||
| # | ||||
| # ``<prefix>_VERSION`` has ``<patch>`` in the bottom 8 bits, ``<minor>`` in the | ||||
| # next 8 bits and ``<major>`` in the remaining bits.  Note that ``<patch>`` and | ||||
| # ``<minor>`` must be less than 256. | ||||
| # | ||||
| # If the PACKAGE_VERSION_FILE option is used, a simple CMake package version | ||||
| # file is created using the write_basic_package_version_file() macro provided by | ||||
| # CMake. It should be installed in the same location as the Config.cmake file of | ||||
| # the library so that it can be found by find_package().  If the filename is a | ||||
| # relative path, it is interpreted as relative to CMAKE_CURRENT_BINARY_DIR. The | ||||
| # optional COMPATIBILITY option is forwarded to | ||||
| # write_basic_package_version_file(), and defaults to AnyNewerVersion. | ||||
| # | ||||
| # If CMake policy CMP0048 is NEW, an alternative form of the command is | ||||
| # available:: | ||||
| # | ||||
| #   ecm_setup_version(PROJECT | ||||
| #                     [VARIABLE_PREFIX <prefix>] | ||||
| #                     [SOVERSION <soversion>] | ||||
| #                     [VERSION_HEADER <filename>] | ||||
| #                     [PACKAGE_VERSION_FILE <filename>] ) | ||||
| # | ||||
| # This will use the version information set by the project() command. | ||||
| # VARIABLE_PREFIX defaults to the project name.  Note that PROJECT must be the | ||||
| # first argument.  In all other respects, it behaves like the other form of the | ||||
| # command. | ||||
| # | ||||
| # Since pre-1.0.0. | ||||
| # | ||||
| # COMPATIBILITY option available since 1.6.0. | ||||
|  | ||||
| #============================================================================= | ||||
| # SPDX-FileCopyrightText: 2014 Alex Merry <alex.merry@kde.org> | ||||
| # SPDX-FileCopyrightText: 2012 Alexander Neundorf <neundorf@kde.org> | ||||
| # | ||||
| # SPDX-License-Identifier: BSD-3-Clause | ||||
|  | ||||
| include(CMakePackageConfigHelpers) | ||||
|  | ||||
| # save the location of the header template while CMAKE_CURRENT_LIST_DIR | ||||
| # has the value we want | ||||
| set(_ECM_SETUP_VERSION_HEADER_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/ECMVersionHeader.h.in") | ||||
|  | ||||
| function(ecm_setup_version _version) | ||||
|     set(options ) | ||||
|     set(oneValueArgs VARIABLE_PREFIX SOVERSION VERSION_HEADER PACKAGE_VERSION_FILE COMPATIBILITY) | ||||
|     set(multiValueArgs ) | ||||
|  | ||||
|     cmake_parse_arguments(ESV "${options}" "${oneValueArgs}" "${multiValueArgs}"  ${ARGN}) | ||||
|  | ||||
|     if(ESV_UNPARSED_ARGUMENTS) | ||||
|         message(FATAL_ERROR "Unknown keywords given to ECM_SETUP_VERSION(): \"${ESV_UNPARSED_ARGUMENTS}\"") | ||||
|     endif() | ||||
|  | ||||
|     set(project_manages_version FALSE) | ||||
|     set(use_project_version FALSE) | ||||
|     # CMP0048 only exists in CMake 3.0.0 and later | ||||
|     if(CMAKE_VERSION VERSION_LESS 3.0.0) | ||||
|         set(project_version_policy "OLD") | ||||
|     else() | ||||
|         cmake_policy(GET CMP0048 project_version_policy) | ||||
|     endif() | ||||
|     if(project_version_policy STREQUAL "NEW") | ||||
|         set(project_manages_version TRUE) | ||||
|         if(_version STREQUAL "PROJECT") | ||||
|             set(use_project_version TRUE) | ||||
|         endif() | ||||
|     elseif(_version STREQUAL "PROJECT") | ||||
|         message(FATAL_ERROR "ecm_setup_version given PROJECT argument, but CMP0048 is not NEW") | ||||
|     endif() | ||||
|  | ||||
|     set(should_set_prefixed_vars TRUE) | ||||
|     if(NOT ESV_VARIABLE_PREFIX) | ||||
|         if(use_project_version) | ||||
|             set(ESV_VARIABLE_PREFIX "${PROJECT_NAME}") | ||||
|             set(should_set_prefixed_vars FALSE) | ||||
|         else() | ||||
|             message(FATAL_ERROR "Required argument PREFIX missing in ECM_SETUP_VERSION() call") | ||||
|         endif() | ||||
|     endif() | ||||
|  | ||||
|     if(use_project_version) | ||||
|         set(_version "${PROJECT_VERSION}") | ||||
|         set(_major "${PROJECT_VERSION_MAJOR}") | ||||
|         set(_minor "${PROJECT_VERSION_MINOR}") | ||||
|         set(_patch "${PROJECT_VERSION_PATCH}") | ||||
|     else() | ||||
|         string(REGEX REPLACE "^0*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" _major "${_version}") | ||||
|         string(REGEX REPLACE "^[0-9]+\\.0*([0-9]+)\\.[0-9]+.*" "\\1" _minor "${_version}") | ||||
|         string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.0*([0-9]+).*" "\\1" _patch "${_version}") | ||||
|     endif() | ||||
|  | ||||
|     if(NOT ESV_SOVERSION) | ||||
|         set(ESV_SOVERSION ${_major}) | ||||
|     endif() | ||||
|  | ||||
|     if(should_set_prefixed_vars) | ||||
|         set(${ESV_VARIABLE_PREFIX}_VERSION "${_version}") | ||||
|         set(${ESV_VARIABLE_PREFIX}_VERSION_MAJOR ${_major}) | ||||
|         set(${ESV_VARIABLE_PREFIX}_VERSION_MINOR ${_minor}) | ||||
|         set(${ESV_VARIABLE_PREFIX}_VERSION_PATCH ${_patch}) | ||||
|     endif() | ||||
|  | ||||
|     set(${ESV_VARIABLE_PREFIX}_SOVERSION ${ESV_SOVERSION}) | ||||
|  | ||||
|     if(NOT project_manages_version) | ||||
|         set(PROJECT_VERSION "${_version}") | ||||
|         set(PROJECT_VERSION_MAJOR "${_major}") | ||||
|         set(PROJECT_VERSION_MINOR "${_minor}") | ||||
|         set(PROJECT_VERSION_PATCH "${_patch}") | ||||
|     endif() | ||||
|  | ||||
|     # compat | ||||
|     set(PROJECT_VERSION_STRING "${PROJECT_VERSION}") | ||||
|     set(${ESV_VARIABLE_PREFIX}_VERSION_STRING "${${ESV_VARIABLE_PREFIX}_VERSION}") | ||||
|  | ||||
|     if(ESV_VERSION_HEADER) | ||||
|         set(HEADER_PREFIX "${ESV_VARIABLE_PREFIX}") | ||||
|         set(HEADER_VERSION "${_version}") | ||||
|         set(HEADER_VERSION_MAJOR "${_major}") | ||||
|         set(HEADER_VERSION_MINOR "${_minor}") | ||||
|         set(HEADER_VERSION_PATCH "${_patch}") | ||||
|         configure_file("${_ECM_SETUP_VERSION_HEADER_TEMPLATE}" "${ESV_VERSION_HEADER}") | ||||
|     endif() | ||||
|  | ||||
|     if(ESV_PACKAGE_VERSION_FILE) | ||||
|         if(NOT ESV_COMPATIBILITY) | ||||
|             set(ESV_COMPATIBILITY AnyNewerVersion) | ||||
|         endif() | ||||
|         write_basic_package_version_file("${ESV_PACKAGE_VERSION_FILE}" VERSION ${_version} COMPATIBILITY ${ESV_COMPATIBILITY}) | ||||
|     endif() | ||||
|  | ||||
|     if(should_set_prefixed_vars) | ||||
|         set(${ESV_VARIABLE_PREFIX}_VERSION_MAJOR "${${ESV_VARIABLE_PREFIX}_VERSION_MAJOR}" PARENT_SCOPE) | ||||
|         set(${ESV_VARIABLE_PREFIX}_VERSION_MINOR "${${ESV_VARIABLE_PREFIX}_VERSION_MINOR}" PARENT_SCOPE) | ||||
|         set(${ESV_VARIABLE_PREFIX}_VERSION_PATCH "${${ESV_VARIABLE_PREFIX}_VERSION_PATCH}" PARENT_SCOPE) | ||||
|         set(${ESV_VARIABLE_PREFIX}_VERSION       "${${ESV_VARIABLE_PREFIX}_VERSION}"       PARENT_SCOPE) | ||||
|     endif() | ||||
|  | ||||
|     # always set the soversion | ||||
|     set(${ESV_VARIABLE_PREFIX}_SOVERSION "${${ESV_VARIABLE_PREFIX}_SOVERSION}" PARENT_SCOPE) | ||||
|  | ||||
|     if(NOT project_manages_version) | ||||
|         set(PROJECT_VERSION       "${PROJECT_VERSION}"       PARENT_SCOPE) | ||||
|         set(PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}" PARENT_SCOPE) | ||||
|         set(PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}" PARENT_SCOPE) | ||||
|         set(PROJECT_VERSION_PATCH "${PROJECT_VERSION_PATCH}" PARENT_SCOPE) | ||||
|     endif() | ||||
|  | ||||
|     # always set the compatibility variables | ||||
|     set(PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING}" PARENT_SCOPE) | ||||
|     set(${ESV_VARIABLE_PREFIX}_VERSION_STRING "${${ESV_VARIABLE_PREFIX}_VERSION}" PARENT_SCOPE) | ||||
|  | ||||
| endfunction() | ||||
| @@ -14,25 +14,39 @@ bool GnomeKeyring::isAvailable() | ||||
|            keyring.is_available(); | ||||
| } | ||||
|  | ||||
| GnomeKeyring::gpointer GnomeKeyring::store_network_password( const gchar* keyring, const gchar* display_name, | ||||
|                                                const gchar* user, const gchar* server, const gchar* password, | ||||
|                                                OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data ) | ||||
| GnomeKeyring::gpointer GnomeKeyring::store_network_password( | ||||
|         const gchar* keyring, | ||||
|         const gchar* display_name, | ||||
|         const gchar* user, | ||||
|         const gchar* server, | ||||
|         const gchar* type, | ||||
|         const gchar* password, | ||||
|         OperationDoneCallback callback, | ||||
|         gpointer data, | ||||
|         GDestroyNotify destroy_data ) | ||||
| { | ||||
|     if ( !isAvailable() ) | ||||
|         return 0; | ||||
|     return instance().store_password( instance().NETWORK_PASSWORD, | ||||
|                                       keyring, display_name, password, callback, data, destroy_data, | ||||
|                                       "user", user, "server", server, static_cast<char*>(0) ); | ||||
|                                       keyring, display_name, password, callback, | ||||
|                                       data, destroy_data, | ||||
|                                       "user", user, | ||||
|                                       "server", server, | ||||
|                                       "type", type, | ||||
|                                       static_cast<char*>(0) ); | ||||
| } | ||||
|  | ||||
| GnomeKeyring::gpointer GnomeKeyring::find_network_password( const gchar* user, const gchar* server, | ||||
|                                               OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data ) | ||||
| GnomeKeyring::gpointer GnomeKeyring::find_network_password( | ||||
|         const gchar* user, const gchar* server, const gchar* type, | ||||
|         OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data ) | ||||
| { | ||||
|     if ( !isAvailable() ) | ||||
|         return 0; | ||||
|  | ||||
|     return instance().find_password( instance().NETWORK_PASSWORD, | ||||
|                                      callback, data, destroy_data, | ||||
|                                      "user", user, "server", server, static_cast<char*>(0) ); | ||||
|                                      "user", user, "server", server, "type", type, | ||||
|                                      static_cast<char*>(0) ); | ||||
| } | ||||
|  | ||||
| GnomeKeyring::gpointer GnomeKeyring::delete_network_password( const gchar* user, | ||||
| @@ -49,12 +63,13 @@ GnomeKeyring::gpointer GnomeKeyring::delete_network_password( const gchar* user, | ||||
| } | ||||
|  | ||||
| GnomeKeyring::GnomeKeyring() | ||||
|     : QLibrary("gnome-keyring", 0) | ||||
|     : QLibrary(QLatin1String("gnome-keyring"), 0) | ||||
| { | ||||
|     static const PasswordSchema schema = { | ||||
|         ITEM_NETWORK_PASSWORD, | ||||
|         {{ "user",   ATTRIBUTE_TYPE_STRING }, | ||||
|          { "server", ATTRIBUTE_TYPE_STRING }, | ||||
|          { "type", ATTRIBUTE_TYPE_STRING }, | ||||
|          { 0,     static_cast<AttributeType>( 0 ) }} | ||||
|     }; | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,8 @@ | ||||
| #include <QLibrary> | ||||
|  | ||||
| class GnomeKeyring : private QLibrary { | ||||
|     Q_OBJECT | ||||
|  | ||||
| public: | ||||
|     enum Result { | ||||
|         RESULT_OK, | ||||
| @@ -43,7 +45,8 @@ public: | ||||
|         } attributes[32]; | ||||
|     } PasswordSchema; | ||||
|  | ||||
|     typedef void ( *OperationGetStringCallback )( Result result, const char* string, gpointer data ); | ||||
|     typedef void ( *OperationGetStringCallback )( Result result, bool binary, | ||||
|                                                   const char* string, gpointer data ); | ||||
|     typedef void ( *OperationDoneCallback )( Result result, gpointer data ); | ||||
|     typedef void ( *GDestroyNotify )( gpointer data ); | ||||
|  | ||||
| @@ -52,11 +55,14 @@ public: | ||||
|     static bool isAvailable(); | ||||
|  | ||||
|     static gpointer store_network_password( const gchar* keyring, const gchar* display_name, | ||||
|                                             const gchar* user, const gchar* server, const gchar* password, | ||||
|                                             const gchar* user, const gchar* server, | ||||
|                                             const gchar* type, const gchar* password, | ||||
|                                             OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data ); | ||||
|  | ||||
|     static gpointer find_network_password( const gchar* user, const gchar* server, | ||||
|                                            OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data ); | ||||
|                                            const gchar* type, | ||||
|                                            OperationGetStringCallback callback, | ||||
|                                            gpointer data, GDestroyNotify destroy_data ); | ||||
|  | ||||
|     static gpointer delete_network_password( const gchar* user, const gchar* server, | ||||
|                                              OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data ); | ||||
|   | ||||
| @@ -11,9 +11,9 @@ | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| Job::Job( const QString& service, QObject *parent ) | ||||
| Job::Job( JobPrivate *q, QObject *parent ) | ||||
|     : QObject( parent ) | ||||
|     , d ( new JobPrivate( service ) ) { | ||||
|     , d ( q ) { | ||||
| } | ||||
|  | ||||
| Job::~Job() { | ||||
| @@ -52,6 +52,10 @@ void Job::setInsecureFallback( bool insecureFallback ) { | ||||
|     d->insecureFallback = insecureFallback; | ||||
| } | ||||
|  | ||||
| void Job::doStart() { | ||||
|     JobExecutor::instance()->enqueue( this ); | ||||
| } | ||||
|  | ||||
| void Job::emitFinished() { | ||||
|     emit finished( this ); | ||||
|     if ( d->autoDelete ) | ||||
| @@ -64,6 +68,10 @@ void Job::emitFinishedWithError( Error error, const QString& errorString ) { | ||||
|     emitFinished(); | ||||
| } | ||||
|  | ||||
| void Job::scheduledStart() { | ||||
|     d->scheduledStart(); | ||||
| } | ||||
|  | ||||
| Error Job::error() const { | ||||
|     return d->error; | ||||
| } | ||||
| @@ -81,12 +89,11 @@ void Job::setErrorString( const QString& errorString ) { | ||||
| } | ||||
|  | ||||
| ReadPasswordJob::ReadPasswordJob( const QString& service, QObject* parent ) | ||||
|     : Job( service, parent ) | ||||
|     , d( new ReadPasswordJobPrivate( this ) ) | ||||
| {} | ||||
|     : Job( new ReadPasswordJobPrivate( service, this ), parent ) { | ||||
|  | ||||
| } | ||||
|  | ||||
| ReadPasswordJob::~ReadPasswordJob() { | ||||
|     delete d; | ||||
| } | ||||
|  | ||||
| QString ReadPasswordJob::textData() const { | ||||
| @@ -97,126 +104,80 @@ QByteArray ReadPasswordJob::binaryData() const { | ||||
|     return d->data; | ||||
| } | ||||
|  | ||||
| QString ReadPasswordJob::key() const { | ||||
| QString Job::key() const { | ||||
|     return d->key; | ||||
| } | ||||
|  | ||||
| void ReadPasswordJob::setKey( const QString& key ) { | ||||
|     d->key = key; | ||||
| } | ||||
|  | ||||
| void ReadPasswordJob::doStart() { | ||||
|     JobExecutor::instance()->enqueue( this ); | ||||
| void Job::setKey( const QString& key_ ) { | ||||
|     d->key = key_; | ||||
| } | ||||
|  | ||||
| WritePasswordJob::WritePasswordJob( const QString& service, QObject* parent ) | ||||
|     : Job( service, parent ) | ||||
|     , d( new WritePasswordJobPrivate( this ) ) { | ||||
|     : Job( new WritePasswordJobPrivate( service, this ), parent ) { | ||||
| } | ||||
|  | ||||
| WritePasswordJob::~WritePasswordJob() { | ||||
|     delete d; | ||||
| } | ||||
|  | ||||
| QString WritePasswordJob::key() const { | ||||
|     return d->key; | ||||
| } | ||||
|  | ||||
| void WritePasswordJob::setKey( const QString& key ) { | ||||
|     d->key = key; | ||||
| } | ||||
|  | ||||
| void WritePasswordJob::setBinaryData( const QByteArray& data ) { | ||||
|     d->binaryData = data; | ||||
|     d->mode = WritePasswordJobPrivate::Binary; | ||||
|     d->data = data; | ||||
|     d->mode = JobPrivate::Binary; | ||||
| } | ||||
|  | ||||
| void WritePasswordJob::setTextData( const QString& data ) { | ||||
|     d->textData = data; | ||||
|     d->mode = WritePasswordJobPrivate::Text; | ||||
| } | ||||
|  | ||||
| void WritePasswordJob::doStart() { | ||||
|     JobExecutor::instance()->enqueue( this ); | ||||
|     d->data = data.toUtf8(); | ||||
|     d->mode = JobPrivate::Text; | ||||
| } | ||||
|  | ||||
| DeletePasswordJob::DeletePasswordJob( const QString& service, QObject* parent ) | ||||
|     : Job( service, parent ) | ||||
|     , d( new DeletePasswordJobPrivate( this ) ) { | ||||
|     : Job( new DeletePasswordJobPrivate( service, this ), parent ) { | ||||
| } | ||||
|  | ||||
| DeletePasswordJob::~DeletePasswordJob() { | ||||
|     delete d; | ||||
| } | ||||
|  | ||||
| void DeletePasswordJob::doStart() { | ||||
|     //Internally, to delete a password we just execute a write job with no data set (null byte array). | ||||
|     //In all current implementations, this deletes the entry so this is sufficient | ||||
|     WritePasswordJob* job = new WritePasswordJob( service(), this ); | ||||
|     connect( job, SIGNAL(finished(QKeychain::Job*)), d, SLOT(jobFinished(QKeychain::Job*)) ); | ||||
|     job->setInsecureFallback(true); | ||||
|     job->setSettings(settings()); | ||||
|     job->setKey( d->key ); | ||||
|     job->doStart(); | ||||
| } | ||||
| DeletePasswordJobPrivate::DeletePasswordJobPrivate(const QString &service_, DeletePasswordJob *qq) : | ||||
|     JobPrivate(service_, qq) { | ||||
|  | ||||
| QString DeletePasswordJob::key() const { | ||||
|     return d->key; | ||||
| } | ||||
|  | ||||
| void DeletePasswordJob::setKey( const QString& key ) { | ||||
|     d->key = key; | ||||
| } | ||||
|  | ||||
| void DeletePasswordJobPrivate::jobFinished( Job* job ) { | ||||
|     q->setError( job->error() ); | ||||
|     q->setErrorString( job->errorString() ); | ||||
|     q->emitFinished(); | ||||
| } | ||||
|  | ||||
| JobExecutor::JobExecutor() | ||||
|     : QObject( 0 ) | ||||
|     , m_runningJob( 0 ) | ||||
| { | ||||
|     , m_jobRunning( false ) { | ||||
| } | ||||
|  | ||||
| void JobExecutor::enqueue( Job* job ) { | ||||
|     m_queue.append( job ); | ||||
|     m_queue.enqueue( job ); | ||||
|     startNextIfNoneRunning(); | ||||
| } | ||||
|  | ||||
| void JobExecutor::startNextIfNoneRunning() { | ||||
|     if ( m_queue.isEmpty() || m_runningJob ) | ||||
|     if ( m_queue.isEmpty() || m_jobRunning ) | ||||
|         return; | ||||
|     QPointer<Job> next; | ||||
|     while ( !next && !m_queue.isEmpty() ) { | ||||
|         next = m_queue.first(); | ||||
|         m_queue.pop_front(); | ||||
|         next = m_queue.dequeue(); | ||||
|     } | ||||
|     if ( next ) { | ||||
|         connect( next, SIGNAL(finished(QKeychain::Job*)), this, SLOT(jobFinished(QKeychain::Job*)) ); | ||||
|         connect( next, SIGNAL(destroyed(QObject*)), this, SLOT(jobDestroyed(QObject*)) ); | ||||
|         m_runningJob = next; | ||||
|         if ( ReadPasswordJob* rpj = qobject_cast<ReadPasswordJob*>( m_runningJob ) ) | ||||
|             rpj->d->scheduledStart(); | ||||
|         else if ( WritePasswordJob* wpj = qobject_cast<WritePasswordJob*>( m_runningJob) ) | ||||
|             wpj->d->scheduledStart(); | ||||
|         m_jobRunning = true; | ||||
|         next->scheduledStart(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void JobExecutor::jobDestroyed( QObject* object ) { | ||||
|     Job* job = static_cast<Job*>(object); | ||||
|     Q_UNUSED( object ) // for release mode | ||||
|     Q_ASSERT( object == m_runningJob ); | ||||
|     m_runningJob->disconnect( this ); | ||||
|     m_runningJob = 0; | ||||
|     job->disconnect( this ); | ||||
|     m_jobRunning = false; | ||||
|     startNextIfNoneRunning(); | ||||
| } | ||||
|  | ||||
| void JobExecutor::jobFinished( Job* job ) { | ||||
|     Q_UNUSED( job ) // for release mode | ||||
|     Q_ASSERT( job == m_runningJob ); | ||||
|     m_runningJob->disconnect( this ); | ||||
|     m_runningJob = 0; | ||||
|     job->disconnect( this ); | ||||
|     m_jobRunning = false; | ||||
|     startNextIfNoneRunning(); | ||||
| } | ||||
|  | ||||
| @@ -227,3 +188,48 @@ JobExecutor* JobExecutor::instance() { | ||||
|         s_instance = new JobExecutor; | ||||
|     return s_instance; | ||||
| } | ||||
|  | ||||
| ReadPasswordJobPrivate::ReadPasswordJobPrivate(const QString &service_, ReadPasswordJob *qq) : | ||||
|     JobPrivate(service_, qq) { | ||||
|  | ||||
| } | ||||
|  | ||||
| JobPrivate::JobPrivate(const QString &service_, Job *qq) | ||||
|     : q(qq) | ||||
|     , mode( Text ) | ||||
|     , error( NoError ) | ||||
|     , service( service_ ) | ||||
|     , autoDelete( true ) | ||||
|     , insecureFallback( false ) | ||||
| { | ||||
| } | ||||
|  | ||||
| QString JobPrivate::modeToString(Mode m) | ||||
| { | ||||
|     switch (m) { | ||||
|     case Text: | ||||
|         return QLatin1String("Text"); | ||||
|     case Binary: | ||||
|         return QLatin1String("Binary"); | ||||
|     } | ||||
|  | ||||
|     Q_ASSERT_X(false, Q_FUNC_INFO, "Unhandled Mode value"); | ||||
|     return QString(); | ||||
| } | ||||
|  | ||||
| JobPrivate::Mode JobPrivate::stringToMode(const QString& s) | ||||
| { | ||||
|     if (s == QLatin1String("Text") || s == QLatin1String("1")) | ||||
|         return Text; | ||||
|     if (s == QLatin1String("Binary") || s == QLatin1String("2")) | ||||
|         return Binary; | ||||
|  | ||||
|     qCritical("Unexpected mode string '%s'", qPrintable(s)); | ||||
|  | ||||
|     return Text; | ||||
| } | ||||
|  | ||||
| WritePasswordJobPrivate::WritePasswordJobPrivate(const QString &service_, WritePasswordJob *qq) : | ||||
|     JobPrivate(service_, qq) { | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -9,7 +9,11 @@ | ||||
| #ifndef KEYCHAIN_H | ||||
| #define KEYCHAIN_H | ||||
|  | ||||
| #if !defined(QTKEYCHAIN_NO_EXPORT) | ||||
| #include "qkeychain_export.h" | ||||
| #else | ||||
| #define QKEYCHAIN_EXPORT | ||||
| #endif | ||||
|  | ||||
| #include <QtCore/QObject> | ||||
| #include <QtCore/QString> | ||||
| @@ -37,107 +41,229 @@ enum Error { | ||||
| class JobExecutor; | ||||
| class JobPrivate; | ||||
|  | ||||
| /** | ||||
|  * @brief Abstract base class for all QKeychain jobs. | ||||
|  */ | ||||
| class QKEYCHAIN_EXPORT Job : public QObject { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     explicit Job( const QString& service, QObject* parent=0 ); | ||||
|     ~Job(); | ||||
|     ~Job() override; | ||||
|  | ||||
|     /** | ||||
|      * @return The QSettings instance used as plaintext storage if insecureFallback() is true. | ||||
|      * @see setSettings() | ||||
|      * @see insecureFallback() | ||||
|      */ | ||||
|     QSettings* settings() const; | ||||
|  | ||||
|     /** | ||||
|      * @return Set the QSettings instance that will be used as plaintext storage if insecureFallback() is true. | ||||
|      * @see settings() | ||||
|      * @see insecureFallback() | ||||
|      */ | ||||
|     void setSettings( QSettings* settings ); | ||||
|  | ||||
|     /** | ||||
|      * Call this method to start the job. | ||||
|      * Typically you want to connect some slot to the finished() signal first: | ||||
|      * | ||||
|      * \code | ||||
|      * SomeClass::startJob() | ||||
|      * { | ||||
|      *     connect(job, &Job::finished, this, &SomeClass::slotJobFinished); | ||||
|      *     job->start(); | ||||
|      * } | ||||
|      * | ||||
|      * SomeClass::slotJobFinished(Job *job) | ||||
|      * { | ||||
|      *     if (job->error()) { | ||||
|      *         // handle error | ||||
|      *     } else { | ||||
|      *         // do job-specific stuff | ||||
|      *     } | ||||
|      * } | ||||
|      * \endcode | ||||
|      * | ||||
|      * @see finished() | ||||
|      */ | ||||
|     void start(); | ||||
|  | ||||
|     QString service() const; | ||||
|  | ||||
|     /** | ||||
|      * @note Call this method only after finished() has been emitted. | ||||
|      * @return The error code of the job (0 if no error). | ||||
|      */ | ||||
|     Error error() const; | ||||
|  | ||||
|     /** | ||||
|      * @return An error message that might provide details if error() returns OtherError. | ||||
|      */ | ||||
|     QString errorString() const; | ||||
|  | ||||
|     /** | ||||
|      * @return Whether this job autodeletes itself once finished() has been emitted. Default is true. | ||||
|      * @see setAutoDelete() | ||||
|      */ | ||||
|     bool autoDelete() const; | ||||
|  | ||||
|     /** | ||||
|      * Set whether this job should autodelete itself once finished() has been emitted. | ||||
|      * @see autoDelete() | ||||
|      */ | ||||
|     void setAutoDelete( bool autoDelete ); | ||||
|  | ||||
|     /** | ||||
|      * @return Whether this job will use plaintext storage on unsupported platforms. Default is false. | ||||
|      * @see setInsecureFallback() | ||||
|      */ | ||||
|     bool insecureFallback() const; | ||||
|  | ||||
|     /** | ||||
|      * Set whether this job should use plaintext storage on unsupported platforms. | ||||
|      * @see insecureFallback() | ||||
|      */ | ||||
|     void setInsecureFallback( bool insecureFallback ); | ||||
|  | ||||
| Q_SIGNALS: | ||||
|     void finished( QKeychain::Job* ); | ||||
|     /** | ||||
|      * @return The string used as key by this job. | ||||
|      * @see setKey() | ||||
|      */ | ||||
|     QString key() const; | ||||
|  | ||||
| protected: | ||||
|     Q_INVOKABLE virtual void doStart() = 0; | ||||
|     /** | ||||
|      * Set the @p key that this job will use to read or write data from/to the keychain. | ||||
|      * The key can be an empty string. | ||||
|      * @see key() | ||||
|      */ | ||||
|     void setKey( const QString& key ); | ||||
|  | ||||
|     void setError( Error error ); | ||||
|     void setErrorString( const QString& errorString ); | ||||
|     void emitFinished(); | ||||
|     void emitFinishedWithError(Error, const QString& errorString); | ||||
|  | ||||
| Q_SIGNALS: | ||||
|     /** | ||||
|      * Emitted when this job is finished. | ||||
|      * You can connect to this signal to be notified about the job's completion. | ||||
|      * @see start() | ||||
|      */ | ||||
|     void finished( QKeychain::Job* ); | ||||
|  | ||||
| protected: | ||||
|     explicit Job( JobPrivate *q, QObject* parent=nullptr ); | ||||
|     Q_INVOKABLE void doStart(); | ||||
|  | ||||
| private: | ||||
|     void setError( Error error ); | ||||
|     void setErrorString( const QString& errorString ); | ||||
|  | ||||
|     void scheduledStart(); | ||||
|  | ||||
| protected: | ||||
|     JobPrivate* const d; | ||||
|  | ||||
| friend class JobExecutor; | ||||
| friend class JobPrivate; | ||||
| friend class ReadPasswordJobPrivate; | ||||
| friend class WritePasswordJobPrivate; | ||||
| friend class DeletePasswordJobPrivate; | ||||
| }; | ||||
|  | ||||
| class ReadPasswordJobPrivate; | ||||
|  | ||||
| /** | ||||
|  * @brief Job for reading secrets from the keychain. | ||||
|  * You can use a ReadPasswordJob to read passwords or binary data from the keychain. | ||||
|  * This job requires a "service" string, which is basically a namespace of keys within the keychain. | ||||
|  * This means that you can read all the pairs <key, secret> stored in the same service string. | ||||
|  */ | ||||
| class QKEYCHAIN_EXPORT ReadPasswordJob : public Job { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     explicit ReadPasswordJob( const QString& service, QObject* parent=0 ); | ||||
|     ~ReadPasswordJob(); | ||||
|  | ||||
|     QString key() const; | ||||
|     void setKey( const QString& key ); | ||||
|     /** | ||||
|      * Create a new ReadPasswordJob. | ||||
|      * @param service The service string used by this job (can be empty). | ||||
|      * @param parent The parent of this job. | ||||
|      */ | ||||
|     explicit ReadPasswordJob( const QString& service, QObject* parent=nullptr ); | ||||
|     ~ReadPasswordJob() override; | ||||
|  | ||||
|     /** | ||||
|      * @return The binary data stored as value of this job's key(). | ||||
|      * @see Job::key() | ||||
|      */ | ||||
|     QByteArray binaryData() const; | ||||
|     QString textData() const; | ||||
|  | ||||
| protected: | ||||
|     void doStart(); | ||||
|     /** | ||||
|      * @return The string stored as value of this job's key(). | ||||
|      * @see Job::key() | ||||
|      * @warning Returns meaningless data if the data was stored as binary data. | ||||
|      * @see WritePasswordJob::setTextData() | ||||
|      */ | ||||
|     QString textData() const; | ||||
|  | ||||
| private: | ||||
|     friend class QKeychain::ReadPasswordJobPrivate; | ||||
|     friend class QKeychain::JobExecutor; | ||||
|     ReadPasswordJobPrivate* const d; | ||||
| }; | ||||
|  | ||||
| class WritePasswordJobPrivate; | ||||
|  | ||||
| /** | ||||
|  * @brief Job for writing secrets to the keychain. | ||||
|  * You can use a WritePasswordJob to store passwords or binary data in the keychain. | ||||
|  * This job requires a "service" string, which is basically a namespace of keys within the keychain. | ||||
|  * This means that you can store different pairs <key, secret> under the same service string. | ||||
|  */ | ||||
| class QKEYCHAIN_EXPORT WritePasswordJob : public Job { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     explicit WritePasswordJob( const QString& service, QObject* parent=0 ); | ||||
|     ~WritePasswordJob(); | ||||
|  | ||||
|     QString key() const; | ||||
|     void setKey( const QString& key ); | ||||
|     /** | ||||
|      * Create a new WritePasswordJob. | ||||
|      * @param service The service string used by this job (can be empty). | ||||
|      * @param parent The parent of this job. | ||||
|      */ | ||||
|     explicit WritePasswordJob( const QString& service, QObject* parent=nullptr ); | ||||
|     ~WritePasswordJob() override; | ||||
|  | ||||
|     /** | ||||
|      * Set the @p data that the job will store in the keychain as binary data. | ||||
|      * @warning setBinaryData() and setTextData() are mutually exclusive. | ||||
|      */ | ||||
|     void setBinaryData( const QByteArray& data ); | ||||
|  | ||||
|     /** | ||||
|      * Set the @p data that the job will store in the keychain as string. | ||||
|      * Typically @p data is a password. | ||||
|      * @warning setBinaryData() and setTextData() are mutually exclusive. | ||||
|      */ | ||||
|     void setTextData( const QString& data ); | ||||
|  | ||||
| protected: | ||||
|     void doStart(); | ||||
|  | ||||
| private: | ||||
|     friend class QKeychain::JobExecutor; | ||||
|  | ||||
|     friend class QKeychain::WritePasswordJobPrivate; | ||||
|     friend class DeletePasswordJob; | ||||
|     WritePasswordJobPrivate* const d; | ||||
| }; | ||||
|  | ||||
| class DeletePasswordJobPrivate; | ||||
|  | ||||
| /** | ||||
|  * @brief Job for deleting secrets from the keychain. | ||||
|  * You can use a DeletePasswordJob to delete passwords or binary data from the keychain. | ||||
|  * This job requires a "service" string, which is basically a namespace of keys within the keychain. | ||||
|  * This means that you can delete all the pairs <key, secret> stored in the same service string. | ||||
|  */ | ||||
| class QKEYCHAIN_EXPORT DeletePasswordJob : public Job { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     explicit DeletePasswordJob( const QString& service, QObject* parent=0 ); | ||||
|     ~DeletePasswordJob(); | ||||
|  | ||||
|     QString key() const; | ||||
|     void setKey( const QString& key ); | ||||
|  | ||||
| protected: | ||||
|     void doStart(); | ||||
|     /** | ||||
|      * Create a new DeletePasswordJob. | ||||
|      * @param service The service string used by this job (can be empty). | ||||
|      * @param parent The parent of this job. | ||||
|      */ | ||||
|     explicit DeletePasswordJob( const QString& service, QObject* parent=nullptr ); | ||||
|     ~DeletePasswordJob() override; | ||||
|  | ||||
| private: | ||||
|     friend class QKeychain::DeletePasswordJobPrivate; | ||||
|     DeletePasswordJobPrivate* const d; | ||||
| }; | ||||
|  | ||||
| } // namespace QtKeychain | ||||
|   | ||||
							
								
								
									
										182
									
								
								ext/qtkeychain/keychain_android.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								ext/qtkeychain/keychain_android.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | ||||
| /****************************************************************************** | ||||
|  *   Copyright (C) 2016 Mathias Hasselmann <mathias.hasselmann@kdab.com>      * | ||||
|  *                                                                            * | ||||
|  * This program is distributed in the hope that it will be useful, but        * | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||||
|  * or FITNESS FOR A PARTICULAR PURPOSE. For licensing and distribution        * | ||||
|  * details, check the accompanying file 'COPYING'.                            * | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| #include "keychain_p.h" | ||||
|  | ||||
| #include "androidkeystore_p.h" | ||||
| #include "plaintextstore_p.h" | ||||
|  | ||||
| #include <QtAndroid> | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| using android::content::Context; | ||||
| using android::security::KeyPairGeneratorSpec; | ||||
|  | ||||
| using java::io::ByteArrayInputStream; | ||||
| using java::io::ByteArrayOutputStream; | ||||
| using java::security::interfaces::RSAPrivateKey; | ||||
| using java::security::interfaces::RSAPublicKey; | ||||
| using java::security::KeyPair; | ||||
| using java::security::KeyPairGenerator; | ||||
| using java::security::KeyStore; | ||||
| using java::util::Calendar; | ||||
|  | ||||
| using javax::crypto::Cipher; | ||||
| using javax::crypto::CipherInputStream; | ||||
| using javax::crypto::CipherOutputStream; | ||||
| using javax::security::auth::x500::X500Principal; | ||||
|  | ||||
| namespace { | ||||
|  | ||||
| inline QString makeAlias(const QString &service, const QString &key) | ||||
| { | ||||
|     return service + QLatin1Char('/') + key; | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| void ReadPasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     PlainTextStore plainTextStore(q->service(), q->settings()); | ||||
|  | ||||
|     if (!plainTextStore.contains(q->key())) { | ||||
|         q->emitFinishedWithError(Error::EntryNotFound, tr("Entry not found")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const QByteArray &encryptedData = plainTextStore.readData(q->key()); | ||||
|     const KeyStore keyStore = KeyStore::getInstance(QStringLiteral("AndroidKeyStore")); | ||||
|  | ||||
|     if (!keyStore || !keyStore.load()) { | ||||
|         q->emitFinishedWithError(Error::AccessDenied, tr("Could not open keystore")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const auto &alias = makeAlias(q->service(), q->key()); | ||||
|     const KeyStore::PrivateKeyEntry entry = keyStore.getEntry(alias); | ||||
|  | ||||
|     if (!entry) { | ||||
|         q->emitFinishedWithError(Error::AccessDenied, tr("Could not retrieve private key from keystore")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const Cipher cipher = Cipher::getInstance(QStringLiteral("RSA/ECB/PKCS1Padding")); | ||||
|  | ||||
|     if (!cipher || !cipher.init(Cipher::DECRYPT_MODE, entry.getPrivateKey())) { | ||||
|         q->emitFinishedWithError(Error::OtherError, tr("Could not create decryption cipher")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     QByteArray plainData; | ||||
|     const CipherInputStream inputStream(ByteArrayInputStream(encryptedData), cipher); | ||||
|  | ||||
|     for (int nextByte; (nextByte = inputStream.read()) != -1; ) | ||||
|         plainData.append(nextByte); | ||||
|  | ||||
|     mode = plainTextStore.readMode(q->key()); | ||||
|     data = plainData; | ||||
|     q->emitFinished(); | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     const KeyStore keyStore = KeyStore::getInstance(QStringLiteral("AndroidKeyStore")); | ||||
|  | ||||
|     if (!keyStore || !keyStore.load()) { | ||||
|         q->emitFinishedWithError(Error::AccessDenied, tr("Could not open keystore")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const auto &alias = makeAlias(q->service(), q->key()); | ||||
|     if (!keyStore.containsAlias(alias)) { | ||||
|         const Calendar start = Calendar::getInstance(); | ||||
|         const Calendar end = Calendar::getInstance(); | ||||
|         end.add(Calendar::YEAR, 99); | ||||
|  | ||||
|         const KeyPairGeneratorSpec spec = | ||||
|                 KeyPairGeneratorSpec::Builder(Context(QtAndroid::androidActivity())). | ||||
|                 setAlias(alias). | ||||
|                 setSubject(X500Principal(QStringLiteral("CN=QtKeychain, O=Android Authority"))). | ||||
|                 setSerialNumber(java::math::BigInteger::ONE). | ||||
|                 setStartDate(start.getTime()). | ||||
|                 setEndDate(end.getTime()). | ||||
|                 build(); | ||||
|  | ||||
|         const KeyPairGenerator generator = KeyPairGenerator::getInstance(QStringLiteral("RSA"), | ||||
|                                                                          QStringLiteral("AndroidKeyStore")); | ||||
|  | ||||
|         if (!generator) { | ||||
|             q->emitFinishedWithError(Error::OtherError, tr("Could not create private key generator")); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         generator.initialize(spec); | ||||
|  | ||||
|         if (!generator.generateKeyPair()) { | ||||
|             q->emitFinishedWithError(Error::OtherError, tr("Could not generate new private key")); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     const KeyStore::PrivateKeyEntry entry = keyStore.getEntry(alias); | ||||
|  | ||||
|     if (!entry) { | ||||
|         q->emitFinishedWithError(Error::AccessDenied, tr("Could not retrieve private key from keystore")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const RSAPublicKey publicKey = entry.getCertificate().getPublicKey(); | ||||
|     const Cipher cipher = Cipher::getInstance(QStringLiteral("RSA/ECB/PKCS1Padding")); | ||||
|  | ||||
|     if (!cipher || !cipher.init(Cipher::ENCRYPT_MODE, publicKey)) { | ||||
|         q->emitFinishedWithError(Error::OtherError, tr("Could not create encryption cipher")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     ByteArrayOutputStream outputStream; | ||||
|     CipherOutputStream cipherOutputStream(outputStream, cipher); | ||||
|  | ||||
|     if (!cipherOutputStream.write(data) || !cipherOutputStream.close()) { | ||||
|         q->emitFinishedWithError(Error::OtherError, tr("Could not encrypt data")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     PlainTextStore plainTextStore(q->service(), q->settings()); | ||||
|     plainTextStore.write(q->key(), outputStream.toByteArray(), mode); | ||||
|  | ||||
|     if (plainTextStore.error() != NoError) | ||||
|         q->emitFinishedWithError(plainTextStore.error(), plainTextStore.errorString()); | ||||
|     else | ||||
|         q->emitFinished(); | ||||
| } | ||||
|  | ||||
| void DeletePasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     const KeyStore keyStore = KeyStore::getInstance(QStringLiteral("AndroidKeyStore")); | ||||
|  | ||||
|     if (!keyStore || !keyStore.load()) { | ||||
|         q->emitFinishedWithError(Error::AccessDenied, tr("Could not open keystore")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const auto &alias = makeAlias(q->service(), q->key()); | ||||
|     if (!keyStore.deleteEntry(alias)) { | ||||
|         q->emitFinishedWithError(Error::OtherError, tr("Could not remove private key from keystore")); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     PlainTextStore plainTextStore(q->service(), q->settings()); | ||||
|     plainTextStore.remove(q->key()); | ||||
|  | ||||
|     if (plainTextStore.error() != NoError) | ||||
|         q->emitFinishedWithError(plainTextStore.error(), plainTextStore.errorString()); | ||||
|     else | ||||
|         q->emitFinished(); | ||||
| } | ||||
							
								
								
									
										146
									
								
								ext/qtkeychain/keychain_apple.mm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								ext/qtkeychain/keychain_apple.mm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| /****************************************************************************** | ||||
|  *   Copyright (C) 2016 Mathias Hasselmann <mathias.hasselmann@kdab.com>      * | ||||
|  *                                                                            * | ||||
|  * This program is distributed in the hope that it will be useful, but        * | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||||
|  * or FITNESS FOR A PARTICULAR PURPOSE. For licensing and distribution        * | ||||
|  * details, check the accompanying file 'COPYING'.                            * | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| #include "keychain_p.h" | ||||
|  | ||||
| #import <Foundation/Foundation.h> | ||||
| #import <Security/Security.h> | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| struct ErrorDescription | ||||
| { | ||||
|     QKeychain::Error code; | ||||
|     QString message; | ||||
|  | ||||
|     ErrorDescription(QKeychain::Error code, const QString &message) | ||||
|         : code(code), message(message) {} | ||||
|  | ||||
|     static ErrorDescription fromStatus(OSStatus status) | ||||
|     { | ||||
|         switch(status) { | ||||
|         case errSecSuccess: | ||||
|             return ErrorDescription(QKeychain::NoError, Job::tr("No error")); | ||||
|         case errSecItemNotFound: | ||||
|             return ErrorDescription(QKeychain::EntryNotFound, Job::tr("The specified item could not be found in the keychain")); | ||||
|         case errSecUserCanceled: | ||||
|             return ErrorDescription(QKeychain::AccessDeniedByUser, Job::tr("User canceled the operation")); | ||||
|         case errSecInteractionNotAllowed: | ||||
|             return ErrorDescription(QKeychain::AccessDenied, Job::tr("User interaction is not allowed")); | ||||
|         case errSecNotAvailable: | ||||
|             return ErrorDescription(QKeychain::AccessDenied, Job::tr("No keychain is available. You may need to restart your computer")); | ||||
|         case errSecAuthFailed: | ||||
|             return ErrorDescription(QKeychain::AccessDenied, Job::tr("The user name or passphrase you entered is not correct")); | ||||
|         case errSecVerifyFailed: | ||||
|             return ErrorDescription(QKeychain::AccessDenied, Job::tr("A cryptographic verification failure has occurred")); | ||||
|         case errSecUnimplemented: | ||||
|             return ErrorDescription(QKeychain::NotImplemented, Job::tr("Function or operation not implemented")); | ||||
|         case errSecIO: | ||||
|             return ErrorDescription(QKeychain::OtherError, Job::tr("I/O error")); | ||||
|         case errSecOpWr: | ||||
|             return ErrorDescription(QKeychain::OtherError, Job::tr("Already open with with write permission")); | ||||
|         case errSecParam: | ||||
|             return ErrorDescription(QKeychain::OtherError, Job::tr("Invalid parameters passed to a function")); | ||||
|         case errSecAllocate: | ||||
|             return ErrorDescription(QKeychain::OtherError, Job::tr("Failed to allocate memory")); | ||||
|         case errSecBadReq: | ||||
|             return ErrorDescription(QKeychain::OtherError, Job::tr("Bad parameter or invalid state for operation")); | ||||
|         case errSecInternalComponent: | ||||
|             return ErrorDescription(QKeychain::OtherError, Job::tr("An internal component failed")); | ||||
|         case errSecDuplicateItem: | ||||
|             return ErrorDescription(QKeychain::OtherError, Job::tr("The specified item already exists in the keychain")); | ||||
|         case errSecDecode: | ||||
|             return ErrorDescription(QKeychain::OtherError, Job::tr("Unable to decode the provided data")); | ||||
|         } | ||||
|  | ||||
|         return ErrorDescription(QKeychain::OtherError, Job::tr("Unknown error")); | ||||
|     } | ||||
| }; | ||||
|  | ||||
| void ReadPasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     NSDictionary *const query = @{ | ||||
|         (__bridge id) kSecClass: (__bridge id) kSecClassGenericPassword, | ||||
|             (__bridge id) kSecAttrService: (__bridge NSString *) service.toCFString(), | ||||
|             (__bridge id) kSecAttrAccount: (__bridge NSString *) key.toCFString(), | ||||
|             (__bridge id) kSecReturnData: @YES, | ||||
|     }; | ||||
|  | ||||
|     CFTypeRef dataRef = nil; | ||||
|     const OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) query, &dataRef); | ||||
|  | ||||
|     data.clear(); | ||||
|     mode = Binary; | ||||
|  | ||||
|     if (status == errSecSuccess) { | ||||
|         if (dataRef) | ||||
|             data = QByteArray::fromCFData((CFDataRef) dataRef); | ||||
|  | ||||
|         q->emitFinished(); | ||||
|     } else { | ||||
|         const ErrorDescription error = ErrorDescription::fromStatus(status); | ||||
|         q->emitFinishedWithError(error.code, Job::tr("Could not retrieve private key from keystore: %1").arg(error.message)); | ||||
|     } | ||||
|  | ||||
|     if (dataRef) | ||||
|         [dataRef release]; | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     NSDictionary *const query = @{ | ||||
|             (__bridge id) kSecClass: (__bridge id) kSecClassGenericPassword, | ||||
|             (__bridge id) kSecAttrService: (__bridge NSString *) service.toCFString(), | ||||
|             (__bridge id) kSecAttrAccount: (__bridge NSString *) key.toCFString(), | ||||
|     }; | ||||
|  | ||||
|     OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) query, nil); | ||||
|  | ||||
|     if (status == errSecSuccess) { | ||||
|         NSDictionary *const update = @{ | ||||
|                 (__bridge id) kSecValueData: (__bridge NSData *) data.toCFData(), | ||||
|         }; | ||||
|  | ||||
|         status = SecItemUpdate((__bridge CFDictionaryRef) query, (__bridge CFDictionaryRef) update); | ||||
|     } else { | ||||
|         NSDictionary *const insert = @{ | ||||
|                 (__bridge id) kSecClass: (__bridge id) kSecClassGenericPassword, | ||||
|                 (__bridge id) kSecAttrService: (__bridge NSString *) service.toCFString(), | ||||
|                 (__bridge id) kSecAttrAccount: (__bridge NSString *) key.toCFString(), | ||||
|                 (__bridge id) kSecValueData: (__bridge NSData *) data.toCFData(), | ||||
|         }; | ||||
|  | ||||
|         status = SecItemAdd((__bridge CFDictionaryRef) insert, nil); | ||||
|     } | ||||
|  | ||||
|     if (status == errSecSuccess) { | ||||
|         q->emitFinished(); | ||||
|     } else { | ||||
|         const ErrorDescription error = ErrorDescription::fromStatus(status); | ||||
|         q->emitFinishedWithError(error.code,  tr("Could not store data in settings: %1").arg(error.message)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void DeletePasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     const NSDictionary *const query = @{ | ||||
|             (__bridge id) kSecClass: (__bridge id) kSecClassGenericPassword, | ||||
|             (__bridge id) kSecAttrService: (__bridge NSString *) service.toCFString(), | ||||
|             (__bridge id) kSecAttrAccount: (__bridge NSString *) key.toCFString(), | ||||
|     }; | ||||
|  | ||||
|     const OSStatus status = SecItemDelete((__bridge CFDictionaryRef) query); | ||||
|  | ||||
|     if (status == errSecSuccess) { | ||||
|         q->emitFinished(); | ||||
|     } else { | ||||
|         const ErrorDescription error = ErrorDescription::fromStatus(status); | ||||
|         q->emitFinishedWithError(error.code, Job::tr("Could not remove private key from keystore: %1").arg(error.message)); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										187
									
								
								ext/qtkeychain/keychain_haiku.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								ext/qtkeychain/keychain_haiku.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,187 @@ | ||||
| /****************************************************************************** | ||||
|  *   Copyright (C) 2018 François Revol <revol@free.fr>                        * | ||||
|  *                                                                            * | ||||
|  * This program is distributed in the hope that it will be useful, but        * | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||||
|  * or FITNESS FOR A PARTICULAR PURPOSE. For licensing and distribution        * | ||||
|  * details, check the accompanying file 'COPYING'.                            * | ||||
|  *****************************************************************************/ | ||||
| #include "keychain_p.h" | ||||
|  | ||||
| #include <KeyStore.h> | ||||
|  | ||||
| #include <Application.h> | ||||
| #include <AppFileInfo.h> | ||||
| #include <File.h> | ||||
|  | ||||
| #include <QDebug> | ||||
| #include <QCoreApplication> | ||||
| #include <QString> | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| class AutoApp { | ||||
| public: | ||||
|     AutoApp(); | ||||
|     ~AutoApp(); | ||||
|     BApplication *app; | ||||
| }; | ||||
|  | ||||
|  | ||||
| AutoApp::AutoApp() | ||||
|     : app(NULL) | ||||
| { | ||||
|     if (be_app != NULL) | ||||
|         return; | ||||
|  | ||||
|     // no BApplication object, probably using QCoreApplication | ||||
|     // but we need one around | ||||
|  | ||||
|     QString appSignature; | ||||
|  | ||||
|     char signature[B_MIME_TYPE_LENGTH]; | ||||
|     signature[0] = '\0'; | ||||
|  | ||||
|     QString appPath = QCoreApplication::applicationFilePath(); | ||||
|  | ||||
|     BFile appFile(appPath.toUtf8(), B_READ_ONLY); | ||||
|     if (appFile.InitCheck() == B_OK) { | ||||
|         BAppFileInfo info(&appFile); | ||||
|         if (info.InitCheck() == B_OK) { | ||||
|             if (info.GetSignature(signature) != B_OK) | ||||
|                 signature[0] = '\0'; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (signature[0] != '\0') | ||||
|         appSignature = QLatin1String(signature); | ||||
|     else | ||||
|         appSignature = QLatin1String("application/x-vnd.qtkeychain-") + | ||||
|             QCoreApplication::applicationName().remove("_x86"); | ||||
|  | ||||
|     app = new BApplication(appSignature.toUtf8().constData()); | ||||
| } | ||||
|  | ||||
| AutoApp::~AutoApp() | ||||
| { | ||||
|     delete app; | ||||
| } | ||||
|  | ||||
| static QString strForStatus( status_t os ) { | ||||
|     const char * const buf = strerror(os) ; | ||||
|     return QObject::tr( "error 0x%1: %2" ) | ||||
|             .arg( os, 8, 16 ).arg( QString::fromUtf8( buf, strlen( buf ) ) ); | ||||
| } | ||||
|  | ||||
| void ReadPasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     AutoApp aa; | ||||
|     QString errorString; | ||||
|     Error error = NoError; | ||||
|     BKeyStore keyStore; | ||||
|     BPasswordKey password; | ||||
|  | ||||
|     status_t result = keyStore.GetKey(B_KEY_TYPE_PASSWORD, | ||||
|                                       q->service().toUtf8().constData(), | ||||
|                                       q->key().toUtf8().constData(), | ||||
|                                       false, password); | ||||
|  | ||||
|     data = QByteArray(reinterpret_cast<const char*>(password.Data()), password.DataLength()); | ||||
|  | ||||
|     switch ( result ) { | ||||
|     case B_OK: | ||||
|         q->emitFinished(); | ||||
|         return; | ||||
|     case B_ENTRY_NOT_FOUND: | ||||
|         errorString = tr("Password not found"); | ||||
|         error = EntryNotFound; | ||||
|         break; | ||||
|     default: | ||||
|         errorString = strForStatus( result ); | ||||
|         error = OtherError; | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     q->emitFinishedWithError( error, errorString ); | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     AutoApp aa; | ||||
|     QString errorString; | ||||
|     Error error = NoError; | ||||
|     BKeyStore keyStore; | ||||
|     BPasswordKey password(data.constData(), | ||||
|         B_KEY_PURPOSE_GENERIC, | ||||
|         q->service().toUtf8().constData(), | ||||
|         q->key().toUtf8().constData()); | ||||
|     status_t result = B_OK; | ||||
|  | ||||
|     // re-add as binary if it's not text | ||||
|     if (mode == Binary) | ||||
|         result = password.SetData(reinterpret_cast<const uint8*>(data.constData()), data.size()); | ||||
|  | ||||
|     if (result == B_OK) | ||||
|         result = keyStore.AddKey(password); | ||||
|  | ||||
|     if (result == B_NAME_IN_USE) { | ||||
|         BPasswordKey old_password; | ||||
|         result = keyStore.GetKey(B_KEY_TYPE_PASSWORD, | ||||
|                                  q->service().toUtf8().constData(), | ||||
|                                  q->key().toUtf8().constData(), | ||||
|                                  false, old_password); | ||||
|         if (result == B_OK) | ||||
|             result = keyStore.RemoveKey(old_password); | ||||
|         if (result == B_OK) | ||||
|             result = keyStore.AddKey(password); | ||||
|     } | ||||
|  | ||||
|     switch ( result ) { | ||||
|     case B_OK: | ||||
|         q->emitFinished(); | ||||
|         return; | ||||
|     case B_ENTRY_NOT_FOUND: | ||||
|         errorString = tr("Password not found"); | ||||
|         error = EntryNotFound; | ||||
|         break; | ||||
|     default: | ||||
|         errorString = strForStatus( result ); | ||||
|         error = OtherError; | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     q->emitFinishedWithError( error, errorString ); | ||||
| } | ||||
|  | ||||
| void DeletePasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     AutoApp aa; | ||||
|     QString errorString; | ||||
|     Error error = NoError; | ||||
|     BKeyStore keyStore; | ||||
|     BPasswordKey password; | ||||
|  | ||||
|     status_t result = keyStore.GetKey(B_KEY_TYPE_PASSWORD, | ||||
|                                       q->service().toUtf8().constData(), | ||||
|                                       q->key().toUtf8().constData(), | ||||
|                                       false, password); | ||||
|  | ||||
|     if (result == B_OK) | ||||
|         result = keyStore.RemoveKey(password); | ||||
|  | ||||
|     switch ( result ) { | ||||
|     case B_OK: | ||||
|         q->emitFinished(); | ||||
|         return; | ||||
|     case B_ENTRY_NOT_FOUND: | ||||
|         errorString = tr("Password not found"); | ||||
|         error = EntryNotFound; | ||||
|         break; | ||||
|     default: | ||||
|         errorString = strForStatus( result ); | ||||
|         error = CouldNotDeleteEntry; | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     q->emitFinishedWithError( error, errorString ); | ||||
| } | ||||
| @@ -1,161 +0,0 @@ | ||||
| /****************************************************************************** | ||||
|  *   Copyright (C) 2011-2015 Frank Osterfeld <frank.osterfeld@gmail.com>      * | ||||
|  *                                                                            * | ||||
|  * This program is distributed in the hope that it will be useful, but        * | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||||
|  * or FITNESS FOR A PARTICULAR PURPOSE. For licensing and distribution        * | ||||
|  * details, check the accompanying file 'COPYING'.                            * | ||||
|  *****************************************************************************/ | ||||
| #include "keychain_p.h" | ||||
|  | ||||
| #include <CoreFoundation/CoreFoundation.h> | ||||
| #include <Security/Security.h> | ||||
| #include <QDebug> | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| template <typename T> | ||||
| struct Releaser { | ||||
|     explicit Releaser( const T& v ) : value( v ) {} | ||||
|     ~Releaser() { | ||||
|         CFRelease( value ); | ||||
|     } | ||||
|  | ||||
|     const T value; | ||||
| }; | ||||
|  | ||||
| static QString strForStatus( OSStatus os ) { | ||||
|     const Releaser<CFStringRef> str( SecCopyErrorMessageString( os, 0 ) ); | ||||
|     const char * const buf = CFStringGetCStringPtr( str.value,  kCFStringEncodingUTF8 ); | ||||
|     if ( !buf ) | ||||
|         return QObject::tr( "%1 (OSStatus %2)" ) | ||||
|             .arg( "OSX Keychain Error" ).arg( os ); | ||||
|     return QObject::tr( "%1 (OSStatus %2)" ) | ||||
|         .arg( QString::fromUtf8( buf, strlen( buf ) ) ).arg( os ); | ||||
| } | ||||
|  | ||||
| static OSStatus readPw( QByteArray* pw, | ||||
|                         const QString& service, | ||||
|                         const QString& account, | ||||
|                         SecKeychainItemRef* ref ) { | ||||
|     Q_ASSERT( pw ); | ||||
|     pw->clear(); | ||||
|     const QByteArray serviceData = service.toUtf8(); | ||||
|     const QByteArray accountData = account.toUtf8(); | ||||
|  | ||||
|     void* data = 0; | ||||
|     UInt32 len = 0; | ||||
|  | ||||
|     const OSStatus ret = SecKeychainFindGenericPassword( NULL, // default keychain | ||||
|                                                          serviceData.size(), | ||||
|                                                          serviceData.constData(), | ||||
|                                                          accountData.size(), | ||||
|                                                          accountData.constData(), | ||||
|                                                          &len, | ||||
|                                                          &data, | ||||
|                                                          ref ); | ||||
|     if ( ret == noErr ) { | ||||
|         *pw = QByteArray( reinterpret_cast<const char*>( data ), len ); | ||||
|         const OSStatus ret2 = SecKeychainItemFreeContent ( 0, data ); | ||||
|         if ( ret2 != noErr ) | ||||
|             qWarning() << "Could not free item content: " << strForStatus( ret2 ); | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| void ReadPasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     QString errorString; | ||||
|     Error error = NoError; | ||||
|     const OSStatus ret = readPw( &data, q->service(), q->key(), 0 ); | ||||
|  | ||||
|     switch ( ret ) { | ||||
|     case noErr: | ||||
|         break; | ||||
|     case errSecItemNotFound: | ||||
|         errorString = tr("Password not found"); | ||||
|         error = EntryNotFound; | ||||
|         break; | ||||
|     default: | ||||
|         errorString = strForStatus( ret ); | ||||
|         error = OtherError; | ||||
|         break; | ||||
|     } | ||||
|     q->emitFinishedWithError( error, errorString ); | ||||
| } | ||||
|  | ||||
|  | ||||
| static QKeychain::Error deleteEntryImpl( const QString& service, const QString& account, QString* err ) { | ||||
|     SecKeychainItemRef ref; | ||||
|     QByteArray pw; | ||||
|     const OSStatus ret1 = readPw( &pw, service, account, &ref ); | ||||
|     if ( ret1 == errSecItemNotFound ) | ||||
|         return NoError; // No item stored, we're done | ||||
|     if ( ret1 != noErr ) { | ||||
|         *err = strForStatus( ret1 ); | ||||
|         //TODO map error code, set errstr | ||||
|         return OtherError; | ||||
|     } | ||||
|     const Releaser<SecKeychainItemRef> releaser( ref ); | ||||
|  | ||||
|     const OSStatus ret2 = SecKeychainItemDelete( ref ); | ||||
|  | ||||
|     if ( ret2 == noErr ) | ||||
|         return NoError; | ||||
|     //TODO map error code | ||||
|     *err = strForStatus( ret2 ); | ||||
|     return CouldNotDeleteEntry; | ||||
| } | ||||
|  | ||||
| static QKeychain::Error writeEntryImpl( const QString& service, | ||||
|                                         const QString& account, | ||||
|                                         const QByteArray& data, | ||||
|                                         QString* err ) { | ||||
|     Q_ASSERT( err ); | ||||
|     err->clear(); | ||||
|     const QByteArray serviceData = service.toUtf8(); | ||||
|     const QByteArray accountData = account.toUtf8(); | ||||
|     const OSStatus ret = SecKeychainAddGenericPassword( NULL, //default keychain | ||||
|                                                         serviceData.size(), | ||||
|                                                         serviceData.constData(), | ||||
|                                                         accountData.size(), | ||||
|                                                         accountData.constData(), | ||||
|                                                         data.size(), | ||||
|                                                         data.constData(), | ||||
|                                                         NULL //item reference | ||||
|                                                         ); | ||||
|     if ( ret != noErr ) { | ||||
|         switch ( ret ) { | ||||
|         case errSecDuplicateItem: | ||||
|         { | ||||
|             Error derr = deleteEntryImpl( service, account, err ); | ||||
|             if ( derr != NoError ) | ||||
|                 return CouldNotDeleteEntry; | ||||
|             else | ||||
|                 return writeEntryImpl( service, account, data, err ); | ||||
|         } | ||||
|         default: | ||||
|             *err = strForStatus( ret ); | ||||
|             return OtherError; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return NoError; | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::scheduledStart() | ||||
| { | ||||
|     QString errorString; | ||||
|     Error error = NoError; | ||||
|  | ||||
|     if ( mode == Delete ) { | ||||
|         const Error derr = deleteEntryImpl( q->service(), key, &errorString ); | ||||
|         if ( derr != NoError ) | ||||
|             error = CouldNotDeleteEntry; | ||||
|         q->emitFinishedWithError( error, errorString ); | ||||
|         return; | ||||
|     } | ||||
|     const QByteArray data = mode == Text ?  textData.toUtf8() : binaryData; | ||||
|     error = writeEntryImpl( q->service(), key, data, &errorString ); | ||||
|     q->emitFinishedWithError( error, errorString ); | ||||
| } | ||||
| @@ -13,9 +13,9 @@ | ||||
| #include <QObject> | ||||
| #include <QPointer> | ||||
| #include <QSettings> | ||||
| #include <QVector> | ||||
| #include <QQueue> | ||||
|  | ||||
| #if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) | ||||
| #if defined(KEYCHAIN_DBUS) | ||||
|  | ||||
| #include <QDBusPendingCallWatcher> | ||||
|  | ||||
| @@ -35,105 +35,109 @@ class JobExecutor; | ||||
| class JobPrivate : public QObject { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     JobPrivate( const QString& service_ ) | ||||
|         : error( NoError ) | ||||
|         , service( service_ ) | ||||
|         , autoDelete( true ) | ||||
|         , insecureFallback( false ) {} | ||||
|     enum Mode { | ||||
| 	Text, | ||||
| 	Binary | ||||
|     }; | ||||
|  | ||||
|     virtual void scheduledStart() = 0; | ||||
|  | ||||
|     static QString modeToString(Mode m); | ||||
|     static Mode stringToMode(const QString& s); | ||||
|  | ||||
|     Job* const q; | ||||
|     Mode mode; | ||||
|     QByteArray data; | ||||
|  | ||||
| #if defined(KEYCHAIN_DBUS) | ||||
|     org::kde::KWallet* iface; | ||||
|     int walletHandle; | ||||
|  | ||||
|     static void gnomeKeyring_readCb( int result, const char* string, JobPrivate* data ); | ||||
|     static void gnomeKeyring_writeCb( int result, JobPrivate* self ); | ||||
|  | ||||
|     virtual void fallbackOnError(const QDBusError& err) = 0; | ||||
|  | ||||
| protected Q_SLOTS: | ||||
|     void kwalletWalletFound( QDBusPendingCallWatcher* watcher ); | ||||
|     virtual void kwalletFinished( QDBusPendingCallWatcher* watcher ); | ||||
|     virtual void kwalletOpenFinished( QDBusPendingCallWatcher* watcher ); | ||||
| #else | ||||
|     void kwalletWalletFound( QDBusPendingCallWatcher* ) {} | ||||
|     virtual void kwalletFinished( QDBusPendingCallWatcher* ) {} | ||||
|     virtual void kwalletOpenFinished( QDBusPendingCallWatcher*  ) {} | ||||
| #endif | ||||
|  | ||||
| protected: | ||||
|     JobPrivate( const QString& service_, Job *q ); | ||||
|  | ||||
| protected: | ||||
|     QKeychain::Error error; | ||||
|     QString errorString; | ||||
|     QString service; | ||||
|     bool autoDelete; | ||||
|     bool insecureFallback; | ||||
|     QPointer<QSettings> settings; | ||||
|     QString key; | ||||
|  | ||||
| friend class Job; | ||||
| friend class JobExecutor; | ||||
| friend class ReadPasswordJob; | ||||
| friend class WritePasswordJob; | ||||
| friend class PlainTextStore; | ||||
| }; | ||||
|  | ||||
| class ReadPasswordJobPrivate : public QObject { | ||||
| class ReadPasswordJobPrivate : public JobPrivate { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     explicit ReadPasswordJobPrivate( ReadPasswordJob* qq ) : q( qq ), walletHandle( 0 ), dataType( Text ) {} | ||||
|     void scheduledStart(); | ||||
|     explicit ReadPasswordJobPrivate( const QString &service_, ReadPasswordJob* qq ); | ||||
|     void scheduledStart() override; | ||||
|  | ||||
|     ReadPasswordJob* const q; | ||||
|     QByteArray data; | ||||
|     QString key; | ||||
|     int walletHandle; | ||||
|     enum DataType { | ||||
|         Binary, | ||||
|         Text | ||||
|     }; | ||||
|     DataType dataType; | ||||
|  | ||||
| #if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) | ||||
|     org::kde::KWallet* iface; | ||||
|     static void gnomeKeyring_cb( int result, const char* string, ReadPasswordJobPrivate* data ); | ||||
|     friend class QKeychain::JobExecutor; | ||||
|     void fallbackOnError(const QDBusError& err); | ||||
| #if defined(KEYCHAIN_DBUS) | ||||
|     void fallbackOnError(const QDBusError& err) override; | ||||
|  | ||||
| private Q_SLOTS: | ||||
|     void kwalletWalletFound( QDBusPendingCallWatcher* watcher ); | ||||
|     void kwalletOpenFinished( QDBusPendingCallWatcher* watcher ); | ||||
|     void kwalletOpenFinished( QDBusPendingCallWatcher* watcher ) override; | ||||
|     void kwalletEntryTypeFinished( QDBusPendingCallWatcher* watcher ); | ||||
|     void kwalletReadFinished( QDBusPendingCallWatcher* watcher ); | ||||
|     void kwalletFinished( QDBusPendingCallWatcher* watcher ) override; | ||||
| #else //moc's too dumb to respect above macros, so just define empty slot implementations | ||||
| private Q_SLOTS: | ||||
|     void kwalletWalletFound( QDBusPendingCallWatcher* ) {} | ||||
|     void kwalletOpenFinished( QDBusPendingCallWatcher* ) {} | ||||
|     void kwalletEntryTypeFinished( QDBusPendingCallWatcher* ) {} | ||||
|     void kwalletReadFinished( QDBusPendingCallWatcher* ) {} | ||||
|     void kwalletFinished( QDBusPendingCallWatcher* ) {} | ||||
| #endif | ||||
|  | ||||
|     friend class ReadPasswordJob; | ||||
| }; | ||||
|  | ||||
| class WritePasswordJobPrivate : public QObject { | ||||
| class WritePasswordJobPrivate : public JobPrivate { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     explicit WritePasswordJobPrivate( WritePasswordJob* qq ) : q( qq ), mode( Delete ) {} | ||||
|     void scheduledStart(); | ||||
|     explicit WritePasswordJobPrivate( const QString &service_, WritePasswordJob* qq ); | ||||
|     void scheduledStart() override; | ||||
|  | ||||
|     enum Mode { | ||||
|         Delete, | ||||
|         Text, | ||||
|         Binary | ||||
|     }; | ||||
|  | ||||
|     static QString modeToString(Mode m); | ||||
|     static Mode stringToMode(const QString& s); | ||||
|  | ||||
|     WritePasswordJob* const q; | ||||
|     Mode mode; | ||||
|     QString key; | ||||
|     QByteArray binaryData; | ||||
|     QString textData; | ||||
|  | ||||
| #if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) | ||||
|     org::kde::KWallet* iface; | ||||
|     static void gnomeKeyring_cb( int result, WritePasswordJobPrivate* self ); | ||||
|     friend class QKeychain::JobExecutor; | ||||
|     void fallbackOnError(const QDBusError& err); | ||||
|  | ||||
| private Q_SLOTS: | ||||
|     void kwalletWalletFound( QDBusPendingCallWatcher* watcher ); | ||||
|     void kwalletOpenFinished( QDBusPendingCallWatcher* watcher ); | ||||
|     void kwalletWriteFinished( QDBusPendingCallWatcher* watcher ); | ||||
| #else | ||||
| private Q_SLOTS: | ||||
|     void kwalletWalletFound( QDBusPendingCallWatcher* ) {} | ||||
|     void kwalletOpenFinished( QDBusPendingCallWatcher* ) {} | ||||
|     void kwalletWriteFinished( QDBusPendingCallWatcher* ) {} | ||||
| #if defined(KEYCHAIN_DBUS) | ||||
|     void fallbackOnError(const QDBusError& err) override; | ||||
| #endif | ||||
|  | ||||
|     friend class WritePasswordJob; | ||||
| }; | ||||
|  | ||||
| class DeletePasswordJobPrivate : public QObject { | ||||
| class DeletePasswordJobPrivate : public JobPrivate { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     explicit DeletePasswordJobPrivate( DeletePasswordJob* qq ) : q( qq ) {} | ||||
|     explicit DeletePasswordJobPrivate( const QString &service_, DeletePasswordJob* qq ); | ||||
|  | ||||
|     void scheduledStart() override; | ||||
|  | ||||
| #if defined(KEYCHAIN_DBUS) | ||||
|     void fallbackOnError(const QDBusError& err) override; | ||||
| #endif | ||||
|  | ||||
| protected: | ||||
|     void doStart(); | ||||
|     DeletePasswordJob* const q; | ||||
|     QString key; | ||||
| private Q_SLOTS: | ||||
|     void jobFinished( QKeychain::Job* ); | ||||
|  | ||||
|     friend class DeletePasswordJob; | ||||
| }; | ||||
|  | ||||
| class JobExecutor : public QObject { | ||||
| @@ -154,8 +158,8 @@ private Q_SLOTS: | ||||
|  | ||||
| private: | ||||
|     static JobExecutor* s_instance; | ||||
|     Job* m_runningJob; | ||||
|     QVector<QPointer<Job> > m_queue; | ||||
|     QQueue<QPointer<Job> > m_queue; | ||||
|     bool m_jobRunning; | ||||
| }; | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -8,24 +8,15 @@ | ||||
|  *****************************************************************************/ | ||||
| #include "keychain_p.h" | ||||
| #include "gnomekeyring_p.h" | ||||
|  | ||||
| #include <QSettings> | ||||
| #include "libsecret_p.h" | ||||
| #include "plaintextstore_p.h" | ||||
|  | ||||
| #include <QScopedPointer> | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| static QString typeKey( const QString& key ) | ||||
| { | ||||
|     return QString::fromLatin1( "%1/type" ).arg( key ); | ||||
| } | ||||
|  | ||||
| static QString dataKey( const QString& key ) | ||||
| { | ||||
|     return QString::fromLatin1( "%1/data" ).arg( key ); | ||||
| } | ||||
|  | ||||
| enum KeyringBackend { | ||||
|     Backend_LibSecretKeyring, | ||||
|     Backend_GnomeKeyring, | ||||
|     Backend_Kwallet4, | ||||
|     Backend_Kwallet5 | ||||
| @@ -44,7 +35,7 @@ enum DesktopEnvironment { | ||||
| // licensed under BSD, see base/nix/xdg_util.cc | ||||
|  | ||||
| static DesktopEnvironment getKdeVersion() { | ||||
|     QString value = qgetenv("KDE_SESSION_VERSION"); | ||||
|     QByteArray value = qgetenv("KDE_SESSION_VERSION"); | ||||
|     if ( value == "5" ) { | ||||
|         return DesktopEnv_Plasma5; | ||||
|     } else if (value == "4" ) { | ||||
| @@ -63,6 +54,8 @@ static DesktopEnvironment detectDesktopEnvironment() { | ||||
|         return DesktopEnv_Unity; | ||||
|     } else if ( xdgCurrentDesktop == "KDE" ) { | ||||
|         return getKdeVersion(); | ||||
|     } else if ( xdgCurrentDesktop == "XFCE" ) { | ||||
|         return DesktopEnv_Xfce; | ||||
|     } | ||||
|  | ||||
|     QByteArray desktopSession = qgetenv("DESKTOP_SESSION"); | ||||
| @@ -85,26 +78,82 @@ static DesktopEnvironment detectDesktopEnvironment() { | ||||
|     return DesktopEnv_Other; | ||||
| } | ||||
|  | ||||
| static bool isKwallet5Available() | ||||
| { | ||||
|     if (!QDBusConnection::sessionBus().isConnected()) | ||||
|         return false; | ||||
|  | ||||
|     org::kde::KWallet iface( | ||||
|         QLatin1String("org.kde.kwalletd5"), | ||||
|         QLatin1String("/modules/kwalletd5"), | ||||
|         QDBusConnection::sessionBus()); | ||||
|  | ||||
|     // At this point iface.isValid() can return false even though the | ||||
|     // interface is activatable by making a call. Hence we check whether | ||||
|     // a wallet can be opened. | ||||
|  | ||||
|     iface.setTimeout(500); | ||||
|     QDBusMessage reply = iface.call(QLatin1String("networkWallet")); | ||||
|     return reply.type() == QDBusMessage::ReplyMessage; | ||||
| } | ||||
|  | ||||
| static KeyringBackend detectKeyringBackend() | ||||
| { | ||||
|     /* The secret service dbus api, accessible through libsecret, is supposed | ||||
|      * to unify password services. | ||||
|      * | ||||
|      * Unfortunately at the time of Kubuntu 18.04 the secret service backend | ||||
|      * in KDE is gnome-keyring-daemon - using it has several complications: | ||||
|      * - the default collection isn't opened on session start, so users need | ||||
|      *   to manually unlock it when the first application uses it | ||||
|      * - it's separate from the kwallet5 keyring, so switching to it means the | ||||
|      *   existing keyring data can't be accessed anymore | ||||
|      * | ||||
|      * Thus we still prefer kwallet backends on KDE even if libsecret is | ||||
|      * available. | ||||
|      */ | ||||
|  | ||||
|     switch (detectDesktopEnvironment()) { | ||||
|     case DesktopEnv_Kde4: | ||||
|         return Backend_Kwallet4; | ||||
|         break; | ||||
|  | ||||
|     case DesktopEnv_Plasma5: | ||||
|         if (isKwallet5Available()) { | ||||
|             return Backend_Kwallet5; | ||||
|         } | ||||
|         if (LibSecretKeyring::isAvailable()) { | ||||
|             return Backend_LibSecretKeyring; | ||||
|         } | ||||
|         if (GnomeKeyring::isAvailable()) { | ||||
|             return Backend_GnomeKeyring; | ||||
|         } | ||||
|         // During startup the keychain backend might just not have started yet | ||||
|         return Backend_Kwallet5; | ||||
|         break; | ||||
|     // fall through | ||||
|  | ||||
|     case DesktopEnv_Gnome: | ||||
|     case DesktopEnv_Unity: | ||||
|     case DesktopEnv_Xfce: | ||||
|     case DesktopEnv_Other: | ||||
|     default: | ||||
|         if ( GnomeKeyring::isAvailable() ) { | ||||
|             return Backend_GnomeKeyring; | ||||
|         } else { | ||||
|             return Backend_Kwallet4; | ||||
|         if (LibSecretKeyring::isAvailable()) { | ||||
|             return Backend_LibSecretKeyring; | ||||
|         } | ||||
|         if (GnomeKeyring::isAvailable()) { | ||||
|             return Backend_GnomeKeyring; | ||||
|         } | ||||
|         if (isKwallet5Available()) { | ||||
|             return Backend_Kwallet5; | ||||
|         } | ||||
|         // During startup the keychain backend might just not have started yet | ||||
|         // | ||||
|         // This doesn't need to be libsecret because LibSecretKeyring::isAvailable() | ||||
|         // only fails if the libsecret shared library couldn't be loaded. In contrast | ||||
|         // to that GnomeKeyring::isAvailable() can return false if the shared library | ||||
|         // *was* loaded but its libgnome_keyring::is_available() returned false. | ||||
|         // | ||||
|         // In the future there should be a difference between "API available" and | ||||
|         // "keychain available". | ||||
|         return Backend_GnomeKeyring; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -125,7 +174,7 @@ static void kwalletReadPasswordScheduledStartImpl(const char * service, const ch | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|     // D-Bus is not reachable so none can tell us something about KWalletd | ||||
|         // D-Bus is not reachable so none can tell us something about KWalletd | ||||
|         QDBusError err( QDBusError::NoServer, ReadPasswordJobPrivate::tr("D-Bus is not running") ); | ||||
|         priv->fallbackOnError( err ); | ||||
|     } | ||||
| @@ -133,9 +182,17 @@ static void kwalletReadPasswordScheduledStartImpl(const char * service, const ch | ||||
|  | ||||
| void ReadPasswordJobPrivate::scheduledStart() { | ||||
|     switch ( getKeyringBackend() ) { | ||||
|     case Backend_LibSecretKeyring: { | ||||
|         if ( !LibSecretKeyring::findPassword(key, q->service(), this) ) { | ||||
|             q->emitFinishedWithError( OtherError, tr("Unknown error") ); | ||||
|         } | ||||
|     } break; | ||||
|     case Backend_GnomeKeyring: | ||||
|         if ( !GnomeKeyring::find_network_password( key.toUtf8().constData(), q->service().toUtf8().constData(), | ||||
|                                                    reinterpret_cast<GnomeKeyring::OperationGetStringCallback>( &ReadPasswordJobPrivate::gnomeKeyring_cb ), | ||||
|         this->mode = JobPrivate::Text; | ||||
|         if ( !GnomeKeyring::find_network_password( key.toUtf8().constData(), | ||||
|                                                    q->service().toUtf8().constData(), | ||||
|                                                    "plaintext", | ||||
|                                                    reinterpret_cast<GnomeKeyring::OperationGetStringCallback>( &JobPrivate::gnomeKeyring_readCb ), | ||||
|                                                    this, 0 ) ) | ||||
|             q->emitFinishedWithError( OtherError, tr("Unknown error") ); | ||||
|         break; | ||||
| @@ -149,13 +206,14 @@ void ReadPasswordJobPrivate::scheduledStart() { | ||||
|     } | ||||
| } | ||||
|  | ||||
| void ReadPasswordJobPrivate::kwalletWalletFound(QDBusPendingCallWatcher *watcher) | ||||
| void JobPrivate::kwalletWalletFound(QDBusPendingCallWatcher *watcher) | ||||
| { | ||||
|     watcher->deleteLater(); | ||||
|     const QDBusPendingReply<QString> reply = *watcher; | ||||
|     const QDBusPendingReply<int> pendingReply = iface->open( reply.value(), 0, q->service() ); | ||||
|     QDBusPendingCallWatcher* pendingWatcher = new QDBusPendingCallWatcher( pendingReply, this ); | ||||
|     connect( pendingWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletOpenFinished(QDBusPendingCallWatcher*)) ); | ||||
|     connect( pendingWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), | ||||
|              this, SLOT(kwalletOpenFinished(QDBusPendingCallWatcher*)) ); | ||||
| } | ||||
|  | ||||
| static QPair<Error, QString> mapGnomeKeyringError( int result ) | ||||
| @@ -188,14 +246,23 @@ static QPair<Error, QString> mapGnomeKeyringError( int result ) | ||||
|     return qMakePair( OtherError, QObject::tr("Unknown error") ); | ||||
| } | ||||
|  | ||||
| void ReadPasswordJobPrivate::gnomeKeyring_cb( int result, const char* string, ReadPasswordJobPrivate* self ) | ||||
| void JobPrivate::gnomeKeyring_readCb( int result, const char* string, JobPrivate* self ) | ||||
| { | ||||
|     if ( result == GnomeKeyring::RESULT_OK ) { | ||||
|         if ( self->dataType == ReadPasswordJobPrivate::Text ) | ||||
|             self->data = string; | ||||
|         if (self->mode == JobPrivate::Text) | ||||
|             self->data = QByteArray(string); | ||||
|         else | ||||
|             self->data = QByteArray::fromBase64( string ); | ||||
|             self->data = QByteArray::fromBase64(string); | ||||
|  | ||||
|         self->q->emitFinished(); | ||||
|     } else if (self->mode == JobPrivate::Text) { | ||||
|         self->mode = JobPrivate::Binary; | ||||
|         if ( !GnomeKeyring::find_network_password( self->key.toUtf8().constData(), | ||||
|                                                    self->q->service().toUtf8().constData(), | ||||
|                                                    "base64", | ||||
|                                                    reinterpret_cast<GnomeKeyring::OperationGetStringCallback>( &JobPrivate::gnomeKeyring_readCb ), | ||||
|                                                    self, 0 ) ) | ||||
|             self->q->emitFinishedWithError( OtherError, tr("Unknown error") ); | ||||
|     } else { | ||||
|         const QPair<Error, QString> errorResult = mapGnomeKeyringError( result ); | ||||
|         self->q->emitFinishedWithError( errorResult.first, errorResult.second ); | ||||
| @@ -204,19 +271,16 @@ void ReadPasswordJobPrivate::gnomeKeyring_cb( int result, const char* string, Re | ||||
|  | ||||
| void ReadPasswordJobPrivate::fallbackOnError(const QDBusError& err ) | ||||
| { | ||||
|     QScopedPointer<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 ); | ||||
|     QSettings* actual = q->settings() ? q->settings() : local.data(); | ||||
|     PlainTextStore plainTextStore( q->service(), q->settings() ); | ||||
|  | ||||
|     if ( q->insecureFallback() && actual->contains( dataKey( key ) ) ) { | ||||
|     if ( q->insecureFallback() && plainTextStore.contains( key ) ) { | ||||
|         mode = plainTextStore.readMode( key ); | ||||
|         data = plainTextStore.readData( key ); | ||||
|  | ||||
|         const WritePasswordJobPrivate::Mode mode = WritePasswordJobPrivate::stringToMode( actual->value( typeKey( key ) ).toString() ); | ||||
|         if (mode == WritePasswordJobPrivate::Binary) | ||||
|            dataType = Binary; | ||||
|         if ( plainTextStore.error() != NoError ) | ||||
|             q->emitFinishedWithError( plainTextStore.error(), plainTextStore.errorString() ); | ||||
|         else | ||||
|             dataType = Text; | ||||
|         data = actual->value( dataKey( key ) ).toByteArray(); | ||||
|  | ||||
|         q->emitFinished(); | ||||
|             q->emitFinished(); | ||||
|     } else { | ||||
|         if ( err.type() == QDBusError::ServiceUnknown ) //KWalletd not running | ||||
|             q->emitFinishedWithError( NoBackendAvailable, tr("No keychain service available") ); | ||||
| @@ -229,21 +293,20 @@ void ReadPasswordJobPrivate::kwalletOpenFinished( QDBusPendingCallWatcher* watch | ||||
|     watcher->deleteLater(); | ||||
|     const QDBusPendingReply<int> reply = *watcher; | ||||
|  | ||||
|     QScopedPointer<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 ); | ||||
|     QSettings* actual = q->settings() ? q->settings() : local.data(); | ||||
|  | ||||
|     if ( reply.isError() ) { | ||||
|         fallbackOnError( reply.error() ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if ( actual->contains( dataKey( key ) ) ) { | ||||
|     PlainTextStore plainTextStore( q->service(), q->settings() ); | ||||
|  | ||||
|     if ( plainTextStore.contains( key ) ) { | ||||
|         // We previously stored data in the insecure QSettings, but now have KWallet available. | ||||
|         // Do the migration | ||||
|  | ||||
|         data = actual->value( dataKey( key ) ).toByteArray(); | ||||
|         const WritePasswordJobPrivate::Mode mode = WritePasswordJobPrivate::stringToMode( actual->value( typeKey( key ) ).toString() ); | ||||
|         actual->remove( key ); | ||||
|         data = plainTextStore.readData( key ); | ||||
|         const WritePasswordJobPrivate::Mode mode = plainTextStore.readMode( key ); | ||||
|         plainTextStore.remove( key ); | ||||
|  | ||||
|         q->emitFinished(); | ||||
|  | ||||
| @@ -300,10 +363,10 @@ void ReadPasswordJobPrivate::kwalletEntryTypeFinished( QDBusPendingCallWatcher* | ||||
|         q->emitFinishedWithError( EntryNotFound, tr("Entry not found") ); | ||||
|         return; | ||||
|     case Password: | ||||
|         dataType = Text; | ||||
|         mode = Text; | ||||
|         break; | ||||
|     case Stream: | ||||
|         dataType = Binary; | ||||
|         mode = Binary; | ||||
|         break; | ||||
|     case Map: | ||||
|         q->emitFinishedWithError( EntryNotFound, tr("Unsupported entry type 'Map'") ); | ||||
| @@ -313,32 +376,32 @@ void ReadPasswordJobPrivate::kwalletEntryTypeFinished( QDBusPendingCallWatcher* | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const QDBusPendingCall nextReply = dataType == Text | ||||
|         ? QDBusPendingCall( iface->readPassword( walletHandle, q->service(), key, q->service() ) ) | ||||
|         : QDBusPendingCall( iface->readEntry( walletHandle, q->service(), key, q->service() ) ); | ||||
|     const QDBusPendingCall nextReply = (mode == Text) | ||||
|             ? QDBusPendingCall( iface->readPassword( walletHandle, q->service(), key, q->service() ) ) | ||||
|             : QDBusPendingCall( iface->readEntry( walletHandle, q->service(), key, q->service() ) ); | ||||
|     QDBusPendingCallWatcher* nextWatcher = new QDBusPendingCallWatcher( nextReply, this ); | ||||
|     connect( nextWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletReadFinished(QDBusPendingCallWatcher*)) ); | ||||
|     connect( nextWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletFinished(QDBusPendingCallWatcher*)) ); | ||||
| } | ||||
|  | ||||
| void ReadPasswordJobPrivate::kwalletReadFinished( QDBusPendingCallWatcher* watcher ) { | ||||
|     watcher->deleteLater(); | ||||
|     if ( watcher->isError() ) { | ||||
|         const QDBusError err = watcher->error(); | ||||
|         q->emitFinishedWithError( OtherError, tr("Could not read password: %1; %2").arg( QDBusError::errorString( err.type() ), err.message() ) ); | ||||
|         return; | ||||
| void ReadPasswordJobPrivate::kwalletFinished( QDBusPendingCallWatcher* watcher ) { | ||||
|     if ( !watcher->isError() ) { | ||||
|         if ( mode == Binary ) { | ||||
|             QDBusPendingReply<QByteArray> reply = *watcher; | ||||
|             if (reply.isValid()) { | ||||
|                 data = reply.value(); | ||||
|             } | ||||
|         } else { | ||||
|             QDBusPendingReply<QString> reply = *watcher; | ||||
|             if (reply.isValid()) { | ||||
|                 data = reply.value().toUtf8(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if ( dataType == Binary ) { | ||||
|         QDBusPendingReply<QByteArray> reply = *watcher; | ||||
|         data = reply.value(); | ||||
|     } else { | ||||
|         QDBusPendingReply<QString> reply = *watcher; | ||||
|         data = reply.value().toUtf8(); | ||||
|     } | ||||
|     q->emitFinished(); | ||||
|     JobPrivate::kwalletFinished(watcher); | ||||
| } | ||||
|  | ||||
| static void kwalletWritePasswordScheduledStart( const char * service, const char * path, WritePasswordJobPrivate * priv ) { | ||||
| static void kwalletWritePasswordScheduledStart( const char * service, const char * path, JobPrivate * priv ) { | ||||
|     if ( QDBusConnection::sessionBus().isConnected() ) | ||||
|     { | ||||
|         priv->iface = new org::kde::KWallet( QLatin1String(service), QLatin1String(path), QDBusConnection::sessionBus(), priv ); | ||||
| @@ -356,21 +419,38 @@ static void kwalletWritePasswordScheduledStart( const char * service, const char | ||||
|  | ||||
| void WritePasswordJobPrivate::scheduledStart() { | ||||
|     switch ( getKeyringBackend() ) { | ||||
|     case Backend_GnomeKeyring: | ||||
|         if ( mode == WritePasswordJobPrivate::Delete ) { | ||||
|             if ( !GnomeKeyring::delete_network_password( key.toUtf8().constData(), q->service().toUtf8().constData(), | ||||
|                                                          reinterpret_cast<GnomeKeyring::OperationDoneCallback>( &WritePasswordJobPrivate::gnomeKeyring_cb ), | ||||
|                                                          this, 0 ) ) | ||||
|                 q->emitFinishedWithError( OtherError, tr("Unknown error") ); | ||||
|         } else { | ||||
|             QByteArray password = mode == WritePasswordJobPrivate::Text ? textData.toUtf8() : binaryData.toBase64(); | ||||
|             QByteArray service = q->service().toUtf8(); | ||||
|             if ( !GnomeKeyring::store_network_password( GnomeKeyring::GNOME_KEYRING_DEFAULT, service.constData(), | ||||
|                                                         key.toUtf8().constData(), service.constData(), password.constData(), | ||||
|                                                         reinterpret_cast<GnomeKeyring::OperationDoneCallback>( &WritePasswordJobPrivate::gnomeKeyring_cb ), | ||||
|                                                         this, 0 ) ) | ||||
|                 q->emitFinishedWithError( OtherError, tr("Unknown error") ); | ||||
|     case Backend_LibSecretKeyring: { | ||||
|         if ( !LibSecretKeyring::writePassword(service, key, service, mode, | ||||
|                                               data, this) ) { | ||||
|             q->emitFinishedWithError( OtherError, tr("Unknown error") ); | ||||
|         } | ||||
|     } break; | ||||
|     case Backend_GnomeKeyring: { | ||||
|         QString type; | ||||
|         QByteArray password; | ||||
|  | ||||
|         switch(mode) { | ||||
|         case JobPrivate::Text: | ||||
|             type = QLatin1String("plaintext"); | ||||
|             password = data; | ||||
|             break; | ||||
|         default: | ||||
|             type = QLatin1String("base64"); | ||||
|             password = data.toBase64(); | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         QByteArray service = q->service().toUtf8(); | ||||
|         if ( !GnomeKeyring::store_network_password( GnomeKeyring::GNOME_KEYRING_DEFAULT, | ||||
|                                                     service.constData(), | ||||
|                                                     key.toUtf8().constData(), | ||||
|                                                     service.constData(), | ||||
|                                                     type.toUtf8().constData(), | ||||
|                                                     password.constData(), | ||||
|                                                     reinterpret_cast<GnomeKeyring::OperationDoneCallback>( &JobPrivate::gnomeKeyring_writeCb ), | ||||
|                                                     this, 0 ) ) | ||||
|             q->emitFinishedWithError( OtherError, tr("Unknown error") ); | ||||
|     } | ||||
|         break; | ||||
|  | ||||
|     case Backend_Kwallet4: | ||||
| @@ -382,64 +462,23 @@ void WritePasswordJobPrivate::scheduledStart() { | ||||
|     } | ||||
| } | ||||
|  | ||||
| QString WritePasswordJobPrivate::modeToString(Mode m) | ||||
| { | ||||
|     switch (m) { | ||||
|     case Delete: | ||||
|         return QLatin1String("Delete"); | ||||
|     case Text: | ||||
|         return QLatin1String("Text"); | ||||
|     case Binary: | ||||
|         return QLatin1String("Binary"); | ||||
|     } | ||||
|  | ||||
|     Q_ASSERT_X(false, Q_FUNC_INFO, "Unhandled Mode value"); | ||||
|     return QString(); | ||||
| } | ||||
|  | ||||
| WritePasswordJobPrivate::Mode WritePasswordJobPrivate::stringToMode(const QString& s) | ||||
| { | ||||
|     if (s == QLatin1String("Delete") || s == QLatin1String("0")) | ||||
|         return Delete; | ||||
|     if (s == QLatin1String("Text") || s == QLatin1String("1")) | ||||
|         return Text; | ||||
|     if (s == QLatin1String("Binary") || s == QLatin1String("2")) | ||||
|         return Binary; | ||||
|  | ||||
|     qCritical("Unexpected mode string '%s'", qPrintable(s)); | ||||
|  | ||||
|     return Text; | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::fallbackOnError(const QDBusError &err) | ||||
| { | ||||
|     QScopedPointer<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 ); | ||||
|     QSettings* actual = q->settings() ? q->settings() : local.data(); | ||||
|  | ||||
|     if ( !q->insecureFallback() ) { | ||||
|         q->emitFinishedWithError( OtherError, tr("Could not open wallet: %1; %2").arg( QDBusError::errorString( err.type() ), err.message() ) ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if ( mode == Delete ) { | ||||
|         actual->remove( key ); | ||||
|         actual->sync(); | ||||
|     PlainTextStore plainTextStore( q->service(), q->settings() ); | ||||
|     plainTextStore.write( key, data, mode ); | ||||
|  | ||||
|     if ( plainTextStore.error() != NoError ) | ||||
|         q->emitFinishedWithError( plainTextStore.error(), plainTextStore.errorString() ); | ||||
|     else | ||||
|         q->emitFinished(); | ||||
|         return; | ||||
|    } | ||||
|  | ||||
|     actual->setValue( QString::fromLatin1( "%1/type" ).arg( key ), mode ); | ||||
|     if ( mode == Text ) | ||||
|         actual->setValue( QString::fromLatin1( "%1/data" ).arg( key ), textData.toUtf8() ); | ||||
|     else if ( mode == Binary ) | ||||
|         actual->setValue( QString::fromLatin1( "%1/data" ).arg( key ), binaryData ); | ||||
|     actual->sync(); | ||||
|  | ||||
|     q->emitFinished(); | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::gnomeKeyring_cb( int result, WritePasswordJobPrivate* self ) | ||||
| void JobPrivate::gnomeKeyring_writeCb(int result, JobPrivate* self ) | ||||
| { | ||||
|     if ( result == GnomeKeyring::RESULT_OK ) { | ||||
|         self->q->emitFinished(); | ||||
| @@ -449,32 +488,19 @@ void WritePasswordJobPrivate::gnomeKeyring_cb( int result, WritePasswordJobPriva | ||||
|     } | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::kwalletWalletFound(QDBusPendingCallWatcher *watcher) | ||||
| { | ||||
|     watcher->deleteLater(); | ||||
|     const QDBusPendingReply<QString> reply = *watcher; | ||||
|     const QDBusPendingReply<int> pendingReply = iface->open( reply.value(), 0, q->service() ); | ||||
|     QDBusPendingCallWatcher* pendingWatcher = new QDBusPendingCallWatcher( pendingReply, this ); | ||||
|     connect( pendingWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletOpenFinished(QDBusPendingCallWatcher*)) ); | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::kwalletOpenFinished( QDBusPendingCallWatcher* watcher ) { | ||||
| void JobPrivate::kwalletOpenFinished( QDBusPendingCallWatcher* watcher ) { | ||||
|     watcher->deleteLater(); | ||||
|     QDBusPendingReply<int> reply = *watcher; | ||||
|  | ||||
|     QScopedPointer<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 ); | ||||
|     QSettings* actual = q->settings() ? q->settings() : local.data(); | ||||
|  | ||||
|     if ( reply.isError() ) { | ||||
|         fallbackOnError( reply.error() ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if ( actual->contains( key ) ) | ||||
|     { | ||||
|     PlainTextStore plainTextStore( q->service(), q->settings() ); | ||||
|     if ( plainTextStore.contains( key ) ) { | ||||
|         // If we had previously written to QSettings, but we now have a kwallet available, migrate and delete old insecure data | ||||
|         actual->remove( key ); | ||||
|         actual->sync(); | ||||
|         plainTextStore.remove( key ); | ||||
|     } | ||||
|  | ||||
|     const int handle = reply.value(); | ||||
| @@ -486,25 +512,75 @@ void WritePasswordJobPrivate::kwalletOpenFinished( QDBusPendingCallWatcher* watc | ||||
|  | ||||
|     QDBusPendingReply<int> nextReply; | ||||
|  | ||||
|     if ( !textData.isEmpty() ) | ||||
|         nextReply = iface->writePassword( handle, q->service(), key, textData, q->service() ); | ||||
|     else if ( !binaryData.isEmpty() ) | ||||
|         nextReply = iface->writeEntry( handle, q->service(), key, binaryData, q->service() ); | ||||
|     if ( mode == Text ) | ||||
|         nextReply = iface->writePassword( handle, q->service(), key, QString::fromUtf8(data), q->service() ); | ||||
|     else if ( mode == Binary ) | ||||
|         nextReply = iface->writeEntry( handle, q->service(), key, data, q->service() ); | ||||
|     else | ||||
|         nextReply = iface->removeEntry( handle, q->service(), key, q->service() ); | ||||
|  | ||||
|     QDBusPendingCallWatcher* nextWatcher = new QDBusPendingCallWatcher( nextReply, this ); | ||||
|     connect( nextWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletWriteFinished(QDBusPendingCallWatcher*)) ); | ||||
|     connect( nextWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(kwalletFinished(QDBusPendingCallWatcher*)) ); | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::kwalletWriteFinished( QDBusPendingCallWatcher* watcher ) { | ||||
|     watcher->deleteLater(); | ||||
|     QDBusPendingReply<int> reply = *watcher; | ||||
|     if ( reply.isError() ) { | ||||
|         const QDBusError err = reply.error(); | ||||
|         q->emitFinishedWithError( OtherError, tr("Could not open wallet: %1; %2").arg( QDBusError::errorString( err.type() ), err.message() ) ); | ||||
|         return; | ||||
| void JobPrivate::kwalletFinished( QDBusPendingCallWatcher* watcher ) { | ||||
|     if ( !watcher->isError() ) { | ||||
|         if ( mode == Binary ) { | ||||
|             QDBusPendingReply<QByteArray> reply = *watcher; | ||||
|             if (reply.isValid()) { | ||||
|                 data = reply.value(); | ||||
|             } | ||||
|         } else { | ||||
|             QDBusPendingReply<QString> reply = *watcher; | ||||
|             if (reply.isValid()) { | ||||
|                 data = reply.value().toUtf8(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     q->emitFinished(); | ||||
| } | ||||
|  | ||||
| void DeletePasswordJobPrivate::scheduledStart() { | ||||
|     switch ( getKeyringBackend() ) { | ||||
|     case Backend_LibSecretKeyring: { | ||||
|         if ( !LibSecretKeyring::deletePassword(key, q->service(), this) ) { | ||||
|             q->emitFinishedWithError( OtherError, tr("Unknown error") ); | ||||
|         } | ||||
|     } break; | ||||
|     case Backend_GnomeKeyring: { | ||||
|         if ( !GnomeKeyring::delete_network_password( | ||||
|                  key.toUtf8().constData(), q->service().toUtf8().constData(), | ||||
|                  reinterpret_cast<GnomeKeyring::OperationDoneCallback>( &JobPrivate::gnomeKeyring_writeCb ), | ||||
|                  this, 0 ) ) | ||||
|             q->emitFinishedWithError( OtherError, tr("Unknown error") ); | ||||
|     } | ||||
|         break; | ||||
|  | ||||
|     case Backend_Kwallet4: | ||||
|         kwalletWritePasswordScheduledStart("org.kde.kwalletd", "/modules/kwalletd", this); | ||||
|         break; | ||||
|     case Backend_Kwallet5: | ||||
|         kwalletWritePasswordScheduledStart("org.kde.kwalletd5", "/modules/kwalletd5", this); | ||||
|         break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void DeletePasswordJobPrivate::fallbackOnError(const QDBusError &err) { | ||||
|     QScopedPointer<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 ); | ||||
|     QSettings* actual = q->settings() ? q->settings() : local.data(); | ||||
|  | ||||
|     if ( !q->insecureFallback() ) { | ||||
|         q->emitFinishedWithError( OtherError, tr("Could not open wallet: %1; %2") | ||||
|                                   .arg( QDBusError::errorString( err.type() ), err.message() ) ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     actual->remove( key ); | ||||
|     actual->sync(); | ||||
|  | ||||
|     q->emitFinished(); | ||||
|  | ||||
|  | ||||
|     q->emitFinished(); | ||||
| } | ||||
|   | ||||
| @@ -7,8 +7,7 @@ | ||||
|  * details, check the accompanying file 'COPYING'.                            * | ||||
|  *****************************************************************************/ | ||||
| #include "keychain_p.h" | ||||
|  | ||||
| #include <QSettings> | ||||
| #include "plaintextstore_p.h" | ||||
|  | ||||
| #include <windows.h> | ||||
| #include <wincrypt.h> | ||||
| @@ -17,14 +16,110 @@ | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| void ReadPasswordJobPrivate::scheduledStart() { | ||||
|     //Use settings member if there, create local settings object if not | ||||
|     std::auto_ptr<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 ); | ||||
|     QSettings* actual = q->settings() ? q->settings() : local.get(); | ||||
| #if defined(USE_CREDENTIAL_STORE) | ||||
| #include <wincred.h> | ||||
|  | ||||
|     QByteArray encrypted = actual->value( key ).toByteArray(); | ||||
|     if ( encrypted.isNull() ) { | ||||
|         q->emitFinishedWithError( EntryNotFound, tr("Entry not found") ); | ||||
| void ReadPasswordJobPrivate::scheduledStart() { | ||||
|     LPCWSTR name = (LPCWSTR)key.utf16(); | ||||
|     PCREDENTIALW cred; | ||||
|  | ||||
|     if (!CredReadW(name, CRED_TYPE_GENERIC, 0, &cred)) { | ||||
|         Error err; | ||||
|         QString msg; | ||||
|         switch(GetLastError()) { | ||||
|         case ERROR_NOT_FOUND: | ||||
|             err = EntryNotFound; | ||||
|             msg = tr("Password entry not found"); | ||||
|             break; | ||||
|         default: | ||||
|             err = OtherError; | ||||
|             msg = tr("Could not decrypt data"); | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         q->emitFinishedWithError( err, msg ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     data = QByteArray((char*)cred->CredentialBlob, cred->CredentialBlobSize); | ||||
|     CredFree(cred); | ||||
|  | ||||
|     q->emitFinished(); | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::scheduledStart() { | ||||
|     CREDENTIALW cred; | ||||
|     char *pwd = data.data(); | ||||
|     LPWSTR name = (LPWSTR)key.utf16(); | ||||
|  | ||||
|     memset(&cred, 0, sizeof(cred)); | ||||
|     cred.Comment = const_cast<wchar_t*>(L"QtKeychain"); | ||||
|     cred.Type = CRED_TYPE_GENERIC; | ||||
|     cred.TargetName = name; | ||||
|     cred.CredentialBlobSize = data.size(); | ||||
|     cred.CredentialBlob = (LPBYTE)pwd; | ||||
|     cred.Persist = CRED_PERSIST_ENTERPRISE; | ||||
|  | ||||
|     if (CredWriteW(&cred, 0)) { | ||||
|         q->emitFinished(); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     DWORD err = GetLastError(); | ||||
|  | ||||
|     // Detect size-exceeded errors and provide nicer messages. | ||||
|     // Unfortunately these error codes aren't documented. | ||||
|     // Found empirically on Win10 1803 build 17134.523. | ||||
|     if (err == RPC_X_BAD_STUB_DATA) { | ||||
|         const size_t maxBlob = CRED_MAX_CREDENTIAL_BLOB_SIZE; | ||||
|         if (cred.CredentialBlobSize > maxBlob) { | ||||
|             q->emitFinishedWithError( | ||||
|                 OtherError, | ||||
|                 tr("Credential size exceeds maximum size of %1").arg(maxBlob)); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|     if (err == RPC_S_INVALID_BOUND) { | ||||
|         const size_t maxTargetName = CRED_MAX_GENERIC_TARGET_NAME_LENGTH; | ||||
|         if (key.size() > maxTargetName) { | ||||
|             q->emitFinishedWithError( | ||||
|                 OtherError, | ||||
|                 tr("Credential key exceeds maximum size of %1").arg(maxTargetName)); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     q->emitFinishedWithError( OtherError, tr("Writing credentials failed: Win32 error code %1").arg(err) ); | ||||
| } | ||||
|  | ||||
| void DeletePasswordJobPrivate::scheduledStart() { | ||||
|     LPCWSTR name = (LPCWSTR)key.utf16(); | ||||
|  | ||||
|     if (!CredDeleteW(name, CRED_TYPE_GENERIC, 0)) { | ||||
|         Error err; | ||||
|         QString msg; | ||||
|         switch(GetLastError()) { | ||||
|         case ERROR_NOT_FOUND: | ||||
|             err = EntryNotFound; | ||||
|             msg = tr("Password entry not found"); | ||||
|             break; | ||||
|         default: | ||||
|             err = OtherError; | ||||
|             msg = tr("Could not decrypt data"); | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         q->emitFinishedWithError( err, msg ); | ||||
|     } else { | ||||
|         q->emitFinished(); | ||||
|     } | ||||
| } | ||||
| #else | ||||
| void ReadPasswordJobPrivate::scheduledStart() { | ||||
|     PlainTextStore plainTextStore( q->service(), q->settings() ); | ||||
|     QByteArray encrypted = plainTextStore.readData( key ); | ||||
|     if ( plainTextStore.error() != NoError ) { | ||||
|         q->emitFinishedWithError( plainTextStore.error(), plainTextStore.errorString() ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
| @@ -53,24 +148,6 @@ void ReadPasswordJobPrivate::scheduledStart() { | ||||
| } | ||||
|  | ||||
| void WritePasswordJobPrivate::scheduledStart() { | ||||
|     if ( mode == Delete ) { | ||||
|         //Use settings member if there, create local settings object if not | ||||
|         std::auto_ptr<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 ); | ||||
|         QSettings* actual = q->settings() ? q->settings() : local.get(); | ||||
|         actual->remove( key ); | ||||
|         actual->sync(); | ||||
|         if ( actual->status() != QSettings::NoError ) { | ||||
|             const QString err = actual->status() == QSettings::AccessError | ||||
|                     ? tr("Could not delete encrypted data from settings: access error") | ||||
|                     : tr("Could not delete encrypted data from settings: format error"); | ||||
|             q->emitFinishedWithError( OtherError, err ); | ||||
|         } else { | ||||
|             q->emitFinished(); | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     QByteArray data = mode == Binary ? binaryData : textData.toUtf8(); | ||||
|     DATA_BLOB blob_in, blob_out; | ||||
|     blob_in.pbData = reinterpret_cast<BYTE*>( data.data() ); | ||||
|     blob_in.cbData = data.size(); | ||||
| @@ -89,19 +166,23 @@ void WritePasswordJobPrivate::scheduledStart() { | ||||
|     const QByteArray encrypted( reinterpret_cast<char*>( blob_out.pbData ), blob_out.cbData ); | ||||
|     LocalFree( blob_out.pbData ); | ||||
|  | ||||
|     //Use settings member if there, create local settings object if not | ||||
|     std::auto_ptr<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 ); | ||||
|     QSettings* actual = q->settings() ? q->settings() : local.get(); | ||||
|     actual->setValue( key, encrypted ); | ||||
|     actual->sync(); | ||||
|     if ( actual->status() != QSettings::NoError ) { | ||||
|  | ||||
|         const QString errorString = actual->status() == QSettings::AccessError | ||||
|                 ? tr("Could not store encrypted data in settings: access error") | ||||
|                 : tr("Could not store encrypted data in settings: format error"); | ||||
|         q->emitFinishedWithError( OtherError, errorString ); | ||||
|     PlainTextStore plainTextStore( q->service(), q->settings() ); | ||||
|     plainTextStore.write( key, encrypted, Binary ); | ||||
|     if ( plainTextStore.error() != NoError ) { | ||||
|         q->emitFinishedWithError( plainTextStore.error(), plainTextStore.errorString() ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     q->emitFinished(); | ||||
| } | ||||
|  | ||||
| void DeletePasswordJobPrivate::scheduledStart() { | ||||
|     PlainTextStore plainTextStore( q->service(), q->settings() ); | ||||
|     plainTextStore.remove( key ); | ||||
|     if ( plainTextStore.error() != NoError ) { | ||||
|         q->emitFinishedWithError( plainTextStore.error(), plainTextStore.errorString() ); | ||||
|     } else { | ||||
|         q->emitFinished(); | ||||
|     } | ||||
| } | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										350
									
								
								ext/qtkeychain/libsecret.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										350
									
								
								ext/qtkeychain/libsecret.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,350 @@ | ||||
| #undef signals | ||||
|  | ||||
| #if defined(HAVE_LIBSECRET) | ||||
| #include <libsecret/secret.h> | ||||
| #endif | ||||
|  | ||||
| #include "libsecret_p.h" | ||||
|  | ||||
| #include <QLibrary> | ||||
| #include <QDebug> | ||||
|  | ||||
| #if defined(HAVE_LIBSECRET) | ||||
| const SecretSchema* qtkeychainSchema(void) { | ||||
|     static const SecretSchema schema = { | ||||
|         "org.qt.keychain", SECRET_SCHEMA_DONT_MATCH_NAME, | ||||
|         { | ||||
|             { "user", SECRET_SCHEMA_ATTRIBUTE_STRING }, | ||||
|             { "server", SECRET_SCHEMA_ATTRIBUTE_STRING }, | ||||
|             { "type", SECRET_SCHEMA_ATTRIBUTE_STRING } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     return &schema; | ||||
| } | ||||
|  | ||||
| typedef struct { | ||||
|     QKeychain::JobPrivate *self; | ||||
|     QString user; | ||||
|     QString server; | ||||
| } callbackArg; | ||||
|  | ||||
| typedef void (*secret_password_lookup_t) (const SecretSchema *schema, | ||||
|                                           GCancellable *cancellable, | ||||
|                                           GAsyncReadyCallback callback, | ||||
|                                           gpointer user_data, | ||||
|                                           ...) G_GNUC_NULL_TERMINATED; | ||||
| typedef gchar *(*secret_password_lookup_finish_t) (GAsyncResult *result, | ||||
|                                                    GError **error); | ||||
| typedef void (*secret_password_store_t) (const SecretSchema *schema, | ||||
|                                          const gchar *collection, | ||||
|                                          const gchar *label, | ||||
|                                          const gchar *password, | ||||
|                                          GCancellable *cancellable, | ||||
|                                          GAsyncReadyCallback callback, | ||||
|                                          gpointer user_data, | ||||
|                                          ...) G_GNUC_NULL_TERMINATED; | ||||
| typedef gboolean (*secret_password_store_finish_t) (GAsyncResult *result, | ||||
|                                                     GError **error); | ||||
| typedef void (*secret_password_clear_t) (const SecretSchema *schema, | ||||
|                                          GCancellable *cancellable, | ||||
|                                          GAsyncReadyCallback callback, | ||||
|                                          gpointer user_data, | ||||
|                                          ...) G_GNUC_NULL_TERMINATED; | ||||
| typedef gboolean (*secret_password_clear_finish_t) (GAsyncResult *result, | ||||
|                                                     GError **error); | ||||
| typedef void (*secret_password_free_t) (gchar *password); | ||||
| typedef GQuark (*secret_error_get_quark_t) (void) G_GNUC_CONST; | ||||
|  | ||||
| static secret_password_lookup_t secret_password_lookup_fn = NULL; | ||||
| static secret_password_lookup_finish_t secret_password_lookup_finish_fn = NULL; | ||||
| static secret_password_store_t secret_password_store_fn = NULL; | ||||
| static secret_password_store_finish_t secret_password_store_finish_fn = NULL; | ||||
| static secret_password_clear_t secret_password_clear_fn = NULL; | ||||
| static secret_password_clear_finish_t secret_password_clear_finish_fn = NULL; | ||||
| static secret_password_free_t secret_password_free_fn = NULL; | ||||
| static secret_error_get_quark_t secret_error_get_quark_fn = NULL; | ||||
|  | ||||
| static QKeychain::Error gerrorToCode(const GError *error) { | ||||
|     if (error->domain != secret_error_get_quark_fn()) { | ||||
|         return QKeychain::OtherError; | ||||
|     } | ||||
|  | ||||
|     switch(error->code) { | ||||
|     case SECRET_ERROR_NO_SUCH_OBJECT: | ||||
|         return QKeychain::EntryNotFound; | ||||
|     case SECRET_ERROR_IS_LOCKED: | ||||
|         return QKeychain::AccessDenied; | ||||
|     default: | ||||
|         return QKeychain::OtherError; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_password_lookup (GObject *source, | ||||
|                     GAsyncResult *result, | ||||
|                     gpointer inst) | ||||
| { | ||||
|     GError *error = NULL; | ||||
|     callbackArg *arg = (callbackArg*)inst; | ||||
|     gchar *password = secret_password_lookup_finish_fn (result, &error); | ||||
|  | ||||
|     Q_UNUSED(source); | ||||
|  | ||||
|     if (arg) { | ||||
|         if (error) { | ||||
|             QKeychain::Error code = gerrorToCode(error); | ||||
|  | ||||
|             arg->self->q->emitFinishedWithError( code, QString::fromUtf8(error->message) ); | ||||
|         } else { | ||||
|             if (password != NULL) { | ||||
|                 QByteArray raw = QByteArray(password); | ||||
|                 switch(arg->self->mode) { | ||||
|                 case QKeychain::JobPrivate::Binary: | ||||
|                     arg->self->data = QByteArray::fromBase64(raw); | ||||
|                     break; | ||||
|                 case QKeychain::JobPrivate::Text: | ||||
|                 default: | ||||
|                     arg->self->data = raw; | ||||
|                 } | ||||
|  | ||||
|                 arg->self->q->emitFinished(); | ||||
|             } else if (arg->self->mode == QKeychain::JobPrivate::Text) { | ||||
|                 arg->self->mode = QKeychain::JobPrivate::Binary; | ||||
|                 secret_password_lookup_fn (qtkeychainSchema(), NULL, | ||||
|                                            on_password_lookup, arg, | ||||
|                                            "user", arg->user.toUtf8().constData(), | ||||
|                                            "server", arg->server.toUtf8().constData(), | ||||
|                                            "type", "base64", | ||||
|                                            NULL); | ||||
|                 return; | ||||
|             } else { | ||||
|                 arg->self->q->emitFinishedWithError( QKeychain::EntryNotFound, QObject::tr("Entry not found") ); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     if (error) { | ||||
|         g_error_free (error); | ||||
|     } | ||||
|  | ||||
|     if (password) { | ||||
|         secret_password_free_fn (password); | ||||
|     } | ||||
|  | ||||
|     if (arg) { | ||||
|         delete arg; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_password_stored (GObject *source, | ||||
|                     GAsyncResult *result, | ||||
|                     gpointer inst) | ||||
| { | ||||
|     GError *error = NULL; | ||||
|     QKeychain::JobPrivate *self = (QKeychain::JobPrivate*)inst; | ||||
|  | ||||
|     Q_UNUSED(source); | ||||
|  | ||||
|     secret_password_store_finish_fn (result, &error); | ||||
|  | ||||
|     if (self) { | ||||
|         if (error != NULL) { | ||||
|             self->q->emitFinishedWithError( gerrorToCode(error), | ||||
|                                             QString::fromUtf8(error->message) ); | ||||
|         } else { | ||||
|             self->q->emitFinished(); | ||||
|         } | ||||
|     } | ||||
|     if (error != NULL) { | ||||
|         g_error_free (error); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_password_cleared (GObject *source, | ||||
|                      GAsyncResult *result, | ||||
|                      gpointer inst) | ||||
| { | ||||
|     GError *error = NULL; | ||||
|     QKeychain::JobPrivate *self = (QKeychain::JobPrivate*)inst; | ||||
|     gboolean removed = secret_password_clear_finish_fn (result, &error); | ||||
|  | ||||
|     Q_UNUSED(source); | ||||
|     if (self) { | ||||
|         if ( error ) { | ||||
|             self->q->emitFinishedWithError( gerrorToCode(error), | ||||
|                                             QString::fromUtf8(error->message) ); | ||||
|         } else { | ||||
|             Q_UNUSED(removed); | ||||
|             self->q->emitFinished(); | ||||
|         } | ||||
|     } | ||||
|     if (error != NULL) { | ||||
|         g_error_free (error); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static QString modeToString(QKeychain::JobPrivate::Mode mode) { | ||||
|     switch(mode) { | ||||
|     case QKeychain::JobPrivate::Binary: | ||||
|         return "base64"; | ||||
|     default: | ||||
|         return "plaintext"; | ||||
|     } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| bool LibSecretKeyring::isAvailable() { | ||||
| #if defined(HAVE_LIBSECRET) | ||||
|     const LibSecretKeyring& keyring = instance(); | ||||
|     if (!keyring.isLoaded()) | ||||
|         return false; | ||||
|     if (secret_password_lookup_fn == NULL) | ||||
|         return false; | ||||
|     if (secret_password_lookup_finish_fn == NULL) | ||||
|         return false; | ||||
|     if (secret_password_store_fn == NULL) | ||||
|         return false; | ||||
|     if (secret_password_store_finish_fn == NULL) | ||||
|         return false; | ||||
|     if (secret_password_clear_fn == NULL) | ||||
|         return false; | ||||
|     if (secret_password_clear_finish_fn == NULL) | ||||
|         return false; | ||||
|     if (secret_password_free_fn == NULL) | ||||
|         return false; | ||||
|     if (secret_error_get_quark_fn == NULL) | ||||
|         return false; | ||||
|     return true; | ||||
| #else | ||||
|     return false; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| bool LibSecretKeyring::findPassword(const QString &user, const QString &server, | ||||
|                                     QKeychain::JobPrivate *self) | ||||
| { | ||||
| #if defined(HAVE_LIBSECRET) | ||||
|     if (!isAvailable()) { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     self->mode = QKeychain::JobPrivate::Text; | ||||
|     self->data = QByteArray(); | ||||
|  | ||||
|     callbackArg *arg = new callbackArg; | ||||
|     arg->self = self; | ||||
|     arg->user = user; | ||||
|     arg->server = server; | ||||
|  | ||||
|     qDebug() << Q_FUNC_INFO; | ||||
|     secret_password_lookup_fn (qtkeychainSchema(), NULL, on_password_lookup, arg, | ||||
|                                "user", user.toUtf8().constData(), | ||||
|                                "server", server.toUtf8().constData(), | ||||
|                                "type", "plaintext", | ||||
|                                NULL); | ||||
|     return true; | ||||
| #else | ||||
|     Q_UNUSED(user) | ||||
|     Q_UNUSED(server) | ||||
|     Q_UNUSED(self) | ||||
|     return false; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| bool LibSecretKeyring::writePassword(const QString &display_name, | ||||
|                                      const QString &user, | ||||
|                                      const QString &server, | ||||
|                                      const QKeychain::JobPrivate::Mode mode, | ||||
|                                      const QByteArray &password, | ||||
|                                      QKeychain::JobPrivate *self) | ||||
| { | ||||
| #if defined(HAVE_LIBSECRET) | ||||
|     if (!isAvailable()) { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     QString type = modeToString(mode); | ||||
|     QByteArray pwd; | ||||
|     switch(mode) { | ||||
|     case QKeychain::JobPrivate::Binary: | ||||
|         pwd = password.toBase64(); | ||||
|         break; | ||||
|     default: | ||||
|         pwd = password; | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     qDebug() << Q_FUNC_INFO; | ||||
|     secret_password_store_fn (qtkeychainSchema(), SECRET_COLLECTION_DEFAULT, | ||||
|                               display_name.toUtf8().constData(), | ||||
|                               pwd.constData(), NULL, on_password_stored, self, | ||||
|                               "user", user.toUtf8().constData(), | ||||
|                               "server", server.toUtf8().constData(), | ||||
|                               "type", type.toUtf8().constData(), | ||||
|                               NULL); | ||||
|     return true; | ||||
| #else | ||||
|     Q_UNUSED(display_name) | ||||
|     Q_UNUSED(user) | ||||
|     Q_UNUSED(server) | ||||
|     Q_UNUSED(mode) | ||||
|     Q_UNUSED(password) | ||||
|     Q_UNUSED(self) | ||||
|     return false; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| bool LibSecretKeyring::deletePassword(const QString &key, const QString &service, | ||||
|                                       QKeychain::JobPrivate* self) | ||||
| { | ||||
| #if defined(HAVE_LIBSECRET) | ||||
|     if (!isAvailable()) { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     qDebug() << Q_FUNC_INFO; | ||||
|     secret_password_clear_fn (qtkeychainSchema(), NULL, on_password_cleared, self, | ||||
|                               "user", key.toUtf8().constData(), | ||||
|                               "server", service.toUtf8().constData(), | ||||
|                               NULL); | ||||
|     return true; | ||||
| #else | ||||
|     Q_UNUSED(key) | ||||
|     Q_UNUSED(service) | ||||
|     Q_UNUSED(self) | ||||
|     return false; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| LibSecretKeyring::LibSecretKeyring() | ||||
|     : QLibrary(QLatin1String("secret-1"), 0) | ||||
| { | ||||
| #ifdef HAVE_LIBSECRET | ||||
|     if (load()) { | ||||
|         secret_password_lookup_fn = | ||||
|                 (secret_password_lookup_t)resolve("secret_password_lookup"); | ||||
|         secret_password_lookup_finish_fn = | ||||
|                 (secret_password_lookup_finish_t)resolve("secret_password_lookup_finish"); | ||||
|         secret_password_store_fn = | ||||
|                 (secret_password_store_t)resolve("secret_password_store"); | ||||
|         secret_password_store_finish_fn = | ||||
|                 (secret_password_store_finish_t)resolve("secret_password_store_finish"); | ||||
|         secret_password_clear_fn = | ||||
|                 (secret_password_clear_t)resolve("secret_password_clear"); | ||||
|         secret_password_clear_finish_fn = | ||||
|                 (secret_password_clear_finish_t)resolve("secret_password_clear_finish"); | ||||
|         secret_password_free_fn = | ||||
|                 (secret_password_free_t)resolve("secret_password_free"); | ||||
|         secret_error_get_quark_fn = | ||||
|                 (secret_error_get_quark_t)resolve("secret_error_get_quark"); | ||||
|     } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| LibSecretKeyring &LibSecretKeyring::instance() { | ||||
|     static LibSecretKeyring instance; | ||||
|  | ||||
|     return instance; | ||||
| } | ||||
							
								
								
									
										33
									
								
								ext/qtkeychain/libsecret_p.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								ext/qtkeychain/libsecret_p.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| #ifndef QTKEYCHAIN_LIBSECRET_P_H | ||||
| #define QTKEYCHAIN_LIBSECRET_P_H | ||||
|  | ||||
| #include <QLibrary> | ||||
|  | ||||
| #include "keychain_p.h" | ||||
|  | ||||
| class LibSecretKeyring : public QLibrary { | ||||
| public: | ||||
|     static bool isAvailable(); | ||||
|  | ||||
|     static bool findPassword(const QString& user, | ||||
| 			     const QString& server, | ||||
| 			     QKeychain::JobPrivate* self); | ||||
|  | ||||
|     static bool writePassword(const QString& display_name, | ||||
| 			      const QString& user, | ||||
| 			      const QString& server, | ||||
| 			      const QKeychain::JobPrivate::Mode type, | ||||
| 			      const QByteArray& password, | ||||
| 			      QKeychain::JobPrivate* self); | ||||
|  | ||||
|     static bool deletePassword(const QString &key, const QString &service, | ||||
| 			       QKeychain::JobPrivate* self); | ||||
|  | ||||
| private: | ||||
|     LibSecretKeyring(); | ||||
|  | ||||
|     static LibSecretKeyring &instance(); | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										110
									
								
								ext/qtkeychain/plaintextstore.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								ext/qtkeychain/plaintextstore.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| /****************************************************************************** | ||||
|  *   Copyright (C) 2011-2015 Frank Osterfeld <frank.osterfeld@gmail.com>      * | ||||
|  *   Copyright (C) 2016 Mathias Hasselmann <mathias.hasselmann@kdab.com>      * | ||||
|  *                                                                            * | ||||
|  * This program is distributed in the hope that it will be useful, but        * | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||||
|  * or FITNESS FOR A PARTICULAR PURPOSE. For licensing and distribution        * | ||||
|  * details, check the accompanying file 'COPYING'.                            * | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| #include "plaintextstore_p.h" | ||||
|  | ||||
| using namespace QKeychain; | ||||
|  | ||||
| namespace { | ||||
| #ifdef Q_OS_WIN | ||||
| inline QString dataKey(const QString &key) { return key; } | ||||
| #else // Q_OS_WIN | ||||
| inline QString dataKey(const QString &key) { return key + QLatin1String("/data"); } | ||||
| inline QString typeKey(const QString &key) { return key + QLatin1String("/type"); } | ||||
| #endif // Q_OS_WIN | ||||
| } | ||||
|  | ||||
|  | ||||
| PlainTextStore::PlainTextStore(const QString &service, QSettings *settings) | ||||
|     : m_localSettings(settings ? 0 : new QSettings(service)) | ||||
|     , m_actualSettings(settings ? settings : m_localSettings.data()) | ||||
|     , m_error(NoError) | ||||
| { | ||||
| } | ||||
|  | ||||
| bool PlainTextStore::contains(const QString &key) const | ||||
| { | ||||
|     return m_actualSettings->contains(dataKey(key)); | ||||
| } | ||||
|  | ||||
| QByteArray PlainTextStore::readData(const QString &key) | ||||
| { | ||||
|     return read(dataKey(key)).toByteArray(); | ||||
| } | ||||
|  | ||||
| #ifndef Q_OS_WIN | ||||
|  | ||||
| JobPrivate::Mode PlainTextStore::readMode(const QString &key) | ||||
| { | ||||
|     return JobPrivate::stringToMode(read(typeKey(key)).toString()); | ||||
| } | ||||
|  | ||||
| #endif // Q_OS_WIN | ||||
|  | ||||
| void PlainTextStore::write(const QString &key, const QByteArray &data, JobPrivate::Mode mode) | ||||
| { | ||||
|     if (m_actualSettings->status() != QSettings::NoError) | ||||
|         return; | ||||
|  | ||||
| #ifndef Q_OS_WIN | ||||
|     m_actualSettings->setValue(typeKey(key), JobPrivate::modeToString(mode)); | ||||
| #else // Q_OS_WIN | ||||
|     Q_UNUSED(mode); | ||||
| #endif // Q_OS_WIN | ||||
|     m_actualSettings->setValue(dataKey(key), data); | ||||
|     m_actualSettings->sync(); | ||||
|  | ||||
|     if (m_actualSettings->status() == QSettings::AccessError) { | ||||
|         setError(AccessDenied, tr("Could not store data in settings: access error")); | ||||
|     } else if (m_actualSettings->status() != QSettings::NoError) { | ||||
|         setError(OtherError, tr("Could not store data in settings: format error")); | ||||
|     } else { | ||||
|         setError(NoError, QString()); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void PlainTextStore::remove(const QString &key) | ||||
| { | ||||
|     if (m_actualSettings->status() != QSettings::NoError) | ||||
|         return; | ||||
|  | ||||
| #ifndef Q_OS_WIN | ||||
|     m_actualSettings->remove(typeKey(key)); | ||||
| #endif // Q_OS_WIN | ||||
|     m_actualSettings->remove(dataKey(key)); | ||||
|     m_actualSettings->sync(); | ||||
|  | ||||
|     if (m_actualSettings->status() == QSettings::AccessError) { | ||||
|         setError(AccessDenied, tr("Could not delete data from settings: access error")); | ||||
|     } else if (m_actualSettings->status() != QSettings::NoError) { | ||||
|         setError(OtherError, tr("Could not delete data from settings: format error")); | ||||
|     } else { | ||||
|         setError(NoError, QString()); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void PlainTextStore::setError(Error error, const QString &errorString) | ||||
| { | ||||
|     m_error = error; | ||||
|     m_errorString = errorString; | ||||
| } | ||||
|  | ||||
| QVariant PlainTextStore::read(const QString &key) | ||||
| { | ||||
|     const QVariant value = m_actualSettings->value(key); | ||||
|  | ||||
|     if (value.isNull()) { | ||||
|         setError(EntryNotFound, tr("Entry not found")); | ||||
|     } else { | ||||
|         setError(NoError, QString()); | ||||
|     } | ||||
|  | ||||
|     return value; | ||||
| } | ||||
							
								
								
									
										47
									
								
								ext/qtkeychain/plaintextstore_p.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								ext/qtkeychain/plaintextstore_p.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| /****************************************************************************** | ||||
|  *   Copyright (C) 2011-2015 Frank Osterfeld <frank.osterfeld@gmail.com>      * | ||||
|  *   Copyright (C) 2016 Mathias Hasselmann <mathias.hasselmann@kdab.com>      * | ||||
|  *                                                                            * | ||||
|  * This program is distributed in the hope that it will be useful, but        * | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||||
|  * or FITNESS FOR A PARTICULAR PURPOSE. For licensing and distribution        * | ||||
|  * details, check the accompanying file 'COPYING'.                            * | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| #ifndef QTKEYCHAIN_PLAINTEXTSTORE_P_H | ||||
| #define QTKEYCHAIN_PLAINTEXTSTORE_P_H | ||||
|  | ||||
| #include "keychain_p.h" | ||||
|  | ||||
| namespace QKeychain { | ||||
|  | ||||
| class PlainTextStore { | ||||
|     Q_DECLARE_TR_FUNCTIONS(QKeychain::PlainTextStore) | ||||
|  | ||||
| public: | ||||
|     explicit PlainTextStore(const QString &service, QSettings *settings); | ||||
|  | ||||
|     Error error() const { return m_error; } | ||||
|     QString errorString() const { return m_errorString; } | ||||
|  | ||||
|     bool contains(const QString &key) const; | ||||
|  | ||||
|     QByteArray readData(const QString &key); | ||||
|     JobPrivate::Mode readMode(const QString &key); | ||||
|  | ||||
|     void write(const QString &key, const QByteArray &data, JobPrivate::Mode mode); | ||||
|     void remove(const QString &key); | ||||
|  | ||||
| private: | ||||
|     void setError(Error error, const QString &errorString); | ||||
|     QVariant read(const QString &key); | ||||
|  | ||||
|     const QScopedPointer<QSettings> m_localSettings; | ||||
|     QSettings *const m_actualSettings; | ||||
|     QString m_errorString; | ||||
|     Error m_error; | ||||
| }; | ||||
|  | ||||
| } | ||||
|  | ||||
| #endif // QTKEYCHAIN_PLAINTEXTSTORE_P_H | ||||
| @@ -1,17 +0,0 @@ | ||||
| #ifndef QKEYCHAIN_EXPORT_H | ||||
| #define QKEYCHAIN_EXPORT_H | ||||
|  | ||||
| #include <qglobal.h> | ||||
|  | ||||
| # ifdef QKEYCHAIN_STATICLIB | ||||
| #  undef QKEYCHAIN_SHAREDLIB | ||||
| #  define QKEYCHAIN_EXPORT | ||||
| # else | ||||
| #  ifdef QKEYCHAIN_BUILD_QKEYCHAIN_LIB | ||||
| #   define QKEYCHAIN_EXPORT Q_DECL_EXPORT | ||||
| #  else | ||||
| #   define QKEYCHAIN_EXPORT Q_DECL_IMPORT | ||||
| #  endif | ||||
| # endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										100
									
								
								ext/qtkeychain/qt5keychain.pri
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								ext/qtkeychain/qt5keychain.pri
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| # Minimal qmake support. | ||||
| # This file is provided as is without any warranty. | ||||
| # It can break at anytime or be removed without notice. | ||||
|  | ||||
| lessThan(QT_MAJOR_VERSION, 5) { | ||||
|     error("qtkeychain requires Qt 5 or later") | ||||
| } | ||||
|  | ||||
| QTKEYCHAIN_PWD = $$PWD | ||||
|  | ||||
| CONFIG += depend_includepath | ||||
| DEFINES += QTKEYCHAIN_NO_EXPORT | ||||
|  | ||||
| INCLUDEPATH += \ | ||||
|     $$PWD/.. \ | ||||
|     $$QTKEYCHAIN_PWD | ||||
|  | ||||
| HEADERS += \ | ||||
|     $$QTKEYCHAIN_PWD/keychain_p.h \ | ||||
|     $$QTKEYCHAIN_PWD/keychain.h | ||||
|  | ||||
| SOURCES += \ | ||||
|     $$QTKEYCHAIN_PWD/keychain.cpp | ||||
|  | ||||
| unix:!android:!macx:!ios { | ||||
|     # Remove the following LIBSECRET_SUPPORT line | ||||
|     # to build without libsecret support. | ||||
|     DEFINES += LIBSECRET_SUPPORT | ||||
|     contains(DEFINES, LIBSECRET_SUPPORT) { | ||||
|         packagesExist(libsecret-1) { | ||||
|             !build_pass:message("Libsecret support: on") | ||||
|             CONFIG += link_pkgconfig | ||||
|             PKGCONFIG += libsecret-1 | ||||
|             DEFINES += HAVE_LIBSECRET | ||||
|         } else { | ||||
|             !build_pass:warning("Libsecret not found.") | ||||
|             !build_pass:message("Libsecret support: off") | ||||
|         } | ||||
|     } else { | ||||
|         !build_pass:message("Libsecret support: off") | ||||
|     } | ||||
|  | ||||
|     # Generate D-Bus interface: | ||||
|     DEFINES += KEYCHAIN_DBUS | ||||
|     QT += dbus | ||||
|     kwallet_interface.files = $$PWD/org.kde.KWallet.xml | ||||
|     DBUS_INTERFACES += kwallet_interface | ||||
|  | ||||
|     HEADERS += \ | ||||
|         $$QTKEYCHAIN_PWD/gnomekeyring_p.h \ | ||||
|         $$QTKEYCHAIN_PWD/plaintextstore_p.h \ | ||||
|         $$QTKEYCHAIN_PWD/libsecret_p.h | ||||
|     SOURCES += \ | ||||
|         $$QTKEYCHAIN_PWD/keychain_unix.cpp \ | ||||
|         $$QTKEYCHAIN_PWD/plaintextstore.cpp \ | ||||
|         $$QTKEYCHAIN_PWD/gnomekeyring.cpp \ | ||||
|         $$QTKEYCHAIN_PWD/libsecret.cpp | ||||
| } | ||||
|  | ||||
| android { | ||||
|     QT += androidextras | ||||
|  | ||||
|     HEADERS += \ | ||||
|         $$QTKEYCHAIN_PWD/androidkeystore_p.h \ | ||||
|         $$QTKEYCHAIN_PWD/plaintextstore_p.h | ||||
|     SOURCES += \ | ||||
|         $$QTKEYCHAIN_PWD/androidkeystore.cpp \ | ||||
|         $$QTKEYCHAIN_PWD/keychain_android.cpp \ | ||||
|         $$QTKEYCHAIN_PWD/plaintextstore.cpp | ||||
| } | ||||
|  | ||||
| win32 { | ||||
|     # Remove the following USE_CREDENTIAL_STORE line | ||||
|     # to use the CryptProtectData Windows API function | ||||
|     # instead of the Windows Credential Store. | ||||
|     DEFINES += USE_CREDENTIAL_STORE | ||||
|     contains(DEFINES, USE_CREDENTIAL_STORE) { | ||||
|         !build_pass:message("Windows Credential Store support: on") | ||||
|         LIBS += -ladvapi32 | ||||
|     } else { | ||||
|         !build_pass:message("Windows Credential Store support: off") | ||||
|         LIBS += -lcrypt32 | ||||
|         HEADERS += $$QTKEYCHAIN_PWD/plaintextstore_p.h | ||||
|         SOURCES += $$QTKEYCHAIN_PWD/plaintextstore.cpp | ||||
|     } | ||||
|     HEADERS += $$QTKEYCHAIN_PWD/libsecret_p.h | ||||
|     SOURCES += \ | ||||
|         $$QTKEYCHAIN_PWD/keychain_win.cpp \ | ||||
|         $$QTKEYCHAIN_PWD/libsecret.cpp | ||||
| } | ||||
|  | ||||
| macx:!ios { | ||||
|     LIBS += -framework Security -framework Foundation | ||||
|     SOURCES += $$QTKEYCHAIN_PWD/keychain_apple.mm | ||||
| } | ||||
|  | ||||
| ios { | ||||
|     LIBS += -framework Security -framework Foundation | ||||
|     OBJECTIVE_SOURCES += $$QTKEYCHAIN_PWD/keychain_ios.mm | ||||
| } | ||||
| @@ -52,6 +52,29 @@ int main( int argc, char** argv ) { | ||||
|             return 1; | ||||
|         } | ||||
|         std::cout << "Password stored successfully" << std::endl; | ||||
|     } else if ( *it == QLatin1String("bstore") ) { | ||||
|         if ( ++it == args.constEnd() ) | ||||
|             return printUsage(); | ||||
|         const QString acc = *it; | ||||
|         if ( ++it == args.constEnd() ) | ||||
|             return printUsage(); | ||||
|         const QString pass = *it; | ||||
|         if ( ++it != args.constEnd() ) | ||||
|             return printUsage(); | ||||
|         WritePasswordJob job( QLatin1String("qtkeychain-testclient") ); | ||||
|         job.setAutoDelete( false ); | ||||
|         job.setKey( acc ); | ||||
|         job.setBinaryData( pass.toUtf8() ); | ||||
|         QEventLoop loop; | ||||
|         job.connect( &job, SIGNAL(finished(QKeychain::Job*)), &loop, SLOT(quit()) ); | ||||
|         job.start(); | ||||
|         loop.exec(); | ||||
|      if ( job.error() ) { | ||||
|             std::cerr << "Storing binary password failed: " | ||||
|                       << qPrintable(job.errorString()) << std::endl; | ||||
|             return 1; | ||||
|         } | ||||
|         std::cout << "Password stored successfully" << std::endl; | ||||
|     } else if ( *it == QLatin1String("restore") ) { | ||||
|         if ( ++it == args.constEnd() ) | ||||
|             return printUsage(); | ||||
|   | ||||
| @@ -1,176 +1,325 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!DOCTYPE TS> | ||||
| <TS version="2.1" language="de_DE"> | ||||
| <context> | ||||
|     <name>QKeychain::DeletePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="104"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="108"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished">Kann Daten nicht entschlüsseln</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="548"/> | ||||
|         <location filename="../keychain_unix.cpp" line="556"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished">Unbekannter Fehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="574"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished">Konnte Brieftasche nicht öffnen: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="177"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished">Passwort nicht gefunden</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="165"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="171"/> | ||||
|         <source>Could not remove private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::JobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="265"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished">Unbekannter Fehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="509"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished">Zugriff auf Schlüsselbund verweigert</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::PlainTextStore</name> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="65"/> | ||||
|         <source>Could not store data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="67"/> | ||||
|         <source>Could not store data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="85"/> | ||||
|         <source>Could not delete data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="87"/> | ||||
|         <source>Could not delete data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="104"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished">Eintrag nicht gefunden</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="140"/> | ||||
|         <location filename="../keychain_unix.cpp" line="187"/> | ||||
|         <location filename="../keychain_unix.cpp" line="197"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Unbekannter Fehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="129"/> | ||||
|         <location filename="../keychain_unix.cpp" line="178"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="222"/> | ||||
|         <location filename="../keychain_unix.cpp" line="286"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation>Kein Schlüsselbund-Dienst verfügbar</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="224"/> | ||||
|         <location filename="../keychain_unix.cpp" line="288"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Konnte Brieftasche nicht öffnen: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="270"/> | ||||
|         <location filename="../keychain_unix.cpp" line="333"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Zugriff auf Schlüsselbund verweigert</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="291"/> | ||||
|         <location filename="../keychain_unix.cpp" line="354"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation>Datentyp kann nicht ermittelt werden: %1: %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="309"/> | ||||
|         <location filename="../keychain_unix.cpp" line="372"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="312"/> | ||||
|         <location filename="../keychain_unix.cpp" line="375"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation>Passwort konnte nicht ausgelesen werden: %1; %2</translation> | ||||
|         <translation type="vanished">Passwort konnte nicht ausgelesen werden: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_mac.cpp" line="76"/> | ||||
|         <location filename="../keychain_haiku.cpp" line="96"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation>Passwort nicht gefunden</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../keychain_win.cpp" line="27"/> | ||||
|         <location filename="../keychain_unix.cpp" line="363"/> | ||||
|         <location filename="../keychain_android.cpp" line="50"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation>Eintrag nicht gefunden</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="44"/> | ||||
|         <location filename="../keychain_win.cpp" line="32"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="36"/> | ||||
|         <location filename="../keychain_win.cpp" line="139"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation>Kann Daten nicht entschlüsseln</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="58"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="66"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="73"/> | ||||
|         <source>Could not create decryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../keychain_unix.cpp" line="372"/> | ||||
|         <location filename="../keychain_unix.cpp" line="425"/> | ||||
|         <location filename="../keychain_unix.cpp" line="452"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Unbekannter Fehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="352"/> | ||||
|         <location filename="../keychain_unix.cpp" line="415"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../keychain_unix.cpp" line="505"/> | ||||
|         <location filename="../keychain_unix.cpp" line="468"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Konnte Brieftasche nicht öffnen: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Zugriff auf Schlüsselbund verweigert</translation> | ||||
|         <translation type="vanished">Zugriff auf Schlüsselbund verweigert</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation>Kann verschlüsselte Daten nicht aus den Einstellungen entfernen: Zugriffsfehler</translation> | ||||
|         <translation type="vanished">Kann verschlüsselte Daten nicht aus den Einstellungen entfernen: Zugriffsfehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation>Kann verschlüsselte Daten nicht aus den Einstellungen entfernen: Formatfehler</translation> | ||||
|         <translation type="vanished">Kann verschlüsselte Daten nicht aus den Einstellungen entfernen: Formatfehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="85"/> | ||||
|         <location filename="../keychain_win.cpp" line="78"/> | ||||
|         <source>Credential size exceeds maximum size of %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="87"/> | ||||
|         <source>Credential key exceeds maximum size of %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="92"/> | ||||
|         <source>Writing credentials failed: Win32 error code %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="162"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation>Verschlüsselung fehlgeschlagen</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation>Kann verschlüsselte Daten nicht in den Einstellungen speichern: Zugriffsfehler</translation> | ||||
|         <translation type="vanished">Kann verschlüsselte Daten nicht in den Einstellungen speichern: Zugriffsfehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation>Kann verschlüsselte Daten nicht in den Einstellungen speichern: Formatfehler</translation> | ||||
|         <translation type="vanished">Kann verschlüsselte Daten nicht in den Einstellungen speichern: Formatfehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="144"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished">Passwort nicht gefunden</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="93"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="116"/> | ||||
|         <source>Could not create private key generator</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="123"/> | ||||
|         <source>Could not generate new private key</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="131"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="139"/> | ||||
|         <source>Could not create encryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="147"/> | ||||
|         <source>Could not encrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="167"/> | ||||
|         <location filename="../keychain_unix.cpp" line="225"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Zugriff auf Schlüsselbund verweigert</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="169"/> | ||||
|         <location filename="../keychain_unix.cpp" line="227"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation>Kein Schlüsselbund-Dienst </translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="171"/> | ||||
|         <location filename="../keychain_unix.cpp" line="229"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation>Bereits entsperrt</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="173"/> | ||||
|         <location filename="../keychain_unix.cpp" line="231"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation>Kein solcher Schlüsselbund</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="175"/> | ||||
|         <location filename="../keychain_unix.cpp" line="233"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation>Ungültige Argumente</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="177"/> | ||||
|         <location filename="../keychain_unix.cpp" line="235"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation>Ein-/Ausgabe-Fehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="179"/> | ||||
|         <location filename="../keychain_unix.cpp" line="237"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation>Abgebrochen</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="181"/> | ||||
|         <location filename="../keychain_unix.cpp" line="239"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation>Schlüsselbund existiert bereits</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="183"/> | ||||
|         <location filename="../keychain_unix.cpp" line="241"/> | ||||
|         <source>No match</source> | ||||
|         <translation>Kein Treffer</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="188"/> | ||||
|         <location filename="../keychain_unix.cpp" line="246"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Unbekannter Fehler</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <location filename="../libsecret.cpp" line="122"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished">Eintrag nicht gefunden</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="72"/> | ||||
|         <source>error 0x%1: %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
|   | ||||
							
								
								
									
										334
									
								
								ext/qtkeychain/translations/qtkeychain_fr.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										334
									
								
								ext/qtkeychain/translations/qtkeychain_fr.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,334 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!DOCTYPE TS> | ||||
| <TS version="2.1" language="fr_FR"> | ||||
| <context> | ||||
|     <name>QKeychain::DeletePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="104"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation>Mot de passe introuvable</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="108"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation>Impossible de déchiffrer les données</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="548"/> | ||||
|         <location filename="../keychain_unix.cpp" line="556"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Erreur inconnue</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="574"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Impossible d'ouvrir le portefeuille : %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="177"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation>Mot de passe introuvable</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="165"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="171"/> | ||||
|         <source>Could not remove private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::JobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="265"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Erreur inconnue</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="509"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Accès au trousseau refusé</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::PlainTextStore</name> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="65"/> | ||||
|         <source>Could not store data in settings: access error</source> | ||||
|         <translation>Impossible de stocker les données dans les paramètres : Erreur d'accès</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="67"/> | ||||
|         <source>Could not store data in settings: format error</source> | ||||
|         <translation>Impossible de stocker les données dans les paramètres : Erreur de format</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="85"/> | ||||
|         <source>Could not delete data from settings: access error</source> | ||||
|         <translation>Impossible de supprimer les données depuis les paramètres : Erreur d'accès</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="87"/> | ||||
|         <source>Could not delete data from settings: format error</source> | ||||
|         <translation>Impossible de supprimer les données depuis les paramètres : Erreur de format</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="104"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation>Entrée introuvable</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="187"/> | ||||
|         <location filename="../keychain_unix.cpp" line="197"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Erreur inconnue</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="178"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation>D-Bus n'est pas en cours d'exécution</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="286"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation>Aucun service de trousseau disponible</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="288"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Impossible d'ouvrir le trousseau : %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="333"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Accès au trousseau refusé</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="354"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation>Impossible de déterminer le type de données : %1: %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="372"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation>Type d'entrée non supporté 'Map'</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="375"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation>Type de trousseau inconnu '%1'</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="vanished">Impossible de lire le mot de passe : %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="96"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation>Mot de passe introuvable</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="363"/> | ||||
|         <location filename="../keychain_android.cpp" line="50"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation>Entrée introuvable</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="32"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation>Entrée de mot de passe introuvable</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="36"/> | ||||
|         <location filename="../keychain_win.cpp" line="139"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation>Impossible de déchiffrer les données</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="58"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="66"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="73"/> | ||||
|         <source>Could not create decryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="425"/> | ||||
|         <location filename="../keychain_unix.cpp" line="452"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Erreur inconnue</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="415"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation>D-Bus n'est pas en cours d'exécution</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="468"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Impossible d'ouvrir le trousseau : %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="vanished">Accès au trousseau refusé</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="vanished">Impossible de supprimer des données chiffrées dans les paramètres : Erreur d'accès</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="vanished">Impossible de supprimer des données chiffrées dans les paramètres : Erreur de format</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="78"/> | ||||
|         <source>Credential size exceeds maximum size of %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="87"/> | ||||
|         <source>Credential key exceeds maximum size of %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="92"/> | ||||
|         <source>Writing credentials failed: Win32 error code %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="162"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation>Le chiffrement a échoué</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="vanished">Impossible de stocker des données chiffrées dans les paramètres : Erreur d'accès</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="vanished">Impossible de stocker des données chiffrées dans les paramètres : Erreur de format</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="144"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation>Mot de passe introuvable</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="93"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="116"/> | ||||
|         <source>Could not create private key generator</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="123"/> | ||||
|         <source>Could not generate new private key</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="131"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="139"/> | ||||
|         <source>Could not create encryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="147"/> | ||||
|         <source>Could not encrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="225"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Accès au trousseau refusé</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="227"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation>Aucun démon de trousseau</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="229"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation>Déjà déverrouillé</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="231"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation>Aucun trousseau</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="233"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation>Mauvais arguments</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="235"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation>Erreur d'E/S</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="237"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation>Annulé</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="239"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation>Trousseau déjà existant</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="241"/> | ||||
|         <source>No match</source> | ||||
|         <translation>Aucune correspondance</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="246"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Erreur inconnue</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>OS X Keychain error (OSStatus %1)</source> | ||||
|         <translation type="vanished">OS X Keychain error (OSStatus %1)</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="vanished">%1 (OSStatus %2)</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../libsecret.cpp" line="122"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation>Entrée introuvable</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="72"/> | ||||
|         <source>error 0x%1: %2</source> | ||||
|         <translation>Erreur 0x%1 : %2</translation> | ||||
|     </message> | ||||
| </context> | ||||
| </TS> | ||||
| @@ -1,178 +1,331 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!DOCTYPE TS> | ||||
| <TS version="2.1" language="ro_RO"> | ||||
| <context> | ||||
|     <name>QKeychain::DeletePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="104"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="108"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished">Nu se poate decripta data</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="548"/> | ||||
|         <location filename="../keychain_unix.cpp" line="556"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished">Eroare necunoscută</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="574"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished">Nu se poate deschide portofelul: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="177"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished">Parola nu a fost găsită</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="165"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="171"/> | ||||
|         <source>Could not remove private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::JobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="265"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished">Eroare necunoscută</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="509"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished">Acces interzis la serviciul de chei</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::PlainTextStore</name> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="65"/> | ||||
|         <source>Could not store data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="67"/> | ||||
|         <source>Could not store data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="85"/> | ||||
|         <source>Could not delete data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="87"/> | ||||
|         <source>Could not delete data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="104"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished">Înregistrarea nu a fost găsită</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="140"/> | ||||
|         <location filename="../keychain_unix.cpp" line="187"/> | ||||
|         <location filename="../keychain_unix.cpp" line="197"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Eroare necunoscută</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="129"/> | ||||
|         <location filename="../keychain_unix.cpp" line="178"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation>D-Bus nu rulează</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="222"/> | ||||
|         <location filename="../keychain_unix.cpp" line="286"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translatorcomment>Nu există niciun serviciu de chei disponibil</translatorcomment> | ||||
|         <translation>Kein Schlüsselbund-Dienst verfügbar</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="224"/> | ||||
|         <location filename="../keychain_unix.cpp" line="288"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Nu se poate deschide portofelul: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="270"/> | ||||
|         <location filename="../keychain_unix.cpp" line="333"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Acces interzis la serviciul de chei</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="291"/> | ||||
|         <location filename="../keychain_unix.cpp" line="354"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation>Nu se poate stabili tipul de date: %1: %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="309"/> | ||||
|         <location filename="../keychain_unix.cpp" line="372"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation>Tip de înregistrare nesuportat 'Map'</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="312"/> | ||||
|         <location filename="../keychain_unix.cpp" line="375"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation>Tip de înregistrare kwallet necunoscut '%1'</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation>Nu se poate citi parola: %1; %2</translation> | ||||
|         <translation type="vanished">Nu se poate citi parola: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_mac.cpp" line="76"/> | ||||
|         <location filename="../keychain_haiku.cpp" line="96"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation>Parola nu a fost găsită</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../keychain_win.cpp" line="27"/> | ||||
|         <location filename="../keychain_unix.cpp" line="363"/> | ||||
|         <location filename="../keychain_android.cpp" line="50"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation>Înregistrarea nu a fost găsită</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="44"/> | ||||
|         <location filename="../keychain_win.cpp" line="32"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="36"/> | ||||
|         <location filename="../keychain_win.cpp" line="139"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation>Nu se poate decripta data</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="58"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="66"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="73"/> | ||||
|         <source>Could not create decryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../keychain_unix.cpp" line="372"/> | ||||
|         <location filename="../keychain_unix.cpp" line="425"/> | ||||
|         <location filename="../keychain_unix.cpp" line="452"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Eroare necunoscută</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="352"/> | ||||
|         <location filename="../keychain_unix.cpp" line="415"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation>D-Bus nu rulează</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../keychain_unix.cpp" line="505"/> | ||||
|         <location filename="../keychain_unix.cpp" line="468"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Nu se poate deschide portofelul: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Acces interzis la serviciul de chei</translation> | ||||
|         <translation type="vanished">Acces interzis la serviciul de chei</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation>Nu se pot șterge datele criptate din setări: eroare de acces</translation> | ||||
|         <translation type="vanished">Nu se pot șterge datele criptate din setări: eroare de acces</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation>Nu se pot șterge datele criptate din setări: eroare de format</translation> | ||||
|         <translation type="vanished">Nu se pot șterge datele criptate din setări: eroare de format</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="85"/> | ||||
|         <location filename="../keychain_win.cpp" line="78"/> | ||||
|         <source>Credential size exceeds maximum size of %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="87"/> | ||||
|         <source>Credential key exceeds maximum size of %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="92"/> | ||||
|         <source>Writing credentials failed: Win32 error code %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="162"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation>Criptarea a eșuat</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation>Nu se pot stoca datele criptate în setări: eroare de acces</translation> | ||||
|         <translation type="vanished">Nu se pot stoca datele criptate în setări: eroare de acces</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation>Nu se pot stoca datele criptate în setări: eroare de format</translation> | ||||
|         <translation type="vanished">Nu se pot stoca datele criptate în setări: eroare de format</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="144"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished">Parola nu a fost găsită</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="93"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="116"/> | ||||
|         <source>Could not create private key generator</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="123"/> | ||||
|         <source>Could not generate new private key</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="131"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="139"/> | ||||
|         <source>Could not create encryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="147"/> | ||||
|         <source>Could not encrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="167"/> | ||||
|         <location filename="../keychain_unix.cpp" line="225"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Acces interzis la serviciul de chei</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="169"/> | ||||
|         <location filename="../keychain_unix.cpp" line="227"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation>Niciun demon pentru inelul de chei</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="171"/> | ||||
|         <location filename="../keychain_unix.cpp" line="229"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation>Deja deblocat</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="173"/> | ||||
|         <location filename="../keychain_unix.cpp" line="231"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation>Nu există astfel de inel de chei</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="175"/> | ||||
|         <location filename="../keychain_unix.cpp" line="233"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation>Argumente greșite</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="177"/> | ||||
|         <location filename="../keychain_unix.cpp" line="235"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation>Eroare de I/E</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="179"/> | ||||
|         <location filename="../keychain_unix.cpp" line="237"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation>Anulat</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="181"/> | ||||
|         <location filename="../keychain_unix.cpp" line="239"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation>Inelul de chei deja există</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="183"/> | ||||
|         <location filename="../keychain_unix.cpp" line="241"/> | ||||
|         <source>No match</source> | ||||
|         <translation>Nicio potrivire</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="188"/> | ||||
|         <location filename="../keychain_unix.cpp" line="246"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Eroare necunoscută</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation>%1 (OSStatus %2)</translation> | ||||
|         <translation type="vanished">%1 (OSStatus %2)</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../libsecret.cpp" line="122"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished">Înregistrarea nu a fost găsită</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="72"/> | ||||
|         <source>error 0x%1: %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| </TS> | ||||
|   | ||||
							
								
								
									
										310
									
								
								ext/qtkeychain/translations/qtkeychain_ru.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										310
									
								
								ext/qtkeychain/translations/qtkeychain_ru.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,310 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!DOCTYPE TS> | ||||
| <TS version="2.1" language="ru_RU"> | ||||
| <context> | ||||
|     <name>QKeychain::DeletePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="548"/> | ||||
|         <location filename="../keychain_unix.cpp" line="556"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Неизвестная ошибка</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="574"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Не удалось открыть бумажник: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="104"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation>Пароль не найден</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="108"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation>Не удалось расшифровать данные</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="177"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished">Пароль не найден</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="165"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="171"/> | ||||
|         <source>Could not remove private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::JobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="265"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Неизвестная ошибка</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="509"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Доступ к связке ключей запрещён</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::PlainTextStore</name> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="65"/> | ||||
|         <source>Could not store data in settings: access error</source> | ||||
|         <translation>Не удалось сохранить данные в настройках: ошибка доступа</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="67"/> | ||||
|         <source>Could not store data in settings: format error</source> | ||||
|         <translation>Не удалось сохранить данные в настройках: ошибка формата</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="85"/> | ||||
|         <source>Could not delete data from settings: access error</source> | ||||
|         <translation>Не удалось удалить данные из настроек: ошибка доступа</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="87"/> | ||||
|         <source>Could not delete data from settings: format error</source> | ||||
|         <translation>Не удалось удалить данные из настроек: ошибка формата</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="104"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation>Запись не найдена</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="96"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation>Пароль не найден</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="178"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation>D-Bus не запущен</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="187"/> | ||||
|         <location filename="../keychain_unix.cpp" line="197"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Неизвестная ошибка</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="286"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation>Служба связки ключей недоступна</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="288"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Не удалось открыть кошелёк: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="333"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Доступ к связке ключей запрещён</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="354"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation>Не удалось определить тип данных: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="363"/> | ||||
|         <location filename="../keychain_android.cpp" line="50"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation>Запись не найдена</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="372"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation>Неподдерживаемый тип записи 'Map'</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="375"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation>Неизвестный тип записи kwallet '%1'</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="32"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation>Пароль не найден</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="36"/> | ||||
|         <location filename="../keychain_win.cpp" line="139"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation>Не удалось расшифровать данные</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="58"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="66"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="73"/> | ||||
|         <source>Could not create decryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="415"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation>D-Bus не запущен</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="425"/> | ||||
|         <location filename="../keychain_unix.cpp" line="452"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Неизвестная ошибка</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="468"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>Не удалось открыть кошелёк: %1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="78"/> | ||||
|         <source>Credential size exceeds maximum size of %1</source> | ||||
|         <translation>Учётные данные превышают максимальный размер %1</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="87"/> | ||||
|         <source>Credential key exceeds maximum size of %1</source> | ||||
|         <translation>Ключ учётных данных превышает максимальный размер %1</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="92"/> | ||||
|         <source>Writing credentials failed: Win32 error code %1</source> | ||||
|         <translation>Не удалось сохранить учётные данные: код ошибки win32 %1</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="162"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation>Шифрование не удалось</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="144"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished">Пароль не найден</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="93"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="116"/> | ||||
|         <source>Could not create private key generator</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="123"/> | ||||
|         <source>Could not generate new private key</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="131"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="139"/> | ||||
|         <source>Could not create encryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="147"/> | ||||
|         <source>Could not encrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <source>OS X Keychain error (OSStatus %1)</source> | ||||
|         <translation type="vanished">Ошибка связки ключей OS X (OSStatus %1)</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="vanished">%1 (OSStatus %2)</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="225"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>Доступ к связке ключей запрещён</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="227"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation>Нет демона связки ключей</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="229"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation>Уже разблокировано</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="231"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation>Связка ключей не найдена</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="233"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation>Неверные аргументы</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="235"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation>Ошибка ввода/вывода</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="237"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation>Отменено</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="239"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation>Связка ключей уже существует</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="241"/> | ||||
|         <source>No match</source> | ||||
|         <translation>Нет совпадений</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="246"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>Неизвестная ошибка</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../libsecret.cpp" line="122"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation>Запись не найдена</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="72"/> | ||||
|         <source>error 0x%1: %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| </TS> | ||||
							
								
								
									
										330
									
								
								ext/qtkeychain/translations/qtkeychain_zh.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										330
									
								
								ext/qtkeychain/translations/qtkeychain_zh.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,330 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!DOCTYPE TS> | ||||
| <TS version="2.1" language="zh_TW"> | ||||
| <context> | ||||
|     <name>QKeychain::DeletePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="104"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="108"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished">無法解密資料</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="548"/> | ||||
|         <location filename="../keychain_unix.cpp" line="556"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished">未知的錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="574"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished">無法開啟錢包:%1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="177"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished">找不到密碼</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="165"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="171"/> | ||||
|         <source>Could not remove private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::JobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="265"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished">未知的錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="509"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished">鑰匙圈存取被拒絕</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::PlainTextStore</name> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="65"/> | ||||
|         <source>Could not store data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="67"/> | ||||
|         <source>Could not store data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="85"/> | ||||
|         <source>Could not delete data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="87"/> | ||||
|         <source>Could not delete data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../plaintextstore.cpp" line="104"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished">找不到項目</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="187"/> | ||||
|         <location filename="../keychain_unix.cpp" line="197"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>未知的錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="178"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation>D-Bus 不在執行中</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="286"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation>沒有可用的鑰匙圈服務</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="288"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>無法開啟錢包:%1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="333"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>鑰匙圈存取被拒絕</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="354"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation>無法判斷資料型別:%1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="372"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation>不支援的項目類型 'Map'</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="375"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation>未知的 kwallet 項目類型 '%1'</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="vanished">無法讀取密碼:%1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="96"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation>找不到密碼</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="363"/> | ||||
|         <location filename="../keychain_android.cpp" line="50"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation>找不到項目</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="32"/> | ||||
|         <source>Password entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="36"/> | ||||
|         <location filename="../keychain_win.cpp" line="139"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation>無法解密資料</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="58"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="66"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="73"/> | ||||
|         <source>Could not create decryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="425"/> | ||||
|         <location filename="../keychain_unix.cpp" line="452"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>未知的錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="415"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation>D-Bus 不在執行中</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="468"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation>無法開啟錢包:%1; %2</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="vanished">鑰匙圈存取被拒絕</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="vanished">無法從設定刪除加密資料:存取錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="vanished">無法從設定刪除加密資料:格式錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="78"/> | ||||
|         <source>Credential size exceeds maximum size of %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="87"/> | ||||
|         <source>Credential key exceeds maximum size of %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="92"/> | ||||
|         <source>Writing credentials failed: Win32 error code %1</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_win.cpp" line="162"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation>加密失敗</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="vanished">無法將加密資料儲存至設定:存取錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="vanished">無法將加密資料儲存至設定:格式錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="144"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished">找不到密碼</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="93"/> | ||||
|         <source>Could not open keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="116"/> | ||||
|         <source>Could not create private key generator</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="123"/> | ||||
|         <source>Could not generate new private key</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="131"/> | ||||
|         <source>Could not retrieve private key from keystore</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="139"/> | ||||
|         <source>Could not create encryption cipher</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_android.cpp" line="147"/> | ||||
|         <source>Could not encrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="225"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation>鑰匙圈存取被拒絕</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="227"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation>沒有可用的鑰匙圈背景程式</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="229"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation>已解鎖</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="231"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation>鑰匙圈不存在</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="233"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation>引數錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="235"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation>I/O 錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="237"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation>已取消</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="239"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation>鑰匙圈已存在</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="241"/> | ||||
|         <source>No match</source> | ||||
|         <translation>無相符項目</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_unix.cpp" line="246"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation>未知的錯誤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="vanished">%1 (OSStatus %2)</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../libsecret.cpp" line="122"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished">找不到項目</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../keychain_haiku.cpp" line="72"/> | ||||
|         <source>error 0x%1: %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| </TS> | ||||
							
								
								
									
										35
									
								
								fuel.pro
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								fuel.pro
									
									
									
									
									
								
							| @@ -23,9 +23,6 @@ TEMPLATE = app | ||||
| win32 { | ||||
| 	RC_FILE = rsrc/fuel.rc | ||||
| 	LIBS += -luser32 -lshell32 -luuid | ||||
|  | ||||
| 	# Prevent batch file being called multiple times | ||||
| 	!build_pass:system(intl\convert.bat) | ||||
| } | ||||
|  | ||||
| macx { | ||||
| @@ -53,7 +50,6 @@ unix:!macx { | ||||
| 	icon.files += rsrc/icons/fuel.png | ||||
|  | ||||
| 	INSTALLS += target desktop icon | ||||
| 	system(intl/convert.sh) | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -114,36 +110,7 @@ RESOURCES += \ | ||||
| 	rsrc/resources.qrc | ||||
|  | ||||
| # QtKeychain | ||||
| SOURCES += ext/qtkeychain/keychain.cpp | ||||
|  | ||||
| HEADERS += ext/qtkeychain/keychain.h \ | ||||
| 		ext/qtkeychain/keychain_p.h \ | ||||
| 		ext/qtkeychain/qkeychain_export.h | ||||
|  | ||||
| DEFINES += QKEYCHAIN_STATICLIB | ||||
|  | ||||
| unix:!macx { | ||||
| 	QT += dbus | ||||
|  | ||||
| 	SOURCES += ext/qtkeychain/keychain_unix.cpp \ | ||||
| 		ext/qtkeychain/gnomekeyring.cpp | ||||
|  | ||||
| 	HEADERS += ext/qtkeychain/gnomekeyring_p.h | ||||
| 	DBUS_INTERFACES += ext/qtkeychain/org.kde.KWallet.xml | ||||
| } | ||||
|  | ||||
| macx { | ||||
| 	SOURCES += ext/qtkeychain/keychain_mac.cpp | ||||
| 	LIBS += -framework CoreFoundation -framework Security | ||||
| } | ||||
|  | ||||
| win32 { | ||||
| 	SOURCES += ext/qtkeychain/keychain_win.cpp | ||||
| 	LIBS += -lCrypt32 | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| include(ext/qtkeychain.pri) | ||||
|  | ||||
| CODECFORTR = UTF-8 | ||||
|  | ||||
|   | ||||
| @@ -1,20 +0,0 @@ | ||||
| @echo off | ||||
| setlocal EnableDelayedExpansion | ||||
| set SCRIPTDIR=%~dp0% | ||||
| set PRJDIR=%SCRIPTDIR%.. | ||||
| set QTPATH=C:\Qt\5.5\mingw492_32 | ||||
|  | ||||
| if NOT "%QTDIR%"=="" set QTPATH=%QTDIR% | ||||
|  | ||||
| echo Using QT at %QTPATH% | ||||
| echo Converting localizations | ||||
| del /q %PRJDIR%\rsrc\intl\* | ||||
| if not exist %PRJDIR%\rsrc\intl\ mkdir %PRJDIR%\rsrc\intl\ | ||||
|  | ||||
| REM Convert all except the en_US which is the original text in the code | ||||
|  | ||||
| for %%i in (de_DE el_GR es_ES fr_FR ru_RU pt_PT it_IT nl_NL ko_KR) do ( | ||||
| 	%QTPATH%\bin\lrelease %PRJDIR%\intl\%%i.ts -qm %PRJDIR%\rsrc\intl\%%i.qm | ||||
| ) | ||||
|  | ||||
| endlocal | ||||
| @@ -1,36 +0,0 @@ | ||||
| #!/bin/sh | ||||
| SCRIPTDIR="$( cd "$( dirname "$0" )" && pwd )" | ||||
| PRJDIR=$SCRIPTDIR/.. | ||||
| INTLDIR=$SCRIPTDIR | ||||
|  | ||||
| # Detect lrelease tool | ||||
| if which lrelease-qt5 2>/dev/null; then | ||||
| 	LRELEASE="lrelease-qt5" | ||||
| elif which lrelease4 2>/dev/null; then | ||||
| 	LRELEASE="lrelease4" | ||||
| elif which lrelease 2>/dev/null; then | ||||
| 	LRELEASE="lrelease" | ||||
| else | ||||
| 	echo "lrelease not found" | ||||
| 	exit 1 | ||||
| fi | ||||
| 	 | ||||
| echo "Using ${LRELEASE}" | ||||
|  | ||||
| echo "Converting localizations" | ||||
|  | ||||
| rm -rf $PRJDIR/rsrc/intl | ||||
| mkdir $PRJDIR/rsrc/intl | ||||
|  | ||||
| for i in $INTLDIR/*.ts | ||||
| do | ||||
| 	BASE=`basename $i .ts` | ||||
|  | ||||
| 	# Convert all except the en_US which is | ||||
| 	# the original text in the code | ||||
| 	if [ "$BASE" != "en_US" ]; then | ||||
| 		echo "$TARGET" | ||||
| 		$LRELEASE $i -qm $PRJDIR/rsrc/intl/$BASE.qm | ||||
| 	fi | ||||
| done | ||||
|  | ||||
							
								
								
									
										336
									
								
								intl/de_DE.ts
									
									
									
									
									
								
							
							
						
						
									
										336
									
								
								intl/de_DE.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Pfad der lokalen Repositorydatei</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Pfad der lokalen Repositorydatei</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>Hauptwerkzeugleiste</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -470,6 +470,11 @@ Released under the GNU GPL</source> | ||||
|         <source>C&lone...</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="486"/> | ||||
|         <source>Clone a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="495"/> | ||||
|         <source>&Push</source> | ||||
| @@ -490,6 +495,74 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
|         <source>View files as a list</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -617,11 +690,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Abort the current operation</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="486"/> | ||||
|         <source>Clone a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="501"/> | ||||
|         <source>Push changes to the remote repository</source> | ||||
| @@ -642,28 +710,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation>Strg+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,47 +774,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation type="unfinished">Öffne Datei</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
|         <source>View files as a list</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="636"/> | ||||
|         <source>Revert</source> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>Ausgewählten Ordner umbenennen</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1603,178 +1603,8 @@ Die folgenden Dateien werden in das Repository verschoben.</translation> | ||||
|         <translation>Die folgenden Stashes werden entfernt</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
							
								
								
									
										314
									
								
								intl/el_GR.ts
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								intl/el_GR.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Διαδρομή για το αρχείο τοπικού αποθετηρίου</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Διαδρομή για το αρχείο τοπικού αποθετηρίου</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>Κύρια μπάρα εργαλείων</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -490,6 +490,68 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -642,28 +704,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation>Ctrl+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,41 +768,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation>Άνοιγμα Αρχείου</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>Μετονομασία του επιλεγμένου φακέλου</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1602,178 +1602,8 @@ The following files will be moved in the repository.</source> | ||||
|         <translation>Οι παρακάτω στοίβες θα διαγραφούν.</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
							
								
								
									
										314
									
								
								intl/en_US.ts
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								intl/en_US.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Path to the local repository file</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Path to the local repository file</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>Main Toolbar</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -490,6 +490,68 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -642,28 +704,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation>Ctrl+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,41 +768,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation>Open File</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>Rename the selected folder</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1602,178 +1602,8 @@ The following files will be moved in the repository.</translation> | ||||
|         <translation>The following stashes will be deleted.</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
							
								
								
									
										336
									
								
								intl/es_ES.ts
									
									
									
									
									
								
							
							
						
						
									
										336
									
								
								intl/es_ES.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Ruta al archivo del depósito local</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Ruta al archivo del depósito local</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>Barra principal de herramientas</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -470,6 +470,11 @@ Released under the GNU GPL</source> | ||||
|         <source>C&lone...</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="486"/> | ||||
|         <source>Clone a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="495"/> | ||||
|         <source>&Push</source> | ||||
| @@ -490,6 +495,74 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
|         <source>View files as a list</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -617,11 +690,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Abort the current operation</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="486"/> | ||||
|         <source>Clone a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="501"/> | ||||
|         <source>Push changes to the remote repository</source> | ||||
| @@ -642,28 +710,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation>Ctrl+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,47 +774,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation type="unfinished">Abrir Archivo</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
|         <source>View files as a list</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="636"/> | ||||
|         <source>Revert</source> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>Renombrar la carpeta seleccionada</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1602,178 +1602,8 @@ Los siguientes archivos serán movidos al depósito.</translation> | ||||
|         <translation>Serán borrados los siguientes cambios apartados</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
							
								
								
									
										314
									
								
								intl/fr_FR.ts
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								intl/fr_FR.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Chemin vers le fichier du dépôt local</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Chemin vers le fichier du dépôt local</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>Barre d'outils principale</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -490,6 +490,68 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -642,28 +704,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation>Ctrl+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,41 +768,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation>Ouvrir le fichier</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>Renommer le dossier sélectionné</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1602,178 +1602,8 @@ Les fichiers suivants seront déplacés dans le dépôt.</translation> | ||||
|         <translation>Les réserves suivantes seront supprimées.</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
							
								
								
									
										314
									
								
								intl/it_IT.ts
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								intl/it_IT.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Percorso al file dell'archivio locale</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Percorso al file dell'archivio locale</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>Barra degli strumenti principale</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -490,6 +490,68 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -642,28 +704,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation> Ctrl+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,41 +768,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation>Apri file</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>Rinomina la cartella selezionata</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1602,178 +1602,8 @@ Saranno spostati nell'archivio i file seguenti:</translation> | ||||
|         <translation>Le seguenti modiche riposte verranno rimosse</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
							
								
								
									
										314
									
								
								intl/ko_KR.ts
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								intl/ko_KR.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>복제해온 저장소 파일을 보관할 위치입니다.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>복제해온 저장소 파일을 보관할 위치입니다.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>주 메뉴</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -490,6 +490,68 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -642,28 +704,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation>Ctrl+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,41 +768,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation>파일 열기</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>폴더의 이름을 바꿉니다.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1602,178 +1602,8 @@ The following files will be moved in the repository.</source> | ||||
|         <translation>쟁여둔 다음 변경사항을 지웁니다.</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
							
								
								
									
										314
									
								
								intl/nl_NL.ts
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								intl/nl_NL.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Pad naar het lokale archief</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Pad naar het lokale archief</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>Hoofd taakbalk</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -490,6 +490,68 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -642,28 +704,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation>Ctrl+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,41 +768,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation>Open Bestand</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>Geselecteerde map hernoemen</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1602,178 +1602,8 @@ De volgende bestanden worden verplaatst naar het archief.</translation> | ||||
|         <translation>De volgende verborgen veranderingen zullen worden verwijderd.</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
							
								
								
									
										314
									
								
								intl/pt_PT.ts
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								intl/pt_PT.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Caminho para o ficheiro do repositório local</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Caminho para o ficheiro do repositório local</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>Barra de ferramentas</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -490,6 +490,68 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -642,28 +704,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation>Ctrl+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,41 +768,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation>Abrir ficheiro</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>Renomear a pasta seleccionada</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1602,178 +1602,8 @@ Os ficheiros seguintes irão ser movidos no repositório.</translation> | ||||
|         <translation>Os seguintes armazéns irão ser eliminados.</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
							
								
								
									
										314
									
								
								intl/ru_RU.ts
									
									
									
									
									
								
							
							
						
						
									
										314
									
								
								intl/ru_RU.ts
									
									
									
									
									
								
							| @@ -108,6 +108,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Local Repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Путь к локальному хранилищу</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="136"/> | ||||
|         <source>The URL of the HTTP proxy. Leave blank if not required</source> | ||||
| @@ -118,11 +123,6 @@ Released under the GNU GPL</source> | ||||
|         <source>HTTP Proxy</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="108"/> | ||||
|         <source>Path to the local repository file</source> | ||||
|         <translation>Путь к локальному хранилищу</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/CloneDialog.ui" line="59"/> | ||||
|         <location filename="../ui/CloneDialog.ui" line="127"/> | ||||
| @@ -342,6 +342,11 @@ Released under the GNU GPL</source> | ||||
|         <source>Main Toolbar</source> | ||||
|         <translation>Панель</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="346"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="349"/> | ||||
| @@ -353,11 +358,6 @@ Released under the GNU GPL</source> | ||||
|         <source>F5</source> | ||||
|         <translation>F5</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="343"/> | ||||
|         <source>&Refresh</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="361"/> | ||||
|         <source>&Commit</source> | ||||
| @@ -490,6 +490,68 @@ Released under the GNU GPL</source> | ||||
|         <source>Pull changes from the default remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="931"/> | ||||
|         <source>Create &Tag</source> | ||||
| @@ -642,28 +704,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Ctrl+L</source> | ||||
|         <translation>Ctrl+L</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="531"/> | ||||
|         <source>&Push to Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="534"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="537"/> | ||||
|         <source>Push changes to a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="546"/> | ||||
|         <source>Pu&ll from Remote</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="549"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="552"/> | ||||
|         <source>Pull changes from a remote repository</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="561"/> | ||||
|         <location filename="../src/MainWindow.cpp" line="1714"/> | ||||
| @@ -728,41 +768,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Open File</source> | ||||
|         <translation>Открыть Файл</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="717"/> | ||||
|         <source>U&ndo</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="750"/> | ||||
|         <source>&Update</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="753"/> | ||||
|         <source>Update the workspace to a revision</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="788"/> | ||||
|         <source>&Modified Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="802"/> | ||||
|         <source>&Unchanged Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="816"/> | ||||
|         <source>Un&known Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="827"/> | ||||
|         <source>&Ignored Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="841"/> | ||||
|         <location filename="../ui/MainWindow.ui" line="844"/> | ||||
| @@ -939,11 +944,6 @@ Released under the GNU GPL</source> | ||||
|         <source>Rename the selected folder</source> | ||||
|         <translation>Переименовать выбранную директорию</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="886"/> | ||||
|         <source>&Stash Changes</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ui/MainWindow.ui" line="889"/> | ||||
|         <source>Stash changes</source> | ||||
| @@ -1602,178 +1602,8 @@ The following files will be moved in the repository.</source> | ||||
|         <translation>Следующие изменения в Буфере будут удалены</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::ReadPasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="76"/> | ||||
|         <source>Password not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="129"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="140"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="222"/> | ||||
|         <source>No keychain service available</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="224"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="270"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="291"/> | ||||
|         <source>Could not determine data type: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="300"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="27"/> | ||||
|         <source>Entry not found</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="309"/> | ||||
|         <source>Unsupported entry type 'Map'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="312"/> | ||||
|         <source>Unknown kwallet entry type '%1'</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="327"/> | ||||
|         <source>Could not read password: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="44"/> | ||||
|         <source>Could not decrypt data</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QKeychain::WritePasswordJobPrivate</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="352"/> | ||||
|         <source>D-Bus is not running</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="364"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="372"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="420"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="505"/> | ||||
|         <source>Could not open wallet: %1; %2</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="483"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="64"/> | ||||
|         <source>Could not delete encrypted data from settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="65"/> | ||||
|         <source>Could not delete encrypted data from settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="85"/> | ||||
|         <source>Encryption failed</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="100"/> | ||||
|         <source>Could not store encrypted data in settings: access error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_win.cpp" line="101"/> | ||||
|         <source>Could not store encrypted data in settings: format error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>QObject</name> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="31"/> | ||||
|         <location filename="../ext/qtkeychain/keychain_mac.cpp" line="33"/> | ||||
|         <source>%1 (OSStatus %2)</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="167"/> | ||||
|         <source>Access to keychain denied</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="169"/> | ||||
|         <source>No keyring daemon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="171"/> | ||||
|         <source>Already unlocked</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="173"/> | ||||
|         <source>No such keyring</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="175"/> | ||||
|         <source>Bad arguments</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="177"/> | ||||
|         <source>I/O error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="179"/> | ||||
|         <source>Cancelled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="181"/> | ||||
|         <source>Keyring already exists</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="183"/> | ||||
|         <source>No match</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../ext/qtkeychain/keychain_unix.cpp" line="188"/> | ||||
|         <source>Unknown error</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="../src/AppSettings.cpp" line="44"/> | ||||
|         <source>Custom Action %0</source> | ||||
|   | ||||
| @@ -1,5 +0,0 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| # Update existing translations | ||||
| lupdate-qt5 ../fuel.pro | ||||
|  | ||||
| @@ -156,22 +156,24 @@ | ||||
| 	<file>icons/Zoom In-01.png</file> | ||||
| 	<file>icons/Zoom Out-01.png</file> | ||||
|   </qresource> | ||||
|   <qresource prefix="/intl"> | ||||
| 	<file>intl/el_GR.qm</file> | ||||
| 	<file>intl/de_DE.qm</file> | ||||
| 	<file>intl/es_ES.qm</file> | ||||
| 	<file>intl/fr_FR.qm</file> | ||||
| 	<file>intl/ru_RU.qm</file> | ||||
| 	<file>intl/pt_PT.qm</file> | ||||
| 	<file>intl/it_IT.qm</file> | ||||
| 	<file>intl/nl_NL.qm</file> | ||||
| 	<file>intl/ko_KR.qm</file> | ||||
|   </qresource> | ||||
|   <qresource prefix="/docs"> | ||||
| 	  <file>docs/Translators.txt</file> | ||||
| 	  <file>docs/Licenses.txt</file> | ||||
|   </qresource> | ||||
|   <qresource prefix="/version"> | ||||
| 	  <file alias="manifest">../manifest.uuid</file> | ||||
|   </qresource> | ||||
| 	<!--> | ||||
|  <qresource prefix="/intl"> | ||||
|    <file>intl/el_GR.qm</file> | ||||
|    <file>intl/de_DE.qm</file> | ||||
|    <file>intl/es_ES.qm</file> | ||||
|    <file>intl/fr_FR.qm</file> | ||||
|    <file>intl/ru_RU.qm</file> | ||||
|    <file>intl/pt_PT.qm</file> | ||||
|    <file>intl/it_IT.qm</file> | ||||
|    <file>intl/nl_NL.qm</file> | ||||
|    <file>intl/ko_KR.qm</file> | ||||
|  </qresource> | ||||
|  <--> | ||||
|  <qresource prefix="/docs"> | ||||
|      <file>docs/Translators.txt</file> | ||||
|      <file>docs/Licenses.txt</file> | ||||
|  </qresource> | ||||
|  <qresource prefix="/version"> | ||||
|      <file alias="manifest">../manifest.uuid</file> | ||||
|  </qresource> | ||||
| </RCC> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user