mirror of https://github.com/EasyCTF/librectf
rehaul
This commit is contained in:
parent
1709cbf418
commit
705ac39094
|
@ -1,7 +1,7 @@
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
use tera::Tera;
|
use tera::{Context, Tera};
|
||||||
|
|
||||||
use config::{Config, FilestoreConfig, WebConfig};
|
use config::{Config, FilestoreConfig, WebConfig};
|
||||||
use db::{establish_connection, Connection, Pool};
|
use db::{establish_connection, Connection, Pool};
|
||||||
|
@ -40,15 +40,13 @@ impl State {
|
||||||
self.get_web_config().and_then(|cfg| cfg.filestore.as_ref())
|
self.get_web_config().and_then(|cfg| cfg.filestore.as_ref())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn renderer<F, T>(&self, f: F) -> Result<T, Error>
|
pub fn render(&self, page: impl AsRef<str>, ctx: &Context) -> Result<String, Error> {
|
||||||
where
|
|
||||||
F: Fn(&Tera) -> T,
|
|
||||||
{
|
|
||||||
let t = self
|
let t = self
|
||||||
.tera
|
.tera
|
||||||
.lock()
|
.lock()
|
||||||
.map_err(|err| format_err!("Internal error acquiring Tera lock: {}", err))?;
|
.map_err(|err| format_err!("Internal error acquiring Tera lock: {}", err))?;
|
||||||
Ok(f(&t))
|
t.render(page.as_ref(), ctx)
|
||||||
|
.map_err(|err| format_err!("Internal error rendering template: {}", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_templates(&mut self, templates: Vec<(&str, &str)>) -> Result<(), Error> {
|
pub fn add_templates(&mut self, templates: Vec<(&str, &str)>) -> Result<(), Error> {
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
mod pages;
|
mod pages;
|
||||||
|
mod user;
|
||||||
|
|
||||||
use actix_web::App;
|
use actix_web::{middleware::csrf::CsrfFilter, App};
|
||||||
use core::State;
|
use core::State;
|
||||||
|
|
||||||
pub fn router(state: State) -> App<State> {
|
pub fn router(state: State) -> App<State> {
|
||||||
App::with_state(state).resource("/", |r| r.get().with(self::pages::handler))
|
App::with_state(state)
|
||||||
|
.middleware(CsrfFilter::new())
|
||||||
|
.resource("/", |r| r.get().with(self::pages::handler))
|
||||||
|
.resource("/static/{path:.*}", |r| r.get().with(self::pages::statics))
|
||||||
|
.scope("/user", self::user::scope)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use actix_web::{HttpRequest, HttpResponse};
|
use actix_web::{HttpRequest, HttpResponse};
|
||||||
use core::{pages::get_page, State};
|
use core::{pages::get_page, State};
|
||||||
use tera::Context;
|
use tera::Context;
|
||||||
|
|
||||||
const WELCOME_MESSAGE: &'static str = "Welcome to LibreCTF! You're seeing this message because you haven't set up your index page yet.";
|
const WELCOME_MESSAGE: &'static str = "Welcome to LibreCTF! You're seeing this message because you probably haven't set up your index page yet. Head over to the admin panel to set it up!";
|
||||||
|
|
||||||
|
#[derive(Embed)]
|
||||||
|
#[folder = "components/frontend/static"]
|
||||||
|
struct Static;
|
||||||
|
|
||||||
pub fn handler(req: HttpRequest<State>) -> HttpResponse {
|
pub fn handler(req: HttpRequest<State>) -> HttpResponse {
|
||||||
let state = req.state();
|
let state = req.state();
|
||||||
|
@ -15,16 +21,20 @@ pub fn handler(req: HttpRequest<State>) -> HttpResponse {
|
||||||
};
|
};
|
||||||
|
|
||||||
state
|
state
|
||||||
.renderer(|tera| {
|
.render("page.html", &ctx)
|
||||||
tera.render("index.html", &ctx)
|
.map(|content| HttpResponse::Ok().body(content))
|
||||||
.map(|content| HttpResponse::Ok().body(content))
|
.map(|err| err.into())
|
||||||
.map(|err| err.into())
|
.unwrap_or_else(|err| {
|
||||||
.unwrap_or_else(|err| {
|
error!("Error during Tera rendering: {}", err);
|
||||||
error!("Error during Tera rendering: {}", err);
|
|
||||||
HttpResponse::InternalServerError().finish()
|
|
||||||
})
|
|
||||||
}).unwrap_or_else(|err| {
|
|
||||||
error!("{}", err);
|
|
||||||
HttpResponse::InternalServerError().finish()
|
HttpResponse::InternalServerError().finish()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn statics(req: HttpRequest<State>) -> HttpResponse {
|
||||||
|
let path = req.match_info().query::<String>("path").unwrap();
|
||||||
|
println!("{:?}", path);
|
||||||
|
match Static::get(&path) {
|
||||||
|
Some(contents) => HttpResponse::Ok().body(contents),
|
||||||
|
None => HttpResponse::NotFound().finish(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
use actix_web::{HttpRequest, HttpResponse, Scope};
|
||||||
|
use core::State;
|
||||||
|
use tera::Context;
|
||||||
|
|
||||||
|
pub fn scope(app: Scope<State>) -> Scope<State> {
|
||||||
|
app.resource("/login", |r| r.with(login))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn login(req: HttpRequest<State>) -> HttpResponse {
|
||||||
|
let state = req.state();
|
||||||
|
let ctx = Context::new();
|
||||||
|
|
||||||
|
state.render("user/login.html", &ctx)
|
||||||
|
.map(|content| HttpResponse::Ok().body(content))
|
||||||
|
.map(|err| err.into())
|
||||||
|
.unwrap_or_else(|err| {
|
||||||
|
error!("Error during Tera rendering: {}", err);
|
||||||
|
HttpResponse::InternalServerError().finish()
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
body {
|
||||||
|
max-width: 854px;
|
||||||
|
margin: auto;
|
||||||
|
font-size: 11pt;
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
margin-bottom: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav {
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul {
|
||||||
|
list-style-type: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li.right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li > a {
|
||||||
|
display: inline-block;
|
||||||
|
color: white;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
header > nav > ul > li > a:visited {
|
||||||
|
color: white;
|
||||||
|
}
|
|
@ -1,8 +1,20 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
|
<link rel="stylesheet" href="/static/main.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>LibreCTF</h1>
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/">home</a></li>
|
||||||
|
<li><a href="/scoreboard">scoreboard</a></li>
|
||||||
|
<li class="right"><a href="/user/login">login</a></li>
|
||||||
|
<li class="right"><a href="/user/register">register</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
{% block content %}{% endblock %}
|
{% block content %}{% endblock %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
{% extends "layout.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
login
|
||||||
|
{% endblock %}
|
Loading…
Reference in New Issue