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