| 704 | } |
| 705 | |
| 706 | void ShowLeasesSets(std::stringstream& s) |
| 707 | { |
| 708 | if (i2p::data::netdb.GetNumLeaseSets ()) |
| 709 | { |
| 710 | s << "<b>" << tr("LeaseSets") << ":</b><br>\r\n<div class=\"list\">\r\n"; |
| 711 | int counter = 1; |
| 712 | // for each lease set |
| 713 | i2p::data::netdb.VisitLeaseSets( |
| 714 | [&s, &counter](const i2p::data::IdentHash dest, std::shared_ptr<i2p::data::LeaseSet> leaseSet) |
| 715 | { |
| 716 | // create copy of lease set so we extract leases |
| 717 | auto storeType = leaseSet->GetStoreType (); |
| 718 | std::unique_ptr<i2p::data::LeaseSet> ls; |
| 719 | if (storeType == i2p::data::NETDB_STORE_TYPE_LEASESET) |
| 720 | ls.reset (new i2p::data::LeaseSet (leaseSet->GetBuffer(), leaseSet->GetBufferLen())); |
| 721 | else |
| 722 | { |
| 723 | ls.reset (new i2p::data::LeaseSet2 (storeType)); |
| 724 | ls->Update (leaseSet->GetBuffer(), leaseSet->GetBufferLen(), nullptr, false); |
| 725 | } |
| 726 | if (!ls) return; |
| 727 | s << "<div class=\"leaseset listitem"; |
| 728 | if (ls->IsExpired()) |
| 729 | s << " expired"; // additional css class for expired |
| 730 | s << "\">\r\n"; |
| 731 | if (!ls->IsValid()) |
| 732 | s << "<div class=\"invalid\">!! " << tr("Invalid") << " !! </div>\r\n"; |
| 733 | s << "<div class=\"slide\"><label for=\"slide" << counter << "\">" << dest.ToBase32() << "</label>\r\n"; |
| 734 | s << "<input type=\"checkbox\" id=\"slide" << (counter++) << "\" />\r\n"; |
| 735 | s << "<div class=\"slidecontent\">\r\n"; |
| 736 | s << "<b>" << tr("Store type") << ":</b> " << (int)storeType << "<br>\r\n"; |
| 737 | s << "<b>" << tr("Expires") << ":</b> " << ConvertTime(ls->GetExpirationTime()) << "<br>\r\n"; |
| 738 | if (storeType == i2p::data::NETDB_STORE_TYPE_LEASESET || storeType == i2p::data::NETDB_STORE_TYPE_STANDARD_LEASESET2) |
| 739 | { |
| 740 | // leases information is available |
| 741 | auto leases = ls->GetNonExpiredLeases(); |
| 742 | s << "<b>" << tr("Non Expired Leases") << ": " << leases.size() << "</b><br>\r\n"; |
| 743 | for ( auto & l : leases ) |
| 744 | { |
| 745 | s << "<b>" << tr("Gateway") << ":</b> " << l->tunnelGateway.ToBase64() << "<br>\r\n"; |
| 746 | s << "<b>" << tr("TunnelID") << ":</b> " << l->tunnelID << "<br>\r\n"; |
| 747 | s << "<b>" << tr("EndDate") << ":</b> " << ConvertTime(l->endDate) << "<br>\r\n"; |
| 748 | } |
| 749 | } |
| 750 | s << "</div>\r\n</div>\r\n"; // class slide class slidecontent |
| 751 | s << "</div>\r\n"; // class leaseset listitem |
| 752 | } |
| 753 | ); |
| 754 | // end for each lease set |
| 755 | s << "</div>\r\n<br>\r\n"; |
| 756 | } |
| 757 | else if (!i2p::context.IsFloodfill ()) |
| 758 | { |
| 759 | s << "<b>" << tr("LeaseSets") << ":</b> " << tr(/* Message on LeaseSets page */ "floodfill mode is disabled") << ".<br>\r\n"; |
| 760 | } |
| 761 | else |
| 762 | { |
| 763 | s << "<b>" << tr("LeaseSets") << ":</b> 0<br>\r\n"; |
no test coverage detected