mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 14:17:22 +01:00
* Updated userItemsNotEnough string * Added a variable to be passed to the deleteSocialAccountText string. This variable name is `magic_word` and is set as DELETE where used * modified incorrectDeletePhrase to use a variable rather than translatable string for the word DELETE. Updated the DELETE-user test and the user api * Changed noSudoAccess from translatable string to static * Changed enterprisePlansEmailSubject from a translatable string to a static string within groupPlans.vue * Fixed test problems with translation fixes * Added no sudo access string to api messages * changed plain string to apiMessage for no sudo access messages
This commit is contained in:
committed by
Sabe Jones
parent
fac81bb9ee
commit
d95836b881
@@ -1,8 +1,8 @@
|
|||||||
import {
|
import {
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
|
||||||
resetHabiticaDB,
|
resetHabiticaDB,
|
||||||
} from '../../../../helpers/api-v3-integration.helper';
|
} from '../../../../helpers/api-v3-integration.helper';
|
||||||
|
import apiMessages from '../../../../../website/server/libs/apiMessages';
|
||||||
|
|
||||||
describe('GET /coupons/', () => {
|
describe('GET /coupons/', () => {
|
||||||
let user;
|
let user;
|
||||||
@@ -19,7 +19,7 @@ describe('GET /coupons/', () => {
|
|||||||
await expect(user.get('/coupons')).to.eventually.be.rejected.and.eql({
|
await expect(user.get('/coupons')).to.eventually.be.rejected.and.eql({
|
||||||
code: 401,
|
code: 401,
|
||||||
error: 'NotAuthorized',
|
error: 'NotAuthorized',
|
||||||
message: t('noSudoAccess'),
|
message: apiMessages('noSudoAccess'),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
resetHabiticaDB,
|
resetHabiticaDB,
|
||||||
} from '../../../../helpers/api-v3-integration.helper';
|
} from '../../../../helpers/api-v3-integration.helper';
|
||||||
import couponCode from 'coupon-code';
|
import couponCode from 'coupon-code';
|
||||||
|
import apiMessages from '../../../../../website/server/libs/apiMessages';
|
||||||
|
|
||||||
describe('POST /coupons/generate/:event', () => {
|
describe('POST /coupons/generate/:event', () => {
|
||||||
let user;
|
let user;
|
||||||
@@ -25,7 +26,7 @@ describe('POST /coupons/generate/:event', () => {
|
|||||||
await expect(user.post('/coupons/generate/aaa')).to.eventually.be.rejected.and.eql({
|
await expect(user.post('/coupons/generate/aaa')).to.eventually.be.rejected.and.eql({
|
||||||
code: 401,
|
code: 401,
|
||||||
error: 'NotAuthorized',
|
error: 'NotAuthorized',
|
||||||
message: t('noSudoAccess'),
|
message: apiMessages('noSudoAccess'),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ describe('DELETE /user', () => {
|
|||||||
})).to.eventually.be.rejected.and.eql({
|
})).to.eventually.be.rejected.and.eql({
|
||||||
code: 401,
|
code: 401,
|
||||||
error: 'NotAuthorized',
|
error: 'NotAuthorized',
|
||||||
message: t('incorrectDeletePhrase'),
|
message: t('incorrectDeletePhrase', {magicWord: 'DELETE'}),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import {
|
|||||||
import i18n from '../../../../../website/common/script/i18n';
|
import i18n from '../../../../../website/common/script/i18n';
|
||||||
import { ensureAdmin, ensureSudo } from '../../../../../website/server/middlewares/ensureAccessRight';
|
import { ensureAdmin, ensureSudo } from '../../../../../website/server/middlewares/ensureAccessRight';
|
||||||
import { NotAuthorized } from '../../../../../website/server/libs/errors';
|
import { NotAuthorized } from '../../../../../website/server/libs/errors';
|
||||||
|
import apiMessages from '../../../../../website/server/libs/apiMessages';
|
||||||
|
|
||||||
describe('ensure access middlewares', () => {
|
describe('ensure access middlewares', () => {
|
||||||
let res, req, next;
|
let res, req, next;
|
||||||
@@ -42,7 +43,7 @@ describe('ensure access middlewares', () => {
|
|||||||
|
|
||||||
ensureSudo(req, res, next);
|
ensureSudo(req, res, next);
|
||||||
|
|
||||||
expect(next).to.be.calledWith(new NotAuthorized(i18n.t('noSudoAccess')));
|
expect(next).to.be.calledWith(new NotAuthorized(apiMessages('noSudoAccess')));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('passes when user is a sudo user', () => {
|
it('passes when user is a sudo user', () => {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
.social-delete(v-if='!user.auth.local.email')
|
.social-delete(v-if='!user.auth.local.email')
|
||||||
h4 {{ $t('deleteAccount') }}
|
h4 {{ $t('deleteAccount') }}
|
||||||
.modal-body
|
.modal-body
|
||||||
p {{ $t('deleteSocialAccountText') }}
|
p {{ $t('deleteSocialAccountText', {magicWord: 'DELETE'}) }}
|
||||||
br
|
br
|
||||||
.row
|
.row
|
||||||
.col-md-6
|
.col-md-6
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
span {{ $t('enterprisePlansDescription') }}
|
span {{ $t('enterprisePlansDescription') }}
|
||||||
.row.row-margin
|
.row.row-margin
|
||||||
// TODO
|
// TODO
|
||||||
a.btn.btn-primary.btn-lg.btn-block(:href="'mailto:vicky@habitica.com?subject=' + $t('enterprisePlansEmailSubject')") {{ $t('enterprisePlansButton') }}
|
a.btn.btn-primary.btn-lg.btn-block(:href="'mailto:vicky@habitica.com?subject=' + enterprisePlansEmailSubject") {{ $t('enterprisePlansButton') }}
|
||||||
|
|
||||||
br
|
br
|
||||||
|
|
||||||
@@ -41,6 +41,11 @@
|
|||||||
components: {
|
components: {
|
||||||
StaticHeader,
|
StaticHeader,
|
||||||
},
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
enterprisePlansEmailSubject: 'Question regarding Enterprise Plans',
|
||||||
|
};
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
goToNewGroupPage () {
|
goToNewGroupPage () {
|
||||||
if (!this.$store.state.isUserLoggedIn) {
|
if (!this.$store.state.isUserLoggedIn) {
|
||||||
@@ -63,7 +68,7 @@
|
|||||||
eventLabel: 'Contact Us (Plans)',
|
eventLabel: 'Contact Us (Plans)',
|
||||||
});
|
});
|
||||||
|
|
||||||
window.location.href = `mailto:vicky@habitica.com?subject=${this.$t('enterprisePlansEmailSubject')}`;
|
window.location.href = `mailto:vicky@habitica.com?subject=${ this.enterprisePlansEmailSubject }`;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -253,7 +253,7 @@
|
|||||||
"missingNewPassword": "Missing new password.",
|
"missingNewPassword": "Missing new password.",
|
||||||
"invalidEmailDomain": "You cannot register with emails with the following domains: <%= domains %>",
|
"invalidEmailDomain": "You cannot register with emails with the following domains: <%= domains %>",
|
||||||
"wrongPassword": "Wrong password.",
|
"wrongPassword": "Wrong password.",
|
||||||
"incorrectDeletePhrase": "Please type DELETE in all caps to delete your account.",
|
"incorrectDeletePhrase": "Please type <%= magicWord %> in all caps to delete your account.",
|
||||||
"notAnEmail": "Invalid email address.",
|
"notAnEmail": "Invalid email address.",
|
||||||
"emailTaken": "Email address is already used in an account.",
|
"emailTaken": "Email address is already used in an account.",
|
||||||
"newEmailRequired": "Missing new email address.",
|
"newEmailRequired": "Missing new email address.",
|
||||||
|
|||||||
@@ -296,7 +296,6 @@
|
|||||||
"funExtras": "Fun Extras",
|
"funExtras": "Fun Extras",
|
||||||
"enterprisePlansButton": "Ask about Enterprise Plans",
|
"enterprisePlansButton": "Ask about Enterprise Plans",
|
||||||
"enterprisePlansDescription": "Looking for a larger install with custom needs? See if our enterprise plans are right for you.",
|
"enterprisePlansDescription": "Looking for a larger install with custom needs? See if our enterprise plans are right for you.",
|
||||||
"enterprisePlansEmailSubject": "Question regarding Enterprise Plans",
|
|
||||||
"familyPlansButton": "Sign Up for Family Plan Mailing List",
|
"familyPlansButton": "Sign Up for Family Plan Mailing List",
|
||||||
"familyPlansDescription": "Want a cozier solution to manage your household? Family Plans are coming soon!",
|
"familyPlansDescription": "Want a cozier solution to manage your household? Family Plans are coming soon!",
|
||||||
"createAGroup": "Create a Group",
|
"createAGroup": "Create a Group",
|
||||||
|
|||||||
@@ -95,7 +95,7 @@
|
|||||||
"plusOneGem": "+1 Gem",
|
"plusOneGem": "+1 Gem",
|
||||||
"typeNotSellable": "Type is not sellable. Must be one of the following <%= acceptedTypes %>",
|
"typeNotSellable": "Type is not sellable. Must be one of the following <%= acceptedTypes %>",
|
||||||
"userItemsKeyNotFound": "Key not found for user.items <%= type %>",
|
"userItemsKeyNotFound": "Key not found for user.items <%= type %>",
|
||||||
"userItemsNotEnough": "Not enough items found for user.items <%= type %>",
|
"userItemsNotEnough": "You do not have enough <%= type %>",
|
||||||
"pathRequired": "Path string is required",
|
"pathRequired": "Path string is required",
|
||||||
"unlocked": "Items have been unlocked",
|
"unlocked": "Items have been unlocked",
|
||||||
"alreadyUnlocked": "Full set already unlocked.",
|
"alreadyUnlocked": "Full set already unlocked.",
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
"resetText1": "WARNING! This resets many parts of your account. This is highly discouraged, but some people find it useful in the beginning after playing with the site for a short time.",
|
"resetText1": "WARNING! This resets many parts of your account. This is highly discouraged, but some people find it useful in the beginning after playing with the site for a short time.",
|
||||||
"resetText2": "You will lose all your levels, gold, and experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment but you will be able to buy it all back, including all limited edition equipment or subscriber Mystery items that you already own (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.",
|
"resetText2": "You will lose all your levels, gold, and experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment but you will be able to buy it all back, including all limited edition equipment or subscriber Mystery items that you already own (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.",
|
||||||
"deleteLocalAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type your password into the text box below.",
|
"deleteLocalAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type your password into the text box below.",
|
||||||
"deleteSocialAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type \"DELETE\" into the text box below.",
|
"deleteSocialAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type \"<%= magicWord %>\" into the text box below.",
|
||||||
"API": "API",
|
"API": "API",
|
||||||
"APIv3": "API v3",
|
"APIv3": "API v3",
|
||||||
"APIText": "Copy these for use in third party applications. However, think of your API Token like a password, and do not share it publicly. You may occasionally be asked for your User ID, but never post your API Token where others can see it, including on Github.",
|
"APIText": "Copy these for use in third party applications. However, think of your API Token like a password, and do not share it publicly. You may occasionally be asked for your User ID, but never post your API Token where others can see it, including on Github.",
|
||||||
|
|||||||
@@ -170,7 +170,6 @@
|
|||||||
"cardTypeNotAllowed": "Unknown card type.",
|
"cardTypeNotAllowed": "Unknown card type.",
|
||||||
"invalidCoupon": "Invalid coupon code.",
|
"invalidCoupon": "Invalid coupon code.",
|
||||||
"couponUsed": "Coupon code already used.",
|
"couponUsed": "Coupon code already used.",
|
||||||
"noSudoAccess": "You don't have sudo access.",
|
|
||||||
"couponCodeRequired": "The coupon code is required.",
|
"couponCodeRequired": "The coupon code is required.",
|
||||||
"eventRequired": "\"req.params.event\" is required.",
|
"eventRequired": "\"req.params.event\" is required.",
|
||||||
"countRequired": "\"req.query.count\" is required.",
|
"countRequired": "\"req.query.count\" is required.",
|
||||||
|
|||||||
@@ -395,7 +395,7 @@ api.deleteUser = {
|
|||||||
let isValidPassword = await passwordUtils.compare(user, password);
|
let isValidPassword = await passwordUtils.compare(user, password);
|
||||||
if (!isValidPassword) throw new NotAuthorized(res.t('wrongPassword'));
|
if (!isValidPassword) throw new NotAuthorized(res.t('wrongPassword'));
|
||||||
} else if ((user.auth.facebook.id || user.auth.google.id) && password !== DELETE_CONFIRMATION) {
|
} else if ((user.auth.facebook.id || user.auth.google.id) && password !== DELETE_CONFIRMATION) {
|
||||||
throw new NotAuthorized(res.t('incorrectDeletePhrase'));
|
throw new NotAuthorized(res.t('incorrectDeletePhrase', {magicWord: 'DELETE'}));
|
||||||
}
|
}
|
||||||
|
|
||||||
let feedback = req.body.feedback;
|
let feedback = req.body.feedback;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ const messages = {
|
|||||||
guildsPageInteger: 'req.query.page must be an integer greater than or equal to 0.',
|
guildsPageInteger: 'req.query.page must be an integer greater than or equal to 0.',
|
||||||
groupIdRequired: 'req.params.groupId must contain a groupId.',
|
groupIdRequired: 'req.params.groupId must contain a groupId.',
|
||||||
managerIdRequired: 'req.body.managerId must contain a user ID.',
|
managerIdRequired: 'req.body.managerId must contain a user ID.',
|
||||||
|
noSudoAccess: 'You don\'t have sudo access',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function (msgKey, vars = {}) {
|
export default function (msgKey, vars = {}) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
NotAuthorized,
|
NotAuthorized,
|
||||||
} from '../libs/errors';
|
} from '../libs/errors';
|
||||||
|
import apiMessages from '../libs/apiMessages';
|
||||||
|
|
||||||
export function ensureAdmin (req, res, next) {
|
export function ensureAdmin (req, res, next) {
|
||||||
let user = res.locals.user;
|
let user = res.locals.user;
|
||||||
@@ -16,7 +17,7 @@ export function ensureSudo (req, res, next) {
|
|||||||
let user = res.locals.user;
|
let user = res.locals.user;
|
||||||
|
|
||||||
if (!user.contributor.sudo) {
|
if (!user.contributor.sudo) {
|
||||||
return next(new NotAuthorized(res.t('noSudoAccess')));
|
return next(new NotAuthorized(apiMessages('noSudoAccess')));
|
||||||
}
|
}
|
||||||
|
|
||||||
next();
|
next();
|
||||||
|
|||||||
Reference in New Issue
Block a user