From 76bf71162ef187d2d363b29faa40d24fecdfba3b Mon Sep 17 00:00:00 2001 From: Felix Date: Thu, 26 Mar 2020 15:23:15 +0100 Subject: [PATCH] Automatic instance setup based on config variables (fixes #404) --- docker/lemmy.hjson | 11 ++++++++- server/config/defaults.hjson | 11 +++++++++ server/src/api/site.rs | 48 ++++++++++++++++++++++++++++-------- server/src/api/user.rs | 14 +++++------ server/src/settings.rs | 9 +++++++ 5 files changed, 75 insertions(+), 18 deletions(-) diff --git a/docker/lemmy.hjson b/docker/lemmy.hjson index 5a6d1ff11c8..b61ea826186 100644 --- a/docker/lemmy.hjson +++ b/docker/lemmy.hjson @@ -41,7 +41,16 @@ # interval length for registration limit register_per_second: 3600 } -# # email sending configuration +# # optional: parameters for automatic configuration of new instance (only used at first start) +# setup: { +# # username for the admin user +# admin_username: "lemmy" +# # password for the admin user +# admin_password: "lemmy" +# # name of the site (can be changed later) +# site_name: "Lemmy Test" +# } +# # optional: email sending configuration # email: { # # hostname of the smtp server # smtp_server: "" diff --git a/server/config/defaults.hjson b/server/config/defaults.hjson index 2b37f3bb356..97b9429c168 100644 --- a/server/config/defaults.hjson +++ b/server/config/defaults.hjson @@ -1,4 +1,15 @@ { +# # optional: parameters for automatic configuration of new instance (only used at first start) +# setup: { +# # username for the admin user +# admin_username: "" +# # password for the admin user +# admin_password: "" +# # optional: email for the admin user (can be omitted and set later through the website) +# admin_email: "" +# # name of the site (can be changed later) +# site_name: "" +# } # settings related to the postgresql database database: { # username to connect to postgres diff --git a/server/src/api/site.rs b/server/src/api/site.rs index ef1a2828761..6bd90149b9d 100644 --- a/server/src/api/site.rs +++ b/server/src/api/site.rs @@ -1,5 +1,9 @@ use super::*; +use crate::api::user::Register; +use crate::api::{Oper, Perform}; +use crate::settings::Settings; use diesel::PgConnection; +use log::info; use std::str::FromStr; #[derive(Serialize, Deserialize)] @@ -53,12 +57,12 @@ pub struct GetModlogResponse { #[derive(Serialize, Deserialize)] pub struct CreateSite { - name: String, - description: Option, - enable_downvotes: bool, - open_registration: bool, - enable_nsfw: bool, - auth: String, + pub name: String, + pub description: Option, + pub enable_downvotes: bool, + pub open_registration: bool, + pub enable_nsfw: bool, + pub auth: String, } #[derive(Serialize, Deserialize)] @@ -277,10 +281,34 @@ impl Perform for Oper { fn perform(&self, conn: &PgConnection) -> Result { let _data: &GetSite = &self.data; - // It can return a null site in order to redirect - let site_view = match Site::read(&conn, 1) { - Ok(_site) => Some(SiteView::read(&conn)?), - Err(_e) => None, + let site = Site::read(&conn, 1); + let site_view = if site.is_ok() { + Some(SiteView::read(&conn)?) + } else if let Some(setup) = Settings::get().setup.as_ref() { + let register = Register { + username: setup.admin_username.to_owned(), + email: setup.admin_email.to_owned(), + password: setup.admin_password.to_owned(), + password_verify: setup.admin_password.to_owned(), + admin: true, + show_nsfw: true, + }; + let login_response = Oper::new(register).perform(&conn)?; + info!("Admin {} created", setup.admin_username); + + let create_site = CreateSite { + name: setup.site_name.to_owned(), + description: None, + enable_downvotes: false, + open_registration: false, + enable_nsfw: false, + auth: login_response.jwt, + }; + Oper::new(create_site).perform(&conn)?; + info!("Site {} created", setup.site_name); + Some(SiteView::read(&conn)?) + } else { + None }; let mut admins = UserView::admins(&conn)?; diff --git a/server/src/api/user.rs b/server/src/api/user.rs index 333fd9494d0..056a2a84626 100644 --- a/server/src/api/user.rs +++ b/server/src/api/user.rs @@ -14,12 +14,12 @@ pub struct Login { #[derive(Serialize, Deserialize)] pub struct Register { - username: String, - email: Option, - password: String, - password_verify: String, - admin: bool, - show_nsfw: bool, + pub username: String, + pub email: Option, + pub password: String, + pub password_verify: String, + pub admin: bool, + pub show_nsfw: bool, } #[derive(Serialize, Deserialize)] @@ -42,7 +42,7 @@ pub struct SaveUserSettings { #[derive(Serialize, Deserialize)] pub struct LoginResponse { - jwt: String, + pub jwt: String, } #[derive(Serialize, Deserialize)] diff --git a/server/src/settings.rs b/server/src/settings.rs index ee3a3c07200..a2d61edbe5d 100644 --- a/server/src/settings.rs +++ b/server/src/settings.rs @@ -9,6 +9,7 @@ static CONFIG_FILE: &str = "config/config.hjson"; #[derive(Debug, Deserialize)] pub struct Settings { + pub setup: Option, pub database: Database, pub hostname: String, pub bind: IpAddr, @@ -20,6 +21,14 @@ pub struct Settings { pub federation_enabled: bool, } +#[derive(Debug, Deserialize)] +pub struct Setup { + pub admin_username: String, + pub admin_password: String, + pub admin_email: Option, + pub site_name: String, +} + #[derive(Debug, Deserialize)] pub struct RateLimitConfig { pub message: i32,