AGPL-3.0-only, a source link in the app, and everything on dev since #5 #6

Merged
bvandeusen merged 214 commits from dev into main 2026-10-21 21:40:00 -04:00
4 changed files with 14 additions and 5 deletions
Showing only changes of commit fe84924f78 - Show all commits
+5
View File
@@ -24,6 +24,11 @@ pub const DB_FILE: &str = "inkwell.db";
/// Attachment bytes, filed by content hash, beside [`DB_FILE`].
pub const BLOBS_DIR: &str = "blobs";
/// The type of bytes whose type isn't known, or isn't safe to say: stored for an
/// attachment that declared none, and served for one that can't be shown inline.
/// The schema's column default (`schema.rs`) is the same string, in SQL.
pub const OPAQUE_MIME: &str = "application/octet-stream";
/// An instant in the store's own form: RFC 3339, UTC, milliseconds, `Z`. Every
/// stored time is written this way, which is what makes lexical order chronological.
pub fn iso(t: DateTime<Utc>) -> String {
+2 -2
View File
@@ -15,7 +15,7 @@ use uuid::Uuid;
use crate::local::derive;
use crate::local::models::*;
use crate::local::recur;
use crate::local::{iso, now};
use crate::local::{iso, now, OPAQUE_MIME};
fn new_id() -> String {
Uuid::new_v4().to_string()
@@ -792,7 +792,7 @@ fn normalize_mime(raw: &str) -> String {
.trim()
.to_ascii_lowercase();
if bare.is_empty() {
"application/octet-stream".to_string()
OPAQUE_MIME.to_string()
} else {
bare
}
+4 -2
View File
@@ -12,6 +12,8 @@ use std::fs;
use std::path::{Path, PathBuf};
use std::sync::OnceLock;
use crate::local::OPAQUE_MIME;
/// A sha256 in lowercase hex, and nothing else.
///
/// This is a **path-safety** check, not a formatting nicety: the hash is taken
@@ -189,7 +191,7 @@ fn content_type_for(mime: &str) -> String {
if familiar && printable {
mime.to_string()
} else {
"application/octet-stream".to_string()
OPAQUE_MIME.to_string()
}
}
@@ -306,7 +308,7 @@ mod tests {
fn a_scriptable_type_is_served_as_a_download() {
// This scheme is an origin of its own. An attachment claiming to be HTML
// must not be handed back as a document that can run there.
let opaque = "application/octet-stream";
let opaque = OPAQUE_MIME;
assert_eq!(content_type_for("text/html"), opaque);
assert_eq!(content_type_for("application/javascript"), opaque);
// An image family member that is really a document with script in it.
+3 -1
View File
@@ -8,6 +8,8 @@
use serde::Deserialize;
use crate::local::OPAQUE_MIME;
#[derive(Debug, Clone, Deserialize, Default)]
pub struct ChangesPage {
#[serde(default)]
@@ -161,5 +163,5 @@ fn default_color() -> String {
}
fn default_mime() -> String {
"application/octet-stream".to_string()
OPAQUE_MIME.to_string()
}