Cognito user deleting shortly after signup
See original GitHub issueBefore opening, please confirm:
- I have searched for duplicate or closed issues and discussions.
- I have read the guide for submitting bug reports.
- I have done my best to include a minimal, self-contained set of instructions for consistently reproducing the issue.
JavaScript Framework
React
Amplify APIs
Authentication
Amplify Categories
auth
Environment information
# Put output below this line
System:
OS: macOS 12.5.1
CPU: (8) x64 Apple M2
Memory: 37.53 MB / 8.00 GB
Shell: 3.2.57 - /bin/bash
Binaries:
Node: 12.14.0 - ~/.nvm/versions/node/v12.14.0/bin/node
npm: 6.13.4 - ~/.nvm/versions/node/v12.14.0/bin/npm
Browsers:
Chrome: 105.0.5195.125
Firefox: 71.0
Safari: 15.6.1
npmGlobalPackages:
npm: 6.13.4
Describe the bug
Sporadic issue: Succeeds 75% of the time, failure 25% of the time
- User registers using email/password combination
- The unconfirmed user is now in the user pool with an unverified email - (confirmed, duplicable)
- Verification code is sent to verify the Email Address
- Between 1-10 seconds elapses
- The Cognito user is now deleted from the user pool
Expected behavior
- User registers using email/password combination
- The unconfirmed user is now in the user pool with an unverified email
- Verification code is sent to verify the Email Address
- Between 1-10 seconds elapses
- The Cognito user is still in the user pool
- The user is able to enter the verification code and confirm their user
Reproduction steps
The issue is sporadic, I have not been able to reliably duplicate.
Code Snippet
// Put your code below this line.
export const registerClient = (details) => async (dispatch) => {
let user = { email: (details.email).toLowerCase(), password: details.password, first: details.first_name, last: details.last_name };
const { email, password, first, last } = user;
if (email && password && first && last) {
let attributes = {
"email": ((email).toLowerCase()).replace(/\s+/g, ""),
"name": `${first} ${last}`
};
if (details.home_phone) attributes.phone_number = formatUSPhoneNumber(details.home_phone);
return Auth.signUp({
username: ((email).toLowerCase()).replace(/\s+/g, ""),
password,
attributes
})
.then((cognitoUser) => {
LogRocket.track(`Cognito user signed up. - ${first} ${last} - ${email}`);
dispatch(logEvent("user creation", { first_name: first, last_name: last, email, cognito_id: cognitoUser.userSub }));
dispatch({ type: UPDATE_CLIENT_REGISTRATION, payload: { collector: "registration_config", key: "cognito_id", value: cognitoUser.userSub } });
dispatch({ type: UPDATE_CLIENT_REGISTRATION, payload: { collector: "registration_config", key: "is_verifying", value: true } });
dispatch({ type: IS_SIGNING_UP, payload: true });
return { success: true };
})
.catch((error) => {
dispatch(showNotification("error", "Cognito signup", error.message));
return { success: false };
});
} else {
dispatch(showNotification("error", "Missing signup credentials", "You must enter a username and password."));
return { success: false };
}
};
Log output
// Put your logs below this line
VM12:2491 Symbol.observable as defined by Redux and Redux DevTools do not match. This could cause your app to behave differently if the DevTools are not loaded. Consider polyfilling Symbol.observable before Redux is imported or avoid polyfilling Symbol.observable altogether.
M @ VM12:2491
build.umd.js:2977 [DEBUG] 51:20.302 Amplify - amplify config Object
build.umd.js:2977 [DEBUG] 51:20.303 AuthClass - configure Auth
build.umd.js:2977 [DEBUG] 51:20.303 Parser - parse config Array(3)
build.umd.js:2977 [DEBUG] 51:20.303 Hub - Dispatching to auth with Object
build.umd.js:2977 [DEBUG] 51:20.303 RestAPI - configure Rest API Object
build.umd.js:2977 [DEBUG] 51:20.304 RestAPI - create Rest API instance
build.umd.js:2977 [DEBUG] 51:20.304 RestClient - API Options Object
build.umd.js:2977 [DEBUG] 51:20.304 I18n - configure I18n
build.umd.js:2977 [DEBUG] 51:20.304 I18n - create I18n instance
build.umd.js:2977 [DEBUG] 51:20.304 PubSub - configure PubSub Object
build.umd.js:2977 [DEBUG] 51:20.304 GraphQLAPI - configure GraphQL API Object
build.umd.js:2977 [DEBUG] 51:20.304 GraphQLAPI - create Rest instance
build.umd.js:2977 [DEBUG] 51:20.304 RestClient - API Options Object
build.umd.js:2977 [DEBUG] 51:20.304 RestAPI - configure Rest API Object
build.umd.js:2977 [DEBUG] 51:20.304 RestAPI - create Rest API instance
build.umd.js:2977 [DEBUG] 51:20.304 RestClient - API Options Object
build.umd.js:2977 [DEBUG] 51:20.304 GraphQLAPI - configure GraphQL API Object
build.umd.js:2977 [DEBUG] 51:20.304 GraphQLAPI - create Rest instance
build.umd.js:2977 [DEBUG] 51:20.304 RestClient - API Options Object
build.umd.js:2977 [DEBUG] 51:20.304 AuthClass - configure Auth
build.umd.js:2977 [DEBUG] 51:20.304 Parser - parse config Array(3)
build.umd.js:2977 [DEBUG] 51:20.304 Hub - Dispatching to auth with Object
build.umd.js:2977 [DEBUG] 51:20.707 AuthClass - Getting current session
build.umd.js:2977 [DEBUG] 51:20.708 AuthClass - Failed to get user from user pool
build.umd.js:2977 [DEBUG] 51:20.708 AuthClass - Failed to get the current user No current user
build.umd.js:2977 [DEBUG] 51:20.712 RestClient - GET Object
build.umd.js:2977 [DEBUG] 51:20.713 Credentials - getting credentials
build.umd.js:2977 [DEBUG] 51:20.713 Credentials - picking up credentials
build.umd.js:2977 [DEBUG] 51:20.713 Credentials - getting new cred promise
build.umd.js:2977 [DEBUG] 51:20.713 Credentials - checking if credentials exists and not expired
build.umd.js:2977 [DEBUG] 51:20.713 Credentials - need to get a new credential or refresh the existing one
build.umd.js:2977 [DEBUG] 51:20.713 Credentials - no credentials for expiration check
build.umd.js:2977 [DEBUG] 51:20.714 AuthClass - Getting current user credentials
build.umd.js:2977 [DEBUG] 51:20.714 AuthClass - Getting current session
build.umd.js:2977 [DEBUG] 51:20.714 AuthClass - Failed to get user from user pool
build.umd.js:2977 [DEBUG] 51:20.714 AuthClass - Failed to get the current user No current user
build.umd.js:2977 [DEBUG] 51:20.714 AuthClass - getting session failed No current user
build.umd.js:2977 [DEBUG] 51:20.714 Credentials - setting credentials for guest
build.umd.js:2977 [DEBUG] 51:20.714 RestClient - No credentials available, the request will be unsigned
build.umd.js:2977 [Meta Pixel] - Removed URL query parameters due to potential violations.
e.<computed> @ build.umd.js:2977
build.umd.js:2977 [DEBUG] 51:21.815 RestClient - GET Object
build.umd.js:2977 [DEBUG] 51:21.816 Credentials - getting credentials
build.umd.js:2977 [DEBUG] 51:21.816 Credentials - picking up credentials
build.umd.js:2977 [DEBUG] 51:21.816 Credentials - getting new cred promise
build.umd.js:2977 [DEBUG] 51:21.816 Credentials - checking if credentials exists and not expired
build.umd.js:2977 [DEBUG] 51:21.816 Credentials - need to get a new credential or refresh the existing one
build.umd.js:2977 [DEBUG] 51:21.816 Credentials - no credentials for expiration check
build.umd.js:2977 [DEBUG] 51:21.816 AuthClass - Getting current user credentials
build.umd.js:2977 [DEBUG] 51:21.816 AuthClass - Getting current session
build.umd.js:2977 [DEBUG] 51:21.816 AuthClass - Failed to get user from user pool
build.umd.js:2977 [DEBUG] 51:21.816 AuthClass - Failed to get the current user No current user
build.umd.js:2977 [DEBUG] 51:21.817 AuthClass - getting session failed No current user
build.umd.js:2977 [DEBUG] 51:21.817 Credentials - setting credentials for guest
build.umd.js:2977 [DEBUG] 51:21.817 RestClient - No credentials available, the request will be unsigned
build.umd.js:2977 [DEBUG] 51:22.949 RestClient - POST Object
build.umd.js:2977 [DEBUG] 51:22.949 Credentials - getting credentials
build.umd.js:2977 [DEBUG] 51:22.949 Credentials - picking up credentials
build.umd.js:2977 [DEBUG] 51:22.949 Credentials - getting new cred promise
build.umd.js:2977 [DEBUG] 51:22.949 Credentials - checking if credentials exists and not expired
build.umd.js:2977 [DEBUG] 51:22.949 Credentials - need to get a new credential or refresh the existing one
build.umd.js:2977 [DEBUG] 51:22.949 Credentials - no credentials for expiration check
build.umd.js:2977 [DEBUG] 51:22.950 AuthClass - Getting current user credentials
build.umd.js:2977 [DEBUG] 51:22.953 AuthClass - Getting current session
build.umd.js:2977 [DEBUG] 51:22.953 AuthClass - Failed to get user from user pool
build.umd.js:2977 [DEBUG] 51:22.953 AuthClass - Failed to get the current user No current user
build.umd.js:2977 [DEBUG] 51:22.953 AuthClass - getting session failed No current user
build.umd.js:2977 [DEBUG] 51:22.953 Credentials - setting credentials for guest
build.umd.js:2977 [DEBUG] 51:22.953 RestClient - No credentials available, the request will be unsigned
build.umd.js:2977 [DEBUG] 51:25.447 RestClient - PATCH Object
build.umd.js:2977 [DEBUG] 51:25.447 Credentials - getting credentials
build.umd.js:2977 [DEBUG] 51:25.447 Credentials - picking up credentials
build.umd.js:2977 [DEBUG] 51:25.447 Credentials - getting new cred promise
build.umd.js:2977 [DEBUG] 51:25.447 Credentials - checking if credentials exists and not expired
build.umd.js:2977 [DEBUG] 51:25.447 Credentials - need to get a new credential or refresh the existing one
build.umd.js:2977 [DEBUG] 51:25.447 Credentials - no credentials for expiration check
build.umd.js:2977 [DEBUG] 51:25.447 AuthClass - Getting current user credentials
build.umd.js:2977 [DEBUG] 51:25.451 AuthClass - Getting current session
build.umd.js:2977 [DEBUG] 51:25.451 AuthClass - Failed to get user from user pool
build.umd.js:2977 [DEBUG] 51:25.451 AuthClass - Failed to get the current user No current user
build.umd.js:2977 [DEBUG] 51:25.452 AuthClass - getting session failed No current user
build.umd.js:2977 [DEBUG] 51:25.452 Credentials - setting credentials for guest
build.umd.js:2977 [DEBUG] 51:25.452 RestClient - No credentials available, the request will be unsigned
build.umd.js:2977 [DEBUG] 51:32.93 RestClient - PATCH Object
build.umd.js:2977 [DEBUG] 51:32.94 Credentials - getting credentials
build.umd.js:2977 [DEBUG] 51:32.94 Credentials - picking up credentials
build.umd.js:2977 [DEBUG] 51:32.94 Credentials - getting new cred promise
build.umd.js:2977 [DEBUG] 51:32.94 Credentials - checking if credentials exists and not expired
build.umd.js:2977 [DEBUG] 51:32.94 Credentials - need to get a new credential or refresh the existing one
build.umd.js:2977 [DEBUG] 51:32.94 Credentials - no credentials for expiration check
build.umd.js:2977 [DEBUG] 51:32.94 AuthClass - Getting current user credentials
build.umd.js:2977 [DEBUG] 51:32.98 AuthClass - Getting current session
build.umd.js:2977 [DEBUG] 51:32.98 AuthClass - Failed to get user from user pool
build.umd.js:2977 [DEBUG] 51:32.98 AuthClass - Failed to get the current user No current user
build.umd.js:2977 [DEBUG] 51:32.98 AuthClass - getting session failed No current user
build.umd.js:2977 [DEBUG] 51:32.98 Credentials - setting credentials for guest
build.umd.js:2977 [DEBUG] 51:32.98 RestClient - No credentials available, the request will be unsigned
client-registration:1 [DOM] Input elements should have autocomplete attributes (suggested: "new-password"): (More info: https://goo.gl/9p2vKq) <input id="password" type="password" required maxlength="36" minlength="8" min="0" class="sc-jtEaiv hQMbSq" value>
client-registration:1 [DOM] Input elements should have autocomplete attributes (suggested: "new-password"): (More info: https://goo.gl/9p2vKq) <input id="confirmPassword" type="password" required maxlength="36" minlength="8" min="0" class="sc-jtEaiv hQMbSq" value>
build.umd.js:2977 [DEBUG] 51:42.895 AuthClass - signUp attrs: Array(3)
build.umd.js:2977 [DEBUG] 51:42.896 AuthClass - signUp validation data: null
build.umd.js:2977 [DEBUG] 51:43.226 Hub - Dispatching to auth with Object
build.umd.js:2977 LogRocket Track API: Ignored unsupported type (undefined) at property plan_id. Expected one of: boolean,number,string,boolean[],number[],string[]
e.<computed> @ build.umd.js:2977
build.umd.js:2977 [DEBUG] 51:43.238 RestClient - PATCH Object
build.umd.js:2977 [DEBUG] 51:43.239 Credentials - getting credentials
build.umd.js:2977 [DEBUG] 51:43.239 Credentials - picking up credentials
build.umd.js:2977 [DEBUG] 51:43.239 Credentials - getting new cred promise
build.umd.js:2977 [DEBUG] 51:43.239 Credentials - checking if credentials exists and not expired
build.umd.js:2977 [DEBUG] 51:43.239 Credentials - need to get a new credential or refresh the existing one
build.umd.js:2977 [DEBUG] 51:43.239 Credentials - no credentials for expiration check
build.umd.js:2977 [DEBUG] 51:43.239 AuthClass - Getting current user credentials
build.umd.js:2977 [DEBUG] 51:43.239 AuthClass - Getting current session
build.umd.js:2977 [DEBUG] 51:43.239 AuthClass - Failed to get user from user pool
build.umd.js:2977 [DEBUG] 51:43.239 AuthClass - Failed to get the current user No current user
build.umd.js:2977 [DEBUG] 51:43.240 AuthClass - getting session failed No current user
build.umd.js:2977 [DEBUG] 51:43.240 Credentials - setting credentials for guest
build.umd.js:2977 [DEBUG] 51:43.240 RestClient - No credentials available, the request will be unsigned
DevTools failed to load source map: Could not load content for chrome-extension://fheoggkfdfchfphceeifdbepaooicaho/sourceMap/chrome/scripts/iframe_form_check.map: System error: net::ERR_BLOCKED_BY_CLIENT
DevTools failed to load source map: Could not load content for chrome-extension://fheoggkfdfchfphceeifdbepaooicaho/sourceMap/chrome/scripts/iframe_form_check.map: System error: net::ERR_BLOCKED_BY_CLIENT
DevTools failed to load source map: Could not load content for chrome-extension://fheoggkfdfchfphceeifdbepaooicaho/sourceMap/chrome/scripts/iframe_form_check.map: System error: net::ERR_BLOCKED_BY_CLIENT
DevTools failed to load source map: Could not load content for chrome-extension://fheoggkfdfchfphceeifdbepaooicaho/sourceMap/chrome/scripts/iframe_form_check.map: System error: net::ERR_BLOCKED_BY_CLIENT
DevTools failed to load source map: Could not load content for chrome-extension://fheoggkfdfchfphceeifdbepaooicaho/sourceMap/chrome/scripts/content_scroll_mid_detection.map: System error: net::ERR_BLOCKED_BY_CLIENT
menu.js:4 [Violation] Added non-passive event listener to a scroll-blocking 'wheel' event. Consider marking event handler as 'passive' to make the page more responsive. See https://www.chromestatus.com/feature/5745543795965952
P @ VM30 menu.js:4
m @ VM30 menu.js:9
J @ VM30 menu.js:4
m @ VM30 menu.js:9
J @ VM30 menu.js:4
m @ VM30 menu.js:9
p @ VM30 menu.js:9
F @ VM30 menu.js:4
N @ VM30 menu.js:4
build.umd.js:1233 POST https://cognito-idp.us-east-1.amazonaws.com/ 400
(anonymous) @ build.umd.js:1233
Promise.then (async)
o @ build.umd.js:1227
(anonymous) @ build.umd.js:1277
(anonymous) @ instrument.ts:153
(anonymous) @ instrument.ts:153
t.request @ Client.js:123
t.confirmRegistration @ CognitoUser.js:697
(anonymous) @ Auth.ts:424
e.confirmSignUp @ Auth.ts:423
(anonymous) @ client-registration.js:72
l @ runtime.js:63
(anonymous) @ runtime.js:294
(anonymous) @ runtime.js:119
n @ asyncToGenerator.js:3
o @ asyncToGenerator.js:25
(anonymous) @ asyncToGenerator.js:32
(anonymous) @ asyncToGenerator.js:21
(anonymous) @ client-registration.js:53
(anonymous) @ index.js:8
dispatch @ VM12:3665
confirmClientRegistration @ CreateUserPage.js:149
(anonymous) @ CreateUserPage.js:109
l @ runtime.js:63
(anonymous) @ runtime.js:294
(anonymous) @ runtime.js:119
n @ asyncToGenerator.js:3
o @ asyncToGenerator.js:25
(anonymous) @ asyncToGenerator.js:32
(anonymous) @ asyncToGenerator.js:21
(anonymous) @ CreateUserPage.js:107
(anonymous) @ verification.slide.js:54
l @ runtime.js:63
(anonymous) @ runtime.js:294
(anonymous) @ runtime.js:119
n @ asyncToGenerator.js:3
o @ asyncToGenerator.js:25
(anonymous) @ asyncToGenerator.js:32
(anonymous) @ asyncToGenerator.js:21
(anonymous) @ verification.slide.js:54
(anonymous) @ MultipartDynamicForm.js:57
l @ runtime.js:63
(anonymous) @ runtime.js:294
(anonymous) @ runtime.js:119
n @ asyncToGenerator.js:3
o @ asyncToGenerator.js:25
(anonymous) @ asyncToGenerator.js:32
(anonymous) @ asyncToGenerator.js:21
(anonymous) @ MultipartDynamicForm.js:51
(anonymous) @ MultipartDynamicForm.js:38
onClick @ SplitLayoutDynamicForm.js:40
o @ react-dom.production.min.js:14
d @ react-dom.production.min.js:14
(anonymous) @ react-dom.production.min.js:14
A @ react-dom.production.min.js:15
it @ react-dom.production.min.js:52
rt @ react-dom.production.min.js:51
ot @ react-dom.production.min.js:52
dt @ react-dom.production.min.js:56
j @ react-dom.production.min.js:287
D @ react-dom.production.min.js:19
Jt @ react-dom.production.min.js:70
Xt @ react-dom.production.min.js:69
t.unstable_runWithPriority @ scheduler.production.min.js:19
Rr @ react-dom.production.min.js:122
B @ react-dom.production.min.js:287
Gt @ react-dom.production.min.js:68
r @ helpers.ts:99
r @ build.umd.js:961
Show 38 more frames
build.umd.js:2977 [DEBUG] 52:15.421 RestClient - PATCH {endpoint: 'REDACTED, region: 'us-east-1', service: 'execute-api', custom_header: undefined}
build.umd.js:2977 [DEBUG] 52:15.422 Credentials - getting credentials
build.umd.js:2977 [DEBUG] 52:15.423 Credentials - picking up credentials
build.umd.js:2977 [DEBUG] 52:15.423 Credentials - getting new cred promise
build.umd.js:2977 [DEBUG] 52:15.423 Credentials - checking if credentials exists and not expired
build.umd.js:2977 [DEBUG] 52:15.423 Credentials - need to get a new credential or refresh the existing one
build.umd.js:2977 [DEBUG] 52:15.423 Credentials - no credentials for expiration check
build.umd.js:2977 [DEBUG] 52:15.424 AuthClass - Getting current user credentials
build.umd.js:2977 [DEBUG] 52:15.424 AuthClass - Getting current session
build.umd.js:2977 [DEBUG] 52:15.424 AuthClass - Failed to get user from user pool
build.umd.js:2977 [DEBUG] 52:15.424 AuthClass - Failed to get the current user No current user
build.umd.js:2977 [DEBUG] 52:15.424 AuthClass - getting session failed No current user
build.umd.js:2977 [DEBUG] 52:15.424 Credentials - setting credentials for guest
build.umd.js:2977 [DEBUG] 52:15.425 RestClient - No credentials available, the request will be unsigned
aws-exports.js
No response
Manual configuration
import config from "./config";
export const amplifyConfiguration = {
Auth: {
mandatorySignIn: true,
region: config.cognito.REGION,
userPoolId: config.cognito.USER_POOL_ID,
identityPoolId: config.cognito.IDENTITY_POOL_ID,
userPoolWebClientId: config.cognito.APP_CLIENT_ID,
},
Storage: {
region: config.s3.REGION,
bucket: config.s3.BUCKET,
identityPoolId: config.cognito.IDENTITY_POOL_ID
},
API: {
endpoints: [
{
name: config.apiGateway.NAME,
endpoint: config.apiGateway.URL,
region: config.apiGateway.REGION
},
]
}
};
Additional configuration
No response
Mobile Device
No response
Mobile Operating System
No response
Mobile Browser
No response
Mobile Browser Version
No response
Additional information and screenshots
Video of sporadic issue, succeeds once, fails once. You can see the user created in the pool, and you can see the user immediately deleted from the pool with no additional interaction.
The register button fires one function, the one referenced above in the Code Snippet
field.
This integration has been functioning with no issues for over 3 years.
Issue Analytics
- State:
- Created a year ago
- Comments:13
Top Results From Across the Web
How to delete a AWS Cognito user automatically after certain ...
First is a pre sign-up lambda, that stores new users in, ... The second one is actually fairly easy, just deleting a row...
Read more >User pool deletion protection - Amazon Cognito
When you want to delete a user pool with an Amazon Cognito API request, you must first change DeletionProtection to Inactive in an...
Read more >Enabling Users to Delete Their Own AWS Cognito Accounts
Once a user deletes their account, it is important to sign them out globally. ... You should be using a 3.x version of...
Read more >Signing up and confirming user accounts - Amazon Cognito
Before you can delete a user account, you must disable sign-in access for that user. Verifying contact information at sign-up. When new users...
Read more >amazon-cognito-identity-js - npm
The Amazon Cognito Identity SDK for JavaScript allows JavaScript enabled applications to sign-up users, authenticate users, view, delete, and ...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Hi @nadetastic -
Correct, I use Amplify, but not the automated setup, a manual setup in this case.
I’ve made every change I can think of to halt this additional call to the API and I can NEVER see this route being called twice from the frontend, even went as far as to make sure dev tools stays open the entire time to see if any initial calls are sent from the frontend. Nothing.
When this anomaly occurs, if you watch the network, it only ever gets fired off one time, so this really doesn’t feel like an issue coming from the frontend.
Here’s a log of the bug when it happens: The functions runs so incredibly close together, it almost seems like a retry, but this function is not asynchronous, so I don’t believe Lambda max retries even apply here.
For some additional insight: This function checks for a registration in progress, for example: A user begins registration and gets past the point where a cognito user is created, but has not finished registration far enough to create a user record in my database.
This function checks for that scenario, if the function finds a cognito user with the matching email, but does not find a user record, we delete the cognito user and return a
Great, this email is available
rather thanThis email is in use
, etc…This had been working as expected for years. I truly don’t know what has changed here, but it feels like it’s either:
At this point, I really am at a loss.
I suppose a way to duplicate the actions that I’m taking would be to run two
adminGetUser
functions back to back, in which case one of them is returning a user and one is not.The obvious scenario that is happening here is:
Video of the actual process: https://user-images.githubusercontent.com/57410369/194350873-350a3718-3de0-474f-8748-be86273ecba5.mov
– Email check Lambda
Cognito user lookup
Delete cognito user
@nadetastic - Updating here:
Have been heavily testing this using Proton Mail in place of Gmail to try to rule out something within my own code, cannot duplicate this bug so far, 30+ attempts, seems specific to Gmail redirected URLs.
Edit: Switched back to Gmail, bug present on attempt 1.