diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-03-23 12:09:33 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-03-23 12:09:33 +0000 |
commit | b38fc20ae0e90d5b1c538a139aa0a7da1b7b5726 (patch) | |
tree | 3ce77cdb707b75c9d74c6ff2a8386dd06bd48b44 /app/assets/javascripts/captcha | |
parent | b3647b2a67930e8aa3c1b1dd9bda29c368c862ba (diff) | |
download | gitlab-ce-b38fc20ae0e90d5b1c538a139aa0a7da1b7b5726.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/captcha')
-rw-r--r-- | app/assets/javascripts/captcha/apollo_captcha_link.js | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/app/assets/javascripts/captcha/apollo_captcha_link.js b/app/assets/javascripts/captcha/apollo_captcha_link.js new file mode 100644 index 00000000000..e49abc10b29 --- /dev/null +++ b/app/assets/javascripts/captcha/apollo_captcha_link.js @@ -0,0 +1,37 @@ +import { ApolloLink, Observable } from 'apollo-link'; + +export const apolloCaptchaLink = new ApolloLink((operation, forward) => + forward(operation).flatMap((result) => { + const { errors = [] } = result; + + // Our API will return with a top-level GraphQL error with extensions + // in case a captcha is required. + const captchaError = errors.find((e) => e?.extensions?.needs_captcha_response); + if (captchaError) { + const captchaSiteKey = captchaError.extensions.captcha_site_key; + const spamLogId = captchaError.extensions.spam_log_id; + + return new Observable((observer) => { + import('~/captcha/wait_for_captcha_to_be_solved') + .then(({ waitForCaptchaToBeSolved }) => waitForCaptchaToBeSolved(captchaSiteKey)) + .then((captchaResponse) => { + // If the captcha was solved correctly, we re-do our action while setting + // captcha response headers. + operation.setContext({ + headers: { + 'X-GitLab-Captcha-Response': captchaResponse, + 'X-GitLab-Spam-Log-Id': spamLogId, + }, + }); + forward(operation).subscribe(observer); + }) + .catch((error) => { + observer.error(error); + observer.complete(); + }); + }); + } + + return Observable.of(result); + }), +); |