Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
c5d267a
fix
trueleo Aug 24, 2023
3619923
fix
trueleo Aug 24, 2023
d66b90c
Refactor
trueleo Aug 25, 2023
ff6a383
Add Oauth
trueleo Aug 25, 2023
ec24873
Fix
trueleo Aug 26, 2023
ae950c3
fix
trueleo Aug 28, 2023
c86a3e2
Fix
trueleo Aug 28, 2023
239c503
Refactor
trueleo Aug 29, 2023
78364ce
Add logout
trueleo Aug 29, 2023
33818d8
Cargo fmt
trueleo Aug 30, 2023
d729db5
Remove http only
trueleo Aug 31, 2023
49cdaa5
Disable cookie same site
trueleo Aug 31, 2023
95eceed
secure disable
trueleo Aug 31, 2023
e347131
Custom role
trueleo Aug 30, 2023
f26054d
Fix
trueleo Aug 31, 2023
68d7358
Revert "secure disable"
trueleo Aug 31, 2023
4b90e79
Revert "Disable cookie same site"
trueleo Aug 31, 2023
3e4dea9
Fix
trueleo Aug 31, 2023
a25117e
Cache control no store
trueleo Aug 31, 2023
4184bcb
Fix
trueleo Sep 1, 2023
d6cf595
Fix
trueleo Sep 1, 2023
d0c018d
Change to hashset
trueleo Sep 1, 2023
61712fe
Update user if does not exist
trueleo Sep 4, 2023
da5ecf3
Logout user based on type
trueleo Sep 4, 2023
bc21c38
Fix comment
trueleo Sep 4, 2023
80a2866
User endpoint change
trueleo Sep 5, 2023
dd9d269
Add actions
trueleo Sep 5, 2023
7e0fe2b
Add migration
trueleo Sep 5, 2023
aba7565
Change to roles
trueleo Sep 5, 2023
69d6fc8
Fix migration
trueleo Sep 5, 2023
27546d8
disallow request when role is in use
trueleo Sep 6, 2023
36a3ecd
Fix
trueleo Sep 6, 2023
c093624
Fix
trueleo Sep 6, 2023
94fef7f
Cors
trueleo Sep 7, 2023
0c9b46e
Refactor
trueleo Sep 12, 2023
7ab724d
Fix
trueleo Sep 14, 2023
5e613e1
Merge branch 'main' into oauth
nitisht Sep 14, 2023
d6a9c2a
Do redirect on no auth
trueleo Sep 15, 2023
53c4352
Fix role types for better error detection
trueleo Sep 15, 2023
47b1ed0
Fix
trueleo Sep 15, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 101 additions & 8 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ xxhash-rust = { version = "0.8", features = ["xxh3"] }
xz2 = { version = "*", features = ["static"] }
nom = "7.1.3"
humantime = "2.1.0"
openid = { version = "0.12.0", default-features = false, features = ["rustls"] }
url = "2.4.0"

[build-dependencies]
cargo_toml = "0.15"
Expand Down
71 changes: 57 additions & 14 deletions server/src/handlers/http.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,17 @@

use std::fs::File;
use std::io::BufReader;
use std::sync::Arc;

use actix_cors::Cors;
use actix_web::{web, App, HttpServer};
use actix_web::{
web::{self, resource},
App, HttpServer,
};
use actix_web_prometheus::PrometheusMetrics;
use actix_web_static_files::ResourceFiles;
use log::info;
use openid::Discovered;
use rustls::{Certificate, PrivateKey, ServerConfig};
use rustls_pemfile::{certs, pkcs8_private_keys};

Expand All @@ -37,33 +43,47 @@ mod ingest;
mod llm;
mod logstream;
mod middleware;
mod oidc;
mod query;
mod rbac;
mod role;

include!(concat!(env!("OUT_DIR"), "/generated.rs"));

const MAX_EVENT_PAYLOAD_SIZE: usize = 10485760;
const API_BASE_PATH: &str = "/api";
const API_VERSION: &str = "v1";

#[macro_export]
macro_rules! create_app {
($prometheus: expr) => {
pub async fn run_http(
prometheus: PrometheusMetrics,
oidc_client: Option<crate::oidc::OpenidConfig>,
) -> anyhow::Result<()> {
let oidc_client = match oidc_client {
Some(config) => {
let client = config
.connect(&format!("{API_BASE_PATH}/{API_VERSION}/o/code"))
.await?;
Some(Arc::new(client))
}
None => None,
};

let create_app = move || {
App::new()
.wrap($prometheus.clone())
.configure(|cfg| configure_routes(cfg))
.wrap(prometheus.clone())
.configure(|cfg| configure_routes(cfg, oidc_client.clone()))
.wrap(actix_web::middleware::Logger::default())
.wrap(actix_web::middleware::Compress::default())
.wrap(
Cors::default()
.allow_any_header()
.allow_any_method()
.allow_any_origin(),
.allow_any_origin()
.expose_any_header()
.supports_credentials(),
)
};
}

pub async fn run_http(prometheus: PrometheusMetrics) -> anyhow::Result<()> {
let ssl_acceptor = match (
&CONFIG.parseable.tls_cert_path,
&CONFIG.parseable.tls_key_path,
Expand Down Expand Up @@ -99,7 +119,7 @@ pub async fn run_http(prometheus: PrometheusMetrics) -> anyhow::Result<()> {
};

// concurrent workers equal to number of cores on the cpu
let http_server = HttpServer::new(move || create_app!(prometheus)).workers(num_cpus::get());
let http_server = HttpServer::new(create_app).workers(num_cpus::get());
if let Some(config) = ssl_acceptor {
http_server
.bind_rustls(&CONFIG.parseable.address, config)?
Expand All @@ -112,7 +132,10 @@ pub async fn run_http(prometheus: PrometheusMetrics) -> anyhow::Result<()> {
Ok(())
}

pub fn configure_routes(cfg: &mut web::ServiceConfig) {
pub fn configure_routes(
cfg: &mut web::ServiceConfig,
oidc_client: Option<Arc<openid::Client<Discovered, crate::oidc::Claims>>>,
) {
let generated = generate();

//log stream API
Expand Down Expand Up @@ -211,13 +234,13 @@ pub fn configure_routes(cfg: &mut web::ServiceConfig) {
.route(
web::put()
.to(rbac::put_role)
.authorize(Action::PutRoles)
.authorize(Action::PutUserRoles)
.wrap(DisAllowRootUser),
)
.route(
web::get()
.to(rbac::get_role)
.authorize_for_user(Action::GetRole),
.authorize_for_user(Action::GetUserRoles),
),
)
.service(
Expand All @@ -238,6 +261,24 @@ pub fn configure_routes(cfg: &mut web::ServiceConfig) {
.authorize(Action::QueryLLM),
),
);
let role_api = web::scope("/role")
.service(resource("").route(web::get().to(role::list).authorize(Action::ListRole)))
.service(
resource("/{name}")
.route(web::put().to(role::put).authorize(Action::PutRole))
.route(web::delete().to(role::delete).authorize(Action::DeleteRole))
.route(web::get().to(role::get).authorize(Action::GetRole)),
);

let mut oauth_api = web::scope("/o")
.service(resource("/login").route(web::get().to(oidc::login)))
.service(resource("/logout").route(web::get().to(oidc::logout)))
.service(resource("/code").route(web::get().to(oidc::reply_login)));

if let Some(client) = oidc_client {
info!("Registered oidc client");
oauth_api = oauth_api.app_data(web::Data::from(client))
}

// Deny request if username is same as the env variable P_USERNAME.
cfg.service(
Expand Down Expand Up @@ -280,7 +321,9 @@ pub fn configure_routes(cfg: &mut web::ServiceConfig) {
),
)
.service(user_api)
.service(llm_query_api),
.service(llm_query_api)
.service(oauth_api)
.service(role_api),
)
// GET "/" ==> Serve the static frontend directory
.service(ResourceFiles::new("/", generated).resolve_not_found_to_root());
Expand Down
Loading