summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorFelix <me@nutomic.com>2020-03-26 15:23:15 +0100
committerFelix <me@nutomic.com>2020-03-29 00:13:13 +0100
commit76bf71162ef187d2d363b29faa40d24fecdfba3b (patch)
tree3782f744f8bf81342f7863b4d0d03e029c0270ea /server
parent807f33f74823b427bbac5e48caf29e805ce4e656 (diff)
Automatic instance setup based on config variables (fixes #404)
Diffstat (limited to 'server')
-rw-r--r--server/config/defaults.hjson11
-rw-r--r--server/src/api/site.rs48
-rw-r--r--server/src/api/user.rs14
-rw-r--r--server/src/settings.rs9
4 files changed, 65 insertions, 17 deletions
diff --git a/server/config/defaults.hjson b/server/config/defaults.hjson
index 2b37f3bb..97b9429c 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 ef1a2828..6bd90149 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<String>,
- enable_downvotes: bool,
- open_registration: bool,
- enable_nsfw: bool,
- auth: String,
+ pub name: String,
+ pub description: Option<String>,
+ pub enable_downvotes: bool,
+ pub open_registration: bool,
+ pub enable_nsfw: bool,
+ pub auth: String,
}
#[derive(Serialize, Deserialize)]
@@ -277,10 +281,34 @@ impl Perform<GetSiteResponse> for Oper<GetSite> {
fn perform(&self, conn: &PgConnection) -> Result<GetSiteResponse, Error> {
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 333fd949..056a2a84 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<String>,
- password: String,
- password_verify: String,
- admin: bool,
- show_nsfw: bool,
+ pub username: String,
+ pub email: Option<String>,
+ 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 ee3a3c07..a2d61edb 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<Setup>,
pub database: Database,
pub hostname: String,
pub bind: IpAddr,
@@ -21,6 +22,14 @@ pub struct Settings {
}
#[derive(Debug, Deserialize)]
+pub struct Setup {
+ pub admin_username: String,
+ pub admin_password: String,
+ pub admin_email: Option<String>,
+ pub site_name: String,
+}
+
+#[derive(Debug, Deserialize)]
pub struct RateLimitConfig {
pub message: i32,
pub message_per_second: i32,