ezidam: setup: redirect to /setup if setup is not complete, create first user, redirect to / if setup is complete
This commit is contained in:
parent
c95800330a
commit
2425a4cb50
4 changed files with 105 additions and 35 deletions
|
|
@ -1,6 +1,7 @@
|
|||
use rocket::{Build, Rocket};
|
||||
|
||||
pub mod root;
|
||||
pub mod setup;
|
||||
|
||||
pub(self) mod prelude {
|
||||
pub use crate::database::Database;
|
||||
|
|
@ -22,6 +23,9 @@ pub(self) mod prelude {
|
|||
}
|
||||
|
||||
pub fn routes(rocket_builder: Rocket<Build>) -> Rocket<Build> {
|
||||
// Root
|
||||
rocket_builder.mount("/", root::routes())
|
||||
rocket_builder
|
||||
// Root
|
||||
.mount("/", root::routes())
|
||||
// Setup
|
||||
.mount("/setup", setup::routes())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
use super::prelude::*;
|
||||
use rocket::{get, routes};
|
||||
use rocket::get;
|
||||
use settings::Settings;
|
||||
|
||||
pub fn routes() -> Vec<rocket::Route> {
|
||||
routes![logo, setup, homepage]
|
||||
pub fn routes() -> Vec<Route> {
|
||||
routes![logo, homepage, redirect_to_setup]
|
||||
}
|
||||
|
||||
#[get("/logo")]
|
||||
|
|
@ -39,11 +39,6 @@ mod test {
|
|||
}
|
||||
}
|
||||
|
||||
#[get("/setup")]
|
||||
async fn setup() -> Page {
|
||||
Page::Setup()
|
||||
}
|
||||
|
||||
pub mod content {
|
||||
use rocket::serde::Serialize;
|
||||
|
||||
|
|
@ -54,7 +49,12 @@ pub mod content {
|
|||
}
|
||||
}
|
||||
|
||||
#[get("/homepage")]
|
||||
#[get("/")]
|
||||
async fn redirect_to_setup(_setup: NeedSetup) -> Redirect {
|
||||
Redirect::to(uri!("/setup"))
|
||||
}
|
||||
|
||||
#[get("/", rank = 2)]
|
||||
async fn homepage() -> Page {
|
||||
Page::Homepage(content::Homepage {
|
||||
abc: "string".to_string(),
|
||||
|
|
|
|||
61
crates/ezidam/src/routes/setup.rs
Normal file
61
crates/ezidam/src/routes/setup.rs
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
use super::prelude::*;
|
||||
use rocket::{get, post};
|
||||
use settings::Settings;
|
||||
use users::User;
|
||||
|
||||
pub fn routes() -> Vec<Route> {
|
||||
routes![setup_completed, setup, create_first_account]
|
||||
}
|
||||
|
||||
#[get("/")]
|
||||
async fn setup_completed(_setup: CompletedSetup) -> Redirect {
|
||||
Redirect::to(uri!(super::root::homepage))
|
||||
}
|
||||
|
||||
#[get("/", rank = 2)]
|
||||
async fn setup() -> Page {
|
||||
Page::Setup
|
||||
}
|
||||
|
||||
#[derive(Debug, FromForm)]
|
||||
pub struct CreateFirstAccount<'r> {
|
||||
pub username: &'r str,
|
||||
pub password: &'r str,
|
||||
}
|
||||
|
||||
#[post("/", data = "<form>")]
|
||||
async fn create_first_account(
|
||||
form: Form<CreateFirstAccount<'_>>,
|
||||
_setup: NeedSetup,
|
||||
mut db: Connection<Database>,
|
||||
) -> Result<Redirect> {
|
||||
let form = form.into_inner();
|
||||
|
||||
// Generate UserID
|
||||
let user_id = task::spawn_blocking(UserID::default).await?;
|
||||
|
||||
// Hash password
|
||||
let password = form.password.to_string();
|
||||
let password = task::spawn_blocking(move || Password::new(&password)).await??;
|
||||
|
||||
let mut transaction = db.begin().await?;
|
||||
|
||||
// Insert in database
|
||||
User::insert(
|
||||
&mut transaction,
|
||||
&user_id,
|
||||
true,
|
||||
form.username,
|
||||
Some(&password),
|
||||
)
|
||||
.await?;
|
||||
|
||||
// Store UserID in settings
|
||||
Settings::set_first_admin(&mut transaction, &user_id).await?;
|
||||
|
||||
transaction.commit().await?;
|
||||
|
||||
// TODO: login with openid/oauth
|
||||
|
||||
Ok(Redirect::to(uri!("/")))
|
||||
}
|
||||
|
|
@ -1,41 +1,46 @@
|
|||
{% extends "base" %}
|
||||
|
||||
{% block content %}
|
||||
<body class=" d-flex flex-column">
|
||||
<body class=" d-flex flex-column">
|
||||
<script src="/js/demo-theme.min.js"></script>
|
||||
<div class="page page-center">
|
||||
<div class="container container-tight py-4">
|
||||
<div class="text-center mb-4">
|
||||
<a href="/" class="navbar-brand navbar-brand-autodark"><img src="http://localhost:8000/logo" height="96" alt=""></a>
|
||||
<a href="/" class="navbar-brand navbar-brand-autodark">
|
||||
<img src="http://localhost:8000/logo" height="96" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="card card-md">
|
||||
<div class="card-body text-center py-4 p-sm-5">
|
||||
<h1 class="">Welcome to Ezidam!</h1>
|
||||
<p class="text-muted">Initial setup</p>
|
||||
</div>
|
||||
<div class="hr-text hr-text-center hr-text-spaceless">first admin account</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Username</label>
|
||||
<input type="text" class="form-control">
|
||||
<form action="/setup" method="post">
|
||||
<div class="card card-md">
|
||||
<div class="card-body text-center py-4 p-sm-5">
|
||||
<h1 class="">Welcome to Ezidam!</h1>
|
||||
<p class="text-muted">Initial setup</p>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Password</label>
|
||||
<div class="input-group input-group-flat">
|
||||
<input type="password" class="form-control" autocomplete="off">
|
||||
<div class="hr-text hr-text-center hr-text-spaceless">first admin account</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
<label class="form-label required" for="username">Username</label>
|
||||
<input name="username" id="username" type="text" class="form-control" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label required" for="password">Password</label>
|
||||
<div class="input-group input-group-flat">
|
||||
<input name="password" id="password" type="password" class="form-control" autocomplete="off" required>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row align-items-center mt-3">
|
||||
<div class="col">
|
||||
<div class="btn-list justify-content-end">
|
||||
<a href="#" class="btn btn-primary">
|
||||
Continue
|
||||
</a>
|
||||
<div class="row align-items-center mt-3">
|
||||
<div class="col">
|
||||
<div class="btn-list justify-content-end">
|
||||
<button type="submit" class="btn btn-primary">Create account</button>
|
||||
<!-- <a href="#" class="btn btn-primary">-->
|
||||
<!-- Create account-->
|
||||
<!-- </a>-->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Libs JS -->
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue