wasmcloud/src/main.rs

133 lines
3.5 KiB
Rust
Raw Normal View History

2020-10-26 16:56:24 +00:00
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate diesel;
#[macro_use]
extern crate rocket;
#[macro_use]
extern crate rocket_contrib;
2020-10-27 15:43:54 +00:00
use color_eyre::eyre::Result;
2020-10-26 16:56:24 +00:00
use diesel::pg::PgConnection;
use diesel::prelude::*;
2020-10-27 15:43:54 +00:00
use rocket::{
http::{Cookie, Cookies, SameSite},
response::Redirect,
};
use rocket_contrib::{helmet::SpaceHelmet, json::Json, uuid::Uuid};
use rocket_oauth2::{OAuth2, TokenResponse};
2020-10-26 16:56:24 +00:00
2020-10-27 15:43:54 +00:00
pub mod gitea;
2020-10-26 16:56:24 +00:00
pub mod models;
pub mod schema;
#[database("main_data")]
struct MainDatabase(PgConnection);
2020-10-27 15:43:54 +00:00
struct Gitea;
#[tracing::instrument(skip(conn))]
2020-10-26 16:56:24 +00:00
#[get("/user/<uuid>")]
fn get_user(conn: MainDatabase, uuid: Uuid) -> Json<models::User> {
use schema::users::dsl::users;
let result = users
.find(uuid.into_inner())
.get_result::<models::User>(&*conn)
.expect("to find user");
Json(result)
}
2020-10-27 15:43:54 +00:00
#[tracing::instrument(skip(oauth2, cookies))]
#[get("/login/gitea")]
fn gitea_login(oauth2: OAuth2<Gitea>, mut cookies: Cookies<'_>) -> Redirect {
oauth2.get_redirect(&mut cookies, &[""]).unwrap()
}
#[tracing::instrument(skip(conn, token, cookies))]
#[get("/auth/gitea")]
fn gitea_callback(
conn: MainDatabase,
token: TokenResponse<Gitea>,
mut cookies: Cookies<'_>,
) -> Redirect {
let tok = token.access_token().to_string();
let refresh = token.refresh_token().unwrap().to_string();
2020-10-27 16:21:28 +00:00
let gitea_user = gitea::user(tok.clone()).expect("gitea api call to work");
use schema::{
gitea_tokens,
users::{
dsl::{email, users},
table as users_table,
},
};
let user: models::User = match users
.filter(email.eq(gitea_user.email.clone()))
.limit(1)
.load::<models::User>(&*conn)
{
2020-10-27 17:41:34 +00:00
Ok(u) => if u.len() == 0 {
2020-10-27 15:43:54 +00:00
let u = models::User {
2020-10-27 16:21:28 +00:00
id: uuid::Uuid::new_v4(),
2020-10-27 15:43:54 +00:00
salutation: gitea_user.full_name,
email: gitea_user.email,
is_admin: gitea_user.is_admin,
2020-10-27 16:21:28 +00:00
is_locked: false,
tier: 0,
};
2020-10-27 17:41:34 +00:00
let u: models::User = diesel::insert_into(users_table)
2020-10-27 16:21:28 +00:00
.values(&u)
.get_result(&*conn)
.expect("able to insert user");
let tok = models::GiteaToken {
id: uuid::Uuid::new_v4(),
user_id: u.id.clone(),
access_token: tok,
refresh_token: refresh,
};
2020-10-27 17:41:34 +00:00
let _: models::GiteaToken = diesel::insert_into(gitea_tokens::table)
2020-10-27 16:21:28 +00:00
.values(&tok)
.get_result(&*conn)
.expect("able to insert token");
u
2020-10-27 17:41:34 +00:00
} else {
tracing::info!("{} {:?} logged in", u[0].id, u[0].salutation);
u[0].clone()
},
Err(why) => {
tracing::error!("error reading from database: {}", why);
todo!("error response")
2020-10-27 15:43:54 +00:00
}
};
// Set a private cookie with the access token
cookies.add_private(
Cookie::build("token", token.access_token().to_string())
.same_site(SameSite::Lax)
.finish(),
);
Redirect::to("/")
}
fn main() -> Result<()> {
color_eyre::install()?;
tracing_subscriber::fmt::init();
2020-10-26 16:56:24 +00:00
rocket::ignite()
2020-10-27 15:43:54 +00:00
.attach(OAuth2::<Gitea>::fairing("gitea"))
2020-10-26 16:56:24 +00:00
.attach(MainDatabase::fairing())
2020-10-27 15:43:54 +00:00
.attach(SpaceHelmet::default())
.mount("/api", routes![get_user])
.mount("/", routes![gitea_login, gitea_callback])
.launch();
Ok(())
2020-10-26 16:56:24 +00:00
}