Skip to content

Commit 0590612

Browse files
committed
OCPBUGS-44505: Exclude crypto from node polyfill, update console-telemetry-plugin to use browsers crypto, refactor
1 parent 43df8c6 commit 0590612

File tree

3 files changed

+59
-47
lines changed

3 files changed

+59
-47
lines changed

frontend/packages/console-shared/src/hooks/useUserSettings.ts

Lines changed: 52 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,56 @@ const useCounterRef = (initialValue: number = 0): [boolean, () => void, () => vo
3232
return [counterRef.current !== initialValue, increment, decrement];
3333
};
3434

35+
const useUserUid = () => {
36+
// Unique username
37+
const uniqueUsernameRef = React.useRef<string>('');
38+
const [userUidLoading, setUserUidLoading] = React.useState<boolean>(true);
39+
40+
// User id and impersonate name
41+
const userImpersonateNameOrUID = useSelector((state: RootState) => {
42+
const impersonateName = getImpersonate(state)?.name;
43+
const uid = getUser(state)?.uid;
44+
return impersonateName || uid || '';
45+
});
46+
47+
// Username
48+
const username = useSelector((state: RootState) => {
49+
return getUser(state)?.username;
50+
});
51+
52+
// construct unique username
53+
React.useEffect(() => {
54+
let activeGenerate = true;
55+
56+
if (username === 'kube:admin') {
57+
uniqueUsernameRef.current = 'kubeadmin';
58+
setUserUidLoading(false);
59+
} else if (username) {
60+
setUserUidLoading(true);
61+
generateHash('SHA-256', username)
62+
.then((hash) => {
63+
if (activeGenerate) {
64+
uniqueUsernameRef.current = hash;
65+
setUserUidLoading(false);
66+
}
67+
})
68+
.catch((err) => {
69+
// eslint-disable-next-line no-console
70+
console.error('Could not generate unique username hash:', err);
71+
setUserUidLoading(false);
72+
});
73+
} else {
74+
setUserUidLoading(false);
75+
}
76+
77+
return () => {
78+
activeGenerate = false;
79+
};
80+
}, [username]);
81+
82+
return { userUidLoading, userUid: userImpersonateNameOrUID || uniqueUsernameRef.current || '' };
83+
};
84+
3585
export const useUserSettings: UseUserSettings = <T>(key, defaultValue, sync = false) => {
3686
// Mount status for safety state updates
3787
const mounted = React.useRef(true);
@@ -64,50 +114,7 @@ export const useUserSettings: UseUserSettings = <T>(key, defaultValue, sync = fa
64114
// Request counter
65115
const [isRequestPending, increaseRequest, decreaseRequest] = useCounterRef();
66116

67-
// Unique username
68-
const [uniqueUsername, setUniqueUsernameUnsafe] = React.useState<string>('');
69-
const setUniqueUsername: typeof setUniqueUsernameUnsafe = React.useCallback(
70-
(...args) => mounted.current && setUniqueUsernameUnsafe(...args),
71-
[setUniqueUsernameUnsafe],
72-
);
73-
// User id and impersonate name
74-
const userImpersonateNameOrUID = useSelector((state: RootState) => {
75-
const impersonateName = getImpersonate(state)?.name;
76-
const uid = getUser(state)?.uid;
77-
return impersonateName || uid || '';
78-
});
79-
80-
// Username
81-
const username = useSelector((state: RootState) => {
82-
return getUser(state)?.username;
83-
});
84-
85-
// construct unique username
86-
React.useEffect(() => {
87-
let activeGenerate = true;
88-
89-
if (!username) {
90-
setUniqueUsername('');
91-
} else if (username === 'kube:admin') {
92-
setUniqueUsername('kubeadmin');
93-
} else {
94-
generateHash('SHA-256', username)
95-
.then((hash) => {
96-
if (activeGenerate) {
97-
setUniqueUsername(hash);
98-
}
99-
})
100-
.catch((err) => {
101-
// eslint-disable-next-line no-console
102-
console.error('Could not generate unique username hash:', err);
103-
});
104-
}
105-
return () => {
106-
activeGenerate = false;
107-
};
108-
}, [username, setUniqueUsername]);
109-
110-
const userUid = userImpersonateNameOrUID || uniqueUsername || '';
117+
const { userUidLoading, userUid } = useUserUid();
111118

112119
const impersonate: boolean = useSelector((state: RootState) => !!getImpersonate(state));
113120

@@ -122,7 +129,7 @@ export const useUserSettings: UseUserSettings = <T>(key, defaultValue, sync = fa
122129

123130
const isLocalStorage = fallbackLocalStorage || impersonate;
124131
const [lsData, setLsDataCallback] = useUserSettingsLocalStorage(
125-
alwaysUseFallbackLocalStorage && !impersonate
132+
(alwaysUseFallbackLocalStorage || userUidLoading) && !impersonate && !userUidLoading
126133
? 'console-user-settings'
127134
: `console-user-settings-${userUid}`,
128135
keyRef.current,

frontend/packages/console-shared/src/utils/utils.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,19 @@ export const createLookup = <A extends K8sResourceKind>(
3333
type HashingAlgorithm = 'SHA-1' | 'SHA-256' | 'SHA-384' | 'SHA-512';
3434

3535
export const generateHash = async (algorithm: HashingAlgorithm, data: string): Promise<string> => {
36+
if (!data) {
37+
return '';
38+
}
39+
3640
try {
3741
const msgUint8 = new TextEncoder().encode(data);
3842
const hashBuffer = await window.crypto.subtle.digest(algorithm, msgUint8);
3943
const hashArray = Array.from(new Uint8Array(hashBuffer));
40-
// converts bytes to a hexadecimal string, ensures that each hex is two characters long (e.g. 0f instead f)
4144
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
4245
} catch (e) {
4346
// eslint-disable-next-line no-console
4447
console.error(`Failed to generate hash with ${algorithm}:`, e);
45-
return '';
48+
throw e; // Re-throw the error to be handled by the caller
4649
}
4750
};
4851

frontend/webpack.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ const config: Configuration = {
9696
prettier: false,
9797
'prettier/parser-yaml': false,
9898
},
99+
fallback: { crypto: false },
99100
},
100101
node: {
101102
global: true, // see https://github.com/browserify/randombytes/issues/36
@@ -267,6 +268,7 @@ const config: Configuration = {
267268
}),
268269
new NodePolyfillPlugin({
269270
additionalAliases: ['process'],
271+
excludeAliases: ['crypto'],
270272
}),
271273
new CopyWebpackPlugin({
272274
patterns: [

0 commit comments

Comments
 (0)