mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
Merge remote-tracking branch 'origin/pr/425' into aether-rust-pioneer
This commit is contained in:
@@ -1351,7 +1351,11 @@ impl UserReadRepository for InMemoryUserReadRepository {
|
||||
}
|
||||
if allowed_providers_present {
|
||||
user.allowed_providers = allowed_providers;
|
||||
user.allowed_providers_mode = if user.allowed_providers.is_some() {
|
||||
user.allowed_providers_mode = if user
|
||||
.allowed_providers
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific".to_string()
|
||||
} else {
|
||||
"unrestricted".to_string()
|
||||
@@ -1359,7 +1363,11 @@ impl UserReadRepository for InMemoryUserReadRepository {
|
||||
}
|
||||
if allowed_api_formats_present {
|
||||
user.allowed_api_formats = allowed_api_formats;
|
||||
user.allowed_api_formats_mode = if user.allowed_api_formats.is_some() {
|
||||
user.allowed_api_formats_mode = if user
|
||||
.allowed_api_formats
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific".to_string()
|
||||
} else {
|
||||
"unrestricted".to_string()
|
||||
@@ -1367,7 +1375,11 @@ impl UserReadRepository for InMemoryUserReadRepository {
|
||||
}
|
||||
if allowed_models_present {
|
||||
user.allowed_models = allowed_models;
|
||||
user.allowed_models_mode = if user.allowed_models.is_some() {
|
||||
user.allowed_models_mode = if user
|
||||
.allowed_models
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific".to_string()
|
||||
} else {
|
||||
"unrestricted".to_string()
|
||||
|
||||
@@ -1029,17 +1029,26 @@ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
rate_limit: Option<i32>,
|
||||
is_active: Option<bool>,
|
||||
) -> Result<Option<StoredUserAuthRecord>, DataLayerError> {
|
||||
let allowed_providers_mode = if allowed_providers.is_some() {
|
||||
let allowed_providers_mode = if allowed_providers
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_api_formats_mode = if allowed_api_formats.is_some() {
|
||||
let allowed_api_formats_mode = if allowed_api_formats
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_models_mode = if allowed_models.is_some() {
|
||||
let allowed_models_mode = if allowed_models
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
@@ -1214,17 +1223,26 @@ VALUES (?, ?, ?, ?, ?, 'user', 'local', 'inherit', 'inherit', 'inherit', 'inheri
|
||||
) -> Result<Option<StoredUserAuthRecord>, DataLayerError> {
|
||||
let user_id = uuid::Uuid::new_v4().to_string();
|
||||
let now = chrono::Utc::now().timestamp();
|
||||
let allowed_providers_mode = if allowed_providers.is_some() {
|
||||
let allowed_providers_mode = if allowed_providers
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_api_formats_mode = if allowed_api_formats.is_some() {
|
||||
let allowed_api_formats_mode = if allowed_api_formats
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_models_mode = if allowed_models.is_some() {
|
||||
let allowed_models_mode = if allowed_models
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
|
||||
@@ -1482,17 +1482,26 @@ WHERE id = $1
|
||||
rate_limit: Option<i32>,
|
||||
is_active: Option<bool>,
|
||||
) -> Result<Option<StoredUserAuthRecord>, DataLayerError> {
|
||||
let allowed_providers_mode = if allowed_providers.is_some() {
|
||||
let allowed_providers_mode = if allowed_providers
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_api_formats_mode = if allowed_api_formats.is_some() {
|
||||
let allowed_api_formats_mode = if allowed_api_formats
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_models_mode = if allowed_models.is_some() {
|
||||
let allowed_models_mode = if allowed_models
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
@@ -1696,17 +1705,26 @@ VALUES (
|
||||
rate_limit: Option<i32>,
|
||||
) -> Result<Option<StoredUserAuthRecord>, DataLayerError> {
|
||||
let user_id = uuid::Uuid::new_v4().to_string();
|
||||
let allowed_providers_mode = if allowed_providers.is_some() {
|
||||
let allowed_providers_mode = if allowed_providers
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_api_formats_mode = if allowed_api_formats.is_some() {
|
||||
let allowed_api_formats_mode = if allowed_api_formats
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_models_mode = if allowed_models.is_some() {
|
||||
let allowed_models_mode = if allowed_models
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
|
||||
@@ -1029,17 +1029,26 @@ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
rate_limit: Option<i32>,
|
||||
is_active: Option<bool>,
|
||||
) -> Result<Option<StoredUserAuthRecord>, DataLayerError> {
|
||||
let allowed_providers_mode = if allowed_providers.is_some() {
|
||||
let allowed_providers_mode = if allowed_providers
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_api_formats_mode = if allowed_api_formats.is_some() {
|
||||
let allowed_api_formats_mode = if allowed_api_formats
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_models_mode = if allowed_models.is_some() {
|
||||
let allowed_models_mode = if allowed_models
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
@@ -1214,17 +1223,26 @@ VALUES (?, ?, ?, ?, ?, 'user', 'local', 'inherit', 'inherit', 'inherit', 'inheri
|
||||
) -> Result<Option<StoredUserAuthRecord>, DataLayerError> {
|
||||
let user_id = uuid::Uuid::new_v4().to_string();
|
||||
let now = chrono::Utc::now().timestamp();
|
||||
let allowed_providers_mode = if allowed_providers.is_some() {
|
||||
let allowed_providers_mode = if allowed_providers
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_api_formats_mode = if allowed_api_formats.is_some() {
|
||||
let allowed_api_formats_mode = if allowed_api_formats
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
};
|
||||
let allowed_models_mode = if allowed_models.is_some() {
|
||||
let allowed_models_mode = if allowed_models
|
||||
.as_ref()
|
||||
.is_some_and(|values| !values.is_empty())
|
||||
{
|
||||
"specific"
|
||||
} else {
|
||||
"unrestricted"
|
||||
|
||||
@@ -1024,7 +1024,7 @@ pub fn normalize_rate_limit_policy_mode(
|
||||
}
|
||||
|
||||
fn legacy_list_policy_mode(values: &Option<Vec<String>>) -> String {
|
||||
if values.is_some() {
|
||||
if values.as_ref().is_some_and(|items| !items.is_empty()) {
|
||||
"specific".to_string()
|
||||
} else {
|
||||
"unrestricted".to_string()
|
||||
@@ -1096,8 +1096,8 @@ mod tests {
|
||||
use serde_json::Value;
|
||||
|
||||
use super::{
|
||||
StoredUserAuthRecord, StoredUserExportRow, StoredUserPreferenceRecord,
|
||||
StoredUserSessionRecord,
|
||||
legacy_list_policy_mode, StoredUserAuthRecord, StoredUserExportRow,
|
||||
StoredUserPreferenceRecord, StoredUserSessionRecord,
|
||||
};
|
||||
|
||||
#[test]
|
||||
@@ -1208,6 +1208,16 @@ mod tests {
|
||||
assert_eq!(row.allowed_models, Some(vec!["gpt-4.1".to_string()]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn legacy_policy_mode_treats_empty_lists_as_unrestricted() {
|
||||
assert_eq!(legacy_list_policy_mode(&None), "unrestricted");
|
||||
assert_eq!(legacy_list_policy_mode(&Some(Vec::new())), "unrestricted");
|
||||
assert_eq!(
|
||||
legacy_list_policy_mode(&Some(vec!["openai".to_string()])),
|
||||
"specific"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn user_session_previous_refresh_token_has_grace_window() {
|
||||
let now = Utc::now();
|
||||
|
||||
Reference in New Issue
Block a user