[Libreoffice-commits] online.git: 2 commits - common/Authorization.cpp common/Authorization.hpp loleaflet/js loleaflet/src Makefile.am test/Makefile.am test/WhiteBoxTests.cpp wsd/Admin.cpp wsd/Auth.cpp wsd/Auth.hpp wsd/Storage.hpp

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Nov 29 20:47:23 UTC 2018


 Makefile.am                      |    2 
 common/Authorization.cpp         |   75 +++++++++++++++++++++++++++++++
 common/Authorization.hpp         |   56 +++++++++++++++++++++++
 loleaflet/js/toolbar.js          |    6 ++
 loleaflet/src/control/Signing.js |   94 +++++++++++++++++++++++++++++++++------
 test/Makefile.am                 |    1 
 test/WhiteBoxTests.cpp           |    2 
 wsd/Admin.cpp                    |    1 
 wsd/Auth.cpp                     |   56 -----------------------
 wsd/Auth.hpp                     |   34 --------------
 wsd/Storage.hpp                  |    1 
 11 files changed, 224 insertions(+), 104 deletions(-)

New commits:
commit 73c8fa9d095b219b87588c172c2d07c7e735654b
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Nov 22 12:03:42 2018 +0100
Commit:     Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Thu Nov 29 21:47:13 2018 +0100

    Extract Authorization out of Auth and put it into common
    
    This is needed so we can use this inside ChildSession.
    
    Change-Id: I88f2cc767412fd52dbb242938f0f9897d4277639
    Reviewed-on: https://gerrit.libreoffice.org/63836
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
    Tested-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/Makefile.am b/Makefile.am
index 69686cec4..a70bb68a7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -91,6 +91,7 @@ shared_sources = common/FileUtil.cpp \
                  common/SpookyV2.cpp \
                  common/Unit.cpp \
                  common/Util.cpp \
+                 common/Authorization.cpp \
                  net/DelaySocket.cpp \
                  net/Socket.cpp
 if ENABLE_SSL
@@ -196,6 +197,7 @@ shared_headers = common/Common.hpp \
                  common/Unit.hpp \
                  common/UnitHTTP.hpp \
                  common/Util.hpp \
+                 common/Authorization.hpp \
                  common/MessageQueue.hpp \
                  common/Message.hpp \
                  common/Png.hpp \
diff --git a/common/Authorization.cpp b/common/Authorization.cpp
new file mode 100644
index 000000000..20e77acba
--- /dev/null
+++ b/common/Authorization.cpp
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <config.h>
+
+#include "Authorization.hpp"
+
+#include <cstdlib>
+#include <cassert>
+
+#include <Poco/StringTokenizer.h>
+
+void Authorization::authorizeURI(Poco::URI& uri) const
+{
+    if (_type == Authorization::Type::Token)
+    {
+        static const std::string key("access_token");
+
+        Poco::URI::QueryParameters queryParams = uri.getQueryParameters();
+        for (auto& param: queryParams)
+        {
+            if (param.first == key)
+            {
+                param.second = _data;
+                uri.setQueryParameters(queryParams);
+                return;
+            }
+        }
+
+        // it did not exist yet
+        uri.addQueryParameter(key, _data);
+    }
+}
+
+void Authorization::authorizeRequest(Poco::Net::HTTPRequest& request) const
+{
+    switch (_type)
+    {
+        case Type::Token:
+            request.set("Authorization", "Bearer " + _data);
+            break;
+        case Type::Header:
+        {
+            // there might be more headers in here; like
+            //   Authorization: Basic ....
+            //   X-Something-Custom: Huh
+            Poco::StringTokenizer tokens(_data, "\n\r", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
+            for (const auto& token : tokens)
+            {
+                size_t i = token.find_first_of(':');
+                if (i != std::string::npos)
+                {
+                    size_t separator = i;
+                    for (++i; i < token.length() && token[i] == ' ';)
+                        ++i;
+
+                    // set the header
+                    if (i < token.length())
+                        request.set(token.substr(0, separator), token.substr(i));
+                }
+            }
+            break;
+        }
+        default:
+            assert(false);
+    }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/common/Authorization.hpp b/common/Authorization.hpp
new file mode 100644
index 000000000..c8c594988
--- /dev/null
+++ b/common/Authorization.hpp
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+// WOPI Authorization
+
+#ifndef INCLUDED_AUTHORIZATION_HPP
+#define INCLUDED_AUTHORIZATION_HPP
+
+#include <string>
+
+#include <Poco/Net/HTTPRequest.h>
+#include <Poco/URI.h>
+
+/// Class to keep the authorization data.
+class Authorization
+{
+public:
+    enum class Type
+    {
+        None,
+        Token,
+        Header
+    };
+
+private:
+    Type _type;
+    std::string _data;
+
+public:
+    Authorization()
+        : _type(Type::None)
+    {
+    }
+
+    Authorization(Type type, const std::string& data)
+        : _type(type)
+        , _data(data)
+    {
+    }
+
+    /// Set the access_token parametr to the given uri.
+    void authorizeURI(Poco::URI& uri) const;
+
+    /// Set the Authorization: header in request.
+    void authorizeRequest(Poco::Net::HTTPRequest& request) const;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/test/Makefile.am b/test/Makefile.am
index 62b859bcc..c43e14dd6 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -45,6 +45,7 @@ wsd_sources = \
             ../common/Session.cpp \
             ../common/Util.cpp \
             ../common/MessageQueue.cpp \
+            ../common/Authorization.cpp \
             ../kit/Kit.cpp \
             ../wsd/Auth.cpp \
             ../wsd/TileCache.cpp \
diff --git a/test/WhiteBoxTests.cpp b/test/WhiteBoxTests.cpp
index 30f8327bf..482a76e18 100644
--- a/test/WhiteBoxTests.cpp
+++ b/test/WhiteBoxTests.cpp
@@ -21,6 +21,8 @@
 #include <Util.hpp>
 #include <JsonUtil.hpp>
 
+#include <common/Authorization.hpp>
+
 /// WhiteBox unit-tests.
 class WhiteBoxTests : public CPPUNIT_NS::TestFixture
 {
diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp
index c5f303ad0..414427027 100644
--- a/wsd/Admin.cpp
+++ b/wsd/Admin.cpp
@@ -38,6 +38,7 @@
 #include <net/WebSocketHandler.hpp>
 
 #include <common/SigUtil.hpp>
+#include <common/Authorization.hpp>
 
 using namespace LOOLProtocol;
 
diff --git a/wsd/Auth.cpp b/wsd/Auth.cpp
index 6be7eceea..f4e92907d 100644
--- a/wsd/Auth.cpp
+++ b/wsd/Auth.cpp
@@ -39,62 +39,6 @@ using Poco::OutputLineEndingConverter;
 
 const Poco::Crypto::RSAKey JWTAuth::_key(Poco::Crypto::RSAKey(Poco::Crypto::RSAKey::KL_2048, Poco::Crypto::RSAKey::EXP_LARGE));
 
-void Authorization::authorizeURI(Poco::URI& uri) const
-{
-    if (_type == Authorization::Type::Token)
-    {
-        static const std::string key("access_token");
-
-        Poco::URI::QueryParameters queryParams = uri.getQueryParameters();
-        for (auto& param: queryParams)
-        {
-            if (param.first == key)
-            {
-                param.second = _data;
-                uri.setQueryParameters(queryParams);
-                return;
-            }
-        }
-
-        // it did not exist yet
-        uri.addQueryParameter(key, _data);
-    }
-}
-
-void Authorization::authorizeRequest(Poco::Net::HTTPRequest& request) const
-{
-    switch (_type)
-    {
-        case Type::Token:
-            request.set("Authorization", "Bearer " + _data);
-            break;
-        case Type::Header:
-        {
-            // there might be more headers in here; like
-            //   Authorization: Basic ....
-            //   X-Something-Custom: Huh
-            Poco::StringTokenizer tokens(_data, "\n\r", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
-            for (const auto& token : tokens)
-            {
-                size_t i = token.find_first_of(':');
-                if (i != std::string::npos)
-                {
-                    size_t separator = i;
-                    for (++i; i < token.length() && token[i] == ' ';)
-                        ++i;
-
-                    // set the header
-                    if (i < token.length())
-                        request.set(token.substr(0, separator), token.substr(i));
-                }
-            }
-            break;
-        }
-        default:
-            assert(false);
-    }
-}
-
 const std::string JWTAuth::getAccessToken()
 {
     std::string encodedHeader = createHeader();
diff --git a/wsd/Auth.hpp b/wsd/Auth.hpp
index 3616b0144..3659a6d38 100644
--- a/wsd/Auth.hpp
+++ b/wsd/Auth.hpp
@@ -21,40 +21,6 @@
 #include <Poco/Net/HTTPRequest.h>
 #include <Poco/URI.h>
 
-/// Class to keep the authorization data.
-class Authorization
-{
-public:
-    enum class Type
-    {
-        None,
-        Token,
-        Header
-    };
-
-private:
-    Type _type;
-    std::string _data;
-
-public:
-    Authorization()
-        : _type(Type::None)
-    {
-    }
-
-    Authorization(Type type, const std::string& data)
-        : _type(type)
-        , _data(data)
-    {
-    }
-
-    /// Set the access_token parametr to the given uri.
-    void authorizeURI(Poco::URI& uri) const;
-
-    /// Set the Authorization: header in request.
-    void authorizeRequest(Poco::Net::HTTPRequest& request) const;
-};
-
 /// Base class of all Authentication/Authorization implementations.
 class AuthBase
 {
diff --git a/wsd/Storage.hpp b/wsd/Storage.hpp
index 990a03adc..893fa9e35 100644
--- a/wsd/Storage.hpp
+++ b/wsd/Storage.hpp
@@ -21,6 +21,7 @@
 #include "LOOLWSD.hpp"
 #include "Log.hpp"
 #include "Util.hpp"
+#include <common/Authorization.hpp>
 
 /// Base class of all Storage abstractions.
 class StorageBase
commit 089e58880fec6ae7615adabc4595ad0f84685526
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Nov 15 10:12:16 2018 +0100
Commit:     Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Thu Nov 29 21:47:05 2018 +0100

    Add passport selection to infobar
    
    Change-Id: I9e997c22b3ecce249b33cc97acecc78fd34fae32
    Reviewed-on: https://gerrit.libreoffice.org/63414
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
    Tested-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/loleaflet/js/toolbar.js b/loleaflet/js/toolbar.js
index 15b91adeb..145d14e5e 100644
--- a/loleaflet/js/toolbar.js
+++ b/loleaflet/js/toolbar.js
@@ -251,6 +251,9 @@ function onClick(e, id, item, subItem) {
 		}
 		L.toggleFullScreen();
 	}
+	else if (id.startsWith('passport:')) {
+		map.setCurrentPassport(item.value, item.text);
+	}
 }
 
 function setBorders(left, right, bottom, top, horiz, vert) {
@@ -955,6 +958,9 @@ function initNormalToolbar(toolItems) {
 				{type: 'html', id: 'identity-label', html: '<b>Identity:</b>'},
 				{type: 'html', id: 'identity', html: 'N/A'},
 				{type: 'break' },
+				{type: 'menu', id: 'passport', caption: _('Select passport'), items: []},
+				{type: 'html', id: 'current-passport', html: 'Passport: N/A'},
+				{type: 'break' },
 				{type: 'button',  id: 'logout',  caption: 'Logout', img: '', hint: _('Logout')},
 				{type: 'button',  id: 'login',  caption: 'Login', img: '', hint: _('Login')},
 			],
diff --git a/loleaflet/src/control/Signing.js b/loleaflet/src/control/Signing.js
index ba656565f..5318b3089 100644
--- a/loleaflet/src/control/Signing.js
+++ b/loleaflet/src/control/Signing.js
@@ -7,11 +7,16 @@
 
 var library = null;
 var identity = null;
+var currentPassport = null;
 
 function isSuccess(result) {
 	return result.code == '200';
 }
 
+function haveIdentity() {
+	return identity != null;
+}
+
 function updateIndentity() {
 	if (library) {
 		if (identity) {
@@ -28,13 +33,63 @@ function updateIndentity() {
 	}
 }
 
+function addPassportToToolbar(passport, i) {
+	var name = null;
+	try {
+		name = passport['claims']['passportName']['tags']['notag']['value']['value'];
+	}
+	catch (exception) {
+		console.log(exception);
+		name = 'Unknown ' + (i+1);
+	}
+
+	w2ui['document-signing-bar'].get('passport').items.push(
+		{ text: name, id: 'item ' + (i+1), value: passport.uuid }
+	);
+}
+
+function updatePassportList() {
+	if (library) {
+		library.passportListPassports().then(function(result) {
+			if (isSuccess(result))
+			{
+				w2ui['document-signing-bar'].get('passport').items = [];
+				var passports = result.data;
+				for (var i = 0; i < passports.length; i++) {
+					addPassportToToolbar(passports[i], i);
+				}
+				updateCurrentPassport();
+				adjustUIState();
+			}
+		});
+	}
+}
+
+function updateCurrentPassport() {
+	if (!haveIdentity())
+		return;
+	if (currentPassport) {
+		w2ui['document-signing-bar'].get('current-passport').html = '<p>' + currentPassport.text + '</p>';
+	}
+	adjustUIState();
+}
+
 function adjustUIState() {
 	if (library && identity) {
 		w2ui['document-signing-bar'].hide('login');
 		w2ui['document-signing-bar'].show('logout');
 		w2ui['document-signing-bar'].show('identity-label');
 		w2ui['document-signing-bar'].show('identity');
-		w2ui['document-signing-bar'].show('sign');
+		if (currentPassport) {
+			w2ui['document-signing-bar'].show('passport');
+			w2ui['document-signing-bar'].show('current-passport');
+			w2ui['document-signing-bar'].show('sign');
+		}
+		else {
+			w2ui['document-signing-bar'].show('passport');
+			w2ui['document-signing-bar'].hide('current-passport');
+			w2ui['document-signing-bar'].hide('sign');
+		}
 	}
 	else {
 		if (library)
@@ -46,6 +101,8 @@ function adjustUIState() {
 		w2ui['document-signing-bar'].hide('identity-label');
 		w2ui['document-signing-bar'].hide('identity');
 		w2ui['document-signing-bar'].hide('sign');
+		w2ui['document-signing-bar'].hide('passport');
+		w2ui['document-signing-bar'].hide('current-passport');
 	}
 	w2ui['document-signing-bar'].refresh();
 }
@@ -60,18 +117,15 @@ L.Map.include({
 	signDocument: function() {
 		if (library) {
 			var map = this;
-			library.getCurrentlyLoggedInUUID().then(function(result) {
-				if (isSuccess(result)) {
-					var UUID = result.data;
-					library.getOneTimeCertificateByPassport(UUID).then(function(result) {
-						if (isSuccess(result)) {
-							var otp = result.data;
-							var blob = new Blob(['signdocument\n', JSON.stringify(otp)]);
-							map._socket.sendMessage(blob);
-						}
-					});
-				}
-			});
+			if (currentPassport) {
+				library.getOneTimeCertificateByPassport(currentPassport.uuid).then(function(result) {
+					if (isSuccess(result)) {
+						var otp = result.data;
+						var blob = new Blob(['signdocument\n', JSON.stringify(otp)]);
+						map._socket.sendMessage(blob);
+					}
+				});
+			}
 		}
 	},
 	signingLogout: function() {
@@ -79,6 +133,7 @@ L.Map.include({
 			library.logout().then(function(result) {
 				if (isSuccess(result)) {
 					identity = null;
+					currentPassport = null;
 					updateIndentity();
 					adjustUIState();
 				}
@@ -98,6 +153,7 @@ L.Map.include({
 							if (isSuccess(result)) {
 								identity = result.data;
 								updateIndentity();
+								updatePassportList();
 								adjustUIState();
 							}
 						});
@@ -108,11 +164,21 @@ L.Map.include({
 					}
 				}
 			},
-			'https://dev.vereign.com/api/js/iframe'
+			'https://integration1.vereign.com/api/js/iframe'
 		).then(function(lib)
 		{
 			library = lib;
 			adjustUIState();
 		});
+	},
+	setCurrentPassport: function(uuid, text) {
+		if (library && identity && uuid) {
+			currentPassport = { uuid: uuid, text: text };
+			updateCurrentPassport();
+			library.passportGetAvatarByPassport(uuid).then(function(result) {
+				console.log(result);
+			});
+			adjustUIState();
+		}
 	}
 });


More information about the Libreoffice-commits mailing list