Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-04-21 02:50:22 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-04-21 02:50:22 +0300
commit9dc93a4519d9d5d7be48ff274127136236a3adb3 (patch)
tree70467ae3692a0e35e5ea56bcb803eb512a10bedb /app/assets/javascripts/captcha
parent4b0f34b6d759d6299322b3a54453e930c6121ff0 (diff)
Add latest changes from gitlab-org/gitlab@13-11-stable-eev13.11.0-rc43
Diffstat (limited to 'app/assets/javascripts/captcha')
-rw-r--r--app/assets/javascripts/captcha/apollo_captcha_link.js37
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);
+ }),
+);