|
17 | 17 | height: 100%;
|
18 | 18 | }
|
19 | 19 | </style>
|
| 20 | + <script async src="https://www.google.com/recaptcha/api.js?render=explicit"></script> |
| 21 | + <script |
| 22 | + src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" |
| 23 | + defer |
| 24 | + ></script> |
20 | 25 | </head>
|
21 | 26 | <body>
|
22 | 27 | <div id="root">
|
|
28 | 33 | sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-modals"></iframe>
|
29 | 34 | </div>
|
30 | 35 | <script>
|
| 36 | + const DEFAULT_RC_SITE_KEY = "6LeXSIIqAAAAAJlp04ct42518YoNJeWiUtUTItTb"; |
| 37 | + |
| 38 | + const widgetIds = {}; |
| 39 | + |
| 40 | + async function getRecaptchaToken(sitekey, action){ |
| 41 | + |
| 42 | + return new Promise((resolve, reject) => { |
| 43 | + |
| 44 | + if (!sitekey) |
| 45 | + sitekey = DEFAULT_RC_SITE_KEY; |
| 46 | + |
| 47 | + grecaptcha.ready(function() { |
| 48 | + const elemId = `recaptcha-${sitekey}`; |
| 49 | + let widgetId; |
| 50 | + if (widgetIds[sitekey] === undefined){ |
| 51 | + const elem = document.createElement("div"); |
| 52 | + elem.id = elemId; |
| 53 | + document.body.append(elem); |
| 54 | + widgetId = grecaptcha.render(elemId, { |
| 55 | + sitekey, |
| 56 | + size: 'invisible' |
| 57 | + }); |
| 58 | + widgetIds[sitekey] = widgetId; |
| 59 | + } else { |
| 60 | + widgetId = widgetIds[sitekey]; |
| 61 | + const elem = document.getElementById(elemId).getElementsByClassName("grecaptcha-badge")[0]; |
| 62 | + if (elem) elem.style.visibility = "visible"; |
| 63 | + } |
| 64 | + |
| 65 | + grecaptcha.execute(widgetId, {action: action ?? "recaptcha"}).then(function(token) { |
| 66 | + resolve(token); |
| 67 | + setTimeout(() => { |
| 68 | + const elem = document.getElementById(elemId).getElementsByClassName("grecaptcha-badge")[0]; |
| 69 | + if (elem) elem.style.visibility = "hidden"; |
| 70 | + }, 5000); |
| 71 | + }).catch(e => { |
| 72 | + reject(e); |
| 73 | + }); |
| 74 | + }); |
| 75 | + }) |
| 76 | + } |
| 77 | + |
| 78 | + const DEFAULT_TS_SITE_KEY = "0x4AAAAAAA0Rmw6kZyekmiSB"; |
| 79 | + |
| 80 | + async function getTurnstileToken(sitekey){ |
| 81 | + |
| 82 | + return new Promise((resolve, reject) => { |
| 83 | + |
| 84 | + if (!sitekey) |
| 85 | + sitekey = DEFAULT_TS_SITE_KEY; |
| 86 | + |
| 87 | + const elemId = `turnstile-${sitekey}`; |
| 88 | + let elem; |
| 89 | + |
| 90 | + try { |
| 91 | + let widgetId; |
| 92 | + |
| 93 | + if (!document.getElementById(elemId)) { |
| 94 | + elem = document.createElement("div"); |
| 95 | + elem.id = elemId; |
| 96 | + elem.classList.add("turnstile-widget"); |
| 97 | + document.body.append(elem); |
| 98 | + } |
| 99 | + |
| 100 | + widgetId = turnstile.render("#" + elemId, { |
| 101 | + sitekey, |
| 102 | + callback: function (token) { |
| 103 | + console.log(`Challenge Success ${token}`); |
| 104 | + resolve(token); |
| 105 | + turnstile.remove(widgetId); |
| 106 | + elem.remove(); |
| 107 | + }, |
| 108 | + 'error-callback': function (error){ |
| 109 | + console.error("Turnstile error: ", error); |
| 110 | + turnstile.remove(widgetId); |
| 111 | + elem.remove(); |
| 112 | + reject(error); |
| 113 | + } |
| 114 | + }); |
| 115 | + } catch (e){ |
| 116 | + reject(e); |
| 117 | + if (elem) |
| 118 | + elem.remove(); |
| 119 | + } |
| 120 | + }) |
| 121 | + } |
| 122 | + |
31 | 123 | ;(function () {
|
32 | 124 | const iframe = document.getElementById("tlink-iframe")
|
33 | 125 |
|
34 |
| - function handleMessage(event) { |
| 126 | + async function handleMessage(event) { |
35 | 127 | // We only proxy messages that originate from the child iframe or parent window
|
36 | 128 | // This prevents postMessage listeners of other tlink iframes on the same page causing duplicate requests to the background service
|
37 | 129 | if (
|
|
42 | 134 | }
|
43 | 135 |
|
44 | 136 | if (event.data.type === "TLINK_API_REQUEST") {
|
| 137 | + |
| 138 | + // grecaptcha must be loaded in the extension context |
| 139 | + const req = event.data.data; |
| 140 | + |
| 141 | + if (req.method === "getRecaptchaToken") { |
| 142 | + event.data.source = "TLINK_API_RESPONSE"; |
| 143 | + try { |
| 144 | + const response = await getRecaptchaToken(req.payload?.sitekey, req.payload.action); |
| 145 | + event.data.data.response = response; |
| 146 | + } catch (e){ |
| 147 | + console.error(e); |
| 148 | + event.data.data.error = e.message; |
| 149 | + } |
| 150 | + iframe?.contentWindow?.postMessage(event.data, "*"); |
| 151 | + return; |
| 152 | + } |
| 153 | + |
| 154 | + if (req.method === "getTurnstileToken") { |
| 155 | + event.data.source = "TLINK_API_RESPONSE"; |
| 156 | + try { |
| 157 | + const response = await getTurnstileToken(req.payload?.sitekey); |
| 158 | + event.data.data.response = response; |
| 159 | + } catch (e){ |
| 160 | + console.error(e); |
| 161 | + event.data.data.error = e.message; |
| 162 | + } |
| 163 | + iframe?.contentWindow?.postMessage(event.data, "*"); |
| 164 | + return; |
| 165 | + } |
| 166 | + |
45 | 167 | // forward ts viewer API request out
|
46 | 168 | window.parent.postMessage(
|
47 | 169 | { source: "TLINK_API_REQUEST", data: event.data.data },
|
|
0 commit comments