mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-15 05:37:22 +01:00
* add date check
* achievements modal polishing
* refresh private-messages page when you are already on it
* add countbadge knob to change the example
* fix lint
* typos
* typos
* typos
* add toggle for achievements categories
* typo
* fix test
* fix edit avatar modal cannot be closed
* WIP(settings): subscriber page improvements
* WIP(subscriptions): more design build-out
* fix(css): disabled button styles
* fix(css): better Amazon targeting
* fix hide tooltip + align header correctly
* disable perfect scroll
* load messages on refresh event
* fix header label + conversation actions not breaking layout on hover
* WIP(g1g1): notif
* WIP(g1g1): notif cont'd
* fix(test): snowball change
* fix(event): feature NYE card
* chore(sprites): compile
* fix(bgs): include TT required field
* add gifting banner to the max height calculation
* chore(event): enable winter customizations
* WIP(gifting): partial modal implementation
* feat(gifting): select giftee modal
* fix(gifting): notification order, modal dismiss
* Begin implementing sign in with apple
# Conflicts:
# package-lock.json
# website/common/script/constants.js
# website/server/libs/auth/social.js
# website/server/models/user/schema.js
* Add apple sign in button to website
* fix lint errors
* fix config json
* fix(modals): correct some repops
* fix(gifting): style updates
* fix(buy): modal style changes
* fix(modals): also clean out "prev"
* Attempt workaround for sign in with apple on android
* temporarily log everything as error
* refactor(modals): hide in dismiss event
* fix temporary test failure
* changes to sign in with apple
* fix: first batch of layout issues for private messages + auto sizing textarea
* fix(modals): new dismiss logic
* fix(modals): new dismiss no go??
* Only use email scope
* print debugging
* .
* ..
* ...
* username second line - open profile on face-avatar/conversation name - fix textarea height
* temporarily disable apple auth and just return data for debugging
* Hopefully this works
* .....
* WIP(subscription): unsubscribed state
* .
* ..
* MAYBE THIS ACTUALLY WORKS???
* Implement apple sign in
* fix some urls
* fix urls
* fix redirect and auth
* attempt to also request name
* fix lint error
* WIP(subscription): partial subscribed
* chore(sprites): compile
* Change approach so that it actually works
* fix config error
* fix lint errors
* Fix
* fix lint error
* lint error
* WIP(subscription): finish subscribed
* refresh on sync
* new "you dont have any messages" style + changed min textarea height
* new conversationItem style / layout
* reset message unread on reload
* chore(npm): update package-locks
* fix styles / textarea height
* feat(subscription): revised sub page RC
* list optOut / chatRevoked informations for each conversation + show why its disabled
* Improve apple redirect view
* Fix apple icon on group task registration page
* WIP(adventure): prereqs
* Block / Unblock - correct disabled states - $gray-200 instead of 300/400
* canReceive not checking chatRevoked
* fix: faceAvatar / userLink open the selected conversation user
* check if the target user is blocking the logged-in user
* fix(subs): style tweaks
* fix(profiles): short circuit contributor
Attempted fix for #11830
* chore(sprites): compile
* fix(content): missing potion data
* fix(content): missing string
* WIP(drops): new modal
* fix(subs): moar style tweaks
* check if blocks is undefined
* max-height instead of height
* fix "no messages" state + canReceive on a new conversation
* WIP(adventure): analytics fixes etc
* Improve apple signin handling
* fixed conversations width (280px on max 768 width page)
* feat(adventure): random egg+potion on 2nd task
* fix(lint): noworkies
* fix(modal): correctly construct classes
* fix(tests): expectations and escape
* Fix typo
* use base url from env variables
* fix lint
* call autosize after message is sent
* fix urls
* always verify token
* throw error when social auth could not retrieve id
* Store emails correctly for apple auth
* Retrieve name when authenticating through apple
* Fix lint errors
* fix all lint errors
* fix(content): missing strings
* Revert "always verify token"
This reverts commit 8ac40c76bf.
# Conflicts:
# website/server/libs/auth/social.js
* Correctly load name
* remove extra changes
* remove extra logger call
* reset package and package-lock
* add back missing packages
* use name from apple
* add support for multiple apple public keys
* add some unit and integration tests
* add apple auth integration test
* tweak social signup buttons
* pixel pushing
Co-authored-by: Matteo Pagliazzi <matteopagliazzi@gmail.com>
Co-authored-by: Sabe Jones <sabrecat@gmail.com>
Co-authored-by: negue <eugen.bolz@gmail.com>
Co-authored-by: Phillip Thelen <phillip@habitica.com>
127 lines
3.3 KiB
JavaScript
127 lines
3.3 KiB
JavaScript
import passport from 'passport';
|
|
import common from '../../../common';
|
|
import { BadRequest } from '../errors';
|
|
import logger from '../logger';
|
|
import {
|
|
generateUsername,
|
|
loginRes,
|
|
} from './utils';
|
|
import { appleProfile } from './apple';
|
|
import { model as User } from '../../models/user';
|
|
import { model as EmailUnsubscription } from '../../models/emailUnsubscription';
|
|
import { sendTxn as sendTxnEmail } from '../email';
|
|
|
|
function _passportProfile (network, accessToken) {
|
|
return new Promise((resolve, reject) => {
|
|
passport._strategies[network].userProfile(accessToken, (err, profile) => {
|
|
if (err) {
|
|
reject(err);
|
|
} else {
|
|
resolve(profile);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
export async function loginSocial (req, res) { // eslint-disable-line import/prefer-default-export
|
|
const existingUser = res.locals.user;
|
|
const { network } = req.body;
|
|
|
|
const isSupportedNetwork = common.constants.SUPPORTED_SOCIAL_NETWORKS
|
|
.find(supportedNetwork => supportedNetwork.key === network);
|
|
if (!isSupportedNetwork) throw new BadRequest(res.t('unsupportedNetwork'));
|
|
|
|
let profile = {};
|
|
if (network === 'apple') {
|
|
profile = await appleProfile(req);
|
|
} else {
|
|
const accessToken = req.body.authResponse.access_token;
|
|
profile = await _passportProfile(network, accessToken);
|
|
}
|
|
|
|
if (!profile.id) throw new BadRequest(res.t('invalidData'));
|
|
|
|
let user = await User.findOne({
|
|
[`auth.${network}.id`]: profile.id,
|
|
}, { _id: 1, apiToken: 1, auth: 1 }).exec();
|
|
|
|
// User already signed up
|
|
if (user) {
|
|
return loginRes(user, req, res);
|
|
}
|
|
|
|
const generatedUsername = generateUsername();
|
|
|
|
user = {
|
|
auth: {
|
|
[network]: {
|
|
id: profile.id,
|
|
emails: profile.emails,
|
|
},
|
|
local: {
|
|
username: generatedUsername,
|
|
lowerCaseUsername: generatedUsername,
|
|
},
|
|
},
|
|
profile: {
|
|
name: profile.displayName || profile.name || profile.username,
|
|
},
|
|
preferences: {
|
|
language: req.language,
|
|
},
|
|
flags: {
|
|
verifiedUsername: true,
|
|
},
|
|
};
|
|
|
|
if (existingUser) {
|
|
existingUser.auth[network] = user.auth[network];
|
|
user = existingUser;
|
|
} else {
|
|
user = new User(user);
|
|
user.registeredThrough = req.headers['x-client']; // Not saved, used to create the correct tasks based on the device used
|
|
}
|
|
|
|
const savedUser = await user.save();
|
|
|
|
if (!existingUser) {
|
|
user.newUser = true;
|
|
}
|
|
|
|
const response = loginRes(user, req, res);
|
|
|
|
// Clean previous email preferences
|
|
if (
|
|
savedUser.auth[network].emails
|
|
&& savedUser.auth[network].emails[0]
|
|
&& savedUser.auth[network].emails[0].value
|
|
) {
|
|
EmailUnsubscription
|
|
.remove({ email: savedUser.auth[network].emails[0].value.toLowerCase() })
|
|
.exec()
|
|
.then(() => {
|
|
if (!existingUser) {
|
|
if (savedUser._ABtests && savedUser._ABtests.welcomeEmailSplit) {
|
|
sendTxnEmail(savedUser, savedUser._ABtests.welcomeEmailSplit);
|
|
} else {
|
|
sendTxnEmail(savedUser, 'welcome');
|
|
}
|
|
}
|
|
})
|
|
.catch(err => logger.error(err)); // eslint-disable-line max-nested-callbacks
|
|
}
|
|
|
|
if (!existingUser) {
|
|
res.analytics.track('register', {
|
|
category: 'acquisition',
|
|
type: network,
|
|
gaLabel: network,
|
|
uuid: savedUser._id,
|
|
headers: req.headers,
|
|
user: savedUser,
|
|
});
|
|
}
|
|
|
|
return response;
|
|
}
|