grafana/public/app/core/components/Login/LoginCtrl.tsx
Tharun Rajendran c3e26657e9
LoginPage: add tests (#36226)
* added tests for LoginPage component

* addressed review changes and removed snapshot
2021-06-29 17:08:50 +03:00

155 lines
3.6 KiB
TypeScript

import React, { PureComponent } from 'react';
import config from 'app/core/config';
import { getBackendSrv } from '@grafana/runtime';
import appEvents from 'app/core/app_events';
import { AppEvents } from '@grafana/data';
const isOauthEnabled = () => {
return !!config.oauth && Object.keys(config.oauth).length > 0;
};
export interface FormModel {
user: string;
password: string;
email: string;
}
interface Props {
resetCode?: string;
children: (props: {
isLoggingIn: boolean;
changePassword: (pw: string) => void;
isChangingPassword: boolean;
skipPasswordChange: Function;
login: (data: FormModel) => void;
disableLoginForm: boolean;
ldapEnabled: boolean;
authProxyEnabled: boolean;
disableUserSignUp: boolean;
isOauthEnabled: boolean;
loginHint: string;
passwordHint: string;
}) => JSX.Element;
}
interface State {
isLoggingIn: boolean;
isChangingPassword: boolean;
}
export class LoginCtrl extends PureComponent<Props, State> {
result: any = {};
constructor(props: Props) {
super(props);
this.state = {
isLoggingIn: false,
isChangingPassword: false,
};
if (config.loginError) {
appEvents.emit(AppEvents.alertWarning, ['Login Failed', config.loginError]);
}
}
changePassword = (password: string) => {
const pw = {
newPassword: password,
confirmNew: password,
oldPassword: 'admin',
};
if (!this.props.resetCode) {
getBackendSrv()
.put('/api/user/password', pw)
.then(() => {
this.toGrafana();
})
.catch((err: any) => console.error(err));
}
const resetModel = {
code: this.props.resetCode,
newPassword: password,
confirmPassword: password,
};
getBackendSrv()
.post('/api/user/password/reset', resetModel)
.then(() => {
this.toGrafana();
});
};
login = (formModel: FormModel) => {
this.setState({
isLoggingIn: true,
});
getBackendSrv()
.post('/login', formModel)
.then((result: any) => {
this.result = result;
if (formModel.password !== 'admin' || config.ldapEnabled || config.authProxyEnabled) {
this.toGrafana();
return;
} else {
this.changeView();
}
})
.catch(() => {
this.setState({
isLoggingIn: false,
});
});
};
changeView = () => {
this.setState({
isChangingPassword: true,
});
};
toGrafana = () => {
// Use window.location.href to force page reload
if (this.result.redirectUrl) {
if (config.appSubUrl !== '' && !this.result.redirectUrl.startsWith(config.appSubUrl)) {
window.location.assign(config.appSubUrl + this.result.redirectUrl);
} else {
window.location.assign(this.result.redirectUrl);
}
} else {
window.location.assign(config.appSubUrl + '/');
}
};
render() {
const { children } = this.props;
const { isLoggingIn, isChangingPassword } = this.state;
const { login, toGrafana, changePassword } = this;
const { loginHint, passwordHint, disableLoginForm, ldapEnabled, authProxyEnabled, disableUserSignUp } = config;
return (
<>
{children({
isOauthEnabled: isOauthEnabled(),
loginHint,
passwordHint,
disableLoginForm,
ldapEnabled,
authProxyEnabled,
disableUserSignUp,
login,
isLoggingIn,
changePassword,
skipPasswordChange: toGrafana,
isChangingPassword,
})}
</>
);
}
}
export default LoginCtrl;