aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-08-06 12:52:42 +0200
committermetamuffin <metamuffin@disroot.org>2023-08-06 12:52:42 +0200
commit8551bf2e34d9543fa41a83fae785ed81d6a6c10f (patch)
treeaaa79d1572b253c35576685945280438fe68f4d4 /server
parentcd366dfdfad18b38c4e542e6db61ced3929d42f9 (diff)
downloadjellything-8551bf2e34d9543fa41a83fae785ed81d6a6c10f.tar
jellything-8551bf2e34d9543fa41a83fae785ed81d6a6c10f.tar.bz2
jellything-8551bf2e34d9543fa41a83fae785ed81d6a6c10f.tar.zst
move shared server code to own crate
Diffstat (limited to 'server')
-rw-r--r--server/Cargo.toml6
-rw-r--r--server/src/database.rs3
-rw-r--r--server/src/federation.rs2
-rw-r--r--server/src/import.rs27
-rw-r--r--server/src/main.rs16
-rw-r--r--server/src/routes/mod.rs3
-rw-r--r--server/src/routes/stream.rs3
-rw-r--r--server/src/routes/ui/account/mod.rs3
-rw-r--r--server/src/routes/ui/account/session/token.rs2
-rw-r--r--server/src/routes/ui/assets.rs7
-rw-r--r--server/src/routes/ui/home.rs2
-rw-r--r--server/src/routes/ui/layout.rs3
-rw-r--r--server/src/routes/ui/mod.rs1
-rw-r--r--server/src/routes/ui/node.rs6
-rw-r--r--server/src/routes/ui/player.rs2
15 files changed, 28 insertions, 58 deletions
diff --git a/server/Cargo.toml b/server/Cargo.toml
index f9ecac2..7d6b18f 100644
--- a/server/Cargo.toml
+++ b/server/Cargo.toml
@@ -5,24 +5,24 @@ edition = "2021"
[dependencies]
jellycommon = { path = "../common" }
+jellybase = { path = "../base" }
jellyremuxer = { path = "../remuxer" }
jellyclient = { path = "../client" }
+jellytranscoder = { path = "../transcoder" }
-serde = { version = "1.0.180", features = ["derive"] }
+serde = { version = "1.0.182", features = ["derive"] }
bincode = { version = "2.0.0-rc.3", features = ["serde", "derive"] }
serde_json = "1.0.104"
log = "0.4.19"
env_logger = "0.10.0"
anyhow = "1.0.72"
-once_cell = "1.18.0"
rand = "0.8.5"
base64 = "0.21.2"
chrono = { version = "0.4.26", features = ["serde"] }
vte = "0.11.1"
argon2 = "0.5.1"
-sha2 = "0.10.7"
aes-gcm-siv = "0.11.1"
async-std = "1.12.0"
diff --git a/server/src/database.rs b/server/src/database.rs
index 12a6564..be71c98 100644
--- a/server/src/database.rs
+++ b/server/src/database.rs
@@ -3,8 +3,9 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
-use crate::{routes::ui::account::hash_password, CONF};
+use crate::routes::ui::account::hash_password;
use anyhow::Context;
+use jellybase::CONF;
use jellycommon::{Node, SeekIndex};
use log::info;
use serde::{Deserialize, Serialize};
diff --git a/server/src/federation.rs b/server/src/federation.rs
index c31f95d..38863e2 100644
--- a/server/src/federation.rs
+++ b/server/src/federation.rs
@@ -3,8 +3,8 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
-use crate::CONF;
use anyhow::anyhow;
+use jellybase::CONF;
use jellyclient::{Instance, Session};
use std::{collections::HashMap, sync::Arc, time::Duration};
use tokio::sync::RwLock;
diff --git a/server/src/import.rs b/server/src/import.rs
index 9ffab48..48bdcdc 100644
--- a/server/src/import.rs
+++ b/server/src/import.rs
@@ -6,14 +6,12 @@
use crate::{database::Database, federation::Federation, CONF};
use anyhow::{anyhow, bail, Context, Ok};
use async_recursion::async_recursion;
-use base64::Engine;
use futures::{stream::FuturesUnordered, StreamExt};
+use jellybase::cache_file;
use jellyclient::Session;
use jellycommon::{AssetLocation, MediaSource, Node, NodePrivate, RemoteImportOptions};
use log::{debug, error, info};
-use std::{
- ffi::OsStr, fs::File, os::unix::prelude::OsStrExt, path::PathBuf, str::FromStr, sync::LazyLock,
-};
+use std::{ffi::OsStr, fs::File, os::unix::prelude::OsStrExt, path::PathBuf, sync::LazyLock};
use tokio::sync::Semaphore;
static IMPORT_SEM: LazyLock<Semaphore> = LazyLock::new(|| Semaphore::new(1));
@@ -194,24 +192,3 @@ async fn cache_federation_asset(
}
Ok(poster)
}
-
-fn cache_file(seed: &[&str]) -> (PathBuf, Option<File>) {
- use sha2::Digest;
- let mut d = sha2::Sha512::new();
- for s in seed {
- d.update(s.as_bytes());
- d.update(b"\0");
- }
- let d = d.finalize();
- let fname = base64::engine::general_purpose::URL_SAFE.encode(d);
- let fname = &fname[..22]; // about 128 bits
- let fullpath = CONF.cache_path.join(fname);
- let cachepath = PathBuf::from_str(fname).unwrap();
-
- let f = if !fullpath.exists() {
- Some(File::create(&fullpath).unwrap())
- } else {
- None
- };
- (cachepath, f)
-}
diff --git a/server/src/main.rs b/server/src/main.rs
index b10831f..73d90a4 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -8,29 +8,15 @@
use crate::routes::ui::admin::log::enable_logging;
use database::Database;
use federation::Federation;
-use jellycommon::config::GlobalConfig;
+use jellybase::CONF;
use jellyremuxer::RemuxerContext;
-use once_cell::sync::Lazy;
use routes::build_rocket;
-use std::fs::File;
pub mod database;
pub mod federation;
pub mod import;
pub mod routes;
-pub static CONF: Lazy<GlobalConfig> = Lazy::new(|| {
- serde_json::from_reader(
- File::open(
- std::env::args()
- .nth(1)
- .expect("First argument must specify the config.json to use."),
- )
- .unwrap(),
- )
- .unwrap()
-});
-
fn main() {
enable_logging();
#[cfg(feature = "bypass-auth")]
diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs
index 38d0390..cdb7424 100644
--- a/server/src/routes/mod.rs
+++ b/server/src/routes/mod.rs
@@ -3,9 +3,10 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
-use crate::{database::Database, federation::Federation, routes::ui::error::MyResult, CONF};
+use crate::{database::Database, federation::Federation, routes::ui::error::MyResult};
use api::{r_api_account_login, r_api_root, r_api_version};
use base64::Engine;
+use jellybase::CONF;
use jellyremuxer::RemuxerContext;
use log::warn;
use rand::random;
diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs
index ee7880c..7e26500 100644
--- a/server/src/routes/stream.rs
+++ b/server/src/routes/stream.rs
@@ -4,8 +4,9 @@
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
use super::ui::{account::session::Session, error::MyError};
-use crate::{database::Database, federation::Federation, CONF};
+use crate::{database::Database, federation::Federation};
use anyhow::{anyhow, Result};
+use jellybase::CONF;
use jellycommon::MediaSource;
use jellyremuxer::RemuxerContext;
use log::{debug, info, warn};
diff --git a/server/src/routes/ui/account/mod.rs b/server/src/routes/ui/account/mod.rs
index 6bdf65a..b7ba332 100644
--- a/server/src/routes/ui/account/mod.rs
+++ b/server/src/routes/ui/account/mod.rs
@@ -10,11 +10,12 @@ use super::{error::MyError, layout::LayoutPage};
use crate::{
database::{Database, User},
routes::ui::{error::MyResult, home::rocket_uri_macro_r_home, layout::DynLayoutPage},
- CONF, uri,
+ uri,
};
use anyhow::anyhow;
use argon2::{password_hash::Salt, Argon2, PasswordHasher};
use chrono::Duration;
+use jellybase::CONF;
use rocket::{
form::{Contextual, Form},
get,
diff --git a/server/src/routes/ui/account/session/token.rs b/server/src/routes/ui/account/session/token.rs
index c02eff7..e5e4baf 100644
--- a/server/src/routes/ui/account/session/token.rs
+++ b/server/src/routes/ui/account/session/token.rs
@@ -4,7 +4,6 @@
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
use super::SessionData;
-use crate::CONF;
use aes_gcm_siv::{
aead::{generic_array::GenericArray, Aead},
KeyInit,
@@ -12,6 +11,7 @@ use aes_gcm_siv::{
use anyhow::anyhow;
use base64::Engine;
use chrono::{Duration, Utc};
+use jellybase::CONF;
use log::warn;
use std::sync::LazyLock;
diff --git a/server/src/routes/ui/assets.rs b/server/src/routes/ui/assets.rs
index c00749f..8a14133 100644
--- a/server/src/routes/ui/assets.rs
+++ b/server/src/routes/ui/assets.rs
@@ -6,9 +6,9 @@
use crate::{
database::Database,
routes::ui::{account::session::Session, error::MyError, CacheControlFile},
- CONF,
};
use anyhow::anyhow;
+use jellybase::CONF;
use jellycommon::AssetLocation;
use log::info;
use rocket::{get, http::ContentType, FromFormField, State, UriDisplayQuery};
@@ -23,12 +23,13 @@ pub enum AssetRole {
Backdrop,
}
-#[get("/n/<id>/asset?<role>")]
+#[get("/n/<id>/asset?<role>&<width>")]
pub async fn r_item_assets(
_sess: Session,
+ db: &State<Database>,
id: String,
role: AssetRole,
- db: &State<Database>,
+ width: Option<u32>,
) -> Result<(ContentType, CacheControlFile), MyError> {
let node = db.node.get(&id)?.ok_or(anyhow!("node does not exist"))?;
let mut asset = match role {
diff --git a/server/src/routes/ui/home.rs b/server/src/routes/ui/home.rs
index c4defd0..c544336 100644
--- a/server/src/routes/ui/home.rs
+++ b/server/src/routes/ui/home.rs
@@ -7,8 +7,8 @@ use super::{account::session::Session, layout::LayoutPage};
use crate::{
database::Database,
routes::ui::{error::MyResult, layout::DynLayoutPage},
- CONF,
};
+use jellybase::CONF;
use rocket::{get, State};
use tokio::fs::read_to_string;
diff --git a/server/src/routes/ui/layout.rs b/server/src/routes/ui/layout.rs
index 0e0a429..fdda3e4 100644
--- a/server/src/routes/ui/layout.rs
+++ b/server/src/routes/ui/layout.rs
@@ -14,9 +14,10 @@ use crate::{
browser::rocket_uri_macro_r_all_items,
node::rocket_uri_macro_r_library_node,
},
- uri, CONF,
+ uri,
};
use async_std::task::block_on;
+use jellybase::CONF;
use markup::{DynRender, Render};
use rocket::{
http::ContentType,
diff --git a/server/src/routes/ui/mod.rs b/server/src/routes/ui/mod.rs
index 7acc02a..d561627 100644
--- a/server/src/routes/ui/mod.rs
+++ b/server/src/routes/ui/mod.rs
@@ -82,6 +82,7 @@ impl<'r> Responder<'r, 'static> for CacheControlFile {
Response::build()
.status(Status::NotModified)
.header(Header::new("cache-control", "private"))
+ .header(Header::new("etag", tag))
.ok()
} else {
debug!("file cache: transfer");
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs
index 7b8548e..4574709 100644
--- a/server/src/routes/ui/node.rs
+++ b/server/src/routes/ui/node.rs
@@ -70,7 +70,7 @@ markup::define! {
div[class=cls] {
div.poster {
a[href=uri!(r_library_node(id))] {
- img[src=uri!(r_item_assets(id, AssetRole::Poster))];
+ img[src=uri!(r_item_assets(id, AssetRole::Poster, Some(1024)))];
}
@if matches!(node.kind, NodeKind::Collection | NodeKind::Channel) {
div.hoverdir { a[href=&uri!(r_library_node(id))] { "Open" } }
@@ -87,11 +87,11 @@ markup::define! {
}
NodePage<'a>(id: &'a str, node: &'a NodePublic, children: &'a Vec<(String, NodePublic)>) {
@if !matches!(node.kind, NodeKind::Collection) {
- img.backdrop[src=uri!(r_item_assets(id, AssetRole::Backdrop))];
+ img.backdrop[src=uri!(r_item_assets(id, AssetRole::Backdrop, Some(2048)))];
}
div.page.node {
@if !matches!(node.kind, NodeKind::Collection) {
- div.bigposter { img[src=uri!(r_item_assets(id, AssetRole::Poster))]; }
+ div.bigposter { img[src=uri!(r_item_assets(id, AssetRole::Poster, Some(2048)))]; }
}
div.title {
h1 { @node.title }
diff --git a/server/src/routes/ui/player.rs b/server/src/routes/ui/player.rs
index 3bfb6a4..0e6962e 100644
--- a/server/src/routes/ui/player.rs
+++ b/server/src/routes/ui/player.rs
@@ -56,7 +56,7 @@ pub fn r_player(
class: Some("player"),
content: markup::new! {
@if tracks.is_empty() {
- img.backdrop[src=uri!(r_item_assets(&id, AssetRole::Backdrop)).to_string()];
+ img.backdrop[src=uri!(r_item_assets(&id, AssetRole::Backdrop, Some(2048))).to_string()];
} else {
video[src=uri!(r_stream(&id, &tracks, Some(true))), controls, preload="auto"]{}
}