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