11#include " threadtools.h"
22#include " util.h"
3+ #include < netadr.h>
4+ #include " iclient.h"
5+ #include " inetchannel.h"
36
47CThreadFastMutex* Mutex = new CThreadFastMutex();
58
@@ -154,9 +157,29 @@ void HttpServer::Think()
154157 Mutex->Unlock ();
155158}
156159
157- httplib::Server::Handler HttpServer::CreateHandler (const char * path, int func)
160+ httplib::Server::Handler HttpServer::CreateHandler (const char * path, int func, bool ipwhitelist )
158161{
159162 return [=](const httplib::Request& req, httplib::Response& res) {
163+ if (ipwhitelist) {
164+ bool found = false ;
165+ for (int i = 1 ; i <= Gmod_Server->GetMaxClients (); ++i)
166+ {
167+ INetChannelInfo* channel = Engine->GetPlayerNetInfo (i);
168+ if (channel == nullptr ) { continue ; }; // We skip bots and empty slots with this.
169+
170+ IClient* client = Gmod_Server->GetClient (i - 1 );
171+ netadr_s addr = client->GetNetChannel ()->GetRemoteAddress ();
172+ std::string address = addr.ToString ();
173+ size_t port_pos = address.find (" :" );
174+ if (address.substr (0 , port_pos) == req.remote_addr || (req.remote_addr == " 127.0.0.1" && address.substr (0 , port_pos) == " loopback" )) {
175+ found = true ;
176+ break ;
177+ }
178+ }
179+
180+ if (!found) { return ; }
181+ }
182+
160183 RequestData_t* request = new RequestData_t;
161184 request->path = path;
162185 request->request = req;
@@ -191,34 +214,34 @@ httplib::Server::Handler HttpServer::CreateHandler(const char* path, int func)
191214 };
192215}
193216
194- void HttpServer::Get (const char * path, int func)
217+ void HttpServer::Get (const char * path, int func, bool ipwhitelist )
195218{
196- server.Get (path, CreateHandler (path, func));
219+ server.Get (path, CreateHandler (path, func, ipwhitelist ));
197220}
198221
199- void HttpServer::Post (const char * path, int func)
222+ void HttpServer::Post (const char * path, int func, bool ipwhitelist )
200223{
201- server.Post (path, CreateHandler (path, func));
224+ server.Post (path, CreateHandler (path, func, ipwhitelist ));
202225}
203226
204- void HttpServer::Put (const char * path, int func)
227+ void HttpServer::Put (const char * path, int func, bool ipwhitelist )
205228{
206- server.Put (path, CreateHandler (path, func));
229+ server.Put (path, CreateHandler (path, func, ipwhitelist ));
207230}
208231
209- void HttpServer::Patch (const char * path, int func)
232+ void HttpServer::Patch (const char * path, int func, bool ipwhitelist )
210233{
211- server.Patch (path, CreateHandler (path, func));
234+ server.Patch (path, CreateHandler (path, func, ipwhitelist ));
212235}
213236
214- void HttpServer::Delete (const char * path, int func)
237+ void HttpServer::Delete (const char * path, int func, bool ipwhitelist )
215238{
216- server.Delete (path, CreateHandler (path, func));
239+ server.Delete (path, CreateHandler (path, func, ipwhitelist ));
217240}
218241
219- void HttpServer::Options (const char * path, int func)
242+ void HttpServer::Options (const char * path, int func, bool ipwhitelist )
220243{
221- server.Options (path, CreateHandler (path, func));
244+ server.Options (path, CreateHandler (path, func, ipwhitelist ));
222245}
223246
224247void HttpServer::Start (const char * address, unsigned port)
@@ -238,7 +261,10 @@ void HttpServer::Stop()
238261{
239262 if (status == HTTPSERVER_OFFLINE) { return ; }
240263
264+ Mutex->Lock ();
241265 server.stop ();
242266 delete data;
267+ Mutex->Unlock ();
268+
243269 status = HTTPSERVER_OFFLINE;
244270}
0 commit comments