diff --git a/src/controllers/api/account/ignoredController.js b/src/controllers/api/account/ignoredController.js deleted file mode 100644 index 04c6c4c..0000000 --- a/src/controllers/api/account/ignoredController.js +++ /dev/null @@ -1,125 +0,0 @@ -/*Canopy - The next generation of stoner streaming software -Copyright (C) 2024-2026 Rainbownapkin and the TTN Community - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see .*/ - -//npm imports -const {validationResult, matchedData} = require('express-validator'); - -//local imports -const {userModel} = require('../../../schemas/user/userSchema'); -const accountUtils = require('../../../utils/sessionUtils'); -const {exceptionHandler, errorHandler} = require('../../../utils/loggerUtils'); - -//api account functions -module.exports.get = async function(req, res){ - try{ - //syntactic sugar :P - const user = req.session.user; - - //make sure we're not bullshitting ourselves here. - if(user == null || user.user == null){ - return errorHandler(res, 'You must be logged in to retrieve your ignored users!', 'unauthorized'); - } - - //Grab user - const userDB = await userModel.findOne({user: user.user}); - - //Bitch about non-existant users - if(!userDB){ - return errorHandler(res, 'User not found!', 'unauthorized'); - } - - //Set status and send ignored user list - res.status(200); - return res.send((await userDB.getIgnoredUsers(false)).user); - - }catch(err){ - exceptionHandler(res, err); - } -} - -module.exports.post = async function(req, res){ - try{ - const validResult = validationResult(req); - - if(validResult.isEmpty()){ - //syntactic sugar :P - const user = req.session.user; - const data = matchedData(req); - - //make sure we're not bullshitting ourselves here. - if(user == null || user.user == null){ - return errorHandler(res, 'You must be logged in to ignore a user!', 'unauthorized'); - } - - //Grab user - const userDB = await userModel.findOne({user: user.user}); - - //Bitch about non-existant users - if(!userDB){ - return errorHandler(res, 'User not found!', 'unauthorized'); - } - - //Ignore given user - await userDB.ignoreByUser(data.user); - - //Set status and send ignored user list - res.status(200); - return res.send((await userDB.getIgnoredUsers(false)).user); - }else{ - res.status(400); - res.send({errors: validResult.array()}) - } - }catch(err){ - exceptionHandler(res, err); - } -} - -module.exports.delete = async function(req, res){ - try{ - const validResult = validationResult(req); - - if(validResult.isEmpty()){ - //syntactic sugar :P - const user = req.session.user; - const data = matchedData(req); - - //make sure we're not bullshitting ourselves here. - if(user == null || user.user == null){ - return errorHandler(res, 'You must be logged in to ignore a user!', 'unauthorized'); - } - - //Grab user - const userDB = await userModel.findOne({user: user.user}); - - //Bitch about non-existant users - if(!userDB){ - return errorHandler(res, 'User not found!', 'unauthorized'); - } - - //Unignore given user - await userDB.unignoreByUser(data.user); - - //Set status and send ignored user list - res.status(200); - return res.send((await userDB.getIgnoredUsers(false)).user); - }else{ - res.status(400); - res.send({errors: validResult.array()}) - } - }catch(err){ - exceptionHandler(res, err); - } -} \ No newline at end of file diff --git a/src/controllers/profileController.js b/src/controllers/profileController.js index 4b382cc..cb7c846 100644 --- a/src/controllers/profileController.js +++ b/src/controllers/profileController.js @@ -27,11 +27,9 @@ const validator = require('validator');//No express here, so regular validator i //profile functions module.exports.get = async function(req, res){ try{ - //Get profile name from URL var profileName = req.url.slice(1) == '' ? (req.session.user ? req.session.user.user : null) : req.url.slice(1); - //Pull profile including semi-sensitive information (this object will only be parsed server side) - const profile = await userModel.findProfile({user: profileName}, true, true); + const profile = await userModel.findProfile({user: profileName}, true); if(profile){ //If we have a user, check if the is looking at their own profile diff --git a/src/routers/api/accountRouter.js b/src/routers/api/accountRouter.js index fceeba5..a846d6e 100644 --- a/src/routers/api/accountRouter.js +++ b/src/routers/api/accountRouter.js @@ -28,7 +28,6 @@ const rankEnumController = require("../../controllers/api/account/rankEnumContro const passwordResetRequestController = require("../../controllers/api/account/passwordResetRequestController"); const passwordResetController = require("../../controllers/api/account/passwordResetController"); const emailChangeRequestController = require('../../controllers/api/account/emailChangeRequestController'); -const ignoredController = require("../../controllers/api/account/ignoredController"); const deleteController = require("../../controllers/api/account/deleteController"); //globals @@ -75,10 +74,6 @@ router.post('/passwordResetRequest', accountValidator.user(), passwordResetReque router.post('/passwordReset', accountValidator.securityToken(), accountValidator.securePass(), accountValidator.pass('confirmPass'), passwordResetController.post); //email change request router.post('/emailChangeRequest', accountValidator.email(), accountValidator.pass(), emailChangeRequestController.post); -//ignored users list management -router.get('/ignore', ignoredController.get); -router.post('/ignore', accountValidator.user(), ignoredController.post); -router.post('/unignore', accountValidator.user(), ignoredController.delete); //account deletion router.post('/delete', accountValidator.pass(), deleteController.post); diff --git a/src/schemas/user/userSchema.js b/src/schemas/user/userSchema.js index c7926e3..5139e99 100644 --- a/src/schemas/user/userSchema.js +++ b/src/schemas/user/userSchema.js @@ -702,6 +702,8 @@ userSchema.methods.ignoreByUserDoc = async function(userDB){ //Save the DB document await this.save(); + + console.log(await this.getIgnoredUsers()); } /** @@ -735,6 +737,8 @@ userSchema.methods.unignoreByUserDoc = async function(userDB){ //Save the DB document await this.save(); + + console.log(await this.getIgnoredUsers()); } userSchema.methods.getIgnoredUsers = async function(fetchAlts = true){ diff --git a/src/views/partial/profile/settings.ejs b/src/views/partial/profile/settings.ejs index aabe7a8..8f5a9f8 100644 --- a/src/views/partial/profile/settings.ejs +++ b/src/views/partial/profile/settings.ejs @@ -22,7 +22,6 @@ along with this program. If not, see . %> \ No newline at end of file diff --git a/www/css/global.css b/www/css/global.css index 9707e01..d3a2919 100644 --- a/www/css/global.css +++ b/www/css/global.css @@ -153,8 +153,7 @@ p.navbar-item, input.navbar-item{ bottom: 0; right: 0; left: 0; - /*Popup backer has to exist behind popups that are behind default ones for error reasons*/ - z-index: 8998; + z-index: 9000; } .popup-div{ diff --git a/www/css/popup/ignoredUsers.css b/www/css/popup/ignoredUsers.css deleted file mode 100644 index 18ee7ce..0000000 --- a/www/css/popup/ignoredUsers.css +++ /dev/null @@ -1,38 +0,0 @@ -/*Canopy - The next generation of stoner streaming software -Copyright (C) 2024-2026 Rainbownapkin and the TTN Community - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see .*/ - -/*Gotta keep er' behind the errors*/ -.popup-div:has(#ignored-users-popup){ - z-index: 8999; -} - -#ignored-users-popup-list-div{ - padding: 0; - margin-bottom: 1em; -} - -.ignored-users-popup-ignored-user { - display: flex; -} - -.ignored-users-popup-ignored-user-label { - margin: 0; -} - -.ignored-users-popup-ignored-user { - justify-content: space-between; - padding: 0 0.5em; -} diff --git a/www/css/theme/movie-night.css b/www/css/theme/movie-night.css index 2f7b2df..053356f 100644 --- a/www/css/theme/movie-night.css +++ b/www/css/theme/movie-night.css @@ -23,7 +23,6 @@ along with this program. If not, see .*/ --bg1: rgb(70, 70, 70); --bg2: rgb(220, 220, 220); --bg1-alt0: rgb(30, 30, 30); - --bg1-alt1: rgb(10, 10, 10); --bg2-alt0: rgb(180, 180, 180); --accent0: rgb(47, 47, 47); @@ -589,18 +588,6 @@ select.panel-head-element{ color: var(--accent1); } -/*Ignored Users Popup*/ -#ignored-users-popup-list-div{ - border-radius: 0; - border: 1px solid var(--accent1); -} - - -.ignored-users-popup-ignored-user:nth-child(even):not(.chat-entry-toke){ - box-shadow: 3px 0px 1px var(--bg1-alt1) inset; - background-color: var(--bg1-alt0); -} - /* psa */ #psa-container{ border: 3px solid var(--danger0); diff --git a/www/css/theme/the-network-classic.css b/www/css/theme/the-network-classic.css index 6a16288..b0edd61 100644 --- a/www/css/theme/the-network-classic.css +++ b/www/css/theme/the-network-classic.css @@ -778,18 +778,6 @@ select.panel-head-element{ color: var(--accent1); } -/*Ignored Users Popup*/ -#ignored-users-popup-list-div{ - border-radius: 0; - border: 1px solid var(--accent1); -} - - -.ignored-users-popup-ignored-user:nth-child(even):not(.chat-entry-toke){ - box-shadow: 3px 0px 1px var(--bg1) inset; - background-color: var(--bg2-alt0); -} - /* psa */ #psa-container{ border: 3px solid var(--danger0); diff --git a/www/js/profile.js b/www/js/profile.js index 91847ae..ed823fe 100644 --- a/www/js/profile.js +++ b/www/js/profile.js @@ -142,6 +142,46 @@ class profileUpdateImagePrompt extends profileUpdatePrompt{ } } +class passwordResetPrompt{ + constructor(){ + this.oldPassNode = document.querySelector('#account-settings-password-reset-old'); + this.newPassNode = document.querySelector('#account-settings-password-reset-new'); + this.confirmPassNode = document.querySelector('#account-settings-password-reset-confirm'); + + this.setupInput(this.oldPassNode); + this.setupInput(this.newPassNode); + this.setupInput(this.confirmPassNode); + } + + setupInput(node){ + if(node != null){ + node.addEventListener("keydown", this.update.bind(this)); + } + } + + async update(event){ + var hasVal = (this.oldPassNode.value && this.newPassNode.value && this.confirmPassNode.value); + if((!event || event.key == "Enter") && hasVal){ + if(this.newPassNode.value == this.confirmPassNode.value){ + const updateObj = {}; + + updateObj.passChange = { + oldPass: this.oldPassNode.value, + newPass: this.newPassNode.value, + confirmPass: this.confirmPassNode.value + }; + + const response = await utils.ajax.updateProfile(updateObj); + + if(response != null){ + //Return user homepage after good pass change, as we've probably been logged out by the server for security. + window.location.pathname = '/'; + } + } + } + } +} + class tokeList{ constructor(){ this.tokeList = document.querySelector('#profile-tokes'); @@ -248,93 +288,6 @@ class changePasswordPopup{ } } -class ignoredUsersPopup{ - constructor(){ - this.popup = new canopyUXUtils.popup("ignoredUsers", true, this.asyncConstructor.bind(this), document, false); - } - - asyncConstructor(){ - this.ignoredUsersListDiv = document.querySelector('#ignored-users-popup-list-div') - this.ignorePrompt = document.querySelector('#ignored-users-popup-prompt'); - this.ignoreButton = document.querySelector('#ignored-users-popup-button'); - - //Refresh ignored list - this.refreshList(); - - this.setupInput(); - } - - //grabs and re-renders list, good for asynchronous fire-and-forget usage - async refreshList(){ - this.renderUsers(await utils.ajax.getIgnoredUsers()); - } - - renderUsers(users){ - //Clear out list div - this.ignoredUsersListDiv.innerHTML = ''; - - //run through our ignored users - for(const user of users){ - //Create a div about it - const userDiv = document.createElement('div'); - userDiv.classList.add('ignored-users-popup-ignored-user'); - - //Create userlabel - const userLabel = document.createElement('p'); - userLabel.classList.add('ignored-users-popup-ignored-user-label'); - userLabel.textContent = user.user; - - //Create unignore icon - const unignoreIcon = document.createElement('i'); - unignoreIcon.classList.add('bi-emoji-smile-fill', 'ignored-users-popup-unignore-user-icon'); - unignoreIcon.title = `Unignore ${user.user}`; - - //Make the unignore button actually fuckin' do something for once in its no-good, lazy, yellowbellied, chicken-fucking life - unignoreIcon.addEventListener('click', (event)=>{this.unignore(user.user)}); - - //ASSEMBLE - userDiv.append(userLabel, unignoreIcon); - - //Render out to popup - this.ignoredUsersListDiv.appendChild(userDiv); - - } - } - - setupInput(){ - this.ignorePrompt.addEventListener('keydown', this.ignore.bind(this)); - this.ignoreButton.addEventListener('click', this.ignore.bind(this)); - } - - async ignore(event){ - //If we clicked or hit enter - if(event.key == null || event.key == "Enter"){ - //Tell server who you wanna ignore and get the new list back - const ignoredList = await utils.ajax.ignoreUser(this.ignorePrompt.value); - - //If we received a good list - if(ignoredList != null){ - //Render out received ignored lsit - this.renderUsers(ignoredList); - } - - //Clear prompt - this.ignorePrompt.value = ""; - } - } - - async unignore(user){ - //Tell server who you wanna unignore and get the new list back - const ignoredList = await utils.ajax.unignoreUser(user); - - //If we received a good list - if(ignoredList != null){ - //Render out received ignored lsit - this.renderUsers(ignoredList); - } - } -} - class deleteAccountPopup{ constructor(){ this.popup = new canopyUXUtils.popup("nukeUser", true, this.asyncConstructor.bind(this)); @@ -365,5 +318,4 @@ const bioPrompt = new profileUpdateTextPrompt('bio', true); const profileTokeList = new tokeList(); const accountEmailChange = new accountSettingsButton('update-email', changeEmailPopup); const accountPasswordChange = new accountSettingsButton('change-password', changePasswordPopup); -const accountIgnoredUsers = new accountSettingsButton('change-password', changePasswordPopup); -const accountDeleteButton = new accountSettingsButton('ignored-users', ignoredUsersPopup); \ No newline at end of file +const accountDeleteButton = new accountSettingsButton('delete', deleteAccountPopup); \ No newline at end of file diff --git a/www/js/utils.js b/www/js/utils.js index 4661e3a..bdfa514 100644 --- a/www/js/utils.js +++ b/www/js/utils.js @@ -885,52 +885,6 @@ class canopyAjaxUtils{ } } - async getIgnoredUsers(){ - var response = await fetch(`/api/account/ignore`,{ - method: "GET" - }); - - if(response.ok){ - return (await response.json()) - }else{ - utils.ux.displayResponseError(await response.json()); - } - } - - async ignoreUser(user){ - const response = await fetch(`/api/account/ignore`,{ - method: "POST", - headers: { - "Content-Type": "application/json", - "x-csrf-token": utils.ajax.getCSRFToken() - }, - body: JSON.stringify({user}) - }); - - if(response.ok){ - return (await response.json()) - }else{ - utils.ux.displayResponseError(await response.json()); - } - } - - async unignoreUser(user){ - const response = await fetch(`/api/account/unignore`,{ - method: "POST", - headers: { - "Content-Type": "application/json", - "x-csrf-token": utils.ajax.getCSRFToken() - }, - body: JSON.stringify({user}) - }); - - if(response.ok){ - return (await response.json()) - }else{ - utils.ux.displayResponseError(await response.json()); - } - } - async deleteAccount(pass){ const response = await fetch(`/api/account/delete`,{ method: "POST", diff --git a/www/popup/ignoredUsers.html b/www/popup/ignoredUsers.html deleted file mode 100644 index 5eae53a..0000000 --- a/www/popup/ignoredUsers.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -
-
-
- - -
\ No newline at end of file