mirror of
				https://github.com/PurpleI2P/i2pd.git
				synced 2025-11-04 08:30:46 +00:00 
			
		
		
		
	[webconsole] remove version from title, move tunnel chain print from Tunnel class
Signed-off-by: R4SAS <r4sas@i2pmail.org>
This commit is contained in:
		
							parent
							
								
									9b4e8bf64b
								
							
						
					
					
						commit
						c9e4e78f41
					
				
					 3 changed files with 79 additions and 67 deletions
				
			
		| 
						 | 
					@ -182,7 +182,7 @@ namespace http {
 | 
				
			||||||
			"  <meta charset=\"UTF-8\">\r\n"
 | 
								"  <meta charset=\"UTF-8\">\r\n"
 | 
				
			||||||
			"  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n"
 | 
								"  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n"
 | 
				
			||||||
			"  <link rel=\"shortcut icon\" href=\"" << itoopieFavicon << "\">\r\n"
 | 
								"  <link rel=\"shortcut icon\" href=\"" << itoopieFavicon << "\">\r\n"
 | 
				
			||||||
			"  <title>Purple I2P " VERSION " Webconsole</title>\r\n";
 | 
								"  <title>Purple I2P Webconsole</title>\r\n";
 | 
				
			||||||
		GetStyles(s);
 | 
							GetStyles(s);
 | 
				
			||||||
		s <<
 | 
							s <<
 | 
				
			||||||
			"</head>\r\n"
 | 
								"</head>\r\n"
 | 
				
			||||||
| 
						 | 
					@ -196,8 +196,10 @@ namespace http {
 | 
				
			||||||
		if (i2p::context.IsFloodfill ())
 | 
							if (i2p::context.IsFloodfill ())
 | 
				
			||||||
			s << "  <a href=\"" << webroot << "?page=" << HTTP_PAGE_LEASESETS << "\">" << tr("LeaseSets") << "</a><br>\r\n";
 | 
								s << "  <a href=\"" << webroot << "?page=" << HTTP_PAGE_LEASESETS << "\">" << tr("LeaseSets") << "</a><br>\r\n";
 | 
				
			||||||
		s <<
 | 
							s <<
 | 
				
			||||||
			"  <a href=\"" << webroot << "?page=" << HTTP_PAGE_TUNNELS << "\">" << tr("Tunnels") << "</a><br>\r\n"
 | 
								"  <a href=\"" << webroot << "?page=" << HTTP_PAGE_TUNNELS << "\">" << tr("Tunnels") << "</a><br>\r\n";
 | 
				
			||||||
			"  <a href=\"" << webroot << "?page=" << HTTP_PAGE_TRANSIT_TUNNELS << "\">" << tr("Transit Tunnels") << "</a><br>\r\n"
 | 
							if (i2p::context.AcceptsTunnels () || i2p::tunnel::tunnels.CountTransitTunnels())
 | 
				
			||||||
 | 
								s << "  <a href=\"" << webroot << "?page=" << HTTP_PAGE_TRANSIT_TUNNELS << "\">" << tr("Transit Tunnels") << "</a><br>\r\n";
 | 
				
			||||||
 | 
							s <<
 | 
				
			||||||
			"  <a href=\"" << webroot << "?page=" << HTTP_PAGE_TRANSPORTS << "\">" << tr ("Transports") << "</a><br>\r\n"
 | 
								"  <a href=\"" << webroot << "?page=" << HTTP_PAGE_TRANSPORTS << "\">" << tr ("Transports") << "</a><br>\r\n"
 | 
				
			||||||
			"  <a href=\"" << webroot << "?page=" << HTTP_PAGE_I2P_TUNNELS << "\">" << tr("I2P tunnels") << "</a><br>\r\n";
 | 
								"  <a href=\"" << webroot << "?page=" << HTTP_PAGE_I2P_TUNNELS << "\">" << tr("I2P tunnels") << "</a><br>\r\n";
 | 
				
			||||||
		if (i2p::client::context.GetSAMBridge ())
 | 
							if (i2p::client::context.GetSAMBridge ())
 | 
				
			||||||
| 
						 | 
					@ -295,10 +297,10 @@ namespace http {
 | 
				
			||||||
		s << " (" << (double) i2p::transport::transports.GetTransitBandwidth () / 1024 << " " << tr(/* tr: Kibibit/s */ "KiB/s") << ")<br>\r\n";
 | 
							s << " (" << (double) i2p::transport::transports.GetTransitBandwidth () / 1024 << " " << tr(/* tr: Kibibit/s */ "KiB/s") << ")<br>\r\n";
 | 
				
			||||||
		s << "<b>" << tr("Data path") << ":</b> " << i2p::fs::GetUTF8DataDir() << "<br>\r\n";
 | 
							s << "<b>" << tr("Data path") << ":</b> " << i2p::fs::GetUTF8DataDir() << "<br>\r\n";
 | 
				
			||||||
		s << "<div class='slide'>";
 | 
							s << "<div class='slide'>";
 | 
				
			||||||
		if((outputFormat == OutputFormatEnum::forWebConsole) || !includeHiddenContent) {
 | 
							if ((outputFormat == OutputFormatEnum::forWebConsole) || !includeHiddenContent) {
 | 
				
			||||||
			s << "<label for=\"slide-info\">" << tr("Hidden content. Press on text to see.") << "</label>\r\n<input type=\"checkbox\" id=\"slide-info\" />\r\n<div class=\"slidecontent\">\r\n";
 | 
								s << "<label for=\"slide-info\">" << tr("Hidden content. Press on text to see.") << "</label>\r\n<input type=\"checkbox\" id=\"slide-info\" />\r\n<div class=\"slidecontent\">\r\n";
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if(includeHiddenContent) {
 | 
							if (includeHiddenContent) {
 | 
				
			||||||
			s << "<b>" << tr("Router Ident") << ":</b> " << i2p::context.GetRouterInfo().GetIdentHashBase64() << "<br>\r\n";
 | 
								s << "<b>" << tr("Router Ident") << ":</b> " << i2p::context.GetRouterInfo().GetIdentHashBase64() << "<br>\r\n";
 | 
				
			||||||
			if (!i2p::context.GetRouterInfo().GetProperty("family").empty())
 | 
								if (!i2p::context.GetRouterInfo().GetProperty("family").empty())
 | 
				
			||||||
				s << "<b>" << tr("Router Family") << ":</b> " << i2p::context.GetRouterInfo().GetProperty("family") << "<br>\r\n";
 | 
									s << "<b>" << tr("Router Family") << ":</b> " << i2p::context.GetRouterInfo().GetProperty("family") << "<br>\r\n";
 | 
				
			||||||
| 
						 | 
					@ -318,31 +320,31 @@ namespace http {
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
					case i2p::data::RouterInfo::eTransportSSU2:
 | 
										case i2p::data::RouterInfo::eTransportSSU2:
 | 
				
			||||||
						s << "SSU2";
 | 
											s << "SSU2";
 | 
				
			||||||
					break;	
 | 
										break;
 | 
				
			||||||
					default:
 | 
										default:
 | 
				
			||||||
						s << tr("Unknown");
 | 
											s << tr("Unknown");
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if (address->IsV6 ()) 
 | 
									if (address->IsV6 ()) 
 | 
				
			||||||
				{	
 | 
									{
 | 
				
			||||||
					if (address->IsV4 ()) s << "v4"; 
 | 
										if (address->IsV4 ()) s << "v4"; 
 | 
				
			||||||
					s << "v6";
 | 
										s << "v6";
 | 
				
			||||||
				}	
 | 
									}
 | 
				
			||||||
				s << "</td>\r\n";
 | 
									s << "</td>\r\n";
 | 
				
			||||||
				if (address->published)
 | 
									if (address->published)
 | 
				
			||||||
					s << "<td>" << address->host.to_string() << ":" << address->port << "</td>\r\n";
 | 
										s << "<td>" << address->host.to_string() << ":" << address->port << "</td>\r\n";
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
				{	
 | 
									{
 | 
				
			||||||
					s << "<td>" << tr("supported");
 | 
										s << "<td>" << tr("supported");
 | 
				
			||||||
					if (address->port)
 | 
										if (address->port)
 | 
				
			||||||
						s << " :" << address->port;	
 | 
											s << " :" << address->port;
 | 
				
			||||||
					s << "</td>\r\n";
 | 
										s << "</td>\r\n";
 | 
				
			||||||
				}		
 | 
									}
 | 
				
			||||||
				s << "</tr>\r\n";
 | 
									s << "</tr>\r\n";
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			s << "</tbody></table>\r\n";
 | 
								s << "</tbody></table>\r\n";
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		s << "</div>\r\n</div>\r\n";
 | 
							s << "</div>\r\n</div>\r\n";
 | 
				
			||||||
		if(outputFormat == OutputFormatEnum::forQtUi) {
 | 
							if (outputFormat == OutputFormatEnum::forQtUi) {
 | 
				
			||||||
			s << "<br>";
 | 
								s << "<br>";
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		s << "<b>" << tr("Routers") << ":</b> " << i2p::data::netdb.GetNumRouters () << " ";
 | 
							s << "<b>" << tr("Routers") << ":</b> " << i2p::data::netdb.GetNumRouters () << " ";
 | 
				
			||||||
| 
						 | 
					@ -356,7 +358,7 @@ namespace http {
 | 
				
			||||||
		s << "<b>" << tr("Client Tunnels") << ":</b> " << std::to_string(clientTunnelCount) << " ";
 | 
							s << "<b>" << tr("Client Tunnels") << ":</b> " << std::to_string(clientTunnelCount) << " ";
 | 
				
			||||||
		s << "<b>" << tr("Transit Tunnels") << ":</b> " << std::to_string(transitTunnelCount) << "<br>\r\n<br>\r\n";
 | 
							s << "<b>" << tr("Transit Tunnels") << ":</b> " << std::to_string(transitTunnelCount) << "<br>\r\n<br>\r\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(outputFormat==OutputFormatEnum::forWebConsole) {
 | 
							if (outputFormat==OutputFormatEnum::forWebConsole) {
 | 
				
			||||||
			bool httpproxy  = i2p::client::context.GetHttpProxy ()         ? true : false;
 | 
								bool httpproxy  = i2p::client::context.GetHttpProxy ()         ? true : false;
 | 
				
			||||||
			bool socksproxy = i2p::client::context.GetSocksProxy ()        ? true : false;
 | 
								bool socksproxy = i2p::client::context.GetSocksProxy ()        ? true : false;
 | 
				
			||||||
			bool bob        = i2p::client::context.GetBOBCommandChannel () ? true : false;
 | 
								bool bob        = i2p::client::context.GetBOBCommandChannel () ? true : false;
 | 
				
			||||||
| 
						 | 
					@ -417,7 +419,7 @@ namespace http {
 | 
				
			||||||
			s << "</div>\r\n</div>\r\n";
 | 
								s << "</div>\r\n</div>\r\n";
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(dest->IsPublic() && token)
 | 
							if (dest->IsPublic() && token)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			std::string webroot; i2p::config::GetOption("http.webroot", webroot);
 | 
								std::string webroot; i2p::config::GetOption("http.webroot", webroot);
 | 
				
			||||||
			auto base32 = dest->GetIdentHash ().ToBase32 ();
 | 
								auto base32 = dest->GetIdentHash ().ToBase32 ();
 | 
				
			||||||
| 
						 | 
					@ -431,7 +433,7 @@ namespace http {
 | 
				
			||||||
			     "</form>\r\n<small>" << tr("<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.") << "</small>\r\n</div>\r\n</div>\r\n<br>\r\n";
 | 
								     "</form>\r\n<small>" << tr("<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.") << "</small>\r\n</div>\r\n</div>\r\n<br>\r\n";
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(dest->GetNumRemoteLeaseSets())
 | 
							if (dest->GetNumRemoteLeaseSets())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			s << "<div class='slide'><label for='slide-lease'><b>" << tr("LeaseSets") << ":</b> <i>" << dest->GetNumRemoteLeaseSets ()
 | 
								s << "<div class='slide'><label for='slide-lease'><b>" << tr("LeaseSets") << ":</b> <i>" << dest->GetNumRemoteLeaseSets ()
 | 
				
			||||||
			  << "</i></label>\r\n<input type=\"checkbox\" id=\"slide-lease\" />\r\n<div class=\"slidecontent\">\r\n<table><thead><th>"<< tr("Address") << "</th><th>" << tr("Type") << "</th><th>" << tr("EncType") << "</th></thead><tbody class=\"tableitem\">";
 | 
								  << "</i></label>\r\n<input type=\"checkbox\" id=\"slide-lease\" />\r\n<div class=\"slidecontent\">\r\n<table><thead><th>"<< tr("Address") << "</th><th>" << tr("Type") << "</th><th>" << tr("EncType") << "</th></thead><tbody class=\"tableitem\">";
 | 
				
			||||||
| 
						 | 
					@ -447,8 +449,18 @@ namespace http {
 | 
				
			||||||
			s << "<b>" << tr("Inbound tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
								s << "<b>" << tr("Inbound tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
				
			||||||
			for (auto & it : pool->GetInboundTunnels ()) {
 | 
								for (auto & it : pool->GetInboundTunnels ()) {
 | 
				
			||||||
				s << "<div class=\"listitem\">";
 | 
									s << "<div class=\"listitem\">";
 | 
				
			||||||
				it->Print(s);
 | 
									// for each tunnel hop if not zero-hop
 | 
				
			||||||
				if(it->LatencyIsKnown())
 | 
									if (it->GetNumHops ())
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										it->VisitTunnelHops(
 | 
				
			||||||
 | 
											[&s](std::shared_ptr<const i2p::data::IdentityEx> hopIdent)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												s << "⇒ " << i2p::data::GetIdentHashAbbreviation (hopIdent->GetIdentHash ()) << " ";
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									s << "⇒ " << it->GetTunnelID () << ":me";
 | 
				
			||||||
 | 
									if (it->LatencyIsKnown())
 | 
				
			||||||
					s << " ( " << it->GetMeanLatency() << tr(/* tr: Milliseconds */ "ms") << " )";
 | 
										s << " ( " << it->GetMeanLatency() << tr(/* tr: Milliseconds */ "ms") << " )";
 | 
				
			||||||
				ShowTunnelDetails(s, it->GetState (), false, it->GetNumReceivedBytes ());
 | 
									ShowTunnelDetails(s, it->GetState (), false, it->GetNumReceivedBytes ());
 | 
				
			||||||
				s << "</div>\r\n";
 | 
									s << "</div>\r\n";
 | 
				
			||||||
| 
						 | 
					@ -457,8 +469,18 @@ namespace http {
 | 
				
			||||||
			s << "<b>" << tr("Outbound tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
								s << "<b>" << tr("Outbound tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
				
			||||||
			for (auto & it : pool->GetOutboundTunnels ()) {
 | 
								for (auto & it : pool->GetOutboundTunnels ()) {
 | 
				
			||||||
				s << "<div class=\"listitem\">";
 | 
									s << "<div class=\"listitem\">";
 | 
				
			||||||
				it->Print(s);
 | 
									s << it->GetTunnelID () << ":me ⇒";
 | 
				
			||||||
				if(it->LatencyIsKnown())
 | 
									// for each tunnel hop if not zero-hop
 | 
				
			||||||
 | 
									if (it->GetNumHops ())
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										it->VisitTunnelHops(
 | 
				
			||||||
 | 
											[&s](std::shared_ptr<const i2p::data::IdentityEx> hopIdent)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												s << " " << i2p::data::GetIdentHashAbbreviation (hopIdent->GetIdentHash ()) << " ⇒";
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (it->LatencyIsKnown())
 | 
				
			||||||
					s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
 | 
										s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
 | 
				
			||||||
				ShowTunnelDetails(s, it->GetState (), false, it->GetNumSentBytes ());
 | 
									ShowTunnelDetails(s, it->GetState (), false, it->GetNumSentBytes ());
 | 
				
			||||||
				s << "</div>\r\n";
 | 
									s << "</div>\r\n";
 | 
				
			||||||
| 
						 | 
					@ -631,8 +653,17 @@ namespace http {
 | 
				
			||||||
		s << "<b>" << tr("Inbound tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
							s << "<b>" << tr("Inbound tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
				
			||||||
		for (auto & it : i2p::tunnel::tunnels.GetInboundTunnels ()) {
 | 
							for (auto & it : i2p::tunnel::tunnels.GetInboundTunnels ()) {
 | 
				
			||||||
			s << "<div class=\"listitem\">";
 | 
								s << "<div class=\"listitem\">";
 | 
				
			||||||
			it->Print(s);
 | 
								if (it->GetNumHops ())
 | 
				
			||||||
			if(it->LatencyIsKnown())
 | 
								{
 | 
				
			||||||
 | 
									it->VisitTunnelHops(
 | 
				
			||||||
 | 
										[&s](std::shared_ptr<const i2p::data::IdentityEx> hopIdent)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											s << "⇒ " << i2p::data::GetIdentHashAbbreviation (hopIdent->GetIdentHash ()) << " ";
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								s << "⇒ " << it->GetTunnelID () << ":me";
 | 
				
			||||||
 | 
								if (it->LatencyIsKnown())
 | 
				
			||||||
			s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
 | 
								s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
 | 
				
			||||||
			ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumReceivedBytes ());
 | 
								ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumReceivedBytes ());
 | 
				
			||||||
			s << "</div>\r\n";
 | 
								s << "</div>\r\n";
 | 
				
			||||||
| 
						 | 
					@ -641,8 +672,18 @@ namespace http {
 | 
				
			||||||
		s << "<b>" << tr("Outbound tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
							s << "<b>" << tr("Outbound tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
				
			||||||
		for (auto & it : i2p::tunnel::tunnels.GetOutboundTunnels ()) {
 | 
							for (auto & it : i2p::tunnel::tunnels.GetOutboundTunnels ()) {
 | 
				
			||||||
			s << "<div class=\"listitem\">";
 | 
								s << "<div class=\"listitem\">";
 | 
				
			||||||
			it->Print(s);
 | 
								s << it->GetTunnelID () << ":me ⇒";
 | 
				
			||||||
			if(it->LatencyIsKnown())
 | 
								// for each tunnel hop if not zero-hop
 | 
				
			||||||
 | 
								if (it->GetNumHops ())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									it->VisitTunnelHops(
 | 
				
			||||||
 | 
										[&s](std::shared_ptr<const i2p::data::IdentityEx> hopIdent)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											s << " " << i2p::data::GetIdentHashAbbreviation (hopIdent->GetIdentHash ()) << " ⇒";
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (it->LatencyIsKnown())
 | 
				
			||||||
			s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
 | 
								s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
 | 
				
			||||||
			ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumSentBytes ());
 | 
								ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumSentBytes ());
 | 
				
			||||||
			s << "</div>\r\n";
 | 
								s << "</div>\r\n";
 | 
				
			||||||
| 
						 | 
					@ -714,7 +755,7 @@ namespace http {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void ShowTransitTunnels (std::stringstream& s)
 | 
						void ShowTransitTunnels (std::stringstream& s)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if(i2p::tunnel::tunnels.CountTransitTunnels())
 | 
							if (i2p::tunnel::tunnels.CountTransitTunnels())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			s << "<b>" << tr("Transit Tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
								s << "<b>" << tr("Transit Tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
				
			||||||
			for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ())
 | 
								for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ())
 | 
				
			||||||
| 
						 | 
					@ -848,7 +889,7 @@ namespace http {
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(sam->GetSessions ().size ())
 | 
							if (sam->GetSessions ().size ())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			s << "<b>" << tr("SAM sessions") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
								s << "<b>" << tr("SAM sessions") << ":</b><br>\r\n<div class=\"list\">\r\n";
 | 
				
			||||||
			for (auto& it: sam->GetSessions ())
 | 
								for (auto& it: sam->GetSessions ())
 | 
				
			||||||
| 
						 | 
					@ -1065,6 +1106,7 @@ namespace http {
 | 
				
			||||||
			SendReply(res, content);
 | 
								SendReply(res, content);
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		bool strictheaders;
 | 
							bool strictheaders;
 | 
				
			||||||
		i2p::config::GetOption("http.strictheaders", strictheaders);
 | 
							i2p::config::GetOption("http.strictheaders", strictheaders);
 | 
				
			||||||
		if (strictheaders)
 | 
							if (strictheaders)
 | 
				
			||||||
| 
						 | 
					@ -1087,6 +1129,7 @@ namespace http {
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// HTML head start
 | 
							// HTML head start
 | 
				
			||||||
		ShowPageHead (s);
 | 
							ShowPageHead (s);
 | 
				
			||||||
		if (req.uri.find("page=") != std::string::npos) {
 | 
							if (req.uri.find("page=") != std::string::npos) {
 | 
				
			||||||
| 
						 | 
					@ -1207,7 +1250,7 @@ namespace http {
 | 
				
			||||||
		else if (cmd == HTTP_COMMAND_SHUTDOWN_CANCEL)
 | 
							else if (cmd == HTTP_COMMAND_SHUTDOWN_CANCEL)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			i2p::context.SetAcceptsTunnels (true);
 | 
								i2p::context.SetAcceptsTunnels (true);
 | 
				
			||||||
#if ((!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID))  || defined(ANDROID_BINARY))
 | 
					#if ((!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID)) || defined(ANDROID_BINARY))
 | 
				
			||||||
			Daemon.gracefulShutdownInterval = 0;
 | 
								Daemon.gracefulShutdownInterval = 0;
 | 
				
			||||||
#elif defined(WIN32_APP)
 | 
					#elif defined(WIN32_APP)
 | 
				
			||||||
			i2p::win32::StopGracefulShutdown ();
 | 
								i2p::win32::StopGracefulShutdown ();
 | 
				
			||||||
| 
						 | 
					@ -1239,7 +1282,7 @@ namespace http {
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (dest)
 | 
									if (dest)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if(dest->DeleteStream (streamID))
 | 
										if (dest->DeleteStream (streamID))
 | 
				
			||||||
						s << "<b>" << tr("SUCCESS") << "</b>: " << tr("Stream closed") << "<br>\r\n<br>\r\n";
 | 
											s << "<b>" << tr("SUCCESS") << "</b>: " << tr("Stream closed") << "<br>\r\n<br>\r\n";
 | 
				
			||||||
					else
 | 
										else
 | 
				
			||||||
						s << "<b>" << tr("ERROR") << "</b>: " << tr("Stream not found or already was closed") << "<br>\r\n<br>\r\n";
 | 
											s << "<b>" << tr("ERROR") << "</b>: " << tr("Stream not found or already was closed") << "<br>\r\n<br>\r\n";
 | 
				
			||||||
| 
						 | 
					@ -1445,7 +1488,7 @@ namespace http {
 | 
				
			||||||
			CreateConnection(newSocket);
 | 
								CreateConnection(newSocket);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if(newSocket) newSocket->close();
 | 
								if (newSocket) newSocket->close();
 | 
				
			||||||
			LogPrint(eLogError, "HTTP Server: Error handling accept: ", ecode.message());
 | 
								LogPrint(eLogError, "HTTP Server: Error handling accept: ", ecode.message());
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		Accept ();
 | 
							Accept ();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -235,15 +235,11 @@ namespace tunnel
 | 
				
			||||||
		m_State = state;
 | 
							m_State = state;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void Tunnel::VisitTunnelHops(TunnelHopVisitor v)
 | 
				
			||||||
	void Tunnel::PrintHops (std::stringstream& s) const
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// hops are in inverted order, we must print in direct order
 | 
							// hops are in inverted order, we must return in direct order
 | 
				
			||||||
		for (auto it = m_Hops.rbegin (); it != m_Hops.rend (); it++)
 | 
							for (auto it = m_Hops.rbegin (); it != m_Hops.rend (); it++)
 | 
				
			||||||
		{
 | 
								v((*it).ident);
 | 
				
			||||||
			s << " ⇒ ";
 | 
					 | 
				
			||||||
			s << i2p::data::GetIdentHashAbbreviation ((*it).ident->GetIdentHash ());
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void InboundTunnel::HandleTunnelDataMsg (std::shared_ptr<I2NPMessage>&& msg)
 | 
						void InboundTunnel::HandleTunnelDataMsg (std::shared_ptr<I2NPMessage>&& msg)
 | 
				
			||||||
| 
						 | 
					@ -254,12 +250,6 @@ namespace tunnel
 | 
				
			||||||
		m_Endpoint.HandleDecryptedTunnelDataMsg (msg);
 | 
							m_Endpoint.HandleDecryptedTunnelDataMsg (msg);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void InboundTunnel::Print (std::stringstream& s) const
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		PrintHops (s);
 | 
					 | 
				
			||||||
		s << " ⇒ " << GetTunnelID () << ":me";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ZeroHopsInboundTunnel::ZeroHopsInboundTunnel ():
 | 
						ZeroHopsInboundTunnel::ZeroHopsInboundTunnel ():
 | 
				
			||||||
		InboundTunnel (std::make_shared<ZeroHopsTunnelConfig> ()),
 | 
							InboundTunnel (std::make_shared<ZeroHopsTunnelConfig> ()),
 | 
				
			||||||
		m_NumReceivedBytes (0)
 | 
							m_NumReceivedBytes (0)
 | 
				
			||||||
| 
						 | 
					@ -276,11 +266,6 @@ namespace tunnel
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void ZeroHopsInboundTunnel::Print (std::stringstream& s) const
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		s << " ⇒ " << GetTunnelID () << ":me";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void OutboundTunnel::SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, std::shared_ptr<i2p::I2NPMessage> msg)
 | 
						void OutboundTunnel::SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, std::shared_ptr<i2p::I2NPMessage> msg)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		TunnelMessageBlock block;
 | 
							TunnelMessageBlock block;
 | 
				
			||||||
| 
						 | 
					@ -315,13 +300,6 @@ namespace tunnel
 | 
				
			||||||
		LogPrint (eLogError, "Tunnel: Incoming message for outbound tunnel ", GetTunnelID ());
 | 
							LogPrint (eLogError, "Tunnel: Incoming message for outbound tunnel ", GetTunnelID ());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void OutboundTunnel::Print (std::stringstream& s) const
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		s << GetTunnelID () << ":me";
 | 
					 | 
				
			||||||
		PrintHops (s);
 | 
					 | 
				
			||||||
		s << " ⇒ ";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ZeroHopsOutboundTunnel::ZeroHopsOutboundTunnel ():
 | 
						ZeroHopsOutboundTunnel::ZeroHopsOutboundTunnel ():
 | 
				
			||||||
		OutboundTunnel (std::make_shared<ZeroHopsTunnelConfig> ()),
 | 
							OutboundTunnel (std::make_shared<ZeroHopsTunnelConfig> ()),
 | 
				
			||||||
		m_NumSentBytes (0)
 | 
							m_NumSentBytes (0)
 | 
				
			||||||
| 
						 | 
					@ -351,11 +329,6 @@ namespace tunnel
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void ZeroHopsOutboundTunnel::Print (std::stringstream& s) const
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		s << GetTunnelID () << ":me ⇒ ";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	Tunnels tunnels;
 | 
						Tunnels tunnels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Tunnels::Tunnels (): m_IsRunning (false), m_Thread (nullptr),
 | 
						Tunnels::Tunnels (): m_IsRunning (false), m_Thread (nullptr),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,9 @@ namespace tunnel
 | 
				
			||||||
	const size_t I2NP_TUNNEL_MESSAGE_SIZE = TUNNEL_DATA_MSG_SIZE + I2NP_HEADER_SIZE + 34; // reserved for alignment and NTCP 16 + 6 + 12
 | 
						const size_t I2NP_TUNNEL_MESSAGE_SIZE = TUNNEL_DATA_MSG_SIZE + I2NP_HEADER_SIZE + 34; // reserved for alignment and NTCP 16 + 6 + 12
 | 
				
			||||||
	const size_t I2NP_TUNNEL_ENPOINT_MESSAGE_SIZE = 2*TUNNEL_DATA_MSG_SIZE + I2NP_HEADER_SIZE + TUNNEL_GATEWAY_HEADER_SIZE + 28; // reserved for alignment and NTCP 16 + 6 + 6
 | 
						const size_t I2NP_TUNNEL_ENPOINT_MESSAGE_SIZE = 2*TUNNEL_DATA_MSG_SIZE + I2NP_HEADER_SIZE + TUNNEL_GATEWAY_HEADER_SIZE + 28; // reserved for alignment and NTCP 16 + 6 + 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** function for visiting a hops stored in a tunnel */
 | 
				
			||||||
 | 
						typedef std::function<void(std::shared_ptr<const i2p::data::IdentityEx>)> TunnelHopVisitor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	enum TunnelState
 | 
						enum TunnelState
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		eTunnelStatePending,
 | 
							eTunnelStatePending,
 | 
				
			||||||
| 
						 | 
					@ -91,8 +94,6 @@ namespace tunnel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			bool HandleTunnelBuildResponse (uint8_t * msg, size_t len);
 | 
								bool HandleTunnelBuildResponse (uint8_t * msg, size_t len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			virtual void Print (std::stringstream&) const {};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// implements TunnelBase
 | 
								// implements TunnelBase
 | 
				
			||||||
			void SendTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage> msg);
 | 
								void SendTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage> msg);
 | 
				
			||||||
			void EncryptTunnelMsg (std::shared_ptr<const I2NPMessage> in, std::shared_ptr<I2NPMessage> out);
 | 
								void EncryptTunnelMsg (std::shared_ptr<const I2NPMessage> in, std::shared_ptr<I2NPMessage> out);
 | 
				
			||||||
| 
						 | 
					@ -107,9 +108,8 @@ namespace tunnel
 | 
				
			||||||
			bool LatencyIsKnown() const { return m_Latency > 0; }
 | 
								bool LatencyIsKnown() const { return m_Latency > 0; }
 | 
				
			||||||
			bool IsSlow () const { return LatencyIsKnown() && (int)m_Latency > HIGH_LATENCY_PER_HOP*GetNumHops (); }
 | 
								bool IsSlow () const { return LatencyIsKnown() && (int)m_Latency > HIGH_LATENCY_PER_HOP*GetNumHops (); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		protected:
 | 
								/** visit all hops we currently store */
 | 
				
			||||||
 | 
								void VisitTunnelHops(TunnelHopVisitor v);
 | 
				
			||||||
			void PrintHops (std::stringstream& s) const;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		private:
 | 
							private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,7 +134,6 @@ namespace tunnel
 | 
				
			||||||
			virtual void SendTunnelDataMsg (const std::vector<TunnelMessageBlock>& msgs); // multiple messages
 | 
								virtual void SendTunnelDataMsg (const std::vector<TunnelMessageBlock>& msgs); // multiple messages
 | 
				
			||||||
			const i2p::data::IdentHash& GetEndpointIdentHash () const { return m_EndpointIdentHash; };
 | 
								const i2p::data::IdentHash& GetEndpointIdentHash () const { return m_EndpointIdentHash; };
 | 
				
			||||||
			virtual size_t GetNumSentBytes () const { return m_Gateway.GetNumSentBytes (); };
 | 
								virtual size_t GetNumSentBytes () const { return m_Gateway.GetNumSentBytes (); };
 | 
				
			||||||
			void Print (std::stringstream& s) const;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// implements TunnelBase
 | 
								// implements TunnelBase
 | 
				
			||||||
			void HandleTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage>&& tunnelMsg);
 | 
								void HandleTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage>&& tunnelMsg);
 | 
				
			||||||
| 
						 | 
					@ -155,7 +154,6 @@ namespace tunnel
 | 
				
			||||||
			InboundTunnel (std::shared_ptr<const TunnelConfig> config): Tunnel (config), m_Endpoint (true) {};
 | 
								InboundTunnel (std::shared_ptr<const TunnelConfig> config): Tunnel (config), m_Endpoint (true) {};
 | 
				
			||||||
			void HandleTunnelDataMsg (std::shared_ptr<I2NPMessage>&& msg);
 | 
								void HandleTunnelDataMsg (std::shared_ptr<I2NPMessage>&& msg);
 | 
				
			||||||
			virtual size_t GetNumReceivedBytes () const { return m_Endpoint.GetNumReceivedBytes (); };
 | 
								virtual size_t GetNumReceivedBytes () const { return m_Endpoint.GetNumReceivedBytes (); };
 | 
				
			||||||
			void Print (std::stringstream& s) const;
 | 
					 | 
				
			||||||
			bool IsInbound() const { return true; }
 | 
								bool IsInbound() const { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// override TunnelBase
 | 
								// override TunnelBase
 | 
				
			||||||
| 
						 | 
					@ -172,7 +170,6 @@ namespace tunnel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ZeroHopsInboundTunnel ();
 | 
								ZeroHopsInboundTunnel ();
 | 
				
			||||||
			void SendTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage> msg);
 | 
								void SendTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage> msg);
 | 
				
			||||||
			void Print (std::stringstream& s) const;
 | 
					 | 
				
			||||||
			size_t GetNumReceivedBytes () const { return m_NumReceivedBytes; };
 | 
								size_t GetNumReceivedBytes () const { return m_NumReceivedBytes; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		private:
 | 
							private:
 | 
				
			||||||
| 
						 | 
					@ -186,7 +183,6 @@ namespace tunnel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ZeroHopsOutboundTunnel ();
 | 
								ZeroHopsOutboundTunnel ();
 | 
				
			||||||
			void SendTunnelDataMsg (const std::vector<TunnelMessageBlock>& msgs);
 | 
								void SendTunnelDataMsg (const std::vector<TunnelMessageBlock>& msgs);
 | 
				
			||||||
			void Print (std::stringstream& s) const;
 | 
					 | 
				
			||||||
			size_t GetNumSentBytes () const { return m_NumSentBytes; };
 | 
								size_t GetNumSentBytes () const { return m_NumSentBytes; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		private:
 | 
							private:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue