nodebb-plugin-anti-account-sharing 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/library.js +32 -29
- package/package.json +1 -1
package/library.js
CHANGED
|
@@ -6,7 +6,7 @@ const user = require.main.require('./src/user');
|
|
|
6
6
|
const Plugin = {};
|
|
7
7
|
|
|
8
8
|
// --- AYARLAR ---
|
|
9
|
-
const MAX_DEVICES = 1; //
|
|
9
|
+
const MAX_DEVICES = 1; // kaç bilgisayar?
|
|
10
10
|
|
|
11
11
|
function isMobile(req) {
|
|
12
12
|
const ua = req?.headers?.['user-agent'] || '';
|
|
@@ -14,52 +14,58 @@ function isMobile(req) {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
Plugin.init = async function () {
|
|
17
|
-
console.log(`[Anti-Share]
|
|
17
|
+
console.log(`[Anti-Share] Aktif ✅ (Limit: ${MAX_DEVICES} PC)`);
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
//
|
|
20
|
+
// Login olduğunda session ekle (req gelmezse bile sorun değil, aşağıda fallback var)
|
|
21
21
|
Plugin.recordSession = async function (data) {
|
|
22
22
|
const req = data?.req;
|
|
23
23
|
const uid = data?.uid;
|
|
24
24
|
|
|
25
|
-
// req yoksa sessizce çık (bazı akışlarda gelemeyebiliyor)
|
|
26
25
|
if (!req || !uid || !req.sessionID) return;
|
|
27
|
-
|
|
28
|
-
// Mobil girişleri takip etmiyoruz
|
|
29
26
|
if (isMobile(req)) return;
|
|
30
27
|
|
|
31
|
-
const key = `antishare:
|
|
28
|
+
const key = `antishare:sessionsz:${uid}`; // <-- DİKKAT: yeni key (zset)
|
|
29
|
+
const sid = req.sessionID;
|
|
30
|
+
|
|
31
|
+
// Eğer yoksa ekle (varsa score'u güncelleme!)
|
|
32
|
+
const all = await db.getSortedSetRevRange(key, 0, -1);
|
|
33
|
+
if (!all.includes(sid)) {
|
|
34
|
+
await db.sortedSetAdd(key, Date.now(), sid);
|
|
35
|
+
}
|
|
32
36
|
|
|
33
|
-
//
|
|
34
|
-
await db.
|
|
35
|
-
|
|
37
|
+
// sadece son MAX_DEVICES tut
|
|
38
|
+
const newest = await db.getSortedSetRevRange(key, 0, -1);
|
|
39
|
+
const toRemove = newest.slice(MAX_DEVICES);
|
|
40
|
+
if (toRemove.length) {
|
|
41
|
+
await db.sortedSetRemove(key, toRemove);
|
|
42
|
+
}
|
|
36
43
|
};
|
|
37
44
|
|
|
38
|
-
//
|
|
45
|
+
// Her page + api isteğinde kontrol
|
|
39
46
|
Plugin.checkSession = async function (data) {
|
|
40
47
|
const req = data?.req;
|
|
41
48
|
const res = data?.res;
|
|
42
49
|
|
|
43
50
|
if (!req || !res) return data;
|
|
44
|
-
|
|
45
|
-
// login değilse veya mobilse karışma
|
|
46
51
|
if (!req.uid || req.uid <= 0 || isMobile(req)) return data;
|
|
47
52
|
|
|
48
|
-
// admin ise karışma
|
|
49
53
|
const isAdmin = await user.isAdministrator(req.uid);
|
|
50
54
|
if (isAdmin) return data;
|
|
51
55
|
|
|
52
|
-
const
|
|
53
|
-
|
|
56
|
+
const sid = req.sessionID;
|
|
57
|
+
if (!sid) return data;
|
|
58
|
+
|
|
59
|
+
const key = `antishare:sessionsz:${req.uid}`;
|
|
54
60
|
|
|
55
|
-
//
|
|
56
|
-
|
|
61
|
+
// Sadece en yeni MAX_DEVICES session allowed
|
|
62
|
+
const allowed = await db.getSortedSetRevRange(key, 0, MAX_DEVICES - 1);
|
|
57
63
|
|
|
58
|
-
//
|
|
59
|
-
if (!
|
|
64
|
+
// Eğer henüz kayıt yoksa (çok nadir) karışma
|
|
65
|
+
if (!Array.isArray(allowed) || !allowed.length) return data;
|
|
60
66
|
|
|
61
|
-
|
|
62
|
-
|
|
67
|
+
// allowed değilse -> kick
|
|
68
|
+
if (!allowed.includes(sid)) {
|
|
63
69
|
try { req.logout?.(); } catch (e) {}
|
|
64
70
|
if (req.session) {
|
|
65
71
|
try { req.session.destroy(() => {}); } catch (e) {}
|
|
@@ -71,17 +77,14 @@ Plugin.checkSession = async function (data) {
|
|
|
71
77
|
req.originalUrl?.startsWith('/api/');
|
|
72
78
|
|
|
73
79
|
if (wantsJson) {
|
|
74
|
-
res.status(401).json({
|
|
75
|
-
|
|
76
|
-
message: 'Maksimum cihaz sınırına ulaşıldı.',
|
|
77
|
-
});
|
|
78
|
-
return; // IMPORTANT: response bitti
|
|
80
|
+
res.status(401).json({ error: 'session_terminated', message: 'Maksimum cihaz sınırına ulaşıldı.' });
|
|
81
|
+
return;
|
|
79
82
|
}
|
|
80
83
|
|
|
81
84
|
res.redirect('/login?error=session-conflict');
|
|
82
|
-
return;
|
|
85
|
+
return;
|
|
83
86
|
}
|
|
84
|
-
|
|
87
|
+
|
|
85
88
|
return data;
|
|
86
89
|
};
|
|
87
90
|
|
package/package.json
CHANGED