// Copyright 2021 The Matrix.org Foundation C.I.C. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. use argon2::Argon2; use clap::Parser; use mas_config::DatabaseConfig; use mas_storage::user::{ lookup_user_by_username, lookup_user_email, mark_user_email_as_verified, register_user, }; use tracing::{info, warn}; use super::RootCommand; #[derive(Parser, Debug)] pub(super) struct ManageCommand { #[clap(subcommand)] subcommand: ManageSubcommand, } #[derive(Parser, Debug)] enum ManageSubcommand { /// Register a new user Register { username: String, password: String }, /// List active users Users, /// Mark email address as verified VerifyEmail { username: String, email: String }, } impl ManageCommand { pub async fn run(&self, root: &RootCommand) -> anyhow::Result<()> { use ManageSubcommand as SC; match &self.subcommand { SC::Register { username, password } => { let config: DatabaseConfig = root.load_config()?; let pool = config.connect().await?; let mut txn = pool.begin().await?; let hasher = Argon2::default(); let user = register_user(&mut txn, hasher, username, password).await?; txn.commit().await?; info!(?user, "User registered"); Ok(()) } SC::Users => { warn!("Not implemented yet"); Ok(()) } SC::VerifyEmail { username, email } => { let config: DatabaseConfig = root.load_config()?; let pool = config.connect().await?; let mut txn = pool.begin().await?; let user = lookup_user_by_username(&mut txn, username).await?; let email = lookup_user_email(&mut txn, &user, email).await?; let email = mark_user_email_as_verified(&mut txn, email).await?; txn.commit().await?; info!(?email, "Email marked as verified"); Ok(()) } } } }