Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions apps/aether-gateway/src/oauth/identity_repo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ pub(crate) struct IdentityOAuthProviderSummary {
pub(crate) struct IdentityOAuthLinkSummary {
pub(crate) provider_type: String,
pub(crate) display_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) icon_url: Option<String>,
pub(crate) provider_username: Option<String>,
pub(crate) provider_email: Option<String>,
pub(crate) linked_at: Option<String>,
Expand Down Expand Up @@ -348,6 +350,7 @@ fn map_link_summary(
Ok(IdentityOAuthLinkSummary {
provider_type: row.provider_type,
display_name: row.display_name,
icon_url: row.icon_url,
provider_username: row.provider_username,
provider_email: row.provider_email,
linked_at: row.linked_at.map(|value| value.to_rfc3339()),
Expand Down
1 change: 1 addition & 0 deletions crates/aether-data/src/repository/users/memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -958,6 +958,7 @@ impl UserReadRepository for InMemoryUserReadRepository {
StoredUserOAuthLinkSummary::new(
link.provider_type.clone(),
link.provider_type.clone(),
None,
link.provider_username.clone(),
link.provider_email.clone(),
Some(link.linked_at),
Expand Down
2 changes: 2 additions & 0 deletions crates/aether-data/src/repository/users/mysql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ const USER_OAUTH_LINK_SUMMARY_COLUMNS: &str = r#"
SELECT
user_oauth_links.provider_type,
oauth_providers.display_name,
oauth_providers.icon_url,
user_oauth_links.provider_username,
user_oauth_links.provider_email,
user_oauth_links.linked_at,
Expand Down Expand Up @@ -2068,6 +2069,7 @@ fn map_oauth_link_summary_row(
StoredUserOAuthLinkSummary::new(
row.try_get("provider_type").map_sql_err()?,
row.try_get("display_name").map_sql_err()?,
row.try_get("icon_url").map_sql_err()?,
row.try_get("provider_username").map_sql_err()?,
row.try_get("provider_email").map_sql_err()?,
optional_datetime_from_unix_secs(row.try_get("linked_at").map_sql_err()?),
Expand Down
2 changes: 2 additions & 0 deletions crates/aether-data/src/repository/users/postgres.rs
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ const LIST_USER_OAUTH_LINKS_SQL: &str = r#"
SELECT
user_oauth_links.provider_type,
oauth_providers.display_name,
oauth_providers.icon_url,
user_oauth_links.provider_username,
user_oauth_links.provider_email,
user_oauth_links.linked_at,
Expand Down Expand Up @@ -2318,6 +2319,7 @@ fn map_oauth_link_summary_row(
StoredUserOAuthLinkSummary::new(
row.try_get("provider_type").map_postgres_err()?,
row.try_get("display_name").map_postgres_err()?,
row.try_get("icon_url").map_postgres_err()?,
row.try_get("provider_username").map_postgres_err()?,
row.try_get("provider_email").map_postgres_err()?,
row.try_get("linked_at").map_postgres_err()?,
Expand Down
2 changes: 2 additions & 0 deletions crates/aether-data/src/repository/users/sqlite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ const USER_OAUTH_LINK_SUMMARY_COLUMNS: &str = r#"
SELECT
user_oauth_links.provider_type,
oauth_providers.display_name,
oauth_providers.icon_url,
user_oauth_links.provider_username,
user_oauth_links.provider_email,
user_oauth_links.linked_at,
Expand Down Expand Up @@ -2072,6 +2073,7 @@ fn map_oauth_link_summary_row(
StoredUserOAuthLinkSummary::new(
row.try_get("provider_type").map_sql_err()?,
row.try_get("display_name").map_sql_err()?,
row.try_get("icon_url").map_sql_err()?,
row.try_get("provider_username").map_sql_err()?,
row.try_get("provider_email").map_sql_err()?,
optional_datetime_from_unix_secs(row.try_get("linked_at").map_sql_err()?),
Expand Down
3 changes: 3 additions & 0 deletions crates/aether-data/src/repository/users/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ pub struct LdapAuthUserProvisioningOutcome {
pub struct StoredUserOAuthLinkSummary {
pub provider_type: String,
pub display_name: String,
pub icon_url: Option<String>,
pub provider_username: Option<String>,
pub provider_email: Option<String>,
pub linked_at: Option<DateTime<Utc>>,
Expand All @@ -190,6 +191,7 @@ impl StoredUserOAuthLinkSummary {
pub fn new(
provider_type: String,
display_name: String,
icon_url: Option<String>,
provider_username: Option<String>,
provider_email: Option<String>,
linked_at: Option<DateTime<Utc>>,
Expand All @@ -209,6 +211,7 @@ impl StoredUserOAuthLinkSummary {
Ok(Self {
provider_type,
display_name,
icon_url,
provider_username,
provider_email,
linked_at,
Expand Down
1 change: 1 addition & 0 deletions frontend/src/api/oauth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export interface OAuthProvidersResponse {
export interface OAuthLinkInfo {
provider_type: string
display_name: string
icon_url?: string | null
provider_username?: string | null
provider_email?: string | null
linked_at?: string | null
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/utils/oauth-icons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ export const OAUTH_ICONS: Record<string, string> = {
const DEFAULT_ICON = OAUTH_ICONS.github

export function getOAuthIcon(providerType: string, iconUrl?: string | null): string {
if (iconUrl) return `<img src="${iconUrl}" alt="" style="width:100%;height:100%;object-fit:contain;" />`
const builtin = OAUTH_ICONS[providerType.toLowerCase()]
if (builtin) return builtin
if (iconUrl) return `<img src="${iconUrl}" alt="" style="width:100%;height:100%;object-fit:contain;" />`
return DEFAULT_ICON
}
2 changes: 1 addition & 1 deletion frontend/src/views/user/Settings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@
<!-- eslint-disable vue/no-v-html -->
<div
class="oauth-icon shrink-0"
v-html="getOAuthIcon(link.provider_type)"
v-html="getOAuthIcon(link.provider_type, link.icon_url)"
/>
<!-- eslint-enable vue/no-v-html -->
<div class="min-w-0">
Expand Down
Loading