Skip to content
Merged
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
25 changes: 19 additions & 6 deletions src-tauri/src/commands/url_watcher.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::service::user::UserService;
use crate::utils::{format_cookies, get_window_cookies};

use serde_json::json;
use serde_json::{json, Value};
use std::time::{Duration, Instant};
use tauri::{AppHandle, Emitter, Manager};
use tokio::time::{self, MissedTickBehavior};
Expand Down Expand Up @@ -105,9 +105,10 @@ pub fn url_watcher(app: AppHandle, name: String, origin: String) {
log::info!("profile: {:?}", profile);

if profile.status != 401 && profile.success {
let user_data = user_service.init().await;
let xpack_message = user_service.get_xpack_message().await;
let version_message = user_service.get_version_message().await;

log::info!("public_message: {:?}", xpack_message);
log::info!("version_message: {:?}", version_message);

let version = if version_message.status == 200 && version_message.success {
Expand All @@ -118,16 +119,28 @@ pub fn url_watcher(app: AppHandle, name: String, origin: String) {
"".to_string()
};

let license_valid = if xpack_message.status == 200 && xpack_message.success {
serde_json::from_str::<Value>(&xpack_message.data)
.ok()
.and_then(|value| value.get("XPACK_LICENSE_IS_VALID").and_then(|v| v.as_bool()))
.unwrap_or(true)
} else {
true
};

let user_data = user_service.init(profile, license_valid).await;

let _ = app.emit(
"login-success-detected",
json!({
"status": "success",
"profile": user_data.profile,
"permission_orgs": user_data.permission_orgs,
"current_org": user_data.current_org,
"cookies": cookie_header,
"version": version,
"cookies": cookie_header,
"profile": user_data.profile,
"resolved_site": effective_origin,
"current_org": user_data.current_org,
"xpack_license_valid": license_valid,
"permission_orgs": user_data.permission_orgs,
}),
);

Expand Down
71 changes: 55 additions & 16 deletions src-tauri/src/service/user.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::commands::requests::{get_with_response, ApiResponse};
use log::info;
use serde::Serialize;
use serde_json::json;

#[derive(Debug, Serialize)]
pub struct UserProfileData {
Expand All @@ -23,39 +23,78 @@ impl UserService {

pub async fn get_user_profile(&self) -> ApiResponse {
let url = format!("{}/api/v1/users/profile/", self.origin);
info!("获取用户 profile 信息: {}", url);
log::info!("获取用户 profile 信息: {}", url);
get_with_response(&url, &self.cookie_header).await
}

pub async fn get_permission_orgs(&self) -> ApiResponse {
let url = format!("{}/api/v1/users/profile/permissions/", self.origin);
info!("获取授权的组织: {}", url);
log::info!("获取授权的组织: {}", url);
get_with_response(&url, &self.cookie_header).await
}

pub async fn get_current_org(&self) -> ApiResponse {
let url = format!("{}/api/v1/orgs/orgs/current/", self.origin);
info!("获取当前组织信息: {}", url);
log::info!("获取当前组织信息: {}", url);
get_with_response(&url, &self.cookie_header).await
}

pub async fn get_version_message(&self) -> ApiResponse {
let url = format!("{}/api/v1/settings/client/versions/", self.origin);
info!("获取当前版本信息: {}", url);
log::info!("获取当前版本信息: {}", url);
get_with_response(&url, &self.cookie_header).await
}

pub async fn init(&self) -> UserProfileData {
let (profile, permission_orgs, current_org) = tokio::join!(
self.get_user_profile(),
self.get_permission_orgs(),
self.get_current_org()
);

UserProfileData {
profile,
permission_orgs,
current_org,
pub async fn get_xpack_message(&self) -> ApiResponse {
let url = format!("{}/api/v1/settings/public/", self.origin);
log::info!("获取当前public信息: {}", url);
get_with_response(&url, &self.cookie_header).await
}

pub async fn init(&self, profile: ApiResponse, fetch_orgs: bool) -> UserProfileData {
if fetch_orgs {
let (permission_orgs, current_org) =
tokio::join!(self.get_permission_orgs(), self.get_current_org());

UserProfileData {
profile,
current_org,
permission_orgs,
}
} else {
let permission_orgs = ApiResponse {
status: 200,
data: json!({
"pam_orgs": [],
"audit_orgs": [],
"console_orgs": [],
"workbench_orgs": [],
"id": "",
"username": "",
})
.to_string(),
success: true,
};

let current_org = ApiResponse {
status: 200,
data: json!({
"id": "",
"name": "",
"is_root": false,
"is_default": false,
"is_system": false,
"comment": "",
})
.to_string(),
success: true,
};

UserProfileData {
profile,
current_org,
permission_orgs,
}
}
}
}
15 changes: 14 additions & 1 deletion ui/components/Header/header.vue
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
<script setup lang="ts">
import { useUserInfoStore } from "~/store/modules/userInfo";

const userInfoStore = useUserInfoStore();
const { loggedIn, currentUser } = storeToRefs(userInfoStore);

/**
* @description 窗口拖拽
* @param event 鼠标事件
Expand Down Expand Up @@ -29,12 +34,20 @@ const handleWindowDrag = async (event: MouseEvent) => {
console.error(error);
}
};

const shouldShowOrganizationSelector = computed(() => {
if (!loggedIn.value) {
return false;
}

return currentUser.value?.xpackLicenseValid !== false;
});
</script>

<template>
<div class="header-bg flex items-center justify-between pl-4 h-13" @mousedown="handleWindowDrag">
<section class="flex items-center h-full">
<div>
<div v-if="shouldShowOrganizationSelector">
<HeaderOrganizationSelector />
</div>
</section>
Expand Down
15 changes: 12 additions & 3 deletions ui/components/SideBar/profile.vue
Original file line number Diff line number Diff line change
Expand Up @@ -445,8 +445,16 @@ onMounted(async () => {
});

unlistenLoginSuccessRef.value = await useTauriEventListen("login-success-detected", async (event) => {
const { status, profile, permission_orgs, current_org, cookies, version, resolved_site } =
event.payload as UserIntiInfo;
const {
status,
profile,
cookies,
version,
current_org,
resolved_site,
permission_orgs,
xpack_license_valid
} = event.payload as UserIntiInfo;
const appVersion = await useTauriAppGetVersion().catch(() => "");

let versionMessage: string | string[] = version ?? "";
Expand Down Expand Up @@ -483,7 +491,7 @@ onMounted(async () => {
useEventBus().emit("versionAlert", { type: "incompatible" });
}

const availableOrgs = initSelectOrganization(permissionOrgData);
const availableOrgs = xpack_license_valid === false ? [] : initSelectOrganization(permissionOrgData);

userInfoStore.setUserData(resolvedSite, {
name: profileData.name,
Expand All @@ -492,6 +500,7 @@ onMounted(async () => {
org: currentOrgData,
system_roles: profileData.system_roles,
availableOrgs,
xpackLicenseValid: xpack_license_valid ?? true,
language,
connectionInfo: {
protocol: "",
Expand Down
2 changes: 2 additions & 0 deletions ui/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,14 @@ export interface UserData {
org: CurrentOrg;
availableOrgs: PermOrgItem[];
connectionInfo: ConnectionInfo;
xpackLicenseValid?: boolean;
}

export interface UserIntiInfo {
status: string;
cookies: string;
version?: string;
xpack_license_valid?: boolean;
resolved_site?: string;
profile: {
data: string;
Expand Down