Public Access
The SSH App opens one session to a shell, over libssh (LibSSH-ESP32 5.10.0) on mbedTLS. A server is trusted the first time on its fingerprint, and a changed key is a warning with Cancel selected. The password is typed each time and kept nowhere; or the device makes itself an Ed25519 key, whose public half is shown, written to /ssh/id_ed25519.pub and printed by `ssh status`. lib/term is the terminal: what a shell, less, top, nano and vim send, with sixteen colours, scroll regions, the alternate screen and 100 lines of scrollback. Five text sizes with Ctrl and + or -, from 60x20 to 26x8, told to the far end. The session goes on when the App is left; SSH shows in the Status Bar. `ssh user@host` in the Shell opens the App. Also: - Keys that aren't characters carry Shift, Ctrl and Alt. The terminal needs it, and it makes Ctrl+Fn+up/down in a note and Shift+Tab in Gemini work from the real keyboard. - IRC doesn't try to connect under 60 KB free: started with a session open, its TLS handshake took the heap down to 236 bytes. - libssh's own curve25519 is left out of the build (scripts/libssh_filter.py): libsodium's has the same names. Costs 292 KB of flash and about 50 KB of heap while a session is open; not started under 75 KB free. Docs: guide page, how-to, FAQ, home page, Status Bar, SD card folders, the memory how-to, README, glossary, N1 notes with Q254 to Q266 and the checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
50 lines
1.6 KiB
C++
50 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
// Who the SSH App connects to, and which servers it has met (issue #2, N1 Q262 and Q263): kept
|
|
// in the device's settings as a few lines of text.
|
|
namespace roro::term {
|
|
|
|
struct SshTarget {
|
|
std::string user, host;
|
|
uint16_t port = 22;
|
|
std::string text() const; // user@host, with :port when it isn't 22
|
|
std::string hostPort() const; // host:port, always: what a host key is remembered under
|
|
};
|
|
// "user@host", "user@host:2222". "" or what is wrong with it.
|
|
std::string parseSshTarget(const std::string& text, SshTarget& out);
|
|
|
|
// Up to eight, the last used first; one a line.
|
|
class SshHosts {
|
|
public:
|
|
static constexpr size_t kMax = 8;
|
|
explicit SshHosts(const std::string& stored = "");
|
|
const std::vector<std::string>& list() const { return hosts_; }
|
|
void used(const SshTarget& target); // to the front, added if it's new
|
|
void remove(size_t index);
|
|
std::string stored() const;
|
|
|
|
private:
|
|
std::vector<std::string> hosts_;
|
|
};
|
|
|
|
// The fingerprint each server showed the first time: "host:port SHA256:...", one a line, sixteen
|
|
// at most (the oldest goes).
|
|
class SshKnownHosts {
|
|
public:
|
|
static constexpr size_t kMax = 16;
|
|
explicit SshKnownHosts(const std::string& stored = "");
|
|
std::string fingerprintOf(const std::string& hostPort) const; // "" if never met
|
|
void remember(const std::string& hostPort, const std::string& fingerprint);
|
|
void forget(const std::string& hostPort);
|
|
std::string stored() const;
|
|
|
|
private:
|
|
std::vector<std::pair<std::string, std::string>> known_;
|
|
};
|
|
|
|
} // namespace roro::term
|