diff --git a/README.md b/README.md
index b333dfb..a61d209 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ Canopy
-0.1-Alpha (Panama Red) - Hotfix 2
+0.1-Alpha (Panama Red) - Hotfix 3
=========
Canopy - /ˈkæ.nə.pi/:
diff --git a/config.example.json b/config.example.json
index 5d8f957..7b869b3 100644
--- a/config.example.json
+++ b/config.example.json
@@ -34,5 +34,10 @@
"address": "toke@42069.weed",
"pass": "CHANGE_ME"
},
+ "links":{
+ "About": "/about",
+ "Code": "https://git.ourfore.st/rainbownapkin/canopy",
+ "HRT": "/hrt"
+ },
"aboutText":"ourfore.st is the one and only original canopy instance. Setup, ran, and administered by rainbownapkin herself. This site exists to provide a featureful, preformant, and comfy replacement for the TTN community."
}
\ No newline at end of file
diff --git a/config.example.jsonc b/config.example.jsonc
index f315d9a..3669d09 100644
--- a/config.example.jsonc
+++ b/config.example.jsonc
@@ -65,6 +65,12 @@
"address": "toke@42069.weed",
"pass": "CHANGE_ME"
},
+ //Provides customizable links for navbar
+ "links":{
+ "About": "/about",
+ "Code": "https://git.ourfore.st/rainbownapkin/canopy",
+ "HRT": "/hrt"
+ },
//Fills the 'about ${instanceName}' section on the /about page, lets users know about your specific instance
"aboutText":"ourfore.st is the one and only original canopy instance. Setup, ran, and administered by rainbownapkin herself. This site exists to provide a featureful, preformant, and comfy replacement for the TTN community."
}
\ No newline at end of file
diff --git a/package.json b/package.json
index ee1cb25..54af4f0 100644
--- a/package.json
+++ b/package.json
@@ -1,14 +1,14 @@
{
"name": "canopy-of-alpha",
- "version": "0.1.2",
- "canopyDisplayVersion": "0.1-Alpha (Panama Red) - Hotfix 2",
+ "version": "0.1.3",
+ "canopyDisplayVersion": "0.1-Alpha (Panama Red) - Hotfix 3",
"license": "AGPL-3.0-only",
"dependencies": {
"@braintree/sanitize-url": "^7.1.1",
- "altcha": "^1.0.7",
+ "altcha": "^2.3.0",
"altcha-lib": "^1.2.0",
"argon2": "^0.44.0",
- "bcrypt": "^5.1.1",
+ "bcrypt": "^6.0.0",
"bootstrap-icons": "^1.11.3",
"connect-mongo": "^5.1.0",
"cookie-parser": "^1.4.7",
@@ -20,8 +20,8 @@
"hls.js": "^1.6.2",
"mongoose": "^8.4.3",
"node-cron": "^3.0.3",
- "nodemailer": "^7.0.9",
- "socket.io": "^4.8.1",
+ "nodemailer": "^8.0.7",
+ "socket.io": "^4.2.0",
"youtube-dl-exec": "^3.0.20"
},
"scripts": {
diff --git a/src/app/chatPreprocessor.js b/src/app/chatPreprocessor.js
index a4331ab..dc3d4bd 100644
--- a/src/app/chatPreprocessor.js
+++ b/src/app/chatPreprocessor.js
@@ -57,7 +57,7 @@ class chatPreprocessor{
//If we don't pass sanatization/validation turn this car around
if(!this.sanatizeCommand(commandObj)){
- return;
+ return false;
}
//split the command
diff --git a/src/controllers/404Controller.js b/src/controllers/404Controller.js
index 471ea16..3e7a4e0 100644
--- a/src/controllers/404Controller.js
+++ b/src/controllers/404Controller.js
@@ -26,5 +26,5 @@ module.exports = async function(req, res){
res.status(404);
//Render page
- return res.render('404', {instance: config.instanceName, user: req.session.user, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('404', {instance: config.instanceName, links: config.links, user: req.session.user, csrfToken: csrfUtils.generateToken(req)});
}
\ No newline at end of file
diff --git a/src/controllers/aboutController.js b/src/controllers/aboutController.js
index 187157b..249e931 100644
--- a/src/controllers/aboutController.js
+++ b/src/controllers/aboutController.js
@@ -24,5 +24,5 @@ const csrfUtils = require('../utils/csrfUtils');
//register page functions
module.exports.get = async function(req, res){
//Render page
- return res.render('about', {aboutText: config.aboutText, instance: config.instanceName, user: req.session.user, version: package.canopyDisplayVersion, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('about', {aboutText: config.aboutText, instance: config.instanceName, links: config.links, user: req.session.user, version: package.canopyDisplayVersion, csrfToken: csrfUtils.generateToken(req)});
}
\ No newline at end of file
diff --git a/src/controllers/adminPanelController.js b/src/controllers/adminPanelController.js
index ca1a74c..6ecdaee 100644
--- a/src/controllers/adminPanelController.js
+++ b/src/controllers/adminPanelController.js
@@ -42,7 +42,7 @@ module.exports.get = async function(req, res){
//Render out the page
return res.render('adminPanel', {
- instance: config.instanceName,
+ instance: config.instanceName, links: config.links,
user: req.session.user,
rankEnum: permissionModel.rankEnum,
chanGuide: chanGuide,
diff --git a/src/controllers/channelController.js b/src/controllers/channelController.js
index dd27fcd..fef37a7 100644
--- a/src/controllers/channelController.js
+++ b/src/controllers/channelController.js
@@ -22,5 +22,5 @@ const csrfUtils = require('../utils/csrfUtils');
//channel functions
module.exports.get = function(req, res){
- res.render('channel', {instance: config.instanceName, user: req.session.user, csrfToken: csrfUtils.generateToken(req)});
+ res.render('channel', {instance: config.instanceName, links: config.links, user: req.session.user, csrfToken: csrfUtils.generateToken(req)});
}
\ No newline at end of file
diff --git a/src/controllers/channelSettingsController.js b/src/controllers/channelSettingsController.js
index e310773..3559503 100644
--- a/src/controllers/channelSettingsController.js
+++ b/src/controllers/channelSettingsController.js
@@ -42,7 +42,7 @@ module.exports.get = async function(req, res){
throw loggerUtils.exceptionSmith("Channel not found.", "queue");
}
- return res.render('channelSettings', {instance: config.instanceName, user: req.session.user, channel: chanDB, reqRank, rankEnum: permissionModel.rankEnum, csrfToken: csrfUtils.generateToken(req), unescape: validator.unescape});
+ return res.render('channelSettings', {instance: config.instanceName, links: config.links, user: req.session.user, channel: chanDB, reqRank, rankEnum: permissionModel.rankEnum, csrfToken: csrfUtils.generateToken(req), unescape: validator.unescape});
}catch(err){
return exceptionHandler(res, err);
}
diff --git a/src/controllers/emailChangeController.js b/src/controllers/emailChangeController.js
index fb9cabd..6b0b99d 100644
--- a/src/controllers/emailChangeController.js
+++ b/src/controllers/emailChangeController.js
@@ -40,18 +40,18 @@ module.exports.get = async function(req, res){
//If we have an invalid request
if(requestDB == null){
- return res.render('emailChange', {instance: config.instanceName, user: req.session.user, csrfToken: csrfUtils.generateToken(req), valid: false});
+ return res.render('emailChange', {instance: config.instanceName, links: config.links, user: req.session.user, csrfToken: csrfUtils.generateToken(req), valid: false});
}
//Speak of our success (don't wait for the emails to be sent)
- res.render('emailChange', {instance: config.instanceName, user: req.session.user, csrfToken: csrfUtils.generateToken(req), valid: true});
+ res.render('emailChange', {instance: config.instanceName, links: config.links, user: req.session.user, csrfToken: csrfUtils.generateToken(req), valid: true});
//Consume the request
await requestDB.consume();
}else{
- return res.render('emailChange', {instance: config.instanceName, user: req.session.user, csrfToken: csrfUtils.generateToken(req), valid: false});
+ return res.render('emailChange', {instance: config.instanceName, links: config.links, user: req.session.user, csrfToken: csrfUtils.generateToken(req), valid: false});
}
}catch(err){
- return res.render('emailChange', {instance: config.instanceName, user: req.session.user, csrfToken: csrfUtils.generateToken(req), valid: false});
+ return res.render('emailChange', {instance: config.instanceName, links: config.links, user: req.session.user, csrfToken: csrfUtils.generateToken(req), valid: false});
}
}
\ No newline at end of file
diff --git a/src/controllers/hrtController.js b/src/controllers/hrtController.js
index e03d5ac..7b1b920 100644
--- a/src/controllers/hrtController.js
+++ b/src/controllers/hrtController.js
@@ -24,5 +24,5 @@ const csrfUtils = require('../utils/csrfUtils');
//register page functions
module.exports.get = async function(req, res){
//Render page
- return res.render('hrt', {instance: config.instanceName, user: req.session.user, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('hrt', {instance: config.instanceName, links: config.links, user: req.session.user, csrfToken: csrfUtils.generateToken(req)});
}
\ No newline at end of file
diff --git a/src/controllers/indexController.js b/src/controllers/indexController.js
index 30e9682..a06cfec 100644
--- a/src/controllers/indexController.js
+++ b/src/controllers/indexController.js
@@ -29,7 +29,7 @@ const {exceptionHandler, errorHandler} = require('../utils/loggerUtils');
module.exports.get = async function(req, res){
try{
const chanGuide = await channelModel.getChannelList();
- return res.render('index', {instance: config.instanceName, user: req.session.user, chanGuide: chanGuide, csrfToken: csrfUtils.generateToken(req), unescape: validator.unescape});
+ return res.render('index', {instance: config.instanceName, links: config.links, user: req.session.user, chanGuide: chanGuide, csrfToken: csrfUtils.generateToken(req), unescape: validator.unescape});
}catch(err){
return exceptionHandler(res, err);
}
diff --git a/src/controllers/loginController.js b/src/controllers/loginController.js
index a25d316..ffa5fc8 100644
--- a/src/controllers/loginController.js
+++ b/src/controllers/loginController.js
@@ -45,7 +45,7 @@ module.exports.get = async function(req, res){
//if we have previous attempts for this user
if(attempts != null){
if(attempts.count > sessionUtils.maxAttempts){
- return res.render('lockedAccount', {instance: config.instanceName, user: req.session.user, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('lockedAccount', {instance: config.instanceName, links: config.links, user: req.session.user, csrfToken: csrfUtils.generateToken(req)});
}
//If the users login's are being throttled
@@ -56,16 +56,16 @@ module.exports.get = async function(req, res){
const challenge = await altchaUtils.genCaptcha(difficulty, user);
//Render page
- return res.render('login', {instance: config.instanceName, user: req.session.user, challenge, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('login', {instance: config.instanceName, links: config.links, user: req.session.user, challenge, csrfToken: csrfUtils.generateToken(req)});
}
//otherwise
}else{
//Render generic page
- return res.render('login', {instance: config.instanceName, user: req.session.user, challenge: null, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('login', {instance: config.instanceName, links: config.links, user: req.session.user, challenge: null, csrfToken: csrfUtils.generateToken(req)});
}
//if we received invalid input
}else{
//Render pretend nothing happened, send out a generic page
- return res.render('login', {instance: config.instanceName, user: req.session.user, challenge: null, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('login', {instance: config.instanceName, links: config.links, user: req.session.user, challenge: null, csrfToken: csrfUtils.generateToken(req)});
}
}
\ No newline at end of file
diff --git a/src/controllers/migrateController.js b/src/controllers/migrateController.js
index ea82e5e..a46d3b2 100644
--- a/src/controllers/migrateController.js
+++ b/src/controllers/migrateController.js
@@ -27,5 +27,5 @@ module.exports.get = async function(req, res){
const challenge = await altchaUtils.genCaptcha();
//Render page
- return res.render('migrate', {instance: config.instanceName, user: req.session.user, challenge, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('migrate', {instance: config.instanceName, links: config.links, user: req.session.user, challenge, csrfToken: csrfUtils.generateToken(req)});
}
\ No newline at end of file
diff --git a/src/controllers/newChannelController.js b/src/controllers/newChannelController.js
index ee77166..233c99a 100644
--- a/src/controllers/newChannelController.js
+++ b/src/controllers/newChannelController.js
@@ -27,5 +27,5 @@ module.exports.get = async function(req, res){
const challenge = await altchaUtils.genCaptcha();
//render the page
- return res.render('newChannel', {instance: config.instanceName, user: req.session.user, challenge, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('newChannel', {instance: config.instanceName, links: config.links, user: req.session.user, challenge, csrfToken: csrfUtils.generateToken(req)});
}
\ No newline at end of file
diff --git a/src/controllers/panel/popoutContainerController.js b/src/controllers/panel/popoutContainerController.js
index 6993f9e..619cf18 100644
--- a/src/controllers/panel/popoutContainerController.js
+++ b/src/controllers/panel/popoutContainerController.js
@@ -19,5 +19,5 @@ const config = require('../../../config.json');
//popout panel container functions
module.exports.get = async function(req, res){
- res.render('popoutContainer', {instance: config.instanceName});
+ res.render('popoutContainer', {instance: config.instanceName, links: config.links});
}
\ No newline at end of file
diff --git a/src/controllers/passwordResetController.js b/src/controllers/passwordResetController.js
index 1d47fae..5fd392c 100644
--- a/src/controllers/passwordResetController.js
+++ b/src/controllers/passwordResetController.js
@@ -47,11 +47,11 @@ module.exports.get = async function(req, res){
*/
//Render page
- return res.render('passwordReset', {instance: config.instanceName, user: req.session.user, challenge, token, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('passwordReset', {instance: config.instanceName, links: config.links, user: req.session.user, challenge, token, csrfToken: csrfUtils.generateToken(req)});
//If we didn't get a valid token
}else{
//otherwise render generic page
- return res.render('passwordReset', {instance: config.instanceName, user: req.session.user, challenge, token: null, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('passwordReset', {instance: config.instanceName, links: config.links, user: req.session.user, challenge, token: null, csrfToken: csrfUtils.generateToken(req)});
}
}catch(err){
return exceptionHandler(res, err);
diff --git a/src/controllers/profileController.js b/src/controllers/profileController.js
index 67d1895..df5b9c2 100644
--- a/src/controllers/profileController.js
+++ b/src/controllers/profileController.js
@@ -42,7 +42,7 @@ module.exports.get = async function(req, res){
const presence = await presenceUtils.getPresence(profile.user);
res.render('profile', {
- instance: config.instanceName,
+ instance: config.instanceName, links: config.links,
user: req.session.user,
profile,
selfProfile,
@@ -52,7 +52,7 @@ module.exports.get = async function(req, res){
});
}else{
res.render('profile', {
- instance: config.instanceName,
+ instance: config.instanceName, links: config.links,
user: req.session.user,
profile: null,
selfProfile: false,
diff --git a/src/controllers/registerController.js b/src/controllers/registerController.js
index 91fb5b0..9f2eb14 100644
--- a/src/controllers/registerController.js
+++ b/src/controllers/registerController.js
@@ -27,5 +27,5 @@ module.exports.get = async function(req, res){
const challenge = await altchaUtils.genCaptcha();
//Render page
- return res.render('register', {instance: config.instanceName, user: req.session.user, challenge, csrfToken: csrfUtils.generateToken(req)});
+ return res.render('register', {instance: config.instanceName, links: config.links, user: req.session.user, challenge, csrfToken: csrfUtils.generateToken(req)});
}
\ No newline at end of file
diff --git a/src/utils/linkUtils.js b/src/utils/linkUtils.js
index 9e85870..76b8e45 100644
--- a/src/utils/linkUtils.js
+++ b/src/utils/linkUtils.js
@@ -14,6 +14,9 @@ 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
Youtube Player Type:
-Aspect-Ratio Lock Chat Width Minimum:
+Chat Width Minimum While Locked to Aspect Ratio:
+ +Disable Portrait/Mobile Layout:
+ +Play Sound for received PMs:
diff --git a/www/img/strikethrough.svg b/www/img/strikethrough.svg index 7c41d20..40e46a2 100644 --- a/www/img/strikethrough.svg +++ b/www/img/strikethrough.svg @@ -1,11 +1,11 @@