mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 04:04:16 +00:00
[webconsole] add address registration line generator
Signed-off-by: R4SAS <r4sas@i2pmail.org>
This commit is contained in:
parent
5f93dc72fd
commit
9049902ced
@ -123,6 +123,7 @@ namespace http {
|
|||||||
const char HTTP_COMMAND_LOGLEVEL[] = "set_loglevel";
|
const char HTTP_COMMAND_LOGLEVEL[] = "set_loglevel";
|
||||||
const char HTTP_COMMAND_KILLSTREAM[] = "closestream";
|
const char HTTP_COMMAND_KILLSTREAM[] = "closestream";
|
||||||
const char HTTP_COMMAND_LIMITTRANSIT[] = "limittransit";
|
const char HTTP_COMMAND_LIMITTRANSIT[] = "limittransit";
|
||||||
|
const char HTTP_COMMAND_GET_REG_STRING[] = "get_reg_string";
|
||||||
const char HTTP_PARAM_SAM_SESSION_ID[] = "id";
|
const char HTTP_PARAM_SAM_SESSION_ID[] = "id";
|
||||||
const char HTTP_PARAM_ADDRESS[] = "address";
|
const char HTTP_PARAM_ADDRESS[] = "address";
|
||||||
|
|
||||||
@ -407,7 +408,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShowLeaseSetDestination (std::stringstream& s, std::shared_ptr<const i2p::client::LeaseSetDestination> dest)
|
static void ShowLeaseSetDestination (std::stringstream& s, std::shared_ptr<const i2p::client::LeaseSetDestination> dest, uint32_t token)
|
||||||
{
|
{
|
||||||
s << "<b>Base64:</b><br>\r\n<textarea readonly cols=\"80\" rows=\"8\" wrap=\"on\">";
|
s << "<b>Base64:</b><br>\r\n<textarea readonly cols=\"80\" rows=\"8\" wrap=\"on\">";
|
||||||
s << dest->GetIdentity ()->ToBase64 () << "</textarea><br>\r\n<br>\r\n";
|
s << dest->GetIdentity ()->ToBase64 () << "</textarea><br>\r\n<br>\r\n";
|
||||||
@ -419,6 +420,20 @@ namespace http {
|
|||||||
s << "</div>\r\n</div>\r\n";
|
s << "</div>\r\n</div>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(dest->IsPublic())
|
||||||
|
{
|
||||||
|
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
|
||||||
|
auto base32 = dest->GetIdentHash ().ToBase32 ();
|
||||||
|
s << "<div class='slide'><label for='slide-regaddr'><b>Address registration line</b></label>\r\n<input type=\"checkbox\" id=\"slide-regaddr\" />\r\n<div class=\"slidecontent\">\r\n"
|
||||||
|
"<form method=\"get\" action=\"" << webroot << "\">\r\n"
|
||||||
|
" <input type=\"hidden\" name=\"cmd\" value=\"" << HTTP_COMMAND_GET_REG_STRING << "\">\r\n"
|
||||||
|
" <input type=\"hidden\" name=\"token\" value=\"" << token << "\">\r\n"
|
||||||
|
" <input type=\"hidden\" name=\"b32\" value=\"" << base32 << "\">\r\n"
|
||||||
|
" <b>Domain:</b>\r\n<input type=\"text\" maxlength=\"67\" name=\"name\" placeholder=\"domain.i2p\" required>\r\n"
|
||||||
|
" <button type=\"submit\">Generate</button>\r\n"
|
||||||
|
"</form>\r\n<small><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>LeaseSets:</b> <i>" << dest->GetNumRemoteLeaseSets ()
|
s << "<div class='slide'><label for='slide-lease'><b>LeaseSets:</b> <i>" << dest->GetNumRemoteLeaseSets ()
|
||||||
@ -494,7 +509,7 @@ namespace http {
|
|||||||
|
|
||||||
if (dest)
|
if (dest)
|
||||||
{
|
{
|
||||||
ShowLeaseSetDestination (s, dest);
|
ShowLeaseSetDestination (s, dest, token);
|
||||||
// show streams
|
// show streams
|
||||||
s << "<table>\r\n<caption>Streams</caption>\r\n<thead>\r\n<tr>";
|
s << "<table>\r\n<caption>Streams</caption>\r\n<thead>\r\n<tr>";
|
||||||
s << "<th style=\"width:25px;\">StreamID</th>";
|
s << "<th style=\"width:25px;\">StreamID</th>";
|
||||||
@ -537,7 +552,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id)
|
void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id)
|
||||||
{
|
{
|
||||||
auto i2cpServer = i2p::client::context.GetI2CPServer ();
|
auto i2cpServer = i2p::client::context.GetI2CPServer ();
|
||||||
if (i2cpServer)
|
if (i2cpServer)
|
||||||
@ -545,7 +560,7 @@ namespace http {
|
|||||||
s << "<b>I2CP Local Destination:</b><br>\r\n<br>\r\n";
|
s << "<b>I2CP Local Destination:</b><br>\r\n<br>\r\n";
|
||||||
auto it = i2cpServer->GetSessions ().find (std::stoi (id));
|
auto it = i2cpServer->GetSessions ().find (std::stoi (id));
|
||||||
if (it != i2cpServer->GetSessions ().end ())
|
if (it != i2cpServer->GetSessions ().end ())
|
||||||
ShowLeaseSetDestination (s, it->second->GetDestination ());
|
ShowLeaseSetDestination (s, it->second->GetDestination (), 0);
|
||||||
else
|
else
|
||||||
ShowError(s, "I2CP session not found");
|
ShowError(s, "I2CP session not found");
|
||||||
}
|
}
|
||||||
@ -825,7 +840,7 @@ namespace http {
|
|||||||
s << "<b>SAM Sessions:</b> no sessions currently running.<br>\r\n";
|
s << "<b>SAM Sessions:</b> no sessions currently running.<br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowSAMSession (std::stringstream& s, const std::string& id)
|
void ShowSAMSession (std::stringstream& s, const std::string& id)
|
||||||
{
|
{
|
||||||
auto sam = i2p::client::context.GetSAMBridge ();
|
auto sam = i2p::client::context.GetSAMBridge ();
|
||||||
if (!sam) {
|
if (!sam) {
|
||||||
@ -1210,15 +1225,15 @@ namespace http {
|
|||||||
if (dest)
|
if (dest)
|
||||||
{
|
{
|
||||||
if(dest->DeleteStream (streamID))
|
if(dest->DeleteStream (streamID))
|
||||||
s << "<b>SUCCESS</b>: Stream closed<br><br>\r\n";
|
s << "<b>SUCCESS</b>: Stream closed<br>\r\n<br>\r\n";
|
||||||
else
|
else
|
||||||
s << "<b>ERROR</b>: Stream not found or already was closed<br><br>\r\n";
|
s << "<b>ERROR</b>: Stream not found or already was closed<br>\r\n<br>\r\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
s << "<b>ERROR</b>: Destination not found<br><br>\r\n";
|
s << "<b>ERROR</b>: Destination not found<br>\r\n<br>\r\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
s << "<b>ERROR</b>: StreamID can be null<br><br>\r\n";
|
s << "<b>ERROR</b>: StreamID can be null<br>\r\n<br>\r\n";
|
||||||
|
|
||||||
s << "<a href=\"" << webroot << "?page=local_destination&b32=" << b32 << "\">Return to destination page</a><br>\r\n";
|
s << "<a href=\"" << webroot << "?page=local_destination&b32=" << b32 << "\">Return to destination page</a><br>\r\n";
|
||||||
s << "<p>You will be redirected back in 5 seconds</b>";
|
s << "<p>You will be redirected back in 5 seconds</b>";
|
||||||
@ -1232,13 +1247,53 @@ namespace http {
|
|||||||
if (limit > 0 && limit <= 65535)
|
if (limit > 0 && limit <= 65535)
|
||||||
SetMaxNumTransitTunnels (limit);
|
SetMaxNumTransitTunnels (limit);
|
||||||
else {
|
else {
|
||||||
s << "<b>ERROR</b>: Transit tunnels count must not exceed 65535<br><br>\r\n";
|
s << "<b>ERROR</b>: Transit tunnels count must not exceed 65535\r\n<br>\r\n<br>\r\n";
|
||||||
s << "<a href=\"" << webroot << "?page=commands\">Back to commands list</a><br>\r\n";
|
s << "<a href=\"" << webroot << "?page=commands\">Back to commands list</a>\r\n<br>\r\n";
|
||||||
s << "<p>You will be redirected back in 5 seconds</b>";
|
s << "<p>You will be redirected back in 5 seconds</b>";
|
||||||
res.add_header("Refresh", redirect.c_str());
|
res.add_header("Refresh", redirect.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (cmd == HTTP_COMMAND_GET_REG_STRING)
|
||||||
|
{
|
||||||
|
std::string b32 = params["b32"];
|
||||||
|
std::string name = params["name"];
|
||||||
|
|
||||||
|
i2p::data::IdentHash ident;
|
||||||
|
ident.FromBase32 (b32);
|
||||||
|
auto dest = i2p::client::context.FindLocalDestination (ident);
|
||||||
|
|
||||||
|
if (dest) {
|
||||||
|
std::size_t pos;
|
||||||
|
pos = name.find (".i2p");
|
||||||
|
if (pos == (name.length () - 4)) {
|
||||||
|
pos = name.find (".b32.i2p");
|
||||||
|
if (pos == std::string::npos) {
|
||||||
|
auto signatureLen = dest->GetIdentity ()->GetSignatureLen ();
|
||||||
|
uint8_t * signature = new uint8_t[signatureLen];
|
||||||
|
char * sig = new char[signatureLen*2];
|
||||||
|
std::stringstream out;
|
||||||
|
|
||||||
|
out << name << "=" << dest->GetIdentity ()->ToBase64 ();
|
||||||
|
dest->Sign ((uint8_t *)out.str ().c_str (), out.str ().length (), signature);
|
||||||
|
auto len = i2p::data::ByteStreamToBase64 (signature, signatureLen, sig, signatureLen*2);
|
||||||
|
sig[len] = 0;
|
||||||
|
out << "#!sig=" << sig;
|
||||||
|
s << "<b>SUCCESS</b>:<br>\r\n<textarea readonly cols=\"80\" rows=\"10\" wrap=\"on\">" << out.str () << "</textarea>\r\n<br>\r\n<br>\r\n";
|
||||||
|
delete[] signature, sig;
|
||||||
|
} else {
|
||||||
|
s << "<b>ERROR</b>: Domain can't end with .b32.i2p\r\n<br>\r\n<br>\r\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s << "<b>ERROR</b>: Domain must end with .i2p\r\n<br>\r\n<br>\r\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s << "<b>ERROR</b>: Such destination is not found\r\n<br>\r\n<br>\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
s << "<a href=\"" << webroot << "?page=local_destination&b32=" << b32 << "\">Return to destination page</a>\r\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res.code = 400;
|
res.code = 400;
|
||||||
|
@ -137,6 +137,8 @@ namespace client
|
|||||||
void ProcessDeliveryStatusMessage (std::shared_ptr<I2NPMessage> msg);
|
void ProcessDeliveryStatusMessage (std::shared_ptr<I2NPMessage> msg);
|
||||||
void SetLeaseSetUpdated ();
|
void SetLeaseSetUpdated ();
|
||||||
|
|
||||||
|
bool IsPublic () const { return m_IsPublic; };
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// implements GarlicDestination
|
// implements GarlicDestination
|
||||||
@ -147,7 +149,6 @@ namespace client
|
|||||||
int GetLeaseSetType () const { return m_LeaseSetType; };
|
int GetLeaseSetType () const { return m_LeaseSetType; };
|
||||||
void SetLeaseSetType (int leaseSetType) { m_LeaseSetType = leaseSetType; };
|
void SetLeaseSetType (int leaseSetType) { m_LeaseSetType = leaseSetType; };
|
||||||
int GetAuthType () const { return m_AuthType; };
|
int GetAuthType () const { return m_AuthType; };
|
||||||
bool IsPublic () const { return m_IsPublic; };
|
|
||||||
virtual void CleanupDestination () {}; // additional clean up in derived classes
|
virtual void CleanupDestination () {}; // additional clean up in derived classes
|
||||||
// I2CP
|
// I2CP
|
||||||
virtual void HandleDataMessage (const uint8_t * buf, size_t len) = 0;
|
virtual void HandleDataMessage (const uint8_t * buf, size_t len) = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user