mirror of
https://github.com/stoatchat/stoatchat.git
synced 2026-07-14 21:47:02 +00:00
Update rAuth, add templates; add APP_URL variable.
This commit is contained in:
25
src/main.rs
25
src/main.rs
@@ -21,12 +21,12 @@ pub mod util;
|
||||
use chrono::Duration;
|
||||
use futures::join;
|
||||
use log::info;
|
||||
use rauth::auth::Auth;
|
||||
use rauth::{auth::Auth, options::{Template, Templates}};
|
||||
use rauth::options::{EmailVerification, Options, SMTP};
|
||||
use rocket_cors::AllowedOrigins;
|
||||
use rocket_prometheus::PrometheusMetrics;
|
||||
use util::variables::{
|
||||
PUBLIC_URL, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, SMTP_USERNAME, USE_EMAIL, USE_PROMETHEUS,
|
||||
PUBLIC_URL, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, SMTP_USERNAME, USE_EMAIL, USE_PROMETHEUS, APP_URL
|
||||
};
|
||||
|
||||
#[async_std::main]
|
||||
@@ -67,9 +67,26 @@ async fn launch_web() {
|
||||
.base_url(format!("{}/auth", *PUBLIC_URL))
|
||||
.email_verification(if *USE_EMAIL {
|
||||
EmailVerification::Enabled {
|
||||
success_redirect_uri: format!("{}/welcome", *PUBLIC_URL),
|
||||
success_redirect_uri: format!("{}/login", *APP_URL),
|
||||
welcome_redirect_uri: format!("{}/welcome", *APP_URL),
|
||||
password_reset_url: Some(format!("{}/login/reset", *APP_URL)),
|
||||
|
||||
verification_expiry: Duration::days(1),
|
||||
verification_ratelimit: Duration::minutes(1),
|
||||
password_reset_expiry: Duration::hours(1),
|
||||
|
||||
templates: Templates {
|
||||
verify_email: Template {
|
||||
title: "Verify your REVOLT account.",
|
||||
text: "Verify your email here: {{url}}",
|
||||
html: include_str!("../assets/templates/verify.html")
|
||||
},
|
||||
reset_password: Template {
|
||||
title: "Reset your REVOLT password.",
|
||||
text: "Reset your password here: {{url}}",
|
||||
html: include_str!("../assets/templates/reset.html")
|
||||
},
|
||||
welcome: None
|
||||
},
|
||||
|
||||
smtp: SMTP {
|
||||
from: (*SMTP_FROM).to_string(),
|
||||
|
||||
@@ -8,7 +8,7 @@ use rocket_contrib::json::JsonValue;
|
||||
#[get("/")]
|
||||
pub async fn root() -> JsonValue {
|
||||
json!({
|
||||
"revolt": "0.3.3-alpha.0",
|
||||
"revolt": "0.3.3-alpha.2",
|
||||
"features": {
|
||||
"registration": !*DISABLE_REGISTRATION,
|
||||
"captcha": {
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
use crate::util::variables::{HCAPTCHA_KEY, USE_HCAPTCHA};
|
||||
|
||||
use reqwest::Client;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct CaptchaResponse {
|
||||
success: bool,
|
||||
}
|
||||
|
||||
pub async fn verify(user_token: &Option<String>) -> Result<(), String> {
|
||||
if *USE_HCAPTCHA {
|
||||
if let Some(token) = user_token {
|
||||
let mut map = HashMap::new();
|
||||
map.insert("secret", HCAPTCHA_KEY.to_string());
|
||||
map.insert("response", token.to_string());
|
||||
|
||||
let client = Client::new();
|
||||
if let Ok(response) = client
|
||||
.post("https://hcaptcha.com/siteverify")
|
||||
.form(&map)
|
||||
.send()
|
||||
.await
|
||||
{
|
||||
let result: CaptchaResponse = response
|
||||
.json()
|
||||
.await
|
||||
.map_err(|_| "Failed to deserialise captcha result.".to_string())?;
|
||||
|
||||
if result.success {
|
||||
Ok(())
|
||||
} else {
|
||||
Err("Unsuccessful captcha verification".to_string())
|
||||
}
|
||||
} else {
|
||||
Err("Failed to verify with hCaptcha".to_string())
|
||||
}
|
||||
} else {
|
||||
Err("Missing hCaptcha token!".to_string())
|
||||
}
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
use lettre::message::{header, MultiPart, SinglePart};
|
||||
use lettre::transport::smtp::authentication::Credentials;
|
||||
use lettre::{Message, SmtpTransport, Transport};
|
||||
|
||||
use super::variables::{PUBLIC_URL, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, SMTP_USERNAME};
|
||||
|
||||
lazy_static! {
|
||||
static ref MAILER: lettre::transport::smtp::SmtpTransport =
|
||||
SmtpTransport::relay(SMTP_HOST.as_ref())
|
||||
.unwrap()
|
||||
.credentials(Credentials::new(
|
||||
SMTP_USERNAME.to_string(),
|
||||
SMTP_PASSWORD.to_string()
|
||||
))
|
||||
.build();
|
||||
}
|
||||
|
||||
fn send(message: Message) -> Result<(), String> {
|
||||
MAILER
|
||||
.send(&message)
|
||||
.map_err(|err| format!("Failed to send email! {}", err.to_string()))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn generate_multipart(text: &str, html: &str) -> MultiPart {
|
||||
MultiPart::mixed().multipart(
|
||||
MultiPart::alternative()
|
||||
.singlepart(
|
||||
SinglePart::quoted_printable()
|
||||
.header(header::ContentType(
|
||||
"text/plain; charset=utf8".parse().unwrap(),
|
||||
))
|
||||
.body(text),
|
||||
)
|
||||
.multipart(
|
||||
MultiPart::related().singlepart(
|
||||
SinglePart::eight_bit()
|
||||
.header(header::ContentType(
|
||||
"text/html; charset=utf8".parse().unwrap(),
|
||||
))
|
||||
.body(html),
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn send_verification_email(email: String, code: String) -> Result<(), String> {
|
||||
let url = format!("{}/api/account/verify/{}", PUBLIC_URL.to_string(), code);
|
||||
let email = Message::builder()
|
||||
.from(SMTP_FROM.to_string().parse().unwrap())
|
||||
.to(email.parse().unwrap())
|
||||
.subject("Verify your email!")
|
||||
.multipart(generate_multipart(
|
||||
&format!("Verify your email here: {}", url),
|
||||
&format!("<a href=\"{}\">Click to verify your email!</a>", url),
|
||||
))
|
||||
.unwrap();
|
||||
|
||||
send(email)
|
||||
}
|
||||
|
||||
pub fn send_password_reset(email: String, code: String) -> Result<(), String> {
|
||||
let url = format!("{}/api/account/reset/{}", PUBLIC_URL.to_string(), code);
|
||||
let email = Message::builder()
|
||||
.from(SMTP_FROM.to_string().parse().unwrap())
|
||||
.to(email.parse().unwrap())
|
||||
.subject("Reset your password.")
|
||||
.multipart(generate_multipart(
|
||||
&format!("Reset your password here: {}", url),
|
||||
&format!("<a href=\"{}\">Click to reset your password!</a>", url),
|
||||
))
|
||||
.unwrap();
|
||||
|
||||
send(email)
|
||||
}
|
||||
|
||||
pub fn send_welcome_email(email: String, username: String) -> Result<(), String> {
|
||||
let email = Message::builder()
|
||||
.from(SMTP_FROM.to_string().parse().unwrap())
|
||||
.to(email.parse().unwrap())
|
||||
.subject("Welcome to REVOLT!")
|
||||
.multipart(
|
||||
generate_multipart(
|
||||
&format!("Welcome, {}! You can now use REVOLT.", username),
|
||||
&format!(
|
||||
"<b>Welcome, {}!</b><br/>You can now use REVOLT.<br/><a href=\"{}\">Go to REVOLT</a>",
|
||||
username,
|
||||
PUBLIC_URL.to_string()
|
||||
)
|
||||
)
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
send(email)
|
||||
}
|
||||
@@ -2,8 +2,6 @@ use rand::{distributions::Alphanumeric, Rng};
|
||||
use std::collections::HashSet;
|
||||
use std::iter::FromIterator;
|
||||
|
||||
pub mod captcha;
|
||||
pub mod email;
|
||||
pub mod result;
|
||||
pub mod variables;
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@ lazy_static! {
|
||||
env::var("REVOLT_MONGO_URI").expect("Missing REVOLT_MONGO_URI environment variable.");
|
||||
pub static ref PUBLIC_URL: String =
|
||||
env::var("REVOLT_PUBLIC_URL").expect("Missing REVOLT_PUBLIC_URL environment variable.");
|
||||
pub static ref APP_URL: String =
|
||||
env::var("REVOLT_APP_URL").unwrap_or_else(|_| "https://app.revolt.chat".to_string());
|
||||
pub static ref EXTERNAL_WS_URL: String =
|
||||
env::var("REVOLT_EXTERNAL_WS_URL").expect("Missing REVOLT_EXTERNAL_WS_URL environment variable.");
|
||||
pub static ref HCAPTCHA_KEY: String =
|
||||
|
||||
Reference in New Issue
Block a user