From a8d51cdf58f047ca539e27e626a29fd9839ee13d Mon Sep 17 00:00:00 2001
From: Steven Hammerton <steven.hammerton@openmarket.com>
Date: Thu, 8 Oct 2015 22:42:09 +0100
Subject: [PATCH] Add support for CAS auth

---
 src/skins/vector/skindex.js                  |  1 +
 src/skins/vector/views/organisms/CasLogin.js | 50 ++++++++++++++++++++
 src/skins/vector/views/templates/Login.js    |  5 ++
 src/vector/index.js                          | 29 +++++++-----
 4 files changed, 74 insertions(+), 11 deletions(-)
 create mode 100644 src/skins/vector/views/organisms/CasLogin.js

diff --git a/src/skins/vector/skindex.js b/src/skins/vector/skindex.js
index dbc161fa14..faf1e2b067 100644
--- a/src/skins/vector/skindex.js
+++ b/src/skins/vector/skindex.js
@@ -64,6 +64,7 @@ skin['molecules.UserSelector'] = require('./views/molecules/UserSelector');
 skin['molecules.voip.CallView'] = require('./views/molecules/voip/CallView');
 skin['molecules.voip.IncomingCallBox'] = require('./views/molecules/voip/IncomingCallBox');
 skin['molecules.voip.VideoView'] = require('./views/molecules/voip/VideoView');
+skin['organisms.CasLogin'] = require('./views/organisms/CasLogin');
 skin['organisms.CreateRoom'] = require('./views/organisms/CreateRoom');
 skin['organisms.ErrorDialog'] = require('./views/organisms/ErrorDialog');
 skin['organisms.LeftPanel'] = require('./views/organisms/LeftPanel');
diff --git a/src/skins/vector/views/organisms/CasLogin.js b/src/skins/vector/views/organisms/CasLogin.js
new file mode 100644
index 0000000000..2a73fd3c1b
--- /dev/null
+++ b/src/skins/vector/views/organisms/CasLogin.js
@@ -0,0 +1,50 @@
+/*
+Copyright 2015 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+var React = require('react');
+
+var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
+
+module.exports = React.createClass({
+    displayName: 'CasLogin',
+
+    getInitialState: function() {
+        var splitLocation = window.location.href.split('/');
+        return {serviceUrl: splitLocation[0] + "//" + splitLocation[2]};
+    },
+
+    onCasClicked: function(ev) {
+        var serviceRedirectUrl = this.state.serviceUrl + "/#/login/cas";
+        var self = this;
+        MatrixClientPeg.get().getCasServer().done(function(data) {
+            var serverUrl = data.serverUrl + "/login?service=" + encodeURIComponent(serviceRedirectUrl);
+            window.location.href=serverUrl
+        }, function(error) {
+            self.setStep("stage_m.login.cas");
+            self.setState({errorText: 'Login failed.'});
+        });
+    },
+
+    render: function() {
+        return (
+            <div>
+                <button onClick={this.onCasClicked}>Sign in with CAS</button>
+            </div>
+        );
+    }
+});
\ No newline at end of file
diff --git a/src/skins/vector/views/templates/Login.js b/src/skins/vector/views/templates/Login.js
index 4e78dce91d..0378153a7f 100644
--- a/src/skins/vector/views/templates/Login.js
+++ b/src/skins/vector/views/templates/Login.js
@@ -141,6 +141,11 @@ module.exports = React.createClass({
                         </form>
                     </div>
                 );
+            case 'stage_m.login.cas':
+                var CasLogin = sdk.getComponent('organisms.CasLogin');
+                return (
+                    <CasLogin />
+                );
         }
     },
 
diff --git a/src/vector/index.js b/src/vector/index.js
index 1f6585f721..8a6a3448c9 100644
--- a/src/vector/index.js
+++ b/src/vector/index.js
@@ -23,22 +23,29 @@ sdk.loadModule(require('../modules/VectorConferenceHandler'));
 
 var lastLocationHashSet = null;
 
+
+function parseQueryParams(location) {
+    var hashparts = location.hash.split('?');
+    var params = {};
+    if (hashparts.length == 2) {
+        var pairs = hashparts[1].split('&');
+        for (var i = 0; i < pairs.length; ++i) {
+            var parts = pairs[i].split('=');
+            if (parts.length != 2) continue;
+            params[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
+        }
+    }
+    return params
+}
+
 // Here, we do some crude URL analysis to allow
 // deep-linking. We only support registration
 // deep-links in this example.
 function routeUrl(location) {
     if (location.hash.indexOf('#/register') == 0) {
-        var hashparts = location.hash.split('?');
-        var params = {};
-        if (hashparts.length == 2) {
-            var pairs = hashparts[1].split('&');
-            for (var i = 0; i < pairs.length; ++i) {
-                var parts = pairs[i].split('=');
-                if (parts.length != 2) continue;
-                params[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
-            }
-        }
-        window.matrixChat.showScreen('register', params);
+        window.matrixChat.showScreen('register', parseQueryParams(location));
+    } else if (location.hash.indexOf('#/login/cas') == 0) {
+        window.matrixChat.showScreen('cas_login', parseQueryParams(location));
     } else {
         window.matrixChat.showScreen(location.hash.substring(2));
     }