-
Notifications
You must be signed in to change notification settings - Fork 0
/
VPNCheckLogger.php
64 lines (53 loc) · 2.2 KB
/
VPNCheckLogger.php
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
<?php
if ( !defined( 'MEDIAWIKI' ) ) {
die( "This file is an extension to the MediaWiki software and cannot be used standalone.\n" );
}
class VPNCheckLogger {
public static function onRecentChangeSave( $recentChange ) {
// ユーザーのIPアドレスを取得
$userIP = $recentChange->getAttribute('rc_ip');
if (!$userIP) {
return true; // IPが取得できない場合は処理を中断
}
$vpnStatus = self::checkVPN($userIP);
// リビジョンIDを取得
$revisionId = $recentChange->getAttribute('rc_this_oldid');
if (!$revisionId) {
return true; // リビジョンIDが取得できない場合は処理を中断
}
// IPアドレス、VPNステータス、リビジョンIDをデータベースに保存
self::logIP($userIP, $vpnStatus, $revisionId);
// 編集履歴のコメントにVPNステータスを追加
$summary = $recentChange->getAttribute('rc_comment') . " (VPN Status: $vpnStatus)";
$recentChange->setAttribute('rc_comment', $summary);
return true;
}
private static function checkVPN( $ip ) {
$url = "https://spur.us/context/" . urlencode( $ip );
$response = file_get_contents($url);
if ($response === false) {
return "Unknown"; // エラー時は「Unknown」として扱う
}
// VPNかどうかを判定し、VPNサービス名を返す
if (preg_match('/<span>\s*(.*?)VPN/i', $response, $matches)) {
return $matches[1] . " VPN"; // VPNサービス名を返す
}
return "Not VPN";
}
private static function logIP($ip, $vpnStatus, $revisionId) {
$dbw = wfGetDB( DB_PRIMARY );
$dbw->insert(
'vpn_ip_log', // テーブル名
[
'ip_address' => $ip,
'vpn_status' => $vpnStatus,
'revision_id' => $revisionId,
'timestamp' => wfTimestampNow()
],
__METHOD__
);
}
public static function onLoadExtensionSchemaUpdates( DatabaseUpdater $updater ) {
$updater->addExtensionTable( 'vpn_ip_log', __DIR__ . '/vpn_ip_log.sql' );
}
}