mirror of
https://github.com/fleetdm/fleet
synced 2026-04-21 21:47:20 +00:00
Closes #1502. This PR adds support for SSO to the new user creation process. An admin now has the option to select SSO when creating a new user. When the confirmation form is submitted, the user is automatically authenticated with the IDP, and if successful, is redirected to the Kolide home page. Password authentication, password change and password reset are not allowed for an SSO user.
199 lines
4.6 KiB
JavaScript
199 lines
4.6 KiB
JavaScript
import React, { Component, PropTypes } from 'react';
|
|
|
|
import Button from 'components/buttons/Button';
|
|
import InputFieldWithIcon from 'components/forms/fields/InputFieldWithIcon';
|
|
import Checkbox from 'components/forms/fields/Checkbox';
|
|
import userInterface from 'interfaces/user';
|
|
import validatePresence from 'components/forms/validators/validate_presence';
|
|
import validEmail from 'components/forms/validators/valid_email';
|
|
|
|
const baseClass = 'invite-user-form';
|
|
|
|
class InviteUserForm extends Component {
|
|
static propTypes = {
|
|
serverErrors: PropTypes.shape({
|
|
email: PropTypes.string,
|
|
base: PropTypes.string,
|
|
}),
|
|
invitedBy: userInterface,
|
|
onCancel: PropTypes.func,
|
|
onSubmit: PropTypes.func,
|
|
canUseSSO: PropTypes.bool,
|
|
};
|
|
|
|
constructor (props) {
|
|
super(props);
|
|
|
|
this.state = {
|
|
errors: {
|
|
admin: null,
|
|
email: null,
|
|
name: null,
|
|
sso_enabled: null,
|
|
},
|
|
formData: {
|
|
admin: false,
|
|
email: '',
|
|
name: '',
|
|
sso_enabled: false,
|
|
},
|
|
};
|
|
}
|
|
|
|
componentWillReceiveProps ({ serverErrors }) {
|
|
const { errors } = this.state;
|
|
|
|
if (this.props.serverErrors !== serverErrors) {
|
|
this.setState({
|
|
errors: {
|
|
...errors,
|
|
...serverErrors,
|
|
},
|
|
});
|
|
}
|
|
}
|
|
|
|
onInputChange = (formField) => {
|
|
return (value) => {
|
|
const { errors, formData } = this.state;
|
|
|
|
this.setState({
|
|
errors: {
|
|
...errors,
|
|
[formField]: null,
|
|
},
|
|
formData: {
|
|
...formData,
|
|
[formField]: value,
|
|
},
|
|
});
|
|
|
|
return false;
|
|
};
|
|
}
|
|
|
|
onCheckboxChange = (formField) => {
|
|
return (evt) => {
|
|
return this.onInputChange(formField)(evt);
|
|
};
|
|
};
|
|
|
|
onFormSubmit = (evt) => {
|
|
evt.preventDefault();
|
|
const valid = this.validate();
|
|
|
|
if (valid) {
|
|
const { formData: { admin, email, name, sso_enabled } } = this.state;
|
|
const { invitedBy, onSubmit } = this.props;
|
|
return onSubmit({
|
|
admin,
|
|
email,
|
|
invited_by: invitedBy.id,
|
|
name,
|
|
sso_enabled,
|
|
});
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
validate = () => {
|
|
const {
|
|
errors,
|
|
formData: { email },
|
|
} = this.state;
|
|
|
|
if (!validatePresence(email)) {
|
|
this.setState({
|
|
errors: {
|
|
...errors,
|
|
email: 'Email field must be completed',
|
|
},
|
|
});
|
|
|
|
return false;
|
|
}
|
|
|
|
if (!validEmail(email)) {
|
|
this.setState({
|
|
errors: {
|
|
...errors,
|
|
email: `${email} is not a valid email`,
|
|
},
|
|
});
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
render () {
|
|
const { errors, formData: { admin, email, name, ssoEnabled } } = this.state;
|
|
const { onCancel, serverErrors } = this.props;
|
|
const { onFormSubmit, onInputChange, onCheckboxChange } = this;
|
|
const baseError = serverErrors.base;
|
|
|
|
return (
|
|
<form onSubmit={onFormSubmit}>
|
|
{baseError && <div className="form__base-error">{baseError}</div>}
|
|
<InputFieldWithIcon
|
|
autofocus
|
|
error={errors.name}
|
|
name="name"
|
|
iconName="username"
|
|
onChange={onInputChange('name')}
|
|
placeholder="Name"
|
|
value={name}
|
|
/>
|
|
<InputFieldWithIcon
|
|
error={errors.email}
|
|
name="email"
|
|
iconName="email"
|
|
onChange={onInputChange('email')}
|
|
placeholder="Email"
|
|
value={email}
|
|
/>
|
|
<div className={`${baseClass}__radio`}>
|
|
<p className={`${baseClass}__role`}>admin</p>
|
|
<Checkbox
|
|
name="admin"
|
|
onChange={onCheckboxChange('admin')}
|
|
value={admin}
|
|
wrapperClassName={`${baseClass}__invite-admin`}
|
|
>
|
|
Enable Admin
|
|
</Checkbox>
|
|
</div>
|
|
<div className={`${baseClass}__radio`}>
|
|
<p className={`${baseClass}__role`}>single sign on</p>
|
|
<Checkbox
|
|
name="sso_enabled"
|
|
onChange={onCheckboxChange('sso_enabled')}
|
|
value={ssoEnabled}
|
|
disabled={!this.props.canUseSSO}
|
|
wrapperClassName={`${baseClass}__invite-admin`}
|
|
>
|
|
Enable Single Sign On
|
|
</Checkbox>
|
|
</div>
|
|
|
|
<div className={`${baseClass}__btn-wrap`}>
|
|
<Button className={`${baseClass}__btn`} type="submit" variant="brand">
|
|
Invite
|
|
</Button>
|
|
<Button
|
|
className={`${baseClass}__btn`}
|
|
onClick={onCancel}
|
|
type="input"
|
|
variant="inverse"
|
|
>
|
|
Cancel
|
|
</Button>
|
|
</div>
|
|
</form>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default InviteUserForm;
|