import React, { PureComponent } from 'react'; import { AppEvents } from '@grafana/data'; import { getBackendSrv } from '@grafana/runtime'; import appEvents from 'app/core/app_events'; import config from 'app/core/config'; 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; disableUserSignUp: boolean; isOauthEnabled: boolean; loginHint: string; passwordHint: string; }) => JSX.Element; } interface State { isLoggingIn: boolean; isChangingPassword: boolean; } export class LoginCtrl extends PureComponent { 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) { const resetModel = { code: this.props.resetCode, newPassword: password, confirmPassword: password, }; getBackendSrv() .post('/api/user/password/reset', resetModel) .then(() => { this.toGrafana(); }); } else { getBackendSrv() .put('/api/user/password', pw) .then(() => { this.toGrafana(); }) .catch((err: any) => console.error(err)); } }; 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, disableUserSignUp } = config; return ( <> {children({ isOauthEnabled: isOauthEnabled(), loginHint, passwordHint, disableLoginForm, disableUserSignUp, login, isLoggingIn, changePassword, skipPasswordChange: toGrafana, isChangingPassword, })} ); } } export default LoginCtrl;