mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
155 lines
3.6 KiB
TypeScript
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;
|