diff --git a/src/App.vue b/src/App.vue index e6aad19..98c7dd8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -32,13 +32,13 @@ export default { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; - color: #2c3e50; + color: $theme-color-grey-blue; font-size: 1vw; overflow: hidden; z-index: 1; min-height: 100%; display: flex; - background-color: #fcfcfc; + background-color: $theme-color-white; } @media only screen and (max-width: 1280) { diff --git a/src/api/admin/authAPI.js b/src/api/admin/authAPI.js index 419dd70..3d4b299 100644 --- a/src/api/admin/authAPI.js +++ b/src/api/admin/authAPI.js @@ -67,11 +67,12 @@ export default { }, async resetPassword(newPassword) { - const response = await this.resetPass(newPassword); - if (response.status === 200) { - return true; + try { + const response = await this.resetPass(newPassword); + return response; + } catch (error) { + throw error; } - return false; }, getUserInfo() { diff --git a/src/api/admin/otpAPI.js b/src/api/admin/otpAPI.js new file mode 100644 index 0000000..b014993 --- /dev/null +++ b/src/api/admin/otpAPI.js @@ -0,0 +1,68 @@ +import axiosInstance from "../axiosInstance.js"; + +export default { + async sendOTP(email) { + let bodyFormData = new FormData(); + bodyFormData.append("email", email); + + try { + const response = await axiosInstance({ + method: "post", + url: `/auth/send-otp`, + data: bodyFormData + }); + + return response; + } catch (error) { + throw error; + } + }, + async verifyOTP(email, otp) { + let bodyFormData = new FormData(); + bodyFormData.append("email", email); + bodyFormData.append("otp", otp); + + try { + const response = await axiosInstance({ + method: "post", + url: `/auth/verify-otp`, + data: bodyFormData, + }); + + return response; + } catch (error) { + throw error; + } + }, + async sendOTPForForget(email) { + let bodyFormData = new FormData(); + bodyFormData.append("email", email); + + try { + const response = await axiosInstance({ + method: "post", + url: `/auth/send-otp-forget`, + data: bodyFormData, + }); + return response; + } catch (error) { + throw error; + } + }, + async verifyOTPForForget(email, otp) { + let bodyFormData = new FormData(); + bodyFormData.append("email", email); + bodyFormData.append("otp", otp); + + try { + const response = await axiosInstance({ + method: "post", + url: `/auth/verify-otp-forget`, + data: bodyFormData, + }); + return response; + } catch (error) { + throw error; + } + } +}; diff --git a/src/api/admin/submissionsAPI.js b/src/api/admin/submissionsAPI.js index 38e0721..d721f1a 100644 --- a/src/api/admin/submissionsAPI.js +++ b/src/api/admin/submissionsAPI.js @@ -13,12 +13,14 @@ export default { }); return submissions; }, - async getUserSubs(username) { - const response = await this.getSubmissions(); - let data = response.filter(el => { - return el.username === username; + + // Group submissions by username for efficient processing + groupSubmissionsByUsers(submissions, usernames) { + const userSubmissions = {}; + usernames.forEach(username => { + userSubmissions[username] = submissions.filter(sub => sub.username === username); }); - return data; + return userSubmissions; }, async fetchAsCSV() { @@ -27,5 +29,12 @@ export default { responseType: "blob", url: `/api/info/submissions?format=csv` }); + }, + + async getUserSubs(username) { + const submissions = await this.getSubmissions(); + const submission = submissions.filter(sub => sub.username === username); + console.log(submission); + return submission; } }; diff --git a/src/api/admin/usersAPI.js b/src/api/admin/usersAPI.js index d985708..b2acd5e 100644 --- a/src/api/admin/usersAPI.js +++ b/src/api/admin/usersAPI.js @@ -42,5 +42,15 @@ export default { responseType: "blob", url: `/api/info/users?sort=${sortFilter}&filter=${statusFilter}&format=csv` }); + }, + + async getLeaderboard(page = 1) { + const response = await axiosInstance.get(`/api/info/leaderboard?page=${page}`); + return response.data; + }, + + async getUserCount() { + const response = await axiosInstance.get('/api/info/usercount'); + return response.data; } }; diff --git a/src/api/axiosInstance.js b/src/api/axiosInstance.js index 2f4362b..7cd82de 100644 --- a/src/api/axiosInstance.js +++ b/src/api/axiosInstance.js @@ -30,6 +30,10 @@ axiosInstance.interceptors.response.use( let ignoreErrorPagesPath = [ "/auth/login", "/auth/register", + "/auth/send-otp", + "/auth/reset-password", + "/auth/verify-otp", + "/auth/verify-otp-forget", "/api/submit/challenge" ]; diff --git a/src/assets/labs-logo-dark.svg b/src/assets/labs-logo-dark.svg new file mode 100644 index 0000000..d0e9cc7 --- /dev/null +++ b/src/assets/labs-logo-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/leaderboard.svg b/src/assets/leaderboard.svg index 4f23cb4..8ed83e0 100644 --- a/src/assets/leaderboard.svg +++ b/src/assets/leaderboard.svg @@ -1,4 +1,11 @@ - - + + + + + + + + + diff --git a/src/assets/login.svg b/src/assets/login.svg index a8ee36c..0d3fdcb 100644 --- a/src/assets/login.svg +++ b/src/assets/login.svg @@ -1,11 +1,9 @@ - - - - - - - - - - + + + + + + + + diff --git a/src/assets/main-logo-dark.svg b/src/assets/main-logo-dark.svg new file mode 100644 index 0000000..461b3d7 --- /dev/null +++ b/src/assets/main-logo-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/sdslabs-logo-dark.svg b/src/assets/sdslabs-logo-dark.svg new file mode 100644 index 0000000..bc98fb6 --- /dev/null +++ b/src/assets/sdslabs-logo-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/sdslabs-logo-dark.svg:Zone.Identifier b/src/assets/sdslabs-logo-dark.svg:Zone.Identifier new file mode 100644 index 0000000..a857cc9 --- /dev/null +++ b/src/assets/sdslabs-logo-dark.svg:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=https://files.slack.com/files-pri/T025QJXB7-F04E1278NNA/download/labs.svg?origin_team=T025QJXB7 diff --git a/src/components/ChallCard.vue b/src/components/ChallCard.vue index 28ccf94..afd1edc 100644 --- a/src/components/ChallCard.vue +++ b/src/components/ChallCard.vue @@ -248,7 +248,8 @@ export default { let ncurl = CONFIG.ncRoot; if ( this.challDetails.category === "service" || - this.challDetails.category === "xinetd" + this.challDetails.category === "xinetd" || + this.challDetails.category === "service_docker" ) { if (this.challDetails.deployedLink == "localhost" || this.challDetails.deployedLink == "") { return `nc ${ncurl} ${port}`; @@ -294,6 +295,10 @@ export default { Response.data.error ? Response.data.error : Response.data.message, "Error" ); + // Increment the counter immediately after submission + if (this.challDetails.maxAttemptLimit !== -1) { + this.challDetails.previous_tries++; + } } }); var self = this; diff --git a/src/components/Footer.vue b/src/components/Footer.vue index 9856d18..11bf695 100644 --- a/src/components/Footer.vue +++ b/src/components/Footer.vue @@ -10,7 +10,10 @@
- + + + +
@@ -23,15 +26,20 @@ diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue index d3262c1..4ba6eb9 100644 --- a/src/components/Navbar.vue +++ b/src/components/Navbar.vue @@ -2,9 +2,8 @@