mirror of
https://github.com/storytold/figcraft.git
synced 2026-10-25 19:06:47 -06:00
The Share popover is one flow: Online (the file is published to the server in
Preferences and the server names its links with short codes) or Local network
(the app hosts; the code carries its address and the session's secret), one
Start sharing button, the code large with Copy code and Copy link, who is here,
can edit / can view, and Stop sharing. Join with a code is one field in the
popover, on the home screen and in the Join dialog, for a code of either kind
or an invite link.
Protocol (within version 2, new variants last): Resolve / Resolved and Admin
code. The server keeps a stretched hash and the wrapped token, never the code,
and limits wrong codes per address (with a lockout) and for everyone. Older
servers leave the links in place of a code; older apps join by link.
collab.share, collab.join {code}, code and share in collab.peers; the server
preference defaults to the built-in server and can be reset or turned off.
25 lines
932 B
Rust
25 lines
932 B
Rust
//! Session secrets from the operating system's random number generator.
|
|
|
|
use base64::Engine as _;
|
|
|
|
/// A session token: 128 random bits, URL-safe base64 (22 characters).
|
|
pub fn secret() -> Result<String, String> {
|
|
let mut b = [0u8; 16];
|
|
getrandom::fill(&mut b).map_err(|e| format!("no secure random numbers: {e}"))?;
|
|
Ok(base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(b))
|
|
}
|
|
|
|
/// A file's session id: 64 random bits as hex (not a secret; it tells sessions apart).
|
|
pub fn file_id() -> Result<String, String> {
|
|
let mut b = [0u8; 8];
|
|
getrandom::fill(&mut b).map_err(|e| format!("no secure random numbers: {e}"))?;
|
|
Ok(b.iter().map(|x| format!("{x:02x}")).collect())
|
|
}
|
|
|
|
/// 64 random bits (join codes are made from them).
|
|
pub fn random() -> Result<u64, String> {
|
|
let mut b = [0u8; 8];
|
|
getrandom::fill(&mut b).map_err(|e| format!("no secure random numbers: {e}"))?;
|
|
Ok(u64::from_le_bytes(b))
|
|
}
|