LdapUserPage.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import { NavModel } from '@grafana/data';
  5. import { Alert } from '@grafana/ui';
  6. import Page from 'app/core/components/Page/Page';
  7. import { getNavModel } from 'app/core/selectors/navModel';
  8. import {
  9. AppNotificationSeverity,
  10. LdapError,
  11. LdapUser,
  12. StoreState,
  13. User,
  14. UserSession,
  15. SyncInfo,
  16. LdapUserSyncInfo,
  17. } from 'app/types';
  18. import {
  19. clearUserError,
  20. loadLdapUserInfo,
  21. revokeSession,
  22. revokeAllSessions,
  23. loadLdapSyncStatus,
  24. syncUser,
  25. } from '../state/actions';
  26. import { LdapUserInfo } from './LdapUserInfo';
  27. import { getRouteParamsId } from 'app/core/selectors/location';
  28. import { UserSessions } from '../UserSessions';
  29. import { UserInfo } from '../UserInfo';
  30. import { UserSyncInfo } from '../UserSyncInfo';
  31. interface Props {
  32. navModel: NavModel;
  33. userId: number;
  34. user: User;
  35. sessions: UserSession[];
  36. ldapUser: LdapUser;
  37. userError?: LdapError;
  38. ldapSyncInfo?: SyncInfo;
  39. loadLdapUserInfo: typeof loadLdapUserInfo;
  40. clearUserError: typeof clearUserError;
  41. loadLdapSyncStatus: typeof loadLdapSyncStatus;
  42. syncUser: typeof syncUser;
  43. revokeSession: typeof revokeSession;
  44. revokeAllSessions: typeof revokeAllSessions;
  45. }
  46. interface State {
  47. isLoading: boolean;
  48. }
  49. export class LdapUserPage extends PureComponent<Props, State> {
  50. state = {
  51. isLoading: true,
  52. };
  53. async componentDidMount() {
  54. const { userId, loadLdapUserInfo, loadLdapSyncStatus } = this.props;
  55. try {
  56. await loadLdapUserInfo(userId);
  57. await loadLdapSyncStatus();
  58. } finally {
  59. this.setState({ isLoading: false });
  60. }
  61. }
  62. onClearUserError = () => {
  63. this.props.clearUserError();
  64. };
  65. onSyncUser = () => {
  66. const { syncUser, user } = this.props;
  67. if (syncUser && user) {
  68. syncUser(user.id);
  69. }
  70. };
  71. onSessionRevoke = (tokenId: number) => {
  72. const { userId, revokeSession } = this.props;
  73. revokeSession(tokenId, userId);
  74. };
  75. onAllSessionsRevoke = () => {
  76. const { userId, revokeAllSessions } = this.props;
  77. revokeAllSessions(userId);
  78. };
  79. render() {
  80. const { user, ldapUser, userError, navModel, sessions, ldapSyncInfo } = this.props;
  81. const { isLoading } = this.state;
  82. const userSyncInfo: LdapUserSyncInfo = {};
  83. if (ldapSyncInfo) {
  84. userSyncInfo.nextSync = ldapSyncInfo.nextSync;
  85. }
  86. if (user) {
  87. userSyncInfo.prevSync = (user as any).updatedAt;
  88. }
  89. return (
  90. <Page navModel={navModel}>
  91. <Page.Contents isLoading={isLoading}>
  92. <div className="grafana-info-box">
  93. This user is synced via LDAP – all changes must be done in LDAP or mappings.
  94. </div>
  95. {userError && userError.title && (
  96. <div className="gf-form-group">
  97. <Alert
  98. title={userError.title}
  99. severity={AppNotificationSeverity.Error}
  100. children={userError.body}
  101. onRemove={this.onClearUserError}
  102. />
  103. </div>
  104. )}
  105. {ldapUser && <LdapUserInfo ldapUser={ldapUser} />}
  106. {!ldapUser && user && <UserInfo user={user} />}
  107. {userSyncInfo && <UserSyncInfo syncInfo={userSyncInfo} onSync={this.onSyncUser} />}
  108. {sessions && (
  109. <UserSessions
  110. sessions={sessions}
  111. onSessionRevoke={this.onSessionRevoke}
  112. onAllSessionsRevoke={this.onAllSessionsRevoke}
  113. />
  114. )}
  115. </Page.Contents>
  116. </Page>
  117. );
  118. }
  119. }
  120. const mapStateToProps = (state: StoreState) => ({
  121. userId: getRouteParamsId(state.location),
  122. navModel: getNavModel(state.navIndex, 'global-users'),
  123. user: state.ldapUser.user,
  124. ldapUser: state.ldapUser.ldapUser,
  125. userError: state.ldapUser.userError,
  126. ldapSyncInfo: state.ldapUser.ldapSyncInfo,
  127. sessions: state.ldapUser.sessions,
  128. });
  129. const mapDispatchToProps = {
  130. loadLdapUserInfo,
  131. loadLdapSyncStatus,
  132. syncUser,
  133. revokeSession,
  134. revokeAllSessions,
  135. clearUserError,
  136. };
  137. export default hot(module)(
  138. connect(
  139. mapStateToProps,
  140. mapDispatchToProps
  141. )(LdapUserPage)
  142. );