fix: replace client and username with email

fix: error handling in lamassu-register
This commit is contained in:
Nikola Ubavic 2021-12-28 20:09:43 +01:00
parent 5ff676553e
commit 4a630f0f53
4 changed files with 30 additions and 23 deletions

View file

@ -2,6 +2,7 @@
const { asyncLocalStorage, defaultStore } = require('../lib/async-storage')
const userManagement = require('../lib/new-admin/graphql/modules/userManagement')
const authErrors = require('../lib/new-admin/graphql/errors/authentication')
const options = require('../lib/options')
const name = process.argv[2]
@ -14,29 +15,25 @@ if (!domain) {
}
if (!name || !role) {
console.log('Usage: lamassu-register <username> <role>')
console.log('Usage: lamassu-register <email> <role>')
console.log('<role> must be \'user\' or \'superuser\'')
process.exit(2)
}
const emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
if (!emailRegex.test(name)) {
console.log('Usage: <name> should be in an email format')
console.log('Usage: <email> must be in an email format')
process.exit(2)
}
if (role !== 'user' && role !== 'superuser') {
console.log('Usage: <role> has two possible values: user | superuser')
console.log('Usage: <role> must be \'user\' or \'superuser\'')
process.exit(2)
}
asyncLocalStorage.run(defaultStore(), () => {
userManagement.createRegisterToken(name, role).then(token => {
if (!token) {
console.log(`A user named ${name} already exists!`)
process.exit(2)
}
if (domain === 'localhost') {
console.log(`https://${domain}:3001/register?t=${token.token}`)
} else {
@ -45,6 +42,12 @@ asyncLocalStorage.run(defaultStore(), () => {
process.exit(0)
}).catch(err => {
if (err instanceof authErrors.UserAlreadyExistsError){
console.log(`A user with email ${name} already exists!`)
process.exit(2)
}
console.log('Error: %s', err)
process.exit(3)
})

View file

@ -46,23 +46,24 @@ const GET_USER_DATA = gql`
`
const validationSchema = Yup.object().shape({
client: Yup.string()
.required('Client field is required!')
.email('Username field should be in an email format!'),
email: Yup.string()
.label('Email')
.required()
.email(),
password: Yup.string().required('Password field is required'),
rememberMe: Yup.boolean()
})
const initialValues = {
client: '',
email: '',
password: '',
rememberMe: false
}
const getErrorMsg = (formikErrors, formikTouched, mutationError) => {
if (!formikErrors || !formikTouched) return null
if (mutationError) return 'Invalid login/password combination'
if (formikErrors.client && formikTouched.client) return formikErrors.client
if (mutationError) return 'Invalid email/password combination'
if (formikErrors.email && formikTouched.email) return formikErrors.email
if (formikErrors.password && formikTouched.password)
return formikErrors.password
return null
@ -142,13 +143,13 @@ const LoginState = ({ state, dispatch, strategy }) => {
validationSchema={validationSchema}
initialValues={initialValues}
onSubmit={values =>
submitLogin(values.client, values.password, values.rememberMe)
submitLogin(values.email, values.password, values.rememberMe)
}>
{({ errors, touched }) => (
<Form id="login-form">
<Field
name="client"
label="Client"
name="email"
label="Email"
size="lg"
component={TextInput}
fullWidth

View file

@ -210,6 +210,10 @@ const Register = () => {
{!loading && state.result === 'failure' && (
<>
<Label3>Link has expired</Label3>
<Label3>
To obtain a new link, run the command{' '}
<strong>lamassu-register</strong> in your servers terminal.
</Label3>
</>
)}
</div>

View file

@ -140,14 +140,13 @@ const Setup2FAState = ({ state, dispatch }) => {
<>
<div className={classes.infoWrapper}>
<Label3 className={classes.info2}>
We detected that this account does not have its two-factor
authentication enabled. In order to protect the resources in the
system, a two-factor authentication is enforced.
This account does not yet have two-factor authentication enabled. To
secure the admin, two-factor authentication is required.
</Label3>
<Label3 className={classes.info2}>
To finish this process, please scan the following QR code or insert
the secret further below on an authentication app of your choice,
such as Google Authenticator or Authy.
To complete the registration process, scan the following QR code or
insert the secret below on a 2FA app, such as Google Authenticator
or AndOTP.
</Label3>
</div>
<div className={classes.qrCodeWrapper}>