3 changed files with 123 additions and 0 deletions
@ -0,0 +1,90 @@ |
|||
extern crate ldap3; |
|||
|
|||
use std::error::Error; |
|||
|
|||
use ldap3::{DerefAliases, LdapConn, Scope, SearchEntry, SearchOptions}; |
|||
|
|||
use crate::db::models::User; |
|||
use crate::db::DbConn; |
|||
use crate::CONFIG; |
|||
|
|||
fn main() { |
|||
match do_search() { |
|||
Ok(_) => (), |
|||
Err(e) => println!("{}", e), |
|||
} |
|||
} |
|||
|
|||
/// Creates an LDAP connection, authenticating if necessary
|
|||
fn ldap_client() -> Result<LdapConn, Box<Error>> { |
|||
let scheme = if CONFIG.ldap_ssl() { "ldaps" } else { "ldap" }; |
|||
let host = CONFIG.ldap_host().unwrap(); |
|||
let port = CONFIG.ldap_port().to_string(); |
|||
|
|||
let ldap = LdapConn::new(&format!("{}://{}:{}", scheme, host, port))?; |
|||
|
|||
match (&CONFIG.ldap_bind_dn(), &CONFIG.ldap_bind_password()) { |
|||
(Some(bind_dn), Some(pass)) => { |
|||
match ldap.simple_bind(bind_dn, pass) { |
|||
_ => {} |
|||
}; |
|||
} |
|||
(_, _) => {} |
|||
}; |
|||
|
|||
Ok(ldap) |
|||
} |
|||
|
|||
/// Retrieves search results from ldap
|
|||
fn search_entries() -> Result<Vec<SearchEntry>, Box<Error>> { |
|||
let ldap = ldap_client()?; |
|||
|
|||
let mail_field = CONFIG.ldap_mail_field(); |
|||
let fields = vec!["uid", "givenname", "sn", "cn", mail_field.as_str()]; |
|||
|
|||
// TODO: Something something error handling
|
|||
let (results, _res) = ldap |
|||
.with_search_options(SearchOptions::new().deref(DerefAliases::Always)) |
|||
.search( |
|||
&CONFIG.ldap_search_base_dn().unwrap(), |
|||
Scope::Subtree, |
|||
&CONFIG.ldap_search_filter(), |
|||
fields, |
|||
)? |
|||
.success()?; |
|||
|
|||
// Build list of entries
|
|||
let mut entries = Vec::new(); |
|||
for result in results { |
|||
entries.push(SearchEntry::construct(result)); |
|||
} |
|||
|
|||
Ok(entries) |
|||
} |
|||
|
|||
pub fn do_search() -> Result<(), Box<Error>> { |
|||
let mail_field = CONFIG.ldap_mail_field(); |
|||
let entries = search_entries()?; |
|||
for user in entries { |
|||
println!("{:?}", user); |
|||
if let Some(user_email) = user.attrs[mail_field.as_str()].first() { |
|||
println!("{}", user_email); |
|||
} |
|||
} |
|||
|
|||
Ok(()) |
|||
} |
|||
|
|||
pub fn invite_from_ldap(conn: DbConn) -> Result<(), Box<Error>> { |
|||
let mail_field = CONFIG.ldap_mail_field(); |
|||
for ldap_user in search_entries()? { |
|||
if let Some(user_email) = ldap_user.attrs[mail_field.as_str()].first() { |
|||
let user = match User::find_by_mail(user_email.as_str(), &conn) { |
|||
Some(user) => println!("User already exists with email: {}", user_email), |
|||
None => println!("New user, should add to invites: {}", user_email), |
|||
}; |
|||
} |
|||
} |
|||
|
|||
Ok(()) |
|||
} |
Loading…
Reference in new issue