aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/src/routes/api/mod.rs13
-rw-r--r--server/src/routes/stream.rs75
2 files changed, 49 insertions, 39 deletions
diff --git a/server/src/routes/api/mod.rs b/server/src/routes/api/mod.rs
index 87ed0e9..214c5de 100644
--- a/server/src/routes/api/mod.rs
+++ b/server/src/routes/api/mod.rs
@@ -9,7 +9,7 @@ use super::ui::{
};
use crate::database::Database;
use anyhow::{anyhow, Context};
-use jellycommon::{user::UserPermission, Node};
+use jellycommon::{user::CreateSessionParams, Node};
use rocket::{
get,
http::MediaType,
@@ -20,9 +20,8 @@ use rocket::{
serde::json::Json,
Request, State,
};
-use serde::Deserialize;
use serde_json::{json, Value};
-use std::{collections::HashSet, ops::Deref};
+use std::ops::Deref;
#[get("/api")]
pub fn r_api_root() -> Redirect {
@@ -34,14 +33,6 @@ pub fn r_api_version() -> &'static str {
"2"
}
-#[derive(Deserialize)]
-pub struct CreateSessionParams {
- username: String,
- password: String,
- expire: Option<i64>,
- drop_permissions: Option<HashSet<UserPermission>>,
-}
-
#[post("/api/create_session", data = "<data>")]
pub fn r_api_account_login(
database: &State<Database>,
diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs
index 14db462..8d16ded 100644
--- a/server/src/routes/stream.rs
+++ b/server/src/routes/stream.rs
@@ -11,7 +11,11 @@ use jellybase::{
permission::{NodePermissionExt, PermissionSetExt},
CONF,
};
-use jellycommon::{stream::StreamSpec, user::UserPermission, TrackSource};
+use jellycommon::{
+ stream::StreamSpec,
+ user::{CreateSessionParams, UserPermission},
+ TrackSource,
+};
use log::{info, warn};
use rocket::{
get, head,
@@ -58,36 +62,51 @@ pub async fn r_stream(
.as_ref()
.ok_or(anyhow!("item does not contain media"))?;
- // TODO federated streams
- // if let MediaSource::Remote { host, remote_id } = source {
- // session
- // .user
- // .permissions
- // .assert(&UserPermission::FederatedContent)?;
+ // TODO its unclear how requests with multiple tracks should be handled.
+ if spec.tracks.len() == 1 {
+ let ti = spec.tracks[0];
+ if let TrackSource::Remote(remote_index) = source[ti] {
+ session
+ .user
+ .permissions
+ .assert(&UserPermission::FederatedContent)?;
+
+ let track = &node.public.media.ok_or(anyhow!("no media"))?.tracks[ti];
+ let host = track
+ .federated
+ .last()
+ .ok_or(anyhow!("federation inconsistent"))?;
- // let (username, password, _) = CONF
- // .remote_credentials
- // .get(host)
- // .ok_or(anyhow!("no credentials on the server-side"))?;
+ let (username, password, _) = CONF
+ .remote_credentials
+ .get(host)
+ .ok_or(anyhow!("no credentials on the server-side"))?;
- // info!("creating session on {host}");
- // let instance = federation.get_instance(&host)?.to_owned();
- // let session = instance
- // .login(LoginDetails {
- // username: username.to_owned(),
- // password: password.to_owned(),
- // expire: Some(60),
- // drop_permissions: Some(HashSet::from_iter([
- // UserPermission::ManageSelf,
- // UserPermission::Admin, // in case somebody federated the admin :)))
- // ])),
- // })
- // .await?;
+ info!("creating session on {host}");
+ let instance = federation.get_instance(&host)?.to_owned();
+ let session = instance
+ .login(CreateSessionParams {
+ username: username.to_owned(),
+ password: password.to_owned(),
+ expire: Some(60),
+ drop_permissions: Some(HashSet::from_iter([
+ UserPermission::ManageSelf,
+ UserPermission::Admin, // in case somebody federated the admin :)))
+ ])),
+ })
+ .await?;
- // let uri = session.stream(&remote_id, &spec);
- // info!("federation redirect");
- // return Ok(Either::Right(RedirectResponse(uri)));
- // }
+ let uri = session.stream(
+ node.public.id.as_ref().unwrap(),
+ &StreamSpec {
+ tracks: vec![remote_index],
+ ..spec
+ },
+ );
+ info!("federation redirect");
+ return Ok(Either::Right(RedirectResponse(uri)));
+ }
+ }
info!(
"stream request (range={})",