[Merge] lp:~abreu-alexandre/webbrowser-app/saml-url-persistence into lp:webbrowser-app
Alexandre Abreu
alexandre.abreu at canonical.com
Wed Jun 3 14:50:38 UTC 2015
updated
Diff comments:
> === modified file 'src/app/webcontainer/WebApp.qml'
> --- src/app/webcontainer/WebApp.qml 2015-05-20 14:14:18 +0000
> +++ src/app/webcontainer/WebApp.qml 2015-05-27 16:25:53 +0000
> @@ -21,6 +21,7 @@
> import Ubuntu.Components 1.1
> import Ubuntu.Unity.Action 1.1 as UnityActions
> import Ubuntu.UnityWebApps 0.1 as UnityWebApps
> +import Qt.labs.settings 1.0
> import "../actions" as Actions
> import ".."
>
> @@ -35,7 +36,7 @@
> property string webappModelSearchPath: ""
>
> property alias webappName: webview.webappName
> - property alias webappUrlPatterns: webview.webappUrlPatterns
> + property var webappUrlPatterns
> property alias popupRedirectionUrlPrefixPattern: webview.popupRedirectionUrlPrefixPattern
> property alias webviewOverrideFile: webview.webviewOverrideFile
> property alias blockOpenExternalUrls: webview.blockOpenExternalUrls
> @@ -47,6 +48,8 @@
> property bool chromeVisible: false
> readonly property bool chromeless: !chromeVisible && !backForwardButtonsVisible
>
> + signal generatedUrlPatternsFileUpdated(string patterns)
I updated the MR to remove the signal, but as I stated in the comment in the code, there is a libAP-qt bug that makes it difficult to not at an extra property/signal
> +
> actions: [
> Actions.Back {
> enabled: webapp.backForwardButtonsVisible && webview.currentWebview && webview.currentWebview.canGoBack
> @@ -61,6 +64,56 @@
> }
> ]
>
> + Settings {
> + id: generatedUrlPatternSettings
> + property string generatedUrlPatterns
> + }
> +
> + function getGeneratedUrlPatterns() {
> + return generatedUrlPatternSettings.generatedUrlPatterns
> + }
> +
> + function addGeneratedUrlPattern(urlPattern) {
> + var patterns;
> + try {
> + patterns = JSON.parse(generatedUrlPatternSettings.generatedUrlPatterns)
> + } catch(e) {
> + console.error("Invalid JSON content found in url patterns file")
> + }
> + if (! (patterns instanceof Array)) {
> + console.error("Invalid JSON content type found in url patterns file (not an array)")
> + patterns = []
> + }
> + if (patterns.indexOf(urlPattern) < 0) {
> + patterns.push(urlPattern)
> + }
> + generatedUrlPatternSettings.generatedUrlPatterns = JSON.stringify(patterns)
> +
> + generatedUrlPatternsFileUpdated(
> + generatedUrlPatternSettings.generatedUrlPatterns)
> + }
> +
> + function mergeUrlPatternSets(p1, p2) {
> + if ( ! (p1 instanceof Array)) {
> + return (p2 instanceof Array) ? p2 : []
> + }
> + if ( ! (p2 instanceof Array)) {
> + return (p1 instanceof Array) ? p1 : []
> + }
> + var p1hash = {}
> + var result = []
> + for (var i1 in p1) {
> + p1hash[p1[i1]] = 1
> + result.push(p1[i1])
> + }
> + for (var i2 in p2) {
> + if (! (p2[i2] in p1hash)) {
> + result.push(p2[i2])
> + }
> + }
> + return result
> + }
> +
> Item {
> id: webviewContainer
> anchors.fill: parent
> @@ -76,6 +129,11 @@
> }
> height: parent.height - osk.height
> developerExtrasEnabled: webapp.developerExtrasEnabled
> + onSamlRequestUrlPatternReceived: {
> + addGeneratedUrlPattern(urlPattern)
> + }
> + webappUrlPatterns: mergeUrlPatternSets(getGeneratedUrlPatterns(),
> + webapp.webappUrlPatterns)
> }
>
> Loader {
>
> === modified file 'src/app/webcontainer/WebViewImplOxide.qml'
> --- src/app/webcontainer/WebViewImplOxide.qml 2015-04-29 21:32:06 +0000
> +++ src/app/webcontainer/WebViewImplOxide.qml 2015-05-27 16:25:53 +0000
> @@ -44,6 +44,8 @@
> // (if any) or navigations resulting in new windows being created.
> property bool blockOpenExternalUrls: false
>
> + signal samlRequestUrlPatternReceived(string urlPattern)
> +
> // Those signals are used for testing purposes to externally
> // track down the various internal logic & steps of a popup lifecycle.
> signal openExternalUrlTriggered(string url)
> @@ -78,6 +80,12 @@
> StateSaver.properties: "url"
> StateSaver.enabled: !runningLocalApplication
>
> + function handleSAMLRequestPattern(urlPattern) {
> + webappUrlPatterns.push(urlPattern)
> +
> + samlRequestUrlPatternReceived(urlPattern)
> + }
> +
> function shouldOpenPopupsInDefaultBrowser() {
> return formFactor !== "desktop";
> }
> @@ -163,9 +171,12 @@
> var match = urlRegExp.exec(url)
> var host = match[1]
> var escapeDotsRegExp = new RegExp("\\.", "g")
> - var hostPattern = "https?://" + host.replace(escapeDotsRegExp, "\\.") + "/"
> + var hostPattern = "https?://" + host.replace(escapeDotsRegExp, "\\.") + "/*"
> +
> console.log("SAML request detected. Adding host pattern: " + hostPattern)
> - webappUrlPatterns.push(hostPattern)
> +
> + handleSAMLRequestPattern(hostPattern)
> +
> request.action = Oxide.NavigationRequest.ActionAccept
> }
>
>
> === modified file 'src/app/webcontainer/WebappContainerWebview.qml'
> --- src/app/webcontainer/WebappContainerWebview.qml 2015-04-21 14:01:13 +0000
> +++ src/app/webcontainer/WebappContainerWebview.qml 2015-05-27 16:25:53 +0000
> @@ -40,6 +40,8 @@
> property bool blockOpenExternalUrls: false
> property bool runningLocalApplication: false
>
> + signal samlRequestUrlPatternReceived(string urlPattern)
> +
> PopupWindowController {
> id: popupController
> objectName: "popupController"
> @@ -52,6 +54,14 @@
> id: webappContainerWebViewLoader
> objectName: "containerWebviewLoader"
> anchors.fill: parent
> + onLoaded: {
> + if (webappContainerWebViewLoader.status === Loader.Ready) {
> + webappContainerWebViewLoader.item
> + .samlRequestUrlPatternReceived.connect(function(urlPattern) {
> + samlRequestUrlPatternReceived(urlPattern)
> + })
> + }
> + }
> }
>
> onUrlChanged: if (webappContainerWebViewLoader.item) webappContainerWebViewLoader.item.url = url
>
> === modified file 'tests/autopilot/webapp_container/tests/fake_servers.py'
> --- tests/autopilot/webapp_container/tests/fake_servers.py 2015-03-23 19:58:08 +0000
> +++ tests/autopilot/webapp_container/tests/fake_servers.py 2015-05-27 16:25:53 +0000
> @@ -99,6 +99,24 @@
> </html>
> """.format("'"+self.headers['user-agent']+"'")
>
> + def saml(self, loopcount):
> + return """
> + <html>
> + <head>
> + <title>open-close</title>
> + <script>
> + </script>
> + </head>
> + <body>
> + <a href="/redirect-to-saml/?loopcount={}&SAMLRequest=1">
> + <div style="height: 100%; width: 100%; background-color: red">
> + target blank link
> + </div>
> + </a>
> + </body>
> + </html>
> + """.format(loopcount)
> +
> def open_close_content(self):
> return """
> <html>
> @@ -142,6 +160,27 @@
> elif self.path == '/open-close-content':
> self.send_response(200)
> self.serve_content(self.open_close_content())
> + elif self.path.startswith('/saml/'):
> + args = self.path[len('/saml/'):]
> + loopCount = 0
> + if args.startswith('?loopcount='):
> + loopCount = int(args[len('?loopcount='):].split(';')[0])
> + self.send_response(200)
> + self.serve_content(self.saml(loopCount))
> + elif self.path.startswith('/redirect-to-saml/'):
> + locationTarget = '/'
> + args = self.path[len('/redirect-to-saml/'):]
> + if args.startswith('?loopcount='):
> + header_size = len('?loopcount=')
> + loopCount = int(
> + args[header_size:args.index('&')].split(';')[0])
> + if loopCount > 0:
> + loopCount = loopCount - 1
> + locationTarget += 'redirect-to-saml\
> +/?loopcount=' + str(loopCount) + '&SAMLRequest=1'
> + self.send_response(302)
> + self.send_header("Location", locationTarget)
> + self.end_headers()
> else:
> self.send_error(404)
>
>
> === added file 'tests/autopilot/webapp_container/tests/test_saml_url_patterns.py'
> --- tests/autopilot/webapp_container/tests/test_saml_url_patterns.py 1970-01-01 00:00:00 +0000
> +++ tests/autopilot/webapp_container/tests/test_saml_url_patterns.py 2015-05-27 16:25:53 +0000
> @@ -0,0 +1,65 @@
> +# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
> +# Copyright 2014 Canonical
> +#
> +# This program is free software: you can redistribute it and/or modify it
> +# under the terms of the GNU General Public License version 3, as published
> +# by the Free Software Foundation.
> +#
> +# 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. See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
> +
> +from testtools.matchers import Equals, Contains
> +from autopilot.matchers import Eventually
> +
> +from webapp_container.tests import WebappContainerTestCaseWithLocalContentBase
> +
> +
> +class WebappContainerSAMLUrlPatternsTestCase(
> + WebappContainerTestCaseWithLocalContentBase):
> + def test_saml_urls_added(self):
> + rule = 'MAP *.test.com:80 ' + self.get_base_url_hostname()
> + args = ["--webappUrlPatterns=\
> +http://www.test.com/saml/*,{}/saml/*".format(self.base_url)]
> +
> + samlRequestRedirectsCount = 1
> + target_path = '/saml/?\
> +loopcount={}'.format(str(samlRequestRedirectsCount))
> +
> + self.launch_webcontainer_app_with_local_http_server(
> + args,
> + target_path,
> + {'WEBAPP_CONTAINER_BLOCK_OPEN_URL_EXTERNALLY': '1',
> + 'UBUNTU_WEBVIEW_HOST_MAPPING_RULES': rule})
> + self.get_webcontainer_window().visible.wait_for(True)
> + self.assert_page_eventually_loaded(self.base_url+target_path)
> +
> + container_webview = self.get_webcontainer_webview()
> + url_patterns_file_updated_watcher = container_webview.watch_signal(
> + 'generatedUrlPatternsFileUpdated(QString)')
> +
> + webview = self.get_oxide_webview()
> +
> + gr = webview.globalRect
> + self.pointing_device.move(
> + gr.x + webview.width*0.5,
> + gr.y + webview.height*0.5)
> + self.pointing_device.click()
> +
> + self.assertThat(
> + lambda: url_patterns_file_updated_watcher.was_emitted,
> + Eventually(Equals(True)))
> + self.assertThat(
> + lambda: url_patterns_file_updated_watcher.num_emissions,
> + Eventually(Equals(samlRequestRedirectsCount)))
> +
> + saved_patterns = container_webview.get_signal_emissions(
> + 'generatedUrlPatternsFileUpdated(QString)')[0][0]
> +
> + self.assertThat(
> + saved_patterns,
> + Contains("\"https?://{}/*\"".format(self.get_base_url_hostname())))
>
--
https://code.launchpad.net/~abreu-alexandre/webbrowser-app/saml-url-persistence/+merge/260248
Your team Ubuntu Phablet Team is subscribed to branch lp:webbrowser-app.
More information about the Ubuntu-reviews
mailing list