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.
Files changed (2) hide show
  1. package/library.js +32 -29
  2. 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; // Kaç bilgisayara izin verilsin?
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] Güvenlik Aktif (Limit: ${MAX_DEVICES} Bilgisayar) 🛡️`);
17
+ console.log(`[Anti-Share] Aktif (Limit: ${MAX_DEVICES} PC)`);
18
18
  };
19
19
 
20
- // 1) Login olunca session kaydet
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:sessions:${uid}`;
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
- // Yeni oturumu sona ekle, sonra sadece son MAX_DEVICES kadarını tut
34
- await db.listAppend(key, req.sessionID);
35
- await db.listTrim(key, -MAX_DEVICES, -1);
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
- // 2) Her page + api isteğinde kontrol
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 key = `antishare:sessions:${req.uid}`;
53
- const validSessions = await db.getListRange(key, 0, -1);
56
+ const sid = req.sessionID;
57
+ if (!sid) return data;
58
+
59
+ const key = `antishare:sessionsz:${req.uid}`;
54
60
 
55
- // liste boşsa (ilk login vs.) karışma
56
- if (!Array.isArray(validSessions) || !validSessions.length) return data;
61
+ // Sadece en yeni MAX_DEVICES session allowed
62
+ const allowed = await db.getSortedSetRevRange(key, 0, MAX_DEVICES - 1);
57
63
 
58
- // sessionID yoksa karışma
59
- if (!req.sessionID) return data;
64
+ // Eğer henüz kayıt yoksa (çok nadir) karışma
65
+ if (!Array.isArray(allowed) || !allowed.length) return data;
60
66
 
61
- if (!validSessions.includes(req.sessionID)) {
62
- // Oturumu öldür
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
- error: 'session_terminated',
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; // IMPORTANT: response bitti
85
+ return;
83
86
  }
84
-
87
+
85
88
  return data;
86
89
  };
87
90
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-plugin-anti-account-sharing",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Prevents account sharing by enforcing a single active session policy for desktop devices.",
5
5
  "main": "library.js",
6
6
  "keywords": [