37 lines
1 KiB
Rust
37 lines
1 KiB
Rust
use sqlx::SqlitePool;
|
|
|
|
const API_KEY_ALPHABET: &str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
const FILENAME_ALPHABET: &str = "0123456789abcdefghijklmnopqrstuvwxyz";
|
|
|
|
pub fn gen_filename() -> String {
|
|
let alphabet = &FILENAME_ALPHABET.chars().collect::<Vec<_>>()[..];
|
|
nanoid::nanoid!(8, alphabet)
|
|
}
|
|
|
|
pub fn gen_key() -> String {
|
|
let alphabet = &API_KEY_ALPHABET.chars().collect::<Vec<_>>()[..];
|
|
nanoid::nanoid!(64, alphabet)
|
|
}
|
|
|
|
pub fn gen_revocation_key() -> String {
|
|
let alphabet = &API_KEY_ALPHABET.chars().collect::<Vec<_>>()[..];
|
|
nanoid::nanoid!(128, alphabet)
|
|
}
|
|
|
|
pub async fn check_admin_key(pool: &SqlitePool) -> anyhow::Result<()> {
|
|
let query = sqlx::query!("select admin from api_keys where admin = true")
|
|
.fetch_all(pool)
|
|
.await?;
|
|
|
|
if query.is_empty() {
|
|
let key = gen_key();
|
|
|
|
sqlx::query!("insert into api_keys (key, admin) values ($1, true)", key)
|
|
.execute(pool)
|
|
.await?;
|
|
|
|
println!("created admin key: {}", key);
|
|
}
|
|
|
|
Ok(())
|
|
}
|