-
Notifications
You must be signed in to change notification settings - Fork 8.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[8.2] [FullStory] Improve UUID generation #131008
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
4fa6973
[8.2] [FullStory] Improve UUID generation
afharo b277463
Validate the Authentication Realm type as well
afharo bebf248
Merge branch '8.2' into hotfix/8.2/fullstory-userId
kibanamachine 1c10a13
More explicit tests about hashed plain username
afharo File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -244,7 +244,10 @@ export class CloudPlugin implements Plugin<CloudSetup> { | |
// Keep this import async so that we do not load any FullStory code into the browser when it is disabled. | ||
const fullStoryChunkPromise = import('./fullstory'); | ||
const userIdPromise: Promise<string | undefined> = security | ||
? loadFullStoryUserId({ getCurrentUser: security.authc.getCurrentUser }) | ||
? loadFullStoryUserId({ | ||
cloudDeploymentId: this.config.id, | ||
getCurrentUser: security.authc.getCurrentUser, | ||
}) | ||
: Promise.resolve(undefined); | ||
|
||
// We need to call FS.identify synchronously after FullStory is initialized, so we must load the user upfront | ||
|
@@ -264,9 +267,8 @@ export class CloudPlugin implements Plugin<CloudSetup> { | |
// This needs to be called syncronously to be sure that we populate the user ID soon enough to make sessions merging | ||
// across domains work | ||
if (userId) { | ||
// Join the cloud org id and the user to create a truly unique user id. | ||
// The hashing here is to keep it at clear as possible in our source code that we do not send literal user IDs | ||
const hashedId = sha256(esOrgId ? `${esOrgId}:${userId}` : `${userId}`); | ||
const hashedId = sha256(`${userId}`); | ||
|
||
executionContextPromise | ||
?.then(async (executionContext) => { | ||
|
@@ -377,8 +379,10 @@ export class CloudPlugin implements Plugin<CloudSetup> { | |
|
||
/** @internal exported for testing */ | ||
export const loadFullStoryUserId = async ({ | ||
cloudDeploymentId, | ||
getCurrentUser, | ||
}: { | ||
cloudDeploymentId?: string; | ||
getCurrentUser: () => Promise<AuthenticatedUser>; | ||
}) => { | ||
try { | ||
|
@@ -395,9 +399,21 @@ export const loadFullStoryUserId = async ({ | |
currentUser.metadata | ||
)}` | ||
); | ||
|
||
return undefined; | ||
} | ||
|
||
if ( | ||
getIsCloudEnabled(cloudDeploymentId) && | ||
currentUser.authentication_realm?.type === 'saml' && | ||
currentUser.authentication_realm?.name === 'cloud-saml-kibana' | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To be extra safe, I think we'll also want to check that There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good call! Added! |
||
) { | ||
return currentUser.username; | ||
} | ||
|
||
return currentUser.username; | ||
return cloudDeploymentId | ||
? `${cloudDeploymentId}:${currentUser.username}` | ||
: currentUser.username; | ||
} catch (e) { | ||
// eslint-disable-next-line no-console | ||
console.error(`[cloud.full_story] Error loading the current user: ${e.toString()}`, e); | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To actually test this case, wouldn't you want to include an id in one of the calls to
setupPlugin
and not to the other, so that you can assert that the hashes do not match?As it is written I'm not sure the test is really proving that an org id isn't included, since both
setupPlugin
calls are identical.It might be simpler to create a hash of the expected ID directly, and then assert that the call to
fullStoryApiMock.identify
matches, e.g.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good call! I pushed a change to make the tests more explicit about using the hashed plain username :)