Commit 884a99e3 by dupondje Committed by GitHub

Disable Change Password for OAuth users (#27886)

parent 4dfce12a
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { getBackendSrv } from '@grafana/runtime'; import { getBackendSrv } from '@grafana/runtime';
import { User, Team, UserOrg, UserSession } from 'app/types'; import { UserDTO, Team, UserOrg, UserSession } from 'app/types';
import { config } from 'app/core/config'; import { config } from 'app/core/config';
import { dateTimeFormat, dateTimeFormatTimeAgo } from '@grafana/data'; import { dateTimeFormat, dateTimeFormatTimeAgo } from '@grafana/data';
...@@ -45,12 +45,12 @@ export interface Props { ...@@ -45,12 +45,12 @@ export interface Props {
teams: Team[], teams: Team[],
orgs: UserOrg[], orgs: UserOrg[],
sessions: UserSession[], sessions: UserSession[],
user?: User user?: UserDTO
) => JSX.Element; ) => JSX.Element;
} }
export interface State { export interface State {
user?: User; user?: UserDTO;
teams: Team[]; teams: Team[];
orgs: UserOrg[]; orgs: UserOrg[];
sessions: UserSession[]; sessions: UserSession[];
......
import React, { FC } from 'react'; import React, { FC } from 'react';
import config from 'app/core/config'; import config from 'app/core/config';
import { UserDTO } from 'app/types';
import { Button, LinkButton, Form, Field, Input, HorizontalGroup } from '@grafana/ui'; import { Button, LinkButton, Form, Field, Input, HorizontalGroup } from '@grafana/ui';
import { ChangePasswordFields } from 'app/core/utils/UserProvider'; import { ChangePasswordFields } from 'app/core/utils/UserProvider';
import { css } from 'emotion'; import { css } from 'emotion';
export interface Props { export interface Props {
user: UserDTO;
isSaving: boolean; isSaving: boolean;
onChangePassword: (payload: ChangePasswordFields) => void; onChangePassword: (payload: ChangePasswordFields) => void;
} }
export const ChangePasswordForm: FC<Props> = ({ onChangePassword, isSaving }) => { export const ChangePasswordForm: FC<Props> = ({ user, onChangePassword, isSaving }) => {
const { ldapEnabled, authProxyEnabled } = config; const { ldapEnabled, authProxyEnabled, disableLoginForm } = config;
const authSource = user.authLabels?.length && user.authLabels[0];
if (ldapEnabled || authProxyEnabled) { if (ldapEnabled || authProxyEnabled) {
return <p>You cannot change password when ldap or auth proxy authentication is enabled.</p>; return <p>You cannot change password when ldap or auth proxy authentication is enabled.</p>;
} }
if (authSource && disableLoginForm) {
return <p>Password cannot be changed here!</p>;
}
return ( return (
<div <div
className={css` className={css`
......
import React, { PureComponent } from 'react'; import React, { FC } from 'react';
import { hot } from 'react-hot-loader'; import { hot } from 'react-hot-loader';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { StoreState } from 'app/types'; import { config } from '@grafana/runtime';
import { LoadingPlaceholder } from '@grafana/ui';
import { UserDTO, Team, UserOrg, UserSession, StoreState } from 'app/types';
import { NavModel } from '@grafana/data'; import { NavModel } from '@grafana/data';
import { getNavModel } from 'app/core/selectors/navModel'; import { getNavModel } from 'app/core/selectors/navModel';
import { UserProvider } from 'app/core/utils/UserProvider'; import { UserProvider, UserAPI, LoadingStates } from 'app/core/utils/UserProvider';
import Page from 'app/core/components/Page/Page'; import Page from 'app/core/components/Page/Page';
import { ChangePasswordForm } from './ChangePasswordForm'; import { ChangePasswordForm } from './ChangePasswordForm';
...@@ -12,23 +14,31 @@ export interface Props { ...@@ -12,23 +14,31 @@ export interface Props {
navModel: NavModel; navModel: NavModel;
} }
export class ChangePasswordPage extends PureComponent<Props> { export const ChangePasswordPage: FC<Props> = ({ navModel }) => (
render() {
const { navModel } = this.props;
return (
<Page navModel={navModel}> <Page navModel={navModel}>
<UserProvider> <UserProvider userId={config.bootData.user.id}>
{({ changePassword }, states) => ( {(
api: UserAPI,
states: LoadingStates,
teams: Team[],
orgs: UserOrg[],
sessions: UserSession[],
user: UserDTO
) => {
return (
<Page.Contents> <Page.Contents>
<h3 className="page-sub-heading">Change Your Password</h3> <h3 className="page-sub-heading">Change Your Password</h3>
<ChangePasswordForm onChangePassword={changePassword} isSaving={states.changePassword} /> {states.loadUser ? (
</Page.Contents> <LoadingPlaceholder text="Loading user profile..." />
) : (
<ChangePasswordForm user={user} onChangePassword={api.changePassword} isSaving={states.changePassword} />
)} )}
</Page.Contents>
);
}}
</UserProvider> </UserProvider>
</Page> </Page>
); );
}
}
function mapStateToProps(state: StoreState) { function mapStateToProps(state: StoreState) {
return { return {
......
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { User, UserOrg } from 'app/types'; import { UserDTO, UserOrg } from 'app/types';
import { LoadingPlaceholder, Button } from '@grafana/ui'; import { LoadingPlaceholder, Button } from '@grafana/ui';
export interface Props { export interface Props {
user: User; user: UserDTO;
orgs: UserOrg[]; orgs: UserOrg[];
isLoading: boolean; isLoading: boolean;
loadOrgs: () => void; loadOrgs: () => void;
......
...@@ -6,7 +6,7 @@ import { config } from '@grafana/runtime'; ...@@ -6,7 +6,7 @@ import { config } from '@grafana/runtime';
import { NavModel } from '@grafana/data'; import { NavModel } from '@grafana/data';
import { UserProvider, UserAPI, LoadingStates } from 'app/core/utils/UserProvider'; import { UserProvider, UserAPI, LoadingStates } from 'app/core/utils/UserProvider';
import { getNavModel } from 'app/core/selectors/navModel'; import { getNavModel } from 'app/core/selectors/navModel';
import { User, Team, UserOrg, UserSession, StoreState } from 'app/types'; import { UserDTO, Team, UserOrg, UserSession, StoreState } from 'app/types';
import { SharedPreferences } from 'app/core/components/SharedPreferences/SharedPreferences'; import { SharedPreferences } from 'app/core/components/SharedPreferences/SharedPreferences';
import Page from 'app/core/components/Page/Page'; import Page from 'app/core/components/Page/Page';
import { UserTeams } from './UserTeams'; import { UserTeams } from './UserTeams';
...@@ -21,7 +21,14 @@ export interface Props { ...@@ -21,7 +21,14 @@ export interface Props {
export const UserProfileEdit: FC<Props> = ({ navModel }) => ( export const UserProfileEdit: FC<Props> = ({ navModel }) => (
<Page navModel={navModel}> <Page navModel={navModel}>
<UserProvider userId={config.bootData.user.id}> <UserProvider userId={config.bootData.user.id}>
{(api: UserAPI, states: LoadingStates, teams: Team[], orgs: UserOrg[], sessions: UserSession[], user: User) => { {(
api: UserAPI,
states: LoadingStates,
teams: Team[],
orgs: UserOrg[],
sessions: UserSession[],
user: UserDTO
) => {
return ( return (
<Page.Contents> <Page.Contents>
{states.loadUser ? ( {states.loadUser ? (
......
import React, { FC } from 'react'; import React, { FC } from 'react';
import { Button, Tooltip, Icon, Form, Input, Field, FieldSet } from '@grafana/ui'; import { Button, Tooltip, Icon, Form, Input, Field, FieldSet } from '@grafana/ui';
import { User } from 'app/types'; import { UserDTO } from 'app/types';
import config from 'app/core/config'; import config from 'app/core/config';
import { ProfileUpdateFields } from 'app/core/utils/UserProvider'; import { ProfileUpdateFields } from 'app/core/utils/UserProvider';
export interface Props { export interface Props {
user: User; user: UserDTO;
isSavingUser: boolean; isSavingUser: boolean;
updateProfile: (payload: ProfileUpdateFields) => void; updateProfile: (payload: ProfileUpdateFields) => void;
} }
...@@ -22,8 +22,14 @@ export const UserProfileEditForm: FC<Props> = ({ user, isSavingUser, updateProfi ...@@ -22,8 +22,14 @@ export const UserProfileEditForm: FC<Props> = ({ user, isSavingUser, updateProfi
{({ register, errors }) => { {({ register, errors }) => {
return ( return (
<FieldSet label="Edit Profile"> <FieldSet label="Edit Profile">
<Field label="Name" invalid={!!errors.name} error="Name is required"> <Field label="Name" invalid={!!errors.name} error="Name is required" disabled={disableLoginForm}>
<Input name="name" ref={register({ required: true })} placeholder="Name" defaultValue={user.name} /> <Input
name="name"
ref={register({ required: true })}
placeholder="Name"
defaultValue={user.name}
suffix={<InputSuffix />}
/>
</Field> </Field>
<Field label="Email" invalid={!!errors.email} error="Email is required" disabled={disableLoginForm}> <Field label="Email" invalid={!!errors.email} error="Email is required" disabled={disableLoginForm}>
<Input <Input
......
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { User, UserSession } from 'app/types'; import { UserDTO, UserSession } from 'app/types';
import { LoadingPlaceholder, Button, Icon } from '@grafana/ui'; import { LoadingPlaceholder, Button, Icon } from '@grafana/ui';
export interface Props { export interface Props {
user: User; user: UserDTO;
sessions: UserSession[]; sessions: UserSession[];
isLoading: boolean; isLoading: boolean;
loadSessions: () => void; loadSessions: () => void;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment