You've already forked authentication-service
mirror of
https://github.com/matrix-org/matrix-authentication-service.git
synced 2025-07-29 22:01:14 +03:00
Make password-based login optional
This commit is contained in:
@ -27,6 +27,7 @@ tower = { version = "0.4.13", features = ["full"] }
|
||||
tower-http = { version = "0.4.0", features = ["fs", "compression-full"] }
|
||||
url = "2.3.1"
|
||||
watchman_client = "0.8.0"
|
||||
zeroize = "1.6.0"
|
||||
|
||||
tracing = "0.1.37"
|
||||
tracing-appender = "0.2.2"
|
||||
|
@ -327,7 +327,7 @@ impl Options {
|
||||
let encrypter = config.secrets.encrypter();
|
||||
let pool = database_from_config(&config.database).await?;
|
||||
let url_builder = UrlBuilder::new(config.http.public_base);
|
||||
let mut repo = PgRepository::from_pool(&pool).await?;
|
||||
let mut repo = PgRepository::from_pool(&pool).await?.boxed();
|
||||
|
||||
let requires_client_secret = token_endpoint_auth_method.requires_client_secret();
|
||||
|
||||
@ -362,6 +362,8 @@ impl Options {
|
||||
)
|
||||
.await?;
|
||||
|
||||
repo.save().await?;
|
||||
|
||||
let redirect_uri = url_builder.upstream_oauth_callback(provider.id);
|
||||
let auth_uri = url_builder.upstream_oauth_authorize(provider.id);
|
||||
tracing::info!(
|
||||
|
@ -33,6 +33,10 @@ use tracing::{error, info, log::LevelFilter};
|
||||
pub async fn password_manager_from_config(
|
||||
config: &PasswordsConfig,
|
||||
) -> Result<PasswordManager, anyhow::Error> {
|
||||
if !config.enabled() {
|
||||
return Ok(PasswordManager::disabled());
|
||||
}
|
||||
|
||||
let schemes = config
|
||||
.load()
|
||||
.await?
|
||||
@ -227,3 +231,76 @@ pub async fn watch_templates(templates: &Templates) -> anyhow::Result<()> {
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use rand::SeedableRng;
|
||||
use zeroize::Zeroizing;
|
||||
|
||||
use super::*;
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_password_manager_from_config() {
|
||||
let mut rng = rand_chacha::ChaChaRng::seed_from_u64(42);
|
||||
let password = Zeroizing::new(b"hunter2".to_vec());
|
||||
|
||||
// Test a valid, enabled config
|
||||
let config = serde_json::from_value(serde_json::json!({
|
||||
"schemes": [{
|
||||
"version": 42,
|
||||
"algorithm": "argon2id"
|
||||
}, {
|
||||
"version": 10,
|
||||
"algorithm": "bcrypt"
|
||||
}]
|
||||
}))
|
||||
.unwrap();
|
||||
|
||||
let manager = password_manager_from_config(&config).await;
|
||||
assert!(manager.is_ok());
|
||||
let manager = manager.unwrap();
|
||||
assert!(manager.is_enabled());
|
||||
let hashed = manager.hash(&mut rng, password.clone()).await;
|
||||
assert!(hashed.is_ok());
|
||||
let (version, hashed) = hashed.unwrap();
|
||||
assert_eq!(version, 42);
|
||||
assert!(hashed.starts_with("$argon2id$"));
|
||||
|
||||
// Test a valid, disabled config
|
||||
let config = serde_json::from_value(serde_json::json!({
|
||||
"enabled": false,
|
||||
"schemes": []
|
||||
}))
|
||||
.unwrap();
|
||||
|
||||
let manager = password_manager_from_config(&config).await;
|
||||
assert!(manager.is_ok());
|
||||
let manager = manager.unwrap();
|
||||
assert!(!manager.is_enabled());
|
||||
let res = manager.hash(&mut rng, password.clone()).await;
|
||||
assert!(res.is_err());
|
||||
|
||||
// Test an invalid config
|
||||
// Repeat the same version twice
|
||||
let config = serde_json::from_value(serde_json::json!({
|
||||
"schemes": [{
|
||||
"version": 42,
|
||||
"algorithm": "argon2id"
|
||||
}, {
|
||||
"version": 42,
|
||||
"algorithm": "bcrypt"
|
||||
}]
|
||||
}))
|
||||
.unwrap();
|
||||
let manager = password_manager_from_config(&config).await;
|
||||
assert!(manager.is_err());
|
||||
|
||||
// Empty schemes
|
||||
let config = serde_json::from_value(serde_json::json!({
|
||||
"schemes": []
|
||||
}))
|
||||
.unwrap();
|
||||
let manager = password_manager_from_config(&config).await;
|
||||
assert!(manager.is_err());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user