Skip to content

Commit bf6faed

Browse files
committed
mgr/dashboard: fix token polling req in multi-cluster UI
the req sends the details of every cluster's token in a GET req which is insecure and gets logged in browser and server logs.. fixing that and also stop polling token status every 5s and resort to the 10m interval Fixes: https://tracker.ceph.com/issues/70371 Signed-off-by: Nizamudeen A <[email protected]>
1 parent 224a0e7 commit bf6faed

File tree

4 files changed

+25
-80
lines changed

4 files changed

+25
-80
lines changed

src/pybind/mgr/dashboard/controllers/multi_cluster.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -411,25 +411,29 @@ def check_token_status_expiration(self, token):
411411
return 1
412412
return 0
413413

414-
def check_token_status_array(self, clusters_token_array):
414+
def check_token_status_array(self):
415415
token_status_map = {}
416+
multi_cluster_config = self.load_multi_cluster_config()
416417

417-
for item in clusters_token_array:
418-
cluster_name = item['name']
419-
token = item['token']
420-
user = item['user']
421-
status = self.check_token_status_expiration(token)
422-
time_left = self.get_time_left(token)
423-
token_status_map[cluster_name] = {'status': status, 'user': user,
424-
'time_left': time_left}
418+
if 'config' in multi_cluster_config:
419+
for _, config in multi_cluster_config['config'].items():
420+
cluster_name = config[0]['name']
421+
token = config[0]['token']
422+
user = config[0]['user']
423+
status = self.check_token_status_expiration(token)
424+
time_left = self.get_time_left(token)
425+
token_status_map[cluster_name] = {
426+
'status': status,
427+
'user': user,
428+
'time_left': time_left
429+
}
425430

426431
return token_status_map
427432

428433
@Endpoint()
429434
@ReadPermission
430-
def check_token_status(self, clustersTokenMap=None):
431-
clusters_token_map = json.loads(clustersTokenMap)
432-
return self.check_token_status_array(clusters_token_map)
435+
def check_token_status(self):
436+
return self.check_token_status_array()
433437

434438
@Endpoint()
435439
@ReadPermission

src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/multi-cluster/multi-cluster-list/multi-cluster-list.component.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,5 @@ export class MultiClusterListComponent extends ListWithDetails implements OnInit
277277

278278
refresh() {
279279
this.multiClusterService.refresh();
280-
this.multiClusterService.refreshTokenStatus();
281280
}
282281
}

src/pybind/mgr/dashboard/frontend/src/app/shared/api/multi-cluster.service.ts

Lines changed: 8 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { HttpClient, HttpParams } from '@angular/common/http';
1+
import { HttpClient } from '@angular/common/http';
22
import { Injectable } from '@angular/core';
33
import { BehaviorSubject, Observable, Subscription } from 'rxjs';
44
import { TimerService } from '../services/timer.service';
@@ -32,56 +32,14 @@ export class MultiClusterService {
3232
.subscribe(this.getClusterObserver());
3333
}
3434

35-
getTempMap(clustersConfig: any) {
36-
const tempMap = new Map<string, { token: string; user: string }>();
37-
Object.keys(clustersConfig).forEach((clusterKey: string) => {
38-
const clusterDetailsList = clustersConfig[clusterKey];
39-
clusterDetailsList.forEach((clusterDetails: any) => {
40-
if (clusterDetails['token'] && clusterDetails['name'] && clusterDetails['user']) {
41-
tempMap.set(clusterDetails['name'], {
42-
token: clusterDetails['token'],
43-
user: clusterDetails['user']
44-
});
45-
}
46-
});
47-
});
48-
return tempMap;
49-
}
50-
5135
startClusterTokenStatusPolling() {
52-
let clustersTokenMap = new Map<string, { token: string; user: string }>();
53-
const dataSubscription = this.subscribeOnce((resp: any) => {
54-
const clustersConfig = resp['config'];
55-
let tempMap = new Map<string, { token: string; user: string }>();
56-
if (clustersConfig) {
57-
tempMap = this.getTempMap(clustersConfig);
58-
Object.keys(clustersConfig).forEach((clusterKey: string) => {
59-
const clusterDetailsList = clustersConfig[clusterKey];
60-
clusterDetailsList.forEach((clusterDetails: any) => {
61-
if (clusterDetails['token'] && clusterDetails['name'] && clusterDetails['user']) {
62-
tempMap.set(clusterDetails['name'], {
63-
token: clusterDetails['token'],
64-
user: clusterDetails['user']
65-
});
66-
}
67-
});
68-
});
69-
70-
if (tempMap.size > 0) {
71-
clustersTokenMap = tempMap;
72-
if (dataSubscription) {
73-
dataSubscription.unsubscribe();
74-
}
75-
this.checkAndStartTimer(clustersTokenMap);
76-
}
77-
}
78-
});
36+
this.checkAndStartTimer();
7937
}
8038

81-
private checkAndStartTimer(clustersTokenMap: Map<string, { token: string; user: string }>) {
82-
this.checkTokenStatus(clustersTokenMap).subscribe(this.getClusterTokenStatusObserver());
39+
private checkAndStartTimer() {
40+
this.checkTokenStatus().subscribe(this.getClusterTokenStatusObserver());
8341
this.timerService
84-
.get(() => this.checkTokenStatus(clustersTokenMap), this.TOKEN_CHECK_INTERVAL)
42+
.get(() => this.checkTokenStatus(), this.TOKEN_CHECK_INTERVAL)
8543
.subscribe(this.getClusterTokenStatusObserver());
8644
}
8745

@@ -94,11 +52,7 @@ export class MultiClusterService {
9452
}
9553

9654
refreshTokenStatus() {
97-
this.subscribeOnce((resp: any) => {
98-
const clustersConfig = resp['config'];
99-
let tempMap = this.getTempMap(clustersConfig);
100-
return this.checkTokenStatus(tempMap).subscribe(this.getClusterTokenStatusObserver());
101-
});
55+
return this.checkTokenStatus().subscribe(this.getClusterTokenStatusObserver());
10256
}
10357

10458
subscribeOnce(next: (data: any) => void, error?: (error: any) => void) {
@@ -203,15 +157,8 @@ export class MultiClusterService {
203157
};
204158
}
205159

206-
checkTokenStatus(
207-
clustersTokenMap: Map<string, { token: string; user: string }>
208-
): Observable<object> {
209-
let data = [...clustersTokenMap].map(([key, { token, user }]) => ({ name: key, token, user }));
210-
211-
let params = new HttpParams();
212-
params = params.set('clustersTokenMap', JSON.stringify(data));
213-
214-
return this.http.get<object>('api/multi-cluster/check_token_status', { params });
160+
checkTokenStatus(): Observable<object> {
161+
return this.http.get<object>('api/multi-cluster/check_token_status');
215162
}
216163

217164
showPrometheusDelayMessage(showDeletionMessage?: boolean) {

src/pybind/mgr/dashboard/openapi.yaml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7278,12 +7278,7 @@ paths:
72787278
- Multi-cluster
72797279
/api/multi-cluster/check_token_status:
72807280
get:
7281-
parameters:
7282-
- allowEmptyValue: true
7283-
in: query
7284-
name: clustersTokenMap
7285-
schema:
7286-
type: string
7281+
parameters: []
72877282
responses:
72887283
'200':
72897284
content:

0 commit comments

Comments
 (0)