aboutsummaryrefslogtreecommitdiffstats
path: root/api/static/server_auth.js
blob: 34fd4fd0bed944dc6346d6509b6bda0e2a008672 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
let captchaData;

document.addEventListener("DOMContentLoaded", function () {
    fetchCaptchaImages();
});

function toggleSelection(element) {
    element.classList.toggle("selected");
}

function populateCaptcha(data) {
    const container = document.getElementById("recaptcha-container");
    const title = document.getElementById("recaptcha-title");
    title.innerHTML = data.title;
    const oldRows = container.getElementsByClassName("recaptcha-row");
    while (oldRows.length > 0) {
        oldRows[0].parentNode.removeChild(oldRows[0]);
    }

    const images = data.questions;

    let rows = Math.ceil(images.length / 4);
    let htmlContent = "";
    for (let r = 0; r < rows; r++) {
        htmlContent += '<div class="recaptcha-row">';
        for (let i = 0; i < 4; i++) {
            const index = r * 4 + i;
            if (images[index]) {
                htmlContent += `
          <div class="recaptcha-image" style="background-image: url('${images[index].image}');" onclick="toggleSelection(this)">
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                  <path d="M20.285 2l-1.272.02L6.72 15.466l-5.644-5.58L0 12.352l7.218 7.15L24 2.083z"/>
              </svg>
            </div>
        `;
            }
        }
        htmlContent += "</div>";
    }

    title.insertAdjacentHTML("afterend", htmlContent);
    captchaData = data;
    session_id = data.session_id;
}

async function verifyCaptcha() {
    const selectedImages = document.querySelectorAll(
        ".recaptcha-image.selected",
    );
    const answers = [];
    selectedImages.forEach((img) => {
        const backgroundImageURL = img.style.backgroundImage;
        const imageURL = backgroundImageURL.slice(
            5,
            backgroundImageURL.length - 2,
        );
        answers.push(
            captchaData.questions.find(
                (question) => question.image === imageURL,
            ).id,
        );
    });
    const captchaAnswer = {
        session: captchaData.session,
        answer: answers.join(","),
    };
    try {
        const response = await fetch("/api/verify", {
            method: "POST",
            headers: {
                "Content-Type": "application/x-www-form-urlencoded",
            },
            body: new URLSearchParams(captchaAnswer).toString(), // Convert JSON object to form-urlencoded data
        });
        const data = await response.json();

        if (data.success) {
            alert("Captcha verification successful!");
        } else {
            alert("Sorry you got some wrong. Please try again.");
            fetchCaptchaImages();
        }
    } catch (error) {
        console.error("Error verifying captcha:", error);
    }
}

const submitButton = document.querySelector(".submit-btn");
submitButton.addEventListener("click", verifyCaptcha);

function fetchCaptchaImages() {
    fetch("/api/affiliation/Phase%20Connect?auth=server")
        .then((response) => response.json())
        .then((data) => {
            populateCaptcha(data);
        })
        .catch((error) => {
            console.error("There was an error fetching the captcha:", error);
        });
}
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage