forked from Elfocrash/L2dotNET
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFirewall.cs
More file actions
129 lines (108 loc) · 3.69 KB
/
Copy pathFirewall.cs
File metadata and controls
129 lines (108 loc) · 3.69 KB
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
using System.Net.Sockets;
namespace L2dotNET.Network
{
/// <summary>
/// <see cref="Firewall"/> enabled action delegate.
/// </summary>
public delegate void OnFirewallEnabledEventHandler();
/// <summary>
/// <see cref="Firewall"/> disabled action delegate.
/// </summary>
public delegate void OnFirewallDisabledEventHandler();
/// <summary>
/// <see cref="Firewall"/> bypass rejected action delegate.
/// </summary>
/// <param name="socket">Connected <see cref="Socket"/> object.</param>
public delegate void OnFirewallBypassRejectedEventHandler(Socket socket);
/// <summary>
/// <see cref="Firewall"/> bypass allowed action delegate.
/// </summary>
/// <param name="socket">Connected <see cref="Socket"/> object.</param>
public delegate void OnFirewallBypassAllowedEventHandler(Socket socket);
/// <summary>
/// Represents simple firewall class.
/// </summary>
public class Firewall
{
/// <summary>
/// Indicates if <see cref="Firewall"/> is currently enabled.
/// </summary>
private volatile bool _mEnabled;
/// <summary>
/// Raises after firewall was enabled.
/// </summary>
public event OnFirewallEnabledEventHandler OnEnabled;
/// <summary>
/// Raises after firewall was disabled.
/// </summary>
public event OnFirewallDisabledEventHandler OnDisabled;
/// <summary>
/// Raises after firewall allowed socket.
/// </summary>
public event OnFirewallBypassAllowedEventHandler OnBypassAllowed;
/// <summary>
/// Raises after firewall rejected socket.
/// </summary>
public event OnFirewallBypassRejectedEventHandler OnBypassRejected;
/// <summary>
/// Validates socket connection. Note: if firewall is disabled and provided socket object is not null, always allows connection.
/// </summary>
/// <param name="socket"><see cref="Socket"/> to validate.</param>
/// <returns>True, if socket is valid, otherwise false.</returns>
public virtual bool ValidateRequest(Socket socket)
{
if ((socket == null) || !socket.Connected)
return false;
if (!_mEnabled)
return true;
if (ValidateRules(socket))
{
OnBypassAllowed?.Invoke(socket);
return true;
}
OnBypassRejected?.Invoke(socket);
return false;
}
/// <summary>
/// Checks that socket is valid for current rules collection.
/// </summary>
/// <param name="socket"><see cref="Socket"/> object to validate.</param>
/// <returns>True, if socket is valid, otherwise false.</returns>
protected virtual bool ValidateRules(Socket socket)
{
return true;
}
/// <summary>
/// Enables firewall.
/// </summary>
public virtual void Enable()
{
_mEnabled = true;
OnEnabled?.Invoke();
}
/// <summary>
/// Disables firewall.
/// </summary>
public virtual void Disable()
{
_mEnabled = false;
OnDisabled?.Invoke();
}
/// <summary>
/// Sets firewall enabled / disabled, gets it current state.
/// </summary>
public bool Enabled
{
get { return _mEnabled; }
set
{
if (_mEnabled == value)
return;
if (value)
Enable();
else
Disable();
}
}
}
}