From 492824ac900b4ef8fe5a3b3f6b7242476ff638ac Mon Sep 17 00:00:00 2001 From: Rarysson Guilherme Date: Sat, 5 Feb 2022 12:26:17 -0300 Subject: [PATCH 01/10] Add automatic year detection on appFooter --- website/client/src/components/appFooter.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/website/client/src/components/appFooter.vue b/website/client/src/components/appFooter.vue index ad76bb6d47..be1fd00313 100644 --- a/website/client/src/components/appFooter.vue +++ b/website/client/src/components/appFooter.vue @@ -224,7 +224,7 @@
- © 2021 Habitica. All rights reserved. + © {{ currentYear }} Habitica. All rights reserved.
Date: Thu, 31 Mar 2022 16:39:53 -0400 Subject: [PATCH 02/10] Update faceAvatar.vue so snowman ACTUALLY shows up (#13911) --- website/client/src/components/faceAvatar.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/client/src/components/faceAvatar.vue b/website/client/src/components/faceAvatar.vue index 9286dd0d81..73f739aa82 100644 --- a/website/client/src/components/faceAvatar.vue +++ b/website/client/src/components/faceAvatar.vue @@ -112,7 +112,7 @@ export default { }, visualBuffs () { return { - snowball: 'snowman', + snowball: `avatar_snowball_${this.member.stats.class}`, spookySparkles: 'ghost', shinySeed: `avatar_floral_${this.member.stats.class}`, seafoam: 'seafoam_star', From 06d982401ace0944fd378069f336f3d79d7a2bf8 Mon Sep 17 00:00:00 2001 From: Natalie L <78037386+CuriousMagpie@users.noreply.github.com> Date: Thu, 31 Mar 2022 16:59:36 -0400 Subject: [PATCH 03/10] Update: Revised text string for zodiacZookeeper and birdsOfAFeather achievements (#13884) * updated text string for zodiacZooKeeper and birdsOfAFeather * added peacock and rooster (oops!) --- website/common/locales/en/achievements.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/common/locales/en/achievements.json b/website/common/locales/en/achievements.json index a8e4c796b5..2ff851bd0c 100644 --- a/website/common/locales/en/achievements.json +++ b/website/common/locales/en/achievements.json @@ -125,9 +125,9 @@ "achievementShadeOfItAllText": "Has tamed all Shade Mounts.", "achievementShadeOfItAllModalText": "You tamed all the Shade Mounts!", "achievementZodiacZookeeper": "Zodiac Zookeeper", - "achievementZodiacZookeeperText": "Has hatched all the zodiac pets: Rat, Cow, Bunny, Snake, Horse, Sheep, Monkey, Rooster, Wolf, Tiger, Flying Pig, and Dragon!", + "achievementZodiacZookeeperText": "Has hatched all standard colors of zodiac pets: Rat, Cow, Bunny, Snake, Horse, Sheep, Monkey, Rooster, Wolf, Tiger, Flying Pig, and Dragon!", "achievementZodiacZookeeperModalText": "You collected all the zodiac pets!", "achievementBirdsOfAFeather": "Birds of a Feather", - "achievementBirdsOfAFeatherText": "Has hatched all the flying pets: Flying Pig, Owl, Parrot, Pterodactyl, Gryphon, Falcon, Peacock, and Rooster.", + "achievementBirdsOfAFeatherText": "Has hatched all standard colors of flying pets: Flying Pig, Owl, Parrot, Pterodactyl, Gryphon, Falcon, Peacock, and Rooster.", "achievementBirdsOfAFeatherModalText":"You collected all the flying pets!" } From 9ff0766910d2ef169574b54106bf3aea4405ea39 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 31 Mar 2022 23:32:59 +0200 Subject: [PATCH 04/10] Fix cron not running if previous run failed (#13892) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * catch issue where cron wouldn’t run bc previous run failed * add some more tests for cron middleware * fix lint --- test/api/unit/middlewares/cronMiddleware.js | 45 +++++++++++++++++++++ test/api/unit/models/user.test.js | 10 +++++ website/server/models/user/methods.js | 10 +++-- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/test/api/unit/middlewares/cronMiddleware.js b/test/api/unit/middlewares/cronMiddleware.js index 873bbb70a7..fea4384c26 100644 --- a/test/api/unit/middlewares/cronMiddleware.js +++ b/test/api/unit/middlewares/cronMiddleware.js @@ -128,6 +128,22 @@ describe('cron middleware', () => { }); }); + it('runs cron if previous cron was incomplete', async () => { + user.lastCron = moment(new Date()).subtract({ days: 1 }); + user.auth.timestamps.loggedin = moment(new Date()).subtract({ days: 4 }); + const now = new Date(); + await user.save(); + + await new Promise((resolve, reject) => { + cronMiddleware(req, res, err => { + if (err) return reject(err); + expect(moment(now).isSame(user.lastCron, 'day')); + expect(moment(now).isSame(user.auth.timestamps.loggedin, 'day')); + return resolve(); + }); + }); + }); + it('updates user.auth.timestamps.loggedin and lastCron', async () => { user.lastCron = moment(new Date()).subtract({ days: 2 }); const now = new Date(); @@ -293,4 +309,33 @@ describe('cron middleware', () => { }); }); }); + + it('cron should not run more than once', async () => { + user.lastCron = moment(new Date()).subtract({ days: 2 }); + await user.save(); + + sandbox.spy(cronLib, 'cron'); + + await Promise.all([new Promise((resolve, reject) => { + cronMiddleware(req, res, err => { + if (err) return reject(err); + return resolve(); + }); + }), new Promise((resolve, reject) => { + cronMiddleware(req, res, err => { + if (err) return reject(err); + return resolve(); + }); + }), new Promise((resolve, reject) => { + setTimeout(() => { + cronMiddleware(req, res, err => { + if (err) return reject(err); + return resolve(); + }); + }, 400); + }), + ]); + + expect(cronLib.cron).to.be.calledOnce; + }); }); diff --git a/test/api/unit/models/user.test.js b/test/api/unit/models/user.test.js index 27c61485d9..d559ba0025 100644 --- a/test/api/unit/models/user.test.js +++ b/test/api/unit/models/user.test.js @@ -811,6 +811,16 @@ describe('User Model', () => { expect(daysMissed).to.eql(5); }); + it('correctly handles a cron that did not complete', () => { + const now = moment(); + user.lastCron = moment(now).subtract(2, 'days'); + user.auth.timestamps.loggedIn = moment(now).subtract(5, 'days'); + + const { daysMissed } = user.daysUserHasMissed(now); + + expect(daysMissed).to.eql(5); + }); + it('uses timezone from preferences to calculate days missed', () => { const now = moment('2017-07-08 01:00:00Z'); user.lastCron = moment('2017-07-04 13:00:00Z'); diff --git a/website/server/models/user/methods.js b/website/server/models/user/methods.js index c4231fbaa2..2c5e62f29a 100644 --- a/website/server/models/user/methods.js +++ b/website/server/models/user/methods.js @@ -382,8 +382,12 @@ schema.methods.daysUserHasMissed = function daysUserHasMissed (now, req = {}) { timezoneUtcOffsetFromUserPrefs = timezoneUtcOffsetFromBrowser; } + let lastCronTime = this.lastCron; + if (this.auth.timestamps.loggedIn < lastCronTime) { + lastCronTime = this.auth.timestamps.loggedIn; + } // How many days have we missed using the user's current timezone: - let daysMissed = daysSince(this.lastCron, defaults({ now }, this.preferences)); + let daysMissed = daysSince(lastCronTime, defaults({ now }, this.preferences)); if (timezoneUtcOffsetAtLastCron !== timezoneUtcOffsetFromUserPrefs) { // Give the user extra time based on the difference in timezones @@ -395,7 +399,7 @@ schema.methods.daysUserHasMissed = function daysUserHasMissed (now, req = {}) { // Since cron last ran, the user's timezone has changed. // How many days have we missed using the old timezone: const daysMissedNewZone = daysMissed; - const daysMissedOldZone = daysSince(this.lastCron, defaults({ + const daysMissedOldZone = daysSince(lastCronTime, defaults({ now, timezoneUtcOffsetOverride: timezoneUtcOffsetAtLastCron, }, this.preferences)); @@ -435,7 +439,7 @@ schema.methods.daysUserHasMissed = function daysUserHasMissed (now, req = {}) { const timezoneOffsetDiff = timezoneUtcOffsetFromUserPrefs - timezoneUtcOffsetAtLastCron; // e.g., for dangerous zone change: -300 - -240 = -60 or 600 - 660= -60 - this.lastCron = moment(this.lastCron).subtract(timezoneOffsetDiff, 'minutes'); + this.lastCron = moment(lastCronTime).subtract(timezoneOffsetDiff, 'minutes'); // NB: We don't change this.auth.timestamps.loggedin so that will still record // the time that the previous cron actually ran. // From now on we can ignore the old timezone: From 55cf2f97956299c83109506a4204394a09fadfa1 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 31 Mar 2022 23:43:16 +0200 Subject: [PATCH 05/10] Improve flows for social auth users (#13862) * Multiple fixes for social authentication flows * frontend changes * add missing computed property * Improvements to social flows * fix existing email error * minor fixes * fix space * fix test * fix lint Co-authored-by: SabreCat --- website/client/src/components/appFooter.vue | 2 +- .../components/auth/registerLoginReset.vue | 6 +- .../client/src/components/bugReportModal.vue | 25 ++++-- .../src/components/bugReportSuccessModal.vue | 19 ++-- .../client/src/components/groups/tavern.vue | 2 +- website/client/src/components/header/menu.vue | 2 +- .../src/components/settings/deleteModal.vue | 4 +- .../client/src/components/settings/site.vue | 31 +++++-- .../src/components/shared/closeIcon.vue | 2 +- .../client/src/components/static/contact.vue | 2 +- .../client/src/components/static/privacy.vue | 89 ++++++++++++++----- .../client/src/components/static/terms.vue | 65 +++++++++----- website/common/locales/el/settings.json | 1 + website/common/locales/en/front.json | 7 +- website/common/locales/en/settings.json | 1 + website/server/controllers/api-v3/auth.js | 28 ++++-- website/server/libs/auth/index.js | 5 +- website/server/libs/password.js | 4 +- website/server/models/user/hooks.js | 6 ++ 19 files changed, 213 insertions(+), 88 deletions(-) diff --git a/website/client/src/components/appFooter.vue b/website/client/src/components/appFooter.vue index 61ba4d08e4..f41be288aa 100644 --- a/website/client/src/components/appFooter.vue +++ b/website/client/src/components/appFooter.vue @@ -84,8 +84,8 @@
  • {{ $t('reportBug') }} diff --git a/website/client/src/components/auth/registerLoginReset.vue b/website/client/src/components/auth/registerLoginReset.vue index b406b124c3..face9f7512 100644 --- a/website/client/src/components/auth/registerLoginReset.vue +++ b/website/client/src/components/auth/registerLoginReset.vue @@ -20,8 +20,8 @@
  • {{ $t('email') }} + >{{ $t('emailOrUsername') }}
    diff --git a/website/client/src/components/bugReportModal.vue b/website/client/src/components/bugReportModal.vue index 91fda2a859..92d096264d 100644 --- a/website/client/src/components/bugReportModal.vue +++ b/website/client/src/components/bugReportModal.vue @@ -12,12 +12,18 @@ {{ $t('reportBug') }} -
    +
    {{ $t('reportBugHeaderDescribe') }}
    - +
    @@ -34,7 +40,10 @@ > {{ $t('email') }} -
    +
    {{ $t('reportEmailText') }}
    -
    +
    {{ $t('reportEmailError') }}
    @@ -55,7 +67,10 @@ -
    +
    {{ $t('reportDescriptionText') }}