| 
									
										
										
										
											2022-04-06 04:14:18 +04:30
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2022, Ali Mohammad Pur <mpfard@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <AK/Error.h>
 | 
					
						
							| 
									
										
										
										
											2022-04-07 21:11:20 +04:30
										 |  |  | #include <AK/IPv4Address.h>
 | 
					
						
							| 
									
										
										
										
											2022-04-06 04:14:18 +04:30
										 |  |  | #include <AK/Types.h>
 | 
					
						
							|  |  |  | #include <LibIPC/Forward.h>
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:22:27 +13:00
										 |  |  | #include <LibURL/URL.h>
 | 
					
						
							| 
									
										
										
										
											2022-04-06 04:14:18 +04:30
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Core { | 
					
						
							|  |  |  | // FIXME: Username/password support.
 | 
					
						
							|  |  |  | struct ProxyData { | 
					
						
							|  |  |  |     enum Type { | 
					
						
							|  |  |  |         Direct, | 
					
						
							|  |  |  |         SOCKS5, | 
					
						
							|  |  |  |     } type { Type::Direct }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     u32 host_ipv4 { 0 }; | 
					
						
							|  |  |  |     int port { 0 }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool operator==(ProxyData const& other) const = default; | 
					
						
							| 
									
										
										
										
											2022-04-07 21:11:20 +04:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:22:27 +13:00
										 |  |  |     static ErrorOr<ProxyData> parse_url(URL::URL const& url) | 
					
						
							| 
									
										
										
										
											2022-04-07 21:11:20 +04:30
										 |  |  |     { | 
					
						
							|  |  |  |         ProxyData proxy_data; | 
					
						
							|  |  |  |         if (url.scheme() != "socks5") | 
					
						
							|  |  |  |             return Error::from_string_literal("Unsupported proxy type"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         proxy_data.type = ProxyData::Type::SOCKS5; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-27 12:48:28 +00:00
										 |  |  |         if (!url.host().has_value() || !url.host()->has<URL::IPv4Address>()) | 
					
						
							| 
									
										
										
										
											2022-04-07 21:11:20 +04:30
										 |  |  |             return Error::from_string_literal("Invalid proxy host, must be an IPv4 address"); | 
					
						
							| 
									
										
										
										
											2024-11-27 12:48:28 +00:00
										 |  |  |         proxy_data.host_ipv4 = url.host()->get<URL::IPv4Address>(); | 
					
						
							| 
									
										
										
										
											2022-04-07 21:11:20 +04:30
										 |  |  | 
 | 
					
						
							|  |  |  |         auto port = url.port(); | 
					
						
							|  |  |  |         if (!port.has_value()) | 
					
						
							|  |  |  |             return Error::from_string_literal("Invalid proxy, must have a port"); | 
					
						
							|  |  |  |         proxy_data.port = *port; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return proxy_data; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-04-06 04:14:18 +04:30
										 |  |  | }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace IPC { | 
					
						
							| 
									
										
										
										
											2022-11-15 11:24:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | template<> | 
					
						
							| 
									
										
										
										
											2023-01-01 23:37:35 -05:00
										 |  |  | ErrorOr<void> encode(Encoder&, Core::ProxyData const&); | 
					
						
							| 
									
										
										
										
											2022-11-15 11:24:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | template<> | 
					
						
							| 
									
										
										
										
											2022-12-22 20:40:33 -05:00
										 |  |  | ErrorOr<Core::ProxyData> decode(Decoder&); | 
					
						
							| 
									
										
										
										
											2022-11-15 11:24:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-06 04:14:18 +04:30
										 |  |  | } |