mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2025-01-07 11:22:36 +00:00
65 lines
1.6 KiB
Rust
65 lines
1.6 KiB
Rust
//! # Cryptographic utilities
|
|
//!
|
|
//! Author: Pierre Hubert
|
|
|
|
extern crate sha1;
|
|
|
|
use crate::data::error::{ResultBoxError, ExecError};
|
|
use rand::{thread_rng, Rng};
|
|
use rand::distributions::Alphanumeric;
|
|
|
|
/// Generate a new sha1 string
|
|
///
|
|
/// ```
|
|
/// use comunic_server::utils::crypt_utils::sha1_str;
|
|
///
|
|
/// let res = sha1_str("secret");
|
|
/// assert_eq!(res, "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4");
|
|
/// ```
|
|
pub fn sha1_str(input: &str) -> String {
|
|
sha1::Sha1::from(input).digest().to_string()
|
|
}
|
|
|
|
/// One-way user password crypt
|
|
///
|
|
/// This method will have to be replaced by a stronger algorithm once this implementation is
|
|
/// completely built.
|
|
///
|
|
/// It currently depends on PHP
|
|
///
|
|
/// ```
|
|
/// use comunic_server::utils::crypt_utils::crypt_pass;
|
|
///
|
|
/// let res = crypt_pass("secret").unwrap();
|
|
/// assert_eq!(res, "e5GUe5kdeUMGs");
|
|
/// ```
|
|
pub fn crypt_pass(pass: &str) -> ResultBoxError<String> {
|
|
let hash = sha1_str(pass);
|
|
|
|
let result = std::process::Command::new("/usr/bin/php")
|
|
.arg("-r")
|
|
.arg(format!("echo crypt('{}', '{}');", hash, hash))
|
|
.output()?;
|
|
|
|
if !result.status.success() {
|
|
return Err(ExecError::boxed_new("Failed to crypt password!"));
|
|
}
|
|
|
|
Ok(String::from_utf8(result.stdout)?)
|
|
}
|
|
|
|
/// Generate a random string of a given size
|
|
///
|
|
/// ```
|
|
/// use comunic_server::utils::crypt_utils::rand_str;
|
|
///
|
|
/// let size = 10;
|
|
/// let rand = rand_str(size);
|
|
/// assert_eq!(size, rand.len());
|
|
/// ```
|
|
pub fn rand_str(len: usize) -> String {
|
|
thread_rng()
|
|
.sample_iter(&Alphanumeric)
|
|
.take(len)
|
|
.collect()
|
|
} |