@swetrix/captcha 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nvmrc +1 -0
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/assets/logo_blue.png +0 -0
- package/dist/assets/logo_white.png +0 -0
- package/dist/captcha-loader.js +1 -0
- package/dist/captcha.js +1 -0
- package/dist/esnext/captcha-loader.d.ts +33 -0
- package/dist/esnext/captcha-loader.js +182 -0
- package/dist/esnext/captcha-loader.js.map +1 -0
- package/dist/esnext/captcha.d.ts +37 -0
- package/dist/esnext/captcha.js +248 -0
- package/dist/esnext/captcha.js.map +1 -0
- package/dist/pages/dark.html +248 -0
- package/dist/pages/light.html +243 -0
- package/dist/pages/test.html +33 -0
- package/package.json +47 -0
- package/rollup.config.js +52 -0
- package/src/assets/logo_blue.png +0 -0
- package/src/assets/logo_white.png +0 -0
- package/src/captcha-loader.ts +242 -0
- package/src/captcha.ts +284 -0
- package/src/pages/dark.html +248 -0
- package/src/pages/light.html +243 -0
- package/src/pages/test.html +33 -0
- package/tsconfig.esnext.json +17 -0
- package/tsconfig.json +17 -0
package/.nvmrc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
16.19.1
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Swetrix
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<img src="/src/assets/logo_blue.png" alt="" height="80" />
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
Swetrix CAPTCHA is a privacy-oriented, simple and opensource CAPTCHA service.
|
|
6
|
+
|
|
7
|
+
See the full documentation at https://docs.swetrix.com/captcha/introduction
|
|
8
|
+
|
|
9
|
+
## Development
|
|
10
|
+
|
|
11
|
+
To build the captcha run:
|
|
12
|
+
```bash
|
|
13
|
+
npm run build
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
After you build it, a new folder `dist` will appear. You can run `test.html` file via an extension like `Live server` to test it (don't forget to set up a valid project ID or one of our [dummy project IDs](https://docs.swetrix.com/captcha/testing)).
|
|
17
|
+
|
|
18
|
+
## License
|
|
19
|
+
|
|
20
|
+
Swetrix CAPTCHA client is released under the MIT licence, see [LICENSE](LICENSE).
|
|
21
|
+
|
|
22
|
+
## Bugs and security
|
|
23
|
+
|
|
24
|
+
Swetrix is open to pull-requests. Feel free to propose new features or submit bug requests via pull reuqests.\
|
|
25
|
+
For severe security issues, please contact us at security@swetrix.com
|
|
26
|
+
|
|
27
|
+
## Contact
|
|
28
|
+
|
|
29
|
+
You can contact us via email at contact@swetrix.com
|
|
30
|
+
|
|
31
|
+
## Donate
|
|
32
|
+
You can support the project by donating us at https://ko-fi.com/andriir \
|
|
33
|
+
We can only run our services by once again asking for your financial support!
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";function r(e,t){var n=Object.keys(t).map(function(e){return"".concat(encodeURIComponent(e),"=").concat(encodeURIComponent(t[e]))}).join("&");return"".concat(e,"?").concat(n)}function c(e){var t=e.data;if(t){var e=t.type,n=t.cid,r=t.event;if(e===l&&n&&v.includes(n)){var a,i=document.getElementById(n),o=null!==i;switch(r){case"success":var c=t.token;if(!o)return void w(d.error,"[PM -> success] Input element does not exist.");i.value=c;break;case"failure":case"tokenExpired":if(!o)return void w(d.error,"[PM -> failure] Input element does not exist.");i.value="";break;case"manualStarted":if(!(a=document.getElementById(f(n))))return void w(d.error,"[PM -> manualStarted] Frame does not exist.");a.style.height=h.manual;break;case"manualFinished":(a=document.getElementById(f(n)))?a.style.height=h.default:w(d.error,"[PM -> manualFinished] Frame does not exist.")}}}}function e(e){!(e=void 0===e?!1:e)&&"swecaptcha"in window&&w(d.warn,"Captcha is already loaded."),window.swecaptcha=!0,window.addEventListener("message",c);for(var t,n,r=0,a=Array.from(document.querySelectorAll(".swecaptcha"));r<a.length;r++){var i=a[r],o={pid:(o=i).getAttribute("data-project-id"),respName:o.getAttribute("data-response-input-name")||s,theme:o.getAttribute("data-theme")};if(n=void 0,n=(t=o).theme,t=t.pid,!(n&&!p.includes(n)?(w(d.error,"Invalid data-theme parameter: ".concat(n)),!1):!(!t||!m(t))||(w(d.error,"Invalid data-project-id parameter: ".concat(t)),!1)))return void w(d.error,"Aborting captcha rendering due to invalid parameters.");n=i,t=o,i=void 0,i=g(),t=u(u({},t),{cid:i}),i=y(t),t=x(t),n.appendChild(i),n.appendChild(t)}}var d,u=function(){return(u=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}).apply(this,arguments)},t=window.__SWETRIX_CAPTCHA_DEV||!1,a=t?"./light.html":"https://cap.swetrix.com/pages/light",i=t?"./dark.html":"https://cap.swetrix.com/pages/dark",s="swetrix-captcha-response",l="swetrix-captcha",p=["light","dark"],n=/^(?!.*--)[a-zA-Z0-9-]{12}$/,o=((t=d=d||{}).log="log",t.error="error",t.warn="warn",t.info="info",["AP00000000000","MP00000000000","FAIL000000000"]),m=function(e){return o.includes(e)||n.test(e)},h={default:"66px",manual:"200px"},f=function(e){return"".concat(e,"-frame")},v=[],w=function(e,t){console[e]("[Swetrix Captcha] ".concat(t))},g=function(){var e="swetrix-captcha-"+Math.random().toString(36).substr(2,6);return v.includes(e)?g():(v.push(e),e)},y=function(e){var t=e.theme,n=document.createElement("iframe");return n.id=f(e.cid),n.src=r("dark"===t?i:a,e),n.style.height=h.default,n.title="Swetrix Captcha",n.style.border="none",n.style.width="302px",n.style.overflow="visible",n},x=function(e){var t=e.cid,n=document.createElement("input");return n.type="hidden",n.name=e.respName,n.value="",n.id=t,n};window.swetrixCaptchaForceLoad=function(){return e(!0)},document.addEventListener("DOMContentLoaded",function(){return e()})});
|
package/dist/captcha.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";function i(e,t){void 0===t&&(t={}),window.parent.postMessage(n({event:e,type:r,cid:window.__SWETRIX_CAPTCHA_ID},t),"*")}function u(e){w=e;var t,n=document.querySelector("#status-default"),r=document.querySelector("#status-failure"),c={checkbox:document.querySelector("#checkbox"),failure:document.querySelector("#failure"),completed:document.querySelector("#completed"),loading:document.querySelector("#loading")};null!=(t=c.checkbox)&&t.classList.add("hidden"),null!=(t=c.failure)&&t.classList.add("hidden"),null!=(t=c.completed)&&t.classList.add("hidden"),null!=(t=c.loading)&&t.classList.add("hidden"),"failure"===e?(null!=n&&n.classList.add("hidden"),null!=r&&r.classList.remove("hidden")):(null!=n&&n.classList.remove("hidden"),null!=r&&r.classList.add("hidden")),null!=(t=c[e])&&t.classList.remove("hidden")}function l(){setTimeout(function(){i(d.TOKEN_EXPIRED),u(f.checkbox)},3e5)}function s(){var e=document.querySelector("#manual-challenge"),t=document.querySelector("#svg-captcha");t&&(i(d.MANUAL_FINISHED),t.innerHTML="",null!=e)&&e.classList.add("hidden")}var d,f,e,n=function(){return(n=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var c in t=arguments[n])Object.prototype.hasOwnProperty.call(t,c)&&(e[c]=t[c]);return e}).apply(this,arguments)},h=function(e,a,i,u){return new(i=i||Promise)(function(n,t){function r(e){try{o(u.next(e))}catch(e){t(e)}}function c(e){try{o(u.throw(e))}catch(e){t(e)}}function o(e){var t;e.done?n(e.value):((t=e.value)instanceof i?t:new i(function(e){e(t)})).then(r,c)}o((u=u.apply(e,a||[])).next())})},p=function(r,c){var o,a,i,u={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},l={next:e(0),throw:e(1),return:e(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function e(n){return function(e){var t=[n,e];if(o)throw new TypeError("Generator is already executing.");for(;u=l&&t[l=0]?0:u;)try{if(o=1,a&&(i=2&t[0]?a.return:t[0]?a.throw||((i=a.return)&&i.call(a),0):a.next)&&!(i=i.call(a,t[1])).done)return i;switch(a=0,(t=i?[2&t[0],i.value]:t)[0]){case 0:case 1:i=t;break;case 4:return u.label++,{value:t[1],done:!1};case 5:u.label++,a=t[1],t=[0];continue;case 7:t=u.ops.pop(),u.trys.pop();continue;default:if(!(i=0<(i=u.trys).length&&i[i.length-1])&&(6===t[0]||2===t[0])){u=0;continue}if(3===t[0]&&(!i||t[1]>i[0]&&t[1]<i[3]))u.label=t[1];else if(6===t[0]&&u.label<i[1])u.label=i[1],i=t;else{if(!(i&&u.label<i[2])){i[2]&&u.ops.pop(),u.trys.pop();continue}u.label=i[2],u.ops.push(t)}}t=c.call(r,u)}catch(e){t=[6,e],a=0}finally{o=i=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},v=window.__SWETRIX_CAPTCHA_DEV||!1?"http://localhost:5005/v1/captcha":"https://api.swetrix.com/v1/captcha",r="swetrix-captcha",y="",m="/verify",S="/generate",E="/verify-manual",w=((e=d=d||{}).SUCCESS="success",e.FAILURE="failure",e.TOKEN_EXPIRED="tokenExpired",e.MANUAL_STARTED="manualStarted",e.MANUAL_FINISHED="manualFinished",(e=f=f||{}).checkbox="checkbox",e.failure="failure",e.completed="completed",e.loading="loading",f.checkbox);document.addEventListener("DOMContentLoaded",function(){var e=document.querySelector("#swetrix-captcha"),t=document.querySelector("#branding"),a=document.querySelector("#svg-captcha-input"),n=document.querySelector("#manual-submit-btn");null!=t&&t.addEventListener("click",function(e){e.stopPropagation()}),null!=n&&n.addEventListener("click",function(o){return h(void 0,void 0,void 0,function(){var t,n,r,c;return p(this,function(e){switch(e.label){case 0:if(o.stopPropagation(),!a)return[2];if(!(t=a.value))return[2];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,fetch("".concat(v).concat(E),{method:"POST",body:JSON.stringify({hash:y,code:t,pid:window.__SWETRIX_PROJECT_ID}),headers:{"Content-Type":"application/json"}})];case 2:return n=e.sent(),[3,4];case 3:return e.sent(),s(),i(d.FAILURE),u(f.failure),a.value="",[2];case 4:return n.ok?[4,n.json()]:(s(),i(d.FAILURE),u(f.failure),a.value="",[2]);case 5:return c=e.sent(),r=c.success,c=c.token,r?(a.value="",i(d.SUCCESS,{token:c}),l(),u(f.completed),s()):(s(),i(d.FAILURE),u(f.failure),a.value=""),[2]}})})}),null!=e&&e.addEventListener("click",function(){return h(void 0,void 0,void 0,function(){var c,o,a;return p(this,function(e){switch(e.label){case 0:if(w===f.loading||w===f.completed)return[2];if(w===f.failure)return u(f.checkbox),[2];u(f.loading),e.label=1;case 1:return e.trys.push([1,3,,5]),[4,h(void 0,void 0,void 0,function(){var t;return p(this,function(e){switch(e.label){case 0:return e.trys.push([0,3,,4]),[4,fetch("".concat(v).concat(m),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({pid:window.__SWETRIX_PROJECT_ID})})];case 1:return(t=e.sent()).ok?[4,t.json()]:[2,{}];case 2:return[2,e.sent()];case 3:return e.sent(),i(d.FAILURE),u(f.failure),[2,{}];case 4:return[2]}})})];case 2:if(c=e.sent().token)return i(d.SUCCESS,{token:c}),l(),u(f.completed),[2];throw"";case 3:return e.sent(),[4,h(void 0,void 0,void 0,function(){var t;return p(this,function(e){switch(e.label){case 0:return e.trys.push([0,3,,4]),[4,fetch("".concat(v).concat(S),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({theme:window.__SWETRIX_CAPTCHA_THEME||"light",pid:window.__SWETRIX_PROJECT_ID})})];case 1:if((t=e.sent()).ok)return[4,t.json()];throw"";case 2:return[2,e.sent()];case 3:return e.sent(),i(d.FAILURE),u(f.failure),[2,{}];case 4:return[2]}})})];case 4:return c=e.sent(),o=c.data,a=c.hash,y=a,t=o,n=document.querySelector("#manual-challenge"),(r=document.querySelector("#svg-captcha"))&&(t?r.innerHTML=t:((t=document.createElement("p")).innerText="Error loading captcha",t.style.color="#d6292a",null!=r&&r.appendChild(t)),i(d.MANUAL_STARTED),null!=n)&&n.classList.remove("hidden"),[2];case 5:return[2]}var t,n,r})})})})});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
declare const isDevelopment: any;
|
|
2
|
+
declare const CAPTCHA_SELECTOR = ".swecaptcha";
|
|
3
|
+
declare const LIGHT_CAPTCHA_IFRAME_URL: string;
|
|
4
|
+
declare const DARK_CAPTCHA_IFRAME_URL: string;
|
|
5
|
+
declare const DEFAULT_RESPONSE_INPUT_NAME = "swetrix-captcha-response";
|
|
6
|
+
declare const MESSAGE_IDENTIFIER = "swetrix-captcha";
|
|
7
|
+
declare const ID_PREFIX = "swetrix-captcha-";
|
|
8
|
+
declare const THEMES: string[];
|
|
9
|
+
declare const PID_REGEX: RegExp;
|
|
10
|
+
declare enum LOG_ACTIONS {
|
|
11
|
+
log = "log",
|
|
12
|
+
error = "error",
|
|
13
|
+
warn = "warn",
|
|
14
|
+
info = "info"
|
|
15
|
+
}
|
|
16
|
+
declare const DUMMY_PIDS: string[];
|
|
17
|
+
declare const isValidPID: (pid: string) => boolean;
|
|
18
|
+
declare const FRAME_HEIGHT_MAPPING: {
|
|
19
|
+
default: string;
|
|
20
|
+
manual: string;
|
|
21
|
+
};
|
|
22
|
+
declare const getFrameID: (cid: string) => string;
|
|
23
|
+
declare const ids: string[];
|
|
24
|
+
declare const log: (status: LOG_ACTIONS, text: string) => void;
|
|
25
|
+
declare const appendParamsToURL: (url: string, params: any) => string;
|
|
26
|
+
declare const renderCaptcha: (container: Element, params: any) => void;
|
|
27
|
+
declare const generateRandomID: () => string;
|
|
28
|
+
declare const postMessageCallback: (pmEvent: MessageEvent) => void;
|
|
29
|
+
declare const generateCaptchaFrame: (params: any) => HTMLIFrameElement;
|
|
30
|
+
declare const generateHiddenInput: (params: any) => HTMLInputElement;
|
|
31
|
+
declare const validateParams: (params: any) => boolean;
|
|
32
|
+
declare const parseParams: (container: Element) => object;
|
|
33
|
+
declare const main: (forced?: boolean) => void;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
const isDevelopment = window.__SWETRIX_CAPTCHA_DEV || false;
|
|
4
|
+
const CAPTCHA_SELECTOR = '.swecaptcha';
|
|
5
|
+
const LIGHT_CAPTCHA_IFRAME_URL = isDevelopment ? './light.html' : 'https://cap.swetrix.com/pages/light';
|
|
6
|
+
const DARK_CAPTCHA_IFRAME_URL = isDevelopment ? './dark.html' : 'https://cap.swetrix.com/pages/dark';
|
|
7
|
+
const DEFAULT_RESPONSE_INPUT_NAME = 'swetrix-captcha-response';
|
|
8
|
+
const MESSAGE_IDENTIFIER = 'swetrix-captcha';
|
|
9
|
+
const ID_PREFIX = 'swetrix-captcha-';
|
|
10
|
+
const THEMES = ['light', 'dark'];
|
|
11
|
+
const PID_REGEX = /^(?!.*--)[a-zA-Z0-9-]{12}$/;
|
|
12
|
+
var LOG_ACTIONS;
|
|
13
|
+
(function (LOG_ACTIONS) {
|
|
14
|
+
LOG_ACTIONS["log"] = "log";
|
|
15
|
+
LOG_ACTIONS["error"] = "error";
|
|
16
|
+
LOG_ACTIONS["warn"] = "warn";
|
|
17
|
+
LOG_ACTIONS["info"] = "info";
|
|
18
|
+
})(LOG_ACTIONS || (LOG_ACTIONS = {}));
|
|
19
|
+
const DUMMY_PIDS = [
|
|
20
|
+
'AP00000000000', 'MP00000000000', 'FAIL000000000',
|
|
21
|
+
];
|
|
22
|
+
const isValidPID = (pid) => DUMMY_PIDS.includes(pid) || PID_REGEX.test(pid);
|
|
23
|
+
const FRAME_HEIGHT_MAPPING = {
|
|
24
|
+
default: '66px',
|
|
25
|
+
manual: '200px',
|
|
26
|
+
};
|
|
27
|
+
const getFrameID = (cid) => `${cid}-frame`;
|
|
28
|
+
const ids = [];
|
|
29
|
+
const log = (status, text) => {
|
|
30
|
+
console[status](`[Swetrix Captcha] ${text}`);
|
|
31
|
+
};
|
|
32
|
+
const appendParamsToURL = (url, params) => {
|
|
33
|
+
const queryString = Object.keys(params).map((key) => {
|
|
34
|
+
return `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`;
|
|
35
|
+
}).join('&');
|
|
36
|
+
return `${url}?${queryString}`;
|
|
37
|
+
};
|
|
38
|
+
const renderCaptcha = (container, params) => {
|
|
39
|
+
const cid = generateRandomID();
|
|
40
|
+
const cParams = {
|
|
41
|
+
...params,
|
|
42
|
+
cid, // CAPTCHA ID
|
|
43
|
+
};
|
|
44
|
+
const frame = generateCaptchaFrame(cParams);
|
|
45
|
+
const input = generateHiddenInput(cParams);
|
|
46
|
+
container.appendChild(frame);
|
|
47
|
+
container.appendChild(input);
|
|
48
|
+
};
|
|
49
|
+
const generateRandomID = () => {
|
|
50
|
+
const randomID = ID_PREFIX + Math.random().toString(36).substr(2, 6);
|
|
51
|
+
if (ids.includes(randomID)) {
|
|
52
|
+
return generateRandomID();
|
|
53
|
+
}
|
|
54
|
+
ids.push(randomID);
|
|
55
|
+
return randomID;
|
|
56
|
+
};
|
|
57
|
+
const postMessageCallback = (pmEvent) => {
|
|
58
|
+
// TODO: Validate origin
|
|
59
|
+
const { data } = pmEvent;
|
|
60
|
+
if (!data) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const { type, cid, event, } = data;
|
|
64
|
+
if (type !== MESSAGE_IDENTIFIER) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (!cid || !ids.includes(cid)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const input = document.getElementById(cid);
|
|
71
|
+
const inputExists = input !== null;
|
|
72
|
+
switch (event) {
|
|
73
|
+
case 'success': {
|
|
74
|
+
const { token } = data;
|
|
75
|
+
if (!inputExists) {
|
|
76
|
+
log(LOG_ACTIONS.error, '[PM -> success] Input element does not exist.');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// @ts-ignore
|
|
80
|
+
input.value = token;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case 'failure': {
|
|
84
|
+
if (!inputExists) {
|
|
85
|
+
log(LOG_ACTIONS.error, '[PM -> failure] Input element does not exist.');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// @ts-ignore
|
|
89
|
+
input.value = '';
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case 'tokenExpired': {
|
|
93
|
+
if (!inputExists) {
|
|
94
|
+
log(LOG_ACTIONS.error, '[PM -> failure] Input element does not exist.');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// @ts-ignore
|
|
98
|
+
input.value = '';
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case 'manualStarted': {
|
|
102
|
+
const frame = document.getElementById(getFrameID(cid));
|
|
103
|
+
if (!frame) {
|
|
104
|
+
log(LOG_ACTIONS.error, '[PM -> manualStarted] Frame does not exist.');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
frame.style.height = FRAME_HEIGHT_MAPPING.manual;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 'manualFinished': {
|
|
111
|
+
const frame = document.getElementById(getFrameID(cid));
|
|
112
|
+
if (!frame) {
|
|
113
|
+
log(LOG_ACTIONS.error, '[PM -> manualFinished] Frame does not exist.');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
frame.style.height = FRAME_HEIGHT_MAPPING.default;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const generateCaptchaFrame = (params) => {
|
|
122
|
+
const { theme } = params;
|
|
123
|
+
const captchaFrame = document.createElement('iframe');
|
|
124
|
+
captchaFrame.id = getFrameID(params.cid);
|
|
125
|
+
captchaFrame.src = theme === 'dark'
|
|
126
|
+
? appendParamsToURL(DARK_CAPTCHA_IFRAME_URL, params)
|
|
127
|
+
: appendParamsToURL(LIGHT_CAPTCHA_IFRAME_URL, params);
|
|
128
|
+
captchaFrame.style.height = FRAME_HEIGHT_MAPPING.default;
|
|
129
|
+
captchaFrame.title = 'Swetrix Captcha';
|
|
130
|
+
captchaFrame.style.border = 'none';
|
|
131
|
+
captchaFrame.style.width = '302px';
|
|
132
|
+
captchaFrame.style.overflow = 'visible';
|
|
133
|
+
return captchaFrame;
|
|
134
|
+
};
|
|
135
|
+
const generateHiddenInput = (params) => {
|
|
136
|
+
const { cid } = params;
|
|
137
|
+
const input = document.createElement('input');
|
|
138
|
+
input.type = 'hidden';
|
|
139
|
+
input.name = params.respName;
|
|
140
|
+
input.value = '';
|
|
141
|
+
input.id = cid;
|
|
142
|
+
return input;
|
|
143
|
+
};
|
|
144
|
+
const validateParams = (params) => {
|
|
145
|
+
const { theme, pid } = params;
|
|
146
|
+
if (theme && !THEMES.includes(theme)) {
|
|
147
|
+
log(LOG_ACTIONS.error, `Invalid data-theme parameter: ${theme}`);
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
if (!pid || !isValidPID(pid)) {
|
|
151
|
+
log(LOG_ACTIONS.error, `Invalid data-project-id parameter: ${pid}`);
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
return true;
|
|
155
|
+
};
|
|
156
|
+
const parseParams = (container) => ({
|
|
157
|
+
pid: container.getAttribute('data-project-id'),
|
|
158
|
+
respName: container.getAttribute('data-response-input-name') || DEFAULT_RESPONSE_INPUT_NAME,
|
|
159
|
+
theme: container.getAttribute('data-theme'),
|
|
160
|
+
});
|
|
161
|
+
const main = (forced = false) => {
|
|
162
|
+
if (!forced && 'swecaptcha' in window) {
|
|
163
|
+
log(LOG_ACTIONS.warn, 'Captcha is already loaded.');
|
|
164
|
+
}
|
|
165
|
+
// TODO: Add some callbacks here
|
|
166
|
+
// @ts-ignore
|
|
167
|
+
window.swecaptcha = true;
|
|
168
|
+
window.addEventListener('message', postMessageCallback);
|
|
169
|
+
const containers = Array.from(document.querySelectorAll(CAPTCHA_SELECTOR));
|
|
170
|
+
for (const container of containers) {
|
|
171
|
+
const params = parseParams(container);
|
|
172
|
+
if (!validateParams(params)) {
|
|
173
|
+
log(LOG_ACTIONS.error, 'Aborting captcha rendering due to invalid parameters.');
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
renderCaptcha(container, params);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
// @ts-ignore
|
|
180
|
+
window.swetrixCaptchaForceLoad = () => main(true);
|
|
181
|
+
document.addEventListener('DOMContentLoaded', () => main());
|
|
182
|
+
//# sourceMappingURL=captcha-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captcha-loader.js","sourceRoot":"","sources":["../../src/captcha-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
declare const isDevelopment: any;
|
|
2
|
+
declare const API_URL: string;
|
|
3
|
+
declare const MSG_IDENTIFIER = "swetrix-captcha";
|
|
4
|
+
declare const DEFAULT_THEME = "light";
|
|
5
|
+
declare const CAPTCHA_TOKEN_LIFETIME = 300;
|
|
6
|
+
declare let TOKEN: string;
|
|
7
|
+
declare let HASH: string;
|
|
8
|
+
declare const ENDPOINTS: {
|
|
9
|
+
VERIFY: string;
|
|
10
|
+
GENERATE: string;
|
|
11
|
+
VERIFY_MANUAL: string;
|
|
12
|
+
};
|
|
13
|
+
declare enum IFRAME_MESSAGE_TYPES {
|
|
14
|
+
SUCCESS = "success",
|
|
15
|
+
FAILURE = "failure",
|
|
16
|
+
TOKEN_EXPIRED = "tokenExpired",
|
|
17
|
+
MANUAL_STARTED = "manualStarted",
|
|
18
|
+
MANUAL_FINISHED = "manualFinished"
|
|
19
|
+
}
|
|
20
|
+
declare enum ACTION {
|
|
21
|
+
checkbox = "checkbox",
|
|
22
|
+
failure = "failure",
|
|
23
|
+
completed = "completed",
|
|
24
|
+
loading = "loading"
|
|
25
|
+
}
|
|
26
|
+
declare let activeAction: ACTION;
|
|
27
|
+
declare const sendMessageToLoader: (event: IFRAME_MESSAGE_TYPES, data?: {}) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Sets the provided action visible and the rest hidden
|
|
30
|
+
* @param {*} action checkbox | failure | completed | loading
|
|
31
|
+
*/
|
|
32
|
+
declare const activateAction: (action: ACTION) => void;
|
|
33
|
+
declare const setLifetimeTimeout: () => void;
|
|
34
|
+
declare const enableManualChallenge: (svg: string) => void;
|
|
35
|
+
declare const disableManualChallenge: () => void;
|
|
36
|
+
declare const generateCaptcha: () => Promise<any>;
|
|
37
|
+
declare const verify: () => Promise<any>;
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
const isDevelopment = window.__SWETRIX_CAPTCHA_DEV || false;
|
|
4
|
+
const API_URL = isDevelopment ? 'http://localhost:5005/v1/captcha' : 'https://api.swetrix.com/v1/captcha';
|
|
5
|
+
const MSG_IDENTIFIER = 'swetrix-captcha';
|
|
6
|
+
const DEFAULT_THEME = 'light';
|
|
7
|
+
const CAPTCHA_TOKEN_LIFETIME = 300; // seconds (5 minutes).
|
|
8
|
+
let TOKEN = '';
|
|
9
|
+
let HASH = '';
|
|
10
|
+
const ENDPOINTS = {
|
|
11
|
+
VERIFY: '/verify',
|
|
12
|
+
GENERATE: '/generate',
|
|
13
|
+
VERIFY_MANUAL: '/verify-manual',
|
|
14
|
+
};
|
|
15
|
+
var IFRAME_MESSAGE_TYPES;
|
|
16
|
+
(function (IFRAME_MESSAGE_TYPES) {
|
|
17
|
+
IFRAME_MESSAGE_TYPES["SUCCESS"] = "success";
|
|
18
|
+
IFRAME_MESSAGE_TYPES["FAILURE"] = "failure";
|
|
19
|
+
IFRAME_MESSAGE_TYPES["TOKEN_EXPIRED"] = "tokenExpired";
|
|
20
|
+
IFRAME_MESSAGE_TYPES["MANUAL_STARTED"] = "manualStarted";
|
|
21
|
+
IFRAME_MESSAGE_TYPES["MANUAL_FINISHED"] = "manualFinished";
|
|
22
|
+
})(IFRAME_MESSAGE_TYPES || (IFRAME_MESSAGE_TYPES = {}));
|
|
23
|
+
var ACTION;
|
|
24
|
+
(function (ACTION) {
|
|
25
|
+
ACTION["checkbox"] = "checkbox";
|
|
26
|
+
ACTION["failure"] = "failure";
|
|
27
|
+
ACTION["completed"] = "completed";
|
|
28
|
+
ACTION["loading"] = "loading";
|
|
29
|
+
})(ACTION || (ACTION = {}));
|
|
30
|
+
let activeAction = ACTION.checkbox;
|
|
31
|
+
const sendMessageToLoader = (event, data = {}) => {
|
|
32
|
+
window.parent.postMessage({
|
|
33
|
+
event,
|
|
34
|
+
type: MSG_IDENTIFIER,
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
cid: window.__SWETRIX_CAPTCHA_ID,
|
|
37
|
+
...data,
|
|
38
|
+
}, '*');
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Sets the provided action visible and the rest hidden
|
|
42
|
+
* @param {*} action checkbox | failure | completed | loading
|
|
43
|
+
*/
|
|
44
|
+
const activateAction = (action) => {
|
|
45
|
+
activeAction = action;
|
|
46
|
+
const statusDefault = document.querySelector('#status-default');
|
|
47
|
+
const statusFailure = document.querySelector('#status-failure');
|
|
48
|
+
const actions = {
|
|
49
|
+
checkbox: document.querySelector('#checkbox'),
|
|
50
|
+
failure: document.querySelector('#failure'),
|
|
51
|
+
completed: document.querySelector('#completed'),
|
|
52
|
+
loading: document.querySelector('#loading'),
|
|
53
|
+
};
|
|
54
|
+
// Apply hidden class to all actions
|
|
55
|
+
actions.checkbox?.classList.add('hidden');
|
|
56
|
+
actions.failure?.classList.add('hidden');
|
|
57
|
+
actions.completed?.classList.add('hidden');
|
|
58
|
+
actions.loading?.classList.add('hidden');
|
|
59
|
+
// Change the status text
|
|
60
|
+
if (action === 'failure') {
|
|
61
|
+
statusDefault?.classList.add('hidden');
|
|
62
|
+
statusFailure?.classList.remove('hidden');
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
statusDefault?.classList.remove('hidden');
|
|
66
|
+
statusFailure?.classList.add('hidden');
|
|
67
|
+
}
|
|
68
|
+
// Remove hidden class from the provided action
|
|
69
|
+
actions[action]?.classList.remove('hidden');
|
|
70
|
+
};
|
|
71
|
+
const setLifetimeTimeout = () => {
|
|
72
|
+
setTimeout(() => {
|
|
73
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.TOKEN_EXPIRED);
|
|
74
|
+
activateAction(ACTION.checkbox);
|
|
75
|
+
}, CAPTCHA_TOKEN_LIFETIME * 1000);
|
|
76
|
+
};
|
|
77
|
+
const enableManualChallenge = (svg) => {
|
|
78
|
+
const manualChallenge = document.querySelector('#manual-challenge');
|
|
79
|
+
const svgCaptcha = document.querySelector('#svg-captcha');
|
|
80
|
+
if (!svgCaptcha) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!svg) {
|
|
84
|
+
const error = document.createElement('p');
|
|
85
|
+
error.innerText = 'Error loading captcha';
|
|
86
|
+
error.style.color = '#d6292a';
|
|
87
|
+
svgCaptcha?.appendChild(error);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
svgCaptcha.innerHTML = svg;
|
|
91
|
+
}
|
|
92
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.MANUAL_STARTED);
|
|
93
|
+
manualChallenge?.classList.remove('hidden');
|
|
94
|
+
};
|
|
95
|
+
const disableManualChallenge = () => {
|
|
96
|
+
const manualChallenge = document.querySelector('#manual-challenge');
|
|
97
|
+
const svgCaptcha = document.querySelector('#svg-captcha');
|
|
98
|
+
if (!svgCaptcha) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.MANUAL_FINISHED);
|
|
102
|
+
svgCaptcha.innerHTML = '';
|
|
103
|
+
manualChallenge?.classList.add('hidden');
|
|
104
|
+
};
|
|
105
|
+
const generateCaptcha = async () => {
|
|
106
|
+
try {
|
|
107
|
+
const response = await fetch(`${API_URL}${ENDPOINTS.GENERATE}`, {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: {
|
|
110
|
+
'Content-Type': 'application/json',
|
|
111
|
+
},
|
|
112
|
+
body: JSON.stringify({
|
|
113
|
+
// @ts-ignore
|
|
114
|
+
theme: window.__SWETRIX_CAPTCHA_THEME || DEFAULT_THEME,
|
|
115
|
+
// @ts-ignore
|
|
116
|
+
pid: window.__SWETRIX_PROJECT_ID,
|
|
117
|
+
}),
|
|
118
|
+
});
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
throw '';
|
|
121
|
+
}
|
|
122
|
+
const data = await response.json();
|
|
123
|
+
return data;
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
|
|
127
|
+
activateAction(ACTION.failure);
|
|
128
|
+
return {};
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const verify = async () => {
|
|
132
|
+
try {
|
|
133
|
+
const response = await fetch(`${API_URL}${ENDPOINTS.VERIFY}`, {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: {
|
|
136
|
+
'Content-Type': 'application/json',
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify({
|
|
139
|
+
// @ts-ignore
|
|
140
|
+
pid: window.__SWETRIX_PROJECT_ID,
|
|
141
|
+
}),
|
|
142
|
+
});
|
|
143
|
+
if (!response.ok) {
|
|
144
|
+
return {};
|
|
145
|
+
}
|
|
146
|
+
const data = await response.json();
|
|
147
|
+
return data;
|
|
148
|
+
}
|
|
149
|
+
catch (e) {
|
|
150
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
|
|
151
|
+
activateAction(ACTION.failure);
|
|
152
|
+
return {};
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
156
|
+
const captchaComponent = document.querySelector('#swetrix-captcha');
|
|
157
|
+
const branding = document.querySelector('#branding');
|
|
158
|
+
const svgCaptchaInput = document.querySelector('#svg-captcha-input');
|
|
159
|
+
const manualSubmitBtn = document.querySelector('#manual-submit-btn');
|
|
160
|
+
branding?.addEventListener('click', (e) => {
|
|
161
|
+
e.stopPropagation();
|
|
162
|
+
});
|
|
163
|
+
manualSubmitBtn?.addEventListener('click', async (e) => {
|
|
164
|
+
e.stopPropagation();
|
|
165
|
+
if (!svgCaptchaInput) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// @ts-ignore
|
|
169
|
+
const code = svgCaptchaInput.value;
|
|
170
|
+
if (!code) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
let response;
|
|
174
|
+
try {
|
|
175
|
+
response = await fetch(`${API_URL}${ENDPOINTS.VERIFY_MANUAL}`, {
|
|
176
|
+
method: 'POST',
|
|
177
|
+
body: JSON.stringify({
|
|
178
|
+
hash: HASH,
|
|
179
|
+
code,
|
|
180
|
+
// @ts-ignore
|
|
181
|
+
pid: window.__SWETRIX_PROJECT_ID,
|
|
182
|
+
}),
|
|
183
|
+
headers: {
|
|
184
|
+
'Content-Type': 'application/json',
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
catch (e) {
|
|
189
|
+
disableManualChallenge();
|
|
190
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
|
|
191
|
+
activateAction(ACTION.failure);
|
|
192
|
+
// @ts-ignore
|
|
193
|
+
svgCaptchaInput.value = '';
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!response.ok) {
|
|
197
|
+
disableManualChallenge();
|
|
198
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
|
|
199
|
+
activateAction(ACTION.failure);
|
|
200
|
+
// @ts-ignore
|
|
201
|
+
svgCaptchaInput.value = '';
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const { success, token } = await response.json();
|
|
205
|
+
if (!success) {
|
|
206
|
+
disableManualChallenge();
|
|
207
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
|
|
208
|
+
activateAction(ACTION.failure);
|
|
209
|
+
// @ts-ignore
|
|
210
|
+
svgCaptchaInput.value = '';
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
// @ts-ignore
|
|
214
|
+
svgCaptchaInput.value = '';
|
|
215
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.SUCCESS, { token });
|
|
216
|
+
setLifetimeTimeout();
|
|
217
|
+
activateAction(ACTION.completed);
|
|
218
|
+
disableManualChallenge();
|
|
219
|
+
});
|
|
220
|
+
captchaComponent?.addEventListener('click', async () => {
|
|
221
|
+
if (activeAction === ACTION.loading || activeAction === ACTION.completed) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (activeAction === ACTION.failure) {
|
|
225
|
+
activateAction(ACTION.checkbox);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
activateAction(ACTION.loading);
|
|
229
|
+
try {
|
|
230
|
+
const { token } = await verify();
|
|
231
|
+
if (!token) {
|
|
232
|
+
throw '';
|
|
233
|
+
}
|
|
234
|
+
TOKEN = token;
|
|
235
|
+
sendMessageToLoader(IFRAME_MESSAGE_TYPES.SUCCESS, { token });
|
|
236
|
+
setLifetimeTimeout();
|
|
237
|
+
activateAction(ACTION.completed);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
catch (e) {
|
|
241
|
+
const { data, hash } = await generateCaptcha();
|
|
242
|
+
HASH = hash;
|
|
243
|
+
enableManualChallenge(data);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
//# sourceMappingURL=captcha.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/captcha.ts"],"names":[],"mappings":"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"}
|