openauth-plugins 0.0.5

Official OpenAuth plugin modules.
Documentation
use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
use rand::rngs::OsRng;
use rand::RngCore;
use sha2::{Digest, Sha256};

const BETTER_AUTH_KEY_CHARSET: &[u8; 52] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

pub fn default_key_hasher(key: &str) -> String {
    URL_SAFE_NO_PAD.encode(Sha256::digest(key.as_bytes()))
}

pub fn default_key_generator(length: usize, prefix: Option<&str>) -> String {
    let key = generate_alpha_string(length);
    match prefix {
        Some(prefix) => format!("{prefix}{key}"),
        None => key,
    }
}

fn generate_alpha_string(length: usize) -> String {
    let mut output = String::with_capacity(length);
    let mut random = [0_u8; 32];
    while output.len() < length {
        OsRng.fill_bytes(&mut random);
        for byte in random {
            if byte >= 208 {
                continue;
            }
            let index = usize::from(byte) % BETTER_AUTH_KEY_CHARSET.len();
            output.push(char::from(BETTER_AUTH_KEY_CHARSET[index]));
            if output.len() == length {
                break;
            }
        }
    }
    output
}