forked from github-starred/komodo
* add some network stuff to container summary * improve settings tables UI * periphery build supports additional tags * fix variable container sizing * alert types newline wrap * plumbing for Stack resource * plumbing for Stack resource * mount stack api * stack resource sync * get remote compose file * support image_name and image_tag * add server config placeholders. default server config address * configure image name and image tag * deployment work with build image_name and image_tag * stack UI * fe builds * configure registry provider and account * implement periphery stack api * stack poll interval * add UI provider management * deploy stacks * build push commit hash tag. * Destroy stack * update default core port to 9120 * remove git_account alias * finish stack (and container) api * frontend builds * cant cancel server based builds * fix * use git pull -f * 9120 * start UI updates (#15) * fix From<Stack> for CloneArgs * remove unused imports * UI Updates (#16) * cleanup dashboard charts for resources * bring back solid scrollbars * enable sidebar scrolling * remove alerts from all resources * pass jwt secret * stacks dont delete the target * parse services from yaml * stacks deploy * close * looking good * closer * destroy stack when file missing. onboard stacks * figure out stack container name matching * get stack state correct * work with service views * UI Updates - Sidebar, Topbar Alerts, and All Resources page (#17) * move sidebar to use fixed positioning instead of sticky * add alert details dialog to topbar alerts * cleanup all resources page layout * ensure resource links don't propagate clicks * periphery support passing env with --env-file * StackServicePage * default run_directory to ./ for clarify * add stack webhook listeners * add default compose name of stack name * stacks controlled with project name * migrate to dotenvy * add stack to dashboard * remove deploying / destroying stack services * update config files * fix getting service logs * git / docker provider management api * implement passing git / registry token from db * rename system user Github to Git Webhook * seperate deployed and latest services on stack info * add stack service level operations * UI Updates - Update Shadcn/UI components, prevent navbar menu layout shift (#20) * add dashboard pie for resource syncs * dashboard items same height * update shadcn components * ensure centered following sheet update * cleanup layout, prevent navbar menu layout shifts * add manual filter, fix toast call * guard webhooks * remove deployed_message, latest_message from StackListItemInfo * stop all containers on server correctly * support multiple compose files * cache all containers networks images projects * remove project missing from db cache * work on sync deploy stuff * rework deployment sync deploy to support stacks. they can depend on each other. * UI Updates - Remove topbar transparency, pretty status badges, tidy resource page layout with a 'back' button (#21) * remove topbar transparency * cleanup unused * responsive dashboard * better mobile header * dont need to calc 64px less since header is using position fixed * add status badge component * update status badges * further simplify layout * allow undefined status as prop * use new status badges for alerts * update status badges for all resources * undo layout change * tidy up resource page layout, add back button * no need for button wrapper * remove unused * build cancel log * update ts types * fix fe type changes * fe tweaks * remove on build logs * core refresh cache immediately on startup * jwt_ttl * canonicalize run directory on host * update canonicalize error message * core use docker-compose * fix incorrect project missing, add status string to stack info * remove entries in "after" that aren't deploying * fix dockerfiel * build custom tag postfix * sync fixes * ensure UpdateGitProviderAccount doesn't change id * ensure UpdateDockerRegistryAccount doesn't change id * configure providers in the UI * add // comment support to env, conversions * add updates for provider deletes * improve sync pending deploy log * add more deployment actions * add backward compat with v1.12 for clone repo * stack deploy format * fe * alert menus clone when click resource link * rename stacks * don't close on click * snake case stack state, in line with deployment state * sync redeploy stack if newer hash (optional behind resource field 'latest_hash') * remove nav to tree * RefreshStack/Sync debug instruments * improve inline UI docs * implement resource base_permission backend * plumbing for Repo build * build repos * write env file repos * add latest hash / message to build info * add optional hash to update * keep built_hash updated * add backend for build / repo latest hash management * remove unused resources * clean up repo dirs after cache update * fix repo info deser error * add build / repo git status * fix page layouts * improve layout responsive * most config incline docs * add descriptions for all resource types * default local auth false * fix omnibar arrow keys issue * add compose file to example config * image registry * dashboard display no resources messge * update deps. * show when no config * resource sync use config git_provider * fix networks * fix deploy error due to after * update lots of docs * fix server stat charts not working * update screenshots * update changelog * add a disclaimer * remove file paths docs stuff * build repo * v1.13 - Komodo * update docs for cli * fill out the compose example more --------- Co-authored-by: Karamvir Singh <67458484+karamvirsingh98@users.noreply.github.com>
139 lines
3.4 KiB
Rust
139 lines
3.4 KiB
Rust
use std::str::FromStr;
|
|
|
|
use anyhow::{anyhow, Context};
|
|
use async_timing_util::unix_timestamp_ms;
|
|
use axum::http::HeaderMap;
|
|
use mongo_indexed::Document;
|
|
use monitor_client::{
|
|
api::auth::{
|
|
CreateLocalUser, CreateLocalUserResponse, LoginLocalUser,
|
|
LoginLocalUserResponse,
|
|
},
|
|
entities::user::{User, UserConfig},
|
|
};
|
|
use mungos::mongodb::bson::{doc, oid::ObjectId};
|
|
use resolver_api::Resolve;
|
|
|
|
use crate::{
|
|
config::core_config,
|
|
state::State,
|
|
state::{db_client, jwt_client},
|
|
};
|
|
|
|
const BCRYPT_COST: u32 = 10;
|
|
|
|
impl Resolve<CreateLocalUser, HeaderMap> for State {
|
|
#[instrument(name = "CreateLocalUser", skip(self))]
|
|
async fn resolve(
|
|
&self,
|
|
CreateLocalUser { username, password }: CreateLocalUser,
|
|
_: HeaderMap,
|
|
) -> anyhow::Result<CreateLocalUserResponse> {
|
|
let core_config = core_config();
|
|
|
|
if !core_config.local_auth {
|
|
return Err(anyhow!("local auth is not enabled"));
|
|
}
|
|
|
|
if username.is_empty() {
|
|
return Err(anyhow!("username cannot be empty string"));
|
|
}
|
|
|
|
if ObjectId::from_str(&username).is_ok() {
|
|
return Err(anyhow!("username cannot be valid ObjectId"));
|
|
}
|
|
|
|
if password.is_empty() {
|
|
return Err(anyhow!("password cannot be empty string"));
|
|
}
|
|
|
|
let password = bcrypt::hash(password, BCRYPT_COST)
|
|
.context("failed to hash password")?;
|
|
|
|
let no_users_exist = db_client()
|
|
.await
|
|
.users
|
|
.find_one(Document::new())
|
|
.await?
|
|
.is_none();
|
|
|
|
let ts = unix_timestamp_ms() as i64;
|
|
|
|
let user = User {
|
|
id: Default::default(),
|
|
username,
|
|
enabled: no_users_exist || core_config.enable_new_users,
|
|
admin: no_users_exist,
|
|
create_server_permissions: no_users_exist,
|
|
create_build_permissions: no_users_exist,
|
|
updated_at: ts,
|
|
last_update_view: 0,
|
|
recents: Default::default(),
|
|
all: Default::default(),
|
|
config: UserConfig::Local { password },
|
|
};
|
|
|
|
let user_id = db_client()
|
|
.await
|
|
.users
|
|
.insert_one(user)
|
|
.await
|
|
.context("failed to create user")?
|
|
.inserted_id
|
|
.as_object_id()
|
|
.context("inserted_id is not ObjectId")?
|
|
.to_string();
|
|
|
|
let jwt = jwt_client()
|
|
.generate(user_id)
|
|
.context("failed to generate jwt for user")?;
|
|
|
|
Ok(CreateLocalUserResponse { jwt })
|
|
}
|
|
}
|
|
|
|
impl Resolve<LoginLocalUser, HeaderMap> for State {
|
|
#[instrument(name = "LoginLocalUser", level = "debug", skip(self))]
|
|
async fn resolve(
|
|
&self,
|
|
LoginLocalUser { username, password }: LoginLocalUser,
|
|
_: HeaderMap,
|
|
) -> anyhow::Result<LoginLocalUserResponse> {
|
|
if !core_config().local_auth {
|
|
return Err(anyhow!("local auth is not enabled"));
|
|
}
|
|
|
|
let user = db_client()
|
|
.await
|
|
.users
|
|
.find_one(doc! { "username": &username })
|
|
.await
|
|
.context("failed at db query for users")?
|
|
.with_context(|| {
|
|
format!("did not find user with username {username}")
|
|
})?;
|
|
|
|
let UserConfig::Local {
|
|
password: user_pw_hash,
|
|
} = user.config
|
|
else {
|
|
return Err(anyhow!(
|
|
"non-local auth users can not log in with a password"
|
|
));
|
|
};
|
|
|
|
let verified = bcrypt::verify(password, &user_pw_hash)
|
|
.context("failed at verify password")?;
|
|
|
|
if !verified {
|
|
return Err(anyhow!("invalid credentials"));
|
|
}
|
|
|
|
let jwt = jwt_client()
|
|
.generate(user.id)
|
|
.context("failed at generating jwt for user")?;
|
|
|
|
Ok(LoginLocalUserResponse { jwt })
|
|
}
|
|
}
|