🛂 refactor(openidStrategy): Use Strategy Functions for Avatars (#2467)

This commit is contained in:
Danny Avila 2024-04-19 09:12:55 -04:00 committed by GitHub
parent f406a85633
commit de3987cbaf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,9 +1,7 @@
const fs = require('fs');
const path = require('path');
const axios = require('axios');
const passport = require('passport'); const passport = require('passport');
const jwtDecode = require('jsonwebtoken/decode'); const jwtDecode = require('jsonwebtoken/decode');
const { Issuer, Strategy: OpenIDStrategy } = require('openid-client'); const { Issuer, Strategy: OpenIDStrategy } = require('openid-client');
const { getStrategyFunctions } = require('~/server/services/Files/strategies');
const { logger } = require('~/config'); const { logger } = require('~/config');
const User = require('~/models/User'); const User = require('~/models/User');
@ -13,22 +11,31 @@ try {
} catch (err) { } catch (err) {
logger.error('[openidStrategy] crypto support is disabled!', err); logger.error('[openidStrategy] crypto support is disabled!', err);
} }
/**
* Downloads an image from a URL using an access token.
* @param {string} url
* @param {string} accessToken
* @returns {Promise<Buffer>}
*/
const downloadImage = async (url, accessToken) => {
if (!url) {
return '';
}
const downloadImage = async (url, imagePath, accessToken) => {
try { try {
const response = await axios.get(url, { const response = await fetch(url, {
method: 'GET',
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
}, },
responseType: 'arraybuffer',
}); });
fs.mkdirSync(path.dirname(imagePath), { recursive: true }); if (response.ok) {
fs.writeFileSync(imagePath, response.data); const buffer = await response.buffer();
return buffer;
const fileName = path.basename(imagePath); } else {
throw new Error(`${response.statusText} (HTTP ${response.status})`);
return `/images/openid/${fileName}`; }
} catch (error) { } catch (error) {
logger.error( logger.error(
`[openidStrategy] downloadImage: Error downloading image at URL "${url}": ${error}`, `[openidStrategy] downloadImage: Error downloading image at URL "${url}": ${error}`,
@ -124,7 +131,9 @@ async function setupOpenId() {
} }
} }
const username = convertToUsername(userinfo.username || userinfo.given_name || userinfo.email); const username = convertToUsername(
userinfo.username || userinfo.given_name || userinfo.email,
);
if (!user) { if (!user) {
user = new User({ user = new User({
@ -143,6 +152,7 @@ async function setupOpenId() {
} }
if (userinfo.picture) { if (userinfo.picture) {
/** @type {string | undefined} */
const imageUrl = userinfo.picture; const imageUrl = userinfo.picture;
let fileName; let fileName;
@ -154,24 +164,18 @@ async function setupOpenId() {
fileName = userinfo.sub + '.png'; fileName = userinfo.sub + '.png';
} }
const imagePath = path.join( const imageBuffer = await downloadImage(imageUrl, tokenset.access_token);
__dirname, const { saveBuffer } = getStrategyFunctions(process.env.CDN_PROVIDER);
'..', if (imageBuffer) {
'..', const imagePath = await saveBuffer({
'client', fileName,
'public', userId: user._id.toString(),
'images', buffer: imageBuffer,
'openid', });
fileName, user.avatar = imagePath ?? '';
); } else {
user.avatar = '';
const imagePathOrEmpty = await downloadImage( }
imageUrl,
imagePath,
tokenset.access_token,
);
user.avatar = imagePathOrEmpty;
} else { } else {
user.avatar = ''; user.avatar = '';
} }