From 8171464c493cc614e21610d4b7be7770ed4c7ffe Mon Sep 17 00:00:00 2001 From: ViViDboarder Date: Thu, 11 Apr 2019 17:07:59 -0700 Subject: [PATCH] Update compose to mostly work Untested since latest bitwarden_rs image doesn't have new endpoints --- Dockerfile | 15 ++++++++++-- docker-compose-ldap-server.yml | 29 ----------------------- docker-compose.yml | 9 +++++++- example.config.toml | 8 +++++++ src/main.rs | 42 +++++++++++++++++++--------------- 5 files changed, 52 insertions(+), 51 deletions(-) delete mode 100644 docker-compose-ldap-server.yml create mode 100644 example.config.toml diff --git a/Dockerfile b/Dockerfile index ccf5b9b..e805936 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,19 @@ FROM rust:1.33 -WORKDIR /usr/src/myapp -COPY . . +WORKDIR /usr/src/ +RUN USER=root cargo new --bin bitwarden_rs_ldap +WORKDIR /usr/src/bitwarden_rs_ldap +# Compile dependencies +COPY ./Cargo.toml ./Cargo.toml +COPY ./Cargo.lock ./Cargo.lock +RUN cargo build --release +# Remove temp src +RUN rm src/*.rs + +# Copy source and install +COPY ./src ./src +RUN rm ./target/release/deps/bitwarden_rs_ldap* RUN cargo install --path . CMD ["bitwarden_rs_ldap"] diff --git a/docker-compose-ldap-server.yml b/docker-compose-ldap-server.yml deleted file mode 100644 index bc62bc6..0000000 --- a/docker-compose-ldap-server.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: '3' -services: - ldap: - image: osixia/openldap - ports: - - 389:389 - - 636:636 - volumes: - - /var/lib/ldap - - /etc/ldap/slapd.d - environment: - LDAP_READONLY_USER: 'true' - LDAP_READONLY_USER_USERNAME: readonly - LDAP_READONLY_USER_PASSWORD: readonly - admin: - image: osixia/phpldapadmin - ports: - - 8001:80 - environment: - PHPLDAPADMIN_HTTPS: 'false' - PHPLDAPADMIN_LDAP_HOSTS: ldap - admin-host: - image: osixia/phpldapadmin - ports: - - 80:80 - network_mode: "host" - environment: - PHPLDAPADMIN_HTTPS: 'false' - PHPLDAPADMIN_LDAP_HOSTS: 0.0.0.0 diff --git a/docker-compose.yml b/docker-compose.yml index 9647bf0..0c972d2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,9 +2,16 @@ version: '3' services: ldap_sync: build: . + volumes: + - ./example.config.toml:/usr/src/bitwarden_rs_ldap/config.toml:ro + restart: always bitwarden: - image: mprasil/bitwarden_rs + image: mprasil/bitwarden + ports: + - 8000:80 + environment: + ADMIN_TOKEN: admin ldap: image: osixia/openldap diff --git a/example.config.toml b/example.config.toml new file mode 100644 index 0000000..07bbae4 --- /dev/null +++ b/example.config.toml @@ -0,0 +1,8 @@ +bitwarden_url = "http://bitwarden:80" +bitwarden_admin_token = "admin" +ldap_host = "ldap" +ldap_bind_dn = "cn=admin,dc=example,dc=org" +ldap_bind_password = "admin" +ldap_search_base_dn = "dc=example,dc=org" +ldap_search_filter = "(&(objectClass=*)(uid=*))" +ldap_sync_interval_seconds = 10 diff --git a/src/main.rs b/src/main.rs index 55d6438..5abe3c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,8 +28,6 @@ fn invite_users( client: &mut bw_admin::Client, start_loop: bool, ) -> Result<(), Box> { - // TODO: Better error handling to differentiate failure to connect to Bitwarden vs LDAP - if start_loop { start_sync_loop(config, client)?; } else { @@ -74,7 +72,7 @@ fn search_entries(config: &config::Config) -> Result, Box Result<(), Box> { - let existing_users = get_existing_users(client)?; - - let mail_field = config.get_ldap_mail_field(); - let mut num_users = 0; - for ldap_user in search_entries(config)? { - if let Some(user_email) = ldap_user.attrs[mail_field.as_str()].first() { - if existing_users.contains(user_email) { - println!("User with email already exists: {}", user_email); - } else { - println!("Try to invite user: {}", user_email); - let response = client.invite(user_email); - num_users = num_users + 1; - println!("Invite response: {:?}", response); + match get_existing_users(client) { + Ok(existing_users) => { + let mail_field = config.get_ldap_mail_field(); + let mut num_users = 0; + for ldap_user in search_entries(config)? { + if let Some(user_email) = ldap_user.attrs[mail_field.as_str()].first() { + if existing_users.contains(user_email) { + println!("User with email already exists: {}", user_email); + } else { + println!("Try to invite user: {}", user_email); + let response = client.invite(user_email); + num_users = num_users + 1; + println!("Invite response: {:?}", response); + } + } } + + // Maybe think about returning this value for some other use + println!("Sent invites to {} user(s).", num_users); + }, + Err(e) => { + println!("Error: Failed to get existing users from Bitwarden"); + return Err(e); } } - // Maybe think about returning this value for some other use - println!("Sent invites to {} user(s).", num_users); - Ok(()) }