diff --git a/packages/nc-gui/pages/user/password/forgot.vue b/packages/nc-gui/pages/user/password/forgot.vue index 30cf0b25eb..468a20869d 100644 --- a/packages/nc-gui/pages/user/password/forgot.vue +++ b/packages/nc-gui/pages/user/password/forgot.vue @@ -97,23 +97,26 @@ export default { beforeDestroy() { }, methods: { - onNormalVerify() { this.recpatcha = true }, - async resetPasswordHandle(e) { if (this.$refs.formType.validate()) { e.preventDefault() // await this.$recaptchaLoaded() // const recaptchaToken = await this.$recaptcha('login') - - const err = await this.$store.dispatch('users/ActPasswordForgot', { ...this.form })// recaptchaToken}); - if (err) { - this.formUtil.formErr = true - this.formUtil.formErrMsg = err.data.msg - } else { + try { + await this.$api.auth.passwordForgot( + { + email: this.form.email + } + ) this.showMsg = true + } catch (e) { + const err = await this._extractSdkResponseErrorMsg(e) + this.formUtil.formErr = true + this.formUtil.formErrMsg = err + return; } } } diff --git a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/emailVerify.ts b/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/emailVerify.ts index fc42bad489..a8eb2a8438 100644 --- a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/emailVerify.ts +++ b/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/emailVerify.ts @@ -7,7 +7,7 @@ export default ` - +
@@ -54,7 +54,7 @@ export default ` methods: {}, async created() { try { - const valid = (await axios.post('<%- baseUrl %>auth/email/validate/' + this.token)).data; + const valid = (await axios.post('<%- baseUrl %>/api/v1/db/auth/email/validate/' + this.token)).data; this.valid = !!valid; } catch (e) { this.valid = false; @@ -74,6 +74,7 @@ export default ` * * @author Naveen MR * @author Pranav C Balan + * @author Wing-Kam Wong * * @license GNU AGPL version 3 or any later version * diff --git a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/resetPassword.ts b/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/resetPassword.ts index 7e03d156b5..36ce73b3e3 100644 --- a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/resetPassword.ts +++ b/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/resetPassword.ts @@ -7,7 +7,7 @@ export default ` - +
@@ -81,7 +81,7 @@ export default ` async resetPassword() { if (this.$refs.form.validate()) { try { - const res = await axios.post('<%- baseUrl %>auth/password/reset/' + this.token, { + const res = await axios.post('<%- baseUrl %>api/v1/db/auth/password/reset/' + this.token, { ...this.formdata }); this.success = true; @@ -93,7 +93,7 @@ export default ` }, async created() { try { - const valid = (await axios.post('<%- baseUrl %>auth/token/validate/' + this.token)).data; + const valid = (await axios.post('<%- baseUrl %>api/v1/db/auth/token/validate/' + this.token)).data; this.valid = !!valid; } catch (e) { this.valid = false; @@ -108,6 +108,7 @@ export default ` * * @author Naveen MR * @author Pranav C Balan + * @author Wing-Kam Wong * * @license GNU AGPL version 3 or any later version * diff --git a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/signin.ts b/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/signin.ts deleted file mode 100644 index 672b39c11d..0000000000 --- a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/signin.ts +++ /dev/null @@ -1,119 +0,0 @@ -export default ` - - - NocoDB - Sign In - - - - - - - - -
- - - - - - - - - - - - - Sign In - - - - -
-

-                    
-                        {{errMsg}}
-                    
-
-
-                
-
-
-
-
- - - - - -`; -/** - * @copyright Copyright (c) 2021, Xgene Cloud Ltd - * - * @author Naveen MR - * @author Pranav C Balan - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ diff --git a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/signup.ts b/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/signup.ts deleted file mode 100644 index 612a28ad3a..0000000000 --- a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/signup.ts +++ /dev/null @@ -1,135 +0,0 @@ -export default ` - - - NocoDB - Sign Up - - - - - - - - -
- - - - - - - - - - - - - - - - - Sign Up - - - - -
-

-                    
-                        {{errMsg}}
-                    
-
-
-                
-
-
-
-
- - - - - -`; -/** - * @copyright Copyright (c) 2021, Xgene Cloud Ltd - * - * @author Naveen MR - * @author Pranav C Balan - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ diff --git a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/swagger-base.xc.json b/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/swagger-base.xc.json deleted file mode 100644 index f3cd2fffff..0000000000 --- a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/swagger-base.xc.json +++ /dev/null @@ -1,425 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Create APIs at the speed of your thoughts", - "version": "1.0.0", - "title": "NocoDB", - "contact": {} - }, - "host": "localhost:8080", - "basePath": "/", - "tags": [ - { - "name": "common" - } - ], - "schemes": [ - "http" - ], - "paths": { - "/auth/signin": { - "post": { - "security": [ - ], - "tags": [ - "Authentication" - ], - "summary": "User login", - "description": "", - "operationId": "login", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Authentication user details", - "required": true, - "schema": { - "$ref": "#/definitions/userAuth" - } - } - ], - "responses": { - "200": { - "description": "Authenticated successfully", - "schema": { - "$ref": "#/definitions/token" - } - } - } - } - }, - "/auth/signup": { - "post": { - "tags": [ - "Authentication" - ], - "summary": "User signup", - "description": "", - "operationId": "signup", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Signup user details", - "required": true, - "schema": { - "$ref": "#/definitions/user" - } - } - ], - "responses": { - "200": { - "description": "Registration success", - "schema": { - "$ref": "#/definitions/token" - } - }, - "400": { - "description": "Bad request" - } - } - } - }, - "/auth/password/forgot": { - "post": { - "tags": [ - "Authentication" - ], - "summary": "Password Forgot", - "description": "", - "operationId": "passwordForgot", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Email address", - "required": true, - "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "required": true, - "example": "test@nocodb.com" - } - } - } - } - ], - "responses": { - "200": { - "description": "Mailed password reset link", - "schema": { - "type": "boolean" - } - } - } - } - }, - "/auth/email/validate/{tokenId}": { - "post": { - "tags": [ - "Authentication" - ], - "summary": "Email validate link", - "description": "", - "operationId": "emailValidate", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "tokenId", - "in": "path", - "description": "random token id received", - "required": true, - "type": "string", - "format": "uuid" - } - ], - "responses": { - "200": { - "description": "Validated successfully" - } - } - } - }, - "/auth/token/validate/{tokenId}": { - "get": { - "tags": [ - "Authentication" - ], - "summary": "Validate password reset token", - "description": "", - "operationId": "passwordResetTokenValidate", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "tokenId", - "in": "path", - "description": "random token id received", - "required": true, - "type": "string", - "format": "uuid" - } - ], - "responses": { - "200": { - "description": "Validated successfully" - } - } - } - }, - "/auth/password/reset/": { - "post": { - "tags": [ - "Authentication" - ], - "summary": "Password reset", - "description": "", - "operationId": "passwordReset", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "tokenId", - "in": "path", - "description": "random token id received", - "required": true, - "type": "string", - "format": "uuid" - }, - { - "in": "body", - "name": "body", - "description": "Reset password details", - "required": true, - "schema": { - "type": "object", - "properties": { - "password": { - "type": "string", - "format": "password", - "example": "password", - "required": true - } - } - } - } - ], - "responses": { - "200": { - "description": "Password reset successfully" - } - } - } - }, - "/user/me": { - "get": { - "tags": [ - "Authentication" - ], - "summary": "User details", - "description": "", - "operationId": "userDetails", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "User details" - } - } - } - }, - "/user": { - "put": { - "tags": [ - "Authentication" - ], - "summary": "Update user details", - "description": "", - "operationId": "updateUserDetails", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "User details" - } - }, - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Updated user details", - "required": true, - "schema": { - "$ref": "#/definitions/user" - } - } - ] - } - }, - "/user/password/change": { - "post": { - "tags": [ - "Authentication" - ], - "summary": "Update user details", - "description": "", - "operationId": "passwordChange", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "User details" - } - }, - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Current password and new password", - "required": true, - "schema": { - "type": "object", - "properties": { - "currentPassword": { - "type": "string", - "format": "password", - "example": "password" - }, - "newPassword": { - "type": "string", - "format": "password", - "example": "newPassword" - } - } - } - } - ] - } - } - }, - "definitions": { - "userAuth": { - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email", - "nullable": false, - "example": "test@nocodb.com" - }, - "password": { - "type": "string", - "format": "password", - "nullable": false, - "example": "password" - } - } - }, - "token": { - "type": "object", - "properties": { - "token": { - "type": "string", - "format": "email", - "nullable": false, - "example": "< JWT Token >" - } - } - }, - "user": { - "allOf": [ - { - "$ref": "#/definitions/userAuth" - }, - { - "type": "object", - "properties": { - "id": { - "type": "integer", - "nullable": false, - "readOnly": true - }, - "firstname": { - "type": "string", - "nullable": false, - "example": "FirstName" - }, - "lastname": { - "type": "string", - "nullable": false, - "example": "LastName" - }, - "roles": { - "type": "object", - "readOnly": true - }, - "created_at": { - "type": "string", - "readOnly": true - }, - "updated_at": { - "type": "string", - "readOnly": true - }, - "email_verified": { - "type": "boolean", - "readOnly": true - } - } - } - ] - } - }, - "security": [ - { - "xcAuth": [] - } - ], - "externalDocs": { - "description": "Find out more about NocoDB", - "url": "http://nocodb.com" - }, - "securityDefinitions": { - "xcAuth": { - "type": "apiKey", - "in": "header", - "name": "xc-auth" - } - } -} \ No newline at end of file diff --git a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/swagger.ts b/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/swagger.ts deleted file mode 100644 index c2872a8643..0000000000 --- a/packages/nocodb/src/lib/noco/meta/api/userApi/ui/auth/swagger.ts +++ /dev/null @@ -1,48 +0,0 @@ -export default ` - - - XC Swagger UI - - - - - - -
-
- - - - -`; -/** - * @copyright Copyright (c) 2021, Xgene Cloud Ltd - * - * @author Naveen MR - * @author Pranav C Balan - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ diff --git a/packages/nocodb/src/lib/noco/meta/api/userApi/userApis.ts b/packages/nocodb/src/lib/noco/meta/api/userApi/userApis.ts index de79716be5..de03ab0cba 100644 --- a/packages/nocodb/src/lib/noco/meta/api/userApi/userApis.ts +++ b/packages/nocodb/src/lib/noco/meta/api/userApi/userApis.ts @@ -269,8 +269,8 @@ async function passwordForgot(req: Request, res): Promise { } const email = _email.toLowerCase(); - const user = await User.getByEmail(email); + if (user) { const token = uuidv4(); await User.update(user.id, { @@ -286,15 +286,16 @@ async function passwordForgot(req: Request, res): Promise { subject: 'Password Reset Link', text: `Visit following link to update your password : ${ (req as any).ncSiteUrl - }/password/reset/${token}.`, + }/api/v1/db/auth/password/reset/${token}.`, html: ejs.render(template, { - resetLink: (req as any).ncSiteUrl + `/password/reset/${token}` + resetLink: (req as any).ncSiteUrl + `/api/v1/db/auth/password/reset/${token}` }) }) ); } catch (e) { - console.log( - 'Warning : `mailSend` failed, Please configure emailClient configuration.' + console.log(e) + return NcError.badRequest( + 'Email Plugin is not found. Please contact administrators to configure it in App Store first.' ); } @@ -305,12 +306,16 @@ async function passwordForgot(req: Request, res): Promise { description: `requested for password reset `, ip: (req as any).clientIp }); + } else { + return NcError.badRequest( + 'Your email has not been registered.' + ); } - res.json({ msg: 'Check your email if you are registered with us.' }); + res.json({ msg: 'Please check your email to reset the password' }); } async function tokenValidate(req, res): Promise { - const token = req.params.token; + const token = req.params.tokenId; const user = await Noco.ncMeta.metaGet(null, null, MetaTable.USERS, { reset_password_token: token @@ -326,7 +331,7 @@ async function tokenValidate(req, res): Promise { } async function passwordReset(req, res): Promise { - const token = req.params.token; + const token = req.params.tokenId; const user = await Noco.ncMeta.metaGet(null, null, MetaTable.USERS, { reset_password_token: token @@ -364,7 +369,7 @@ async function passwordReset(req, res): Promise { } async function emailVerification(req, res): Promise { - const token = req.params.token; + const token = req.params.tokenId; const user = await Noco.ncMeta.metaGet(null, null, MetaTable.USERS, { email_verification_token: token @@ -428,6 +433,19 @@ async function refreshToken(req, res): Promise { } } +async function renderPasswordReset(req, res): Promise { + try { + res.send( + ejs.render((await import('./ui/auth/resetPassword')).default, { + token: JSON.stringify(req.params.tokenId), + baseUrl: `/` + }) + ); + } catch (e) { + return res.status(400).json({ msg: e.message }); + } +} + const mapRoutes = router => { // todo: old api - /auth/signup?tool=1 router.post('/auth/user/signup', catchError(signup)); @@ -472,5 +490,9 @@ const mapRoutes = router => { '/api/v1/db/auth/token/refresh', ncMetaAclMw(refreshToken, 'refreshToken') ); + router.get( + '/api/v1/db/auth/password/reset/:tokenId', + catchError(renderPasswordReset) + ); }; export { mapRoutes as userApis };