| 1050 | } |
| 1051 | |
| 1052 | void ShowSAMSession (std::stringstream& s, const std::string& id) |
| 1053 | { |
| 1054 | auto sam = i2p::client::context.GetSAMBridge (); |
| 1055 | if (!sam) |
| 1056 | { |
| 1057 | ShowError(s, tr("SAM disabled")); |
| 1058 | return; |
| 1059 | } |
| 1060 | if (id.empty ()) |
| 1061 | { |
| 1062 | ShowError(s, tr("No sam_id")); |
| 1063 | return; |
| 1064 | } |
| 1065 | std::vector<uint8_t> sam_id(id.length ()); // id is in base64 |
| 1066 | size_t l = i2p::data::Base64ToByteStream (id, sam_id.data (), sam_id.size ()); |
| 1067 | if (!l) |
| 1068 | { |
| 1069 | ShowError(s, tr("Invalid sam_id")); |
| 1070 | return; |
| 1071 | } |
| 1072 | auto session = sam->FindSession ( { (const char *)sam_id.data (), l }); |
| 1073 | if (!session) |
| 1074 | { |
| 1075 | ShowError(s, tr("SAM session not found")); |
| 1076 | return; |
| 1077 | } |
| 1078 | |
| 1079 | std::string webroot; i2p::config::GetOption("http.webroot", webroot); |
| 1080 | s << "<b>" << tr("SAM Session") << ":</b><br>\r\n<div class=\"list\">\r\n"; |
| 1081 | auto& ident = session->GetLocalDestination ()->GetIdentHash(); |
| 1082 | s << "<div class=\"listitem\"><a href=\"" << webroot << "?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">"; |
| 1083 | s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "</a></div>\r\n"; |
| 1084 | s << "</div>\r\n<br>\r\n"; |
| 1085 | s << "<b>" << tr("Streams") << ":</b><br>\r\n<div class=\"list\">\r\n"; |
| 1086 | for (const auto& it: sam->ListSockets({ (const char *)sam_id.data (), l })) |
| 1087 | { |
| 1088 | s << "<div class=\"listitem\">"; |
| 1089 | switch (it->GetSocketType ()) |
| 1090 | { |
| 1091 | case i2p::client::SAMSocketType::eSAMSocketTypeSession : s << "session"; break; |
| 1092 | case i2p::client::SAMSocketType::eSAMSocketTypeStream : s << "stream"; break; |
| 1093 | case i2p::client::SAMSocketType::eSAMSocketTypeAcceptor : s << "acceptor"; break; |
| 1094 | case i2p::client::SAMSocketType::eSAMSocketTypeForward : s << "forward"; break; |
| 1095 | default: s << "unknown"; break; |
| 1096 | } |
| 1097 | if (it->GetSocketType () != i2p::client::SAMSocketType::eSAMSocketTypeTerminated && it->GetSocket ().is_open ()) |
| 1098 | s << " [" << it->GetSocket ().remote_endpoint() << "]"; |
| 1099 | s << "</div>\r\n"; |
| 1100 | } |
| 1101 | s << "</div>\r\n"; |
| 1102 | } |
| 1103 | |
| 1104 | void ShowI2PTunnels (std::stringstream& s) |
| 1105 | { |
no test coverage detected