Browse Source

Pass username from Windows to login page.

Signed-off-by: alex-z <blackslayer4@gmail.com>
alex-z 4 years ago
parent
commit
b03bf1c1f0

+ 1 - 0
NEXTCLOUD.cmake

@@ -13,6 +13,7 @@ set( APPLICATION_REV_DOMAIN "com.nextcloud.desktopclient" )
 set( APPLICATION_VIRTUALFILE_SUFFIX "nextcloud" CACHE STRING "Virtual file suffix (not including the .)")
 set( APPLICATION_OCSP_STAPLING_ENABLED OFF )
 set( APPLICATION_FORBID_BAD_SSL OFF )
+set( APPLICATION_LOGIN_WITH_SYSTEM_USERNAME OFF )
 
 set( LINUX_PACKAGE_SHORTNAME "nextcloud" )
 set( LINUX_APPLICATION_ID "${APPLICATION_REV_DOMAIN}.${LINUX_PACKAGE_SHORTNAME}")

+ 1 - 0
config.h.in

@@ -31,6 +31,7 @@
 #cmakedefine APPLICATION_VIRTUALFILE_SUFFIX "@APPLICATION_VIRTUALFILE_SUFFIX@"
 #cmakedefine APPLICATION_OCSP_STAPLING_ENABLED "@APPLICATION_OCSP_STAPLING_ENABLED@"
 #cmakedefine APPLICATION_FORBID_BAD_SSL "@APPLICATION_FORBID_BAD_SSL@"
+#cmakedefine APPLICATION_LOGIN_WITH_SYSTEM_USERNAME "@APPLICATION_LOGIN_WITH_SYSTEM_USERNAME@"
 #define APPLICATION_DOTVIRTUALFILE_SUFFIX "." APPLICATION_VIRTUALFILE_SUFFIX
 #cmakedefine01 ENFORCE_VIRTUAL_FILES_SYNC_FOLDER
 

+ 5 - 0
src/common/utility.h

@@ -242,6 +242,11 @@ namespace Utility {
      */
     OCSYNC_EXPORT bool isPathWindowsDrivePartitionRoot(const QString &path);
 
+    /**
+     * @brief Retrieves current logged-in user name from the OS
+     */
+    OCSYNC_EXPORT QString getCurrentUserName();
+
 #ifdef Q_OS_WIN
     OCSYNC_EXPORT bool registryKeyExists(HKEY hRootKey, const QString &subKey);
     OCSYNC_EXPORT QVariant registryGetKeyValue(HKEY hRootKey, const QString &subKey, const QString &valueName);

+ 5 - 0
src/common/utility_mac.cpp

@@ -136,4 +136,9 @@ static bool hasDarkSystray_private()
     return returnValue;
 }
 
+QString Utility::getCurrentUserName()
+{
+    return {};
+}
+
 } // namespace OCC

+ 5 - 0
src/common/utility_unix.cpp

@@ -108,4 +108,9 @@ static inline bool hasDarkSystray_private()
     return true;
 }
 
+QString Utility::getCurrentUserName()
+{
+    return {};
+}
+
 } // namespace OCC

+ 12 - 0
src/common/utility_win.cpp

@@ -20,6 +20,7 @@
 #include "utility.h"
 
 #include <comdef.h>
+#include <Lmcons.h>
 #include <shlguid.h>
 #include <shlobj.h>
 #include <string>
@@ -380,6 +381,17 @@ QString Utility::formatWinError(long errorCode)
     return QStringLiteral("WindowsError: %1: %2").arg(QString::number(errorCode, 16), QString::fromWCharArray(_com_error(errorCode).ErrorMessage()));
 }
 
+QString Utility::getCurrentUserName()
+{
+    TCHAR username[UNLEN + 1] = {0};
+    DWORD len = sizeof(username) / sizeof(TCHAR);
+    
+    if (!GetUserName(username, &len)) {
+        qCWarning(lcUtility) << "Could not retrieve Windows user name." << formatWinError(GetLastError());
+    }
+
+    return QString::fromWCharArray(username);
+}
 
 Utility::NtfsPermissionLookupRAII::NtfsPermissionLookupRAII()
 {

+ 10 - 0
src/gui/creds/flow2auth.cpp

@@ -132,6 +132,16 @@ void Flow2Auth::fetchNewToken(const TokenAction action)
 
 
         _loginUrl = loginUrl;
+
+        if (Theme::instance()->loginWithSystemUserName()) {
+            const auto userName = Utility::getCurrentUserName();
+            if (!userName.isEmpty()) {
+                auto query = QUrlQuery(_loginUrl);
+                query.addQueryItem(QStringLiteral("user"), userName);
+                _loginUrl.setQuery(query);
+            }
+        }
+
         _pollToken = pollToken;
         _pollEndpoint = pollEndpoint;
 

+ 9 - 0
src/libsync/theme.cpp

@@ -417,6 +417,15 @@ bool Theme::forbidBadSSL() const
 #endif
 }
 
+bool Theme::loginWithSystemUserName() const
+{
+#ifdef APPLICATION_LOGIN_WITH_SYSTEM_USERNAME
+    return true;
+#else
+    return false;
+#endif
+}
+
 QString Theme::forceConfigAuthType() const
 {
     return QString();

+ 7 - 0
src/libsync/theme.h

@@ -254,6 +254,13 @@ public:
      */
     virtual bool forbidBadSSL() const;
 
+    /**
+     * Use current logged in username from the system
+     *
+     * When true, the Web login form will be pre-filled with system user name
+     */
+    bool loginWithSystemUserName() const;
+
     /**
      * This is only usefull when previous version had a different overrideServerUrl
      * with a different auth type in that case You should then specify "http" or "shibboleth".