-
Notifications
You must be signed in to change notification settings - Fork 9
/
library.js
132 lines (107 loc) · 3.77 KB
/
library.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
'use strict';
const user = require.main.require('./src/user');
const meta = require.main.require('./src/meta');
const db = require.main.require('./src/database');
const winston = require.main.require('winston');
const async = require('async');
const crypto = require('crypto');
const controllers = require('./lib/controllers');
const plugin = {};
plugin.init = async (params) => {
const { router } = params;
const hostMiddleware = params.middleware;
router.get('/admin/plugins/gravatar', hostMiddleware.admin.buildHeader, controllers.renderAdminPage);
router.get('/api/admin/plugins/gravatar', controllers.renderAdminPage);
};
plugin.addAdminNavigation = async (header) => {
header.plugins.push({
route: '/plugins/gravatar',
icon: 'fa-picture',
name: 'Gravatar',
});
return header;
};
plugin.list = async (data) => {
const { email, username } = await user.getUserFields(data.uid, ['email', 'username']);
data.pictures.push({
type: 'gravatar',
url: await getGravatarUrl(email, username),
text: 'Gravatar',
});
return data;
};
plugin.get = async (data) => {
if (data.type === 'gravatar') {
const { email, username } = await user.getUserFields(data.uid, ['email', 'username']);
data.picture = await getGravatarUrl(email, username);
}
return data;
};
plugin.updateUser = async (data) => {
const { default: useDefault } = await meta.settings.get('gravatar');
if (useDefault === 'on') {
winston.verbose(`[plugin/gravatar] Updating uid ${data.user.uid} to use gravatar`);
data.user.picture = await getGravatarUrl(data.user.email, data.user.username);
}
return data;
};
plugin.onForceEnabled = async (users) => {
const { default: useDefault, force } = await meta.settings.get('gravatar');
if (force === 'on') {
users = await Promise.all(users.map(async (userObj) => {
if (!userObj) {
return userObj;
}
if (!userObj.email) {
const email = await db.getObjectField(`user:${userObj.uid}`, 'email');
userObj.picture = await getGravatarUrl(email, userObj.username);
} else {
userObj.picture = await getGravatarUrl(userObj.email, userObj.username);
}
return userObj;
}));
} else if (plugin.hasOwnProperty('settings') && useDefault === 'on') {
users = await Promise.all(users.map(async (userObj) => {
if (!userObj) {
return userObj;
}
if (userObj.picture === null || userObj.picture === '') {
if (!userObj.email) {
const email = await db.getObjectField(`user:${userObj.uid}`, 'email');
userObj.picture = await getGravatarUrl(email, userObj.username);
} else {
userObj.picture = await getGravatarUrl(userObj.email, userObj.username);
}
}
return userObj;
}));
}
return users;
};
async function getGravatarUrl(userEmail, username) {
const email = userEmail || '';
const size = parseInt(meta.config.profileImageDimension, 10) || 128;
let baseUrl = `https://www.gravatar.com/avatar/${sum(email)}?size=192`;
let { customDefault, iconDefault } = await meta.settings.get('gravatar');
if (customDefault) {
// If custom avatar provider is a URL, replace possible variables with values.
if (customDefault.indexOf('http') === 0) { // Use explicit check for increased readability.
customDefault = customDefault.replace(/%md5/i, sum(email));
customDefault = customDefault.replace(/%email/i, email);
customDefault = customDefault.replace(/%user/i, username);
customDefault = customDefault.replace(/%size/i, size);
customDefault = customDefault.replace(/%userhash/i, sum(username));
}
baseUrl += `&d=${encodeURIComponent(customDefault)}`;
} else if (iconDefault) {
baseUrl += `&d=${iconDefault}`;
}
return baseUrl;
}
function sum(email) {
let md5sum = crypto.createHash('md5');
md5sum.update(String(email).trim().toLowerCase());
md5sum = md5sum.digest('hex');
return md5sum;
}
module.exports = plugin;