Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 35 additions & 22 deletions app/views/AuthenticationWebView.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import { WebView } from 'react-native-webview';
import { connect } from 'react-redux';
import parse from 'url-parse';

import RocketChat from '../lib/rocketchat';
import { isIOS } from '../utils/deviceInfo';
Expand All @@ -10,6 +11,7 @@ import StatusBar from '../containers/StatusBar';
import ActivityIndicator from '../containers/ActivityIndicator';
import { withTheme } from '../theme';
import { themedHeader } from '../utils/navigation';
import log from '../utils/log';

const userAgent = isIOS
? 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1'
Expand Down Expand Up @@ -64,32 +66,43 @@ class AuthenticationWebView extends React.PureComponent {
}

onNavigationStateChange = (webViewState) => {
const url = decodeURIComponent(webViewState.url);
if (this.authType === 'saml' || this.authType === 'cas') {
const { navigation } = this.props;
const ssoToken = navigation.getParam('ssoToken');
if (url.includes('ticket') || url.includes('validate')) {
let payload;
const credentialToken = { credentialToken: ssoToken };
if (this.authType === 'saml') {
payload = { ...credentialToken, saml: true };
} else {
payload = { cas: credentialToken };
try {
const url = decodeURIComponent(webViewState.url);

if (this.authType === 'cas') {
const { navigation } = this.props;
const ssoToken = navigation.getParam('ssoToken');
if (url.includes('ticket') || url.includes('validate')) {
const payload = { cas: ssoToken };
// We need to set a timeout when the login is done with SSO in order to make it work on our side.
// It is actually due to the SSO server processing the response.
setTimeout(() => {
this.login(payload);
}, 3000);
}
}

if (this.authType === 'saml') {
const parsedUrl = parse(url, true);
if (parsedUrl.query && parsedUrl.query.saml_idp_credentialToken) {
const payload = { credentialToken: parsedUrl.query.saml_idp_credentialToken, saml: true };
// We need to set a timeout when the login is done with SSO in order to make it work on our side.
// It is actually due to the SSO server processing the response.
setTimeout(() => {
this.login(payload);
}, 3000);
}
// We need to set a timeout when the login is done with SSO in order to make it work on our side.
// It is actually due to the SSO server processing the response.
setTimeout(() => {
this.login(payload);
}, 3000);
}
}

if (this.authType === 'oauth') {
if (this.redirectRegex.test(url)) {
const parts = url.split('#');
const credentials = JSON.parse(parts[1]);
this.login({ oauth: { ...credentials } });
if (this.authType === 'oauth') {
if (this.redirectRegex.test(url)) {
const parts = url.split('#');
const credentials = JSON.parse(parts[1]);
this.login({ oauth: { ...credentials } });
}
}
} catch (e) {
log(e);
}
}

Expand Down
5 changes: 2 additions & 3 deletions app/views/LoginSignupView.js
Original file line number Diff line number Diff line change
Expand Up @@ -250,9 +250,8 @@ class LoginSignupView extends React.Component {
const { server } = this.props;
const { clientConfig } = loginService;
const { provider } = clientConfig;
const ssoToken = random(17);
const url = `${ server }/_saml/authorize/${ provider }/${ ssoToken }`;
this.openOAuth({ url, ssoToken, authType: 'saml' });
const url = `${ server }/_saml/authorize/${ provider }/`;
this.openOAuth({ url, authType: 'saml' });
}

onPressCas = () => {
Expand Down