Added configurable link section to Navbar

This commit is contained in:
rainbow napkin 2026-05-18 01:54:43 -04:00
parent d41e9d1df9
commit c82299f94b
16 changed files with 36 additions and 25 deletions

View file

@ -26,5 +26,5 @@ module.exports = async function(req, res){
res.status(404); res.status(404);
//Render page //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)});
} }

View file

@ -24,5 +24,5 @@ const csrfUtils = require('../utils/csrfUtils');
//register page functions //register page functions
module.exports.get = async function(req, res){ module.exports.get = async function(req, res){
//Render page //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)});
} }

View file

@ -42,7 +42,7 @@ module.exports.get = async function(req, res){
//Render out the page //Render out the page
return res.render('adminPanel', { return res.render('adminPanel', {
instance: config.instanceName, instance: config.instanceName, links: config.links,
user: req.session.user, user: req.session.user,
rankEnum: permissionModel.rankEnum, rankEnum: permissionModel.rankEnum,
chanGuide: chanGuide, chanGuide: chanGuide,

View file

@ -22,5 +22,5 @@ const csrfUtils = require('../utils/csrfUtils');
//channel functions //channel functions
module.exports.get = function(req, res){ 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)});
} }

View file

@ -42,7 +42,7 @@ module.exports.get = async function(req, res){
throw loggerUtils.exceptionSmith("Channel not found.", "queue"); 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){ }catch(err){
return exceptionHandler(res, err); return exceptionHandler(res, err);
} }

View file

@ -40,18 +40,18 @@ module.exports.get = async function(req, res){
//If we have an invalid request //If we have an invalid request
if(requestDB == null){ 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) //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 //Consume the request
await requestDB.consume(); await requestDB.consume();
}else{ }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){ }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});
} }
} }

View file

@ -24,5 +24,5 @@ const csrfUtils = require('../utils/csrfUtils');
//register page functions //register page functions
module.exports.get = async function(req, res){ module.exports.get = async function(req, res){
//Render page //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)});
} }

View file

@ -29,7 +29,7 @@ const {exceptionHandler, errorHandler} = require('../utils/loggerUtils');
module.exports.get = async function(req, res){ module.exports.get = async function(req, res){
try{ try{
const chanGuide = await channelModel.getChannelList(); 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){ }catch(err){
return exceptionHandler(res, err); return exceptionHandler(res, err);
} }

View file

@ -45,7 +45,7 @@ module.exports.get = async function(req, res){
//if we have previous attempts for this user //if we have previous attempts for this user
if(attempts != null){ if(attempts != null){
if(attempts.count > sessionUtils.maxAttempts){ 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 //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); const challenge = await altchaUtils.genCaptcha(difficulty, user);
//Render page //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 //otherwise
}else{ }else{
//Render generic page //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 //if we received invalid input
}else{ }else{
//Render pretend nothing happened, send out a generic page //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)});
} }
} }

View file

@ -27,5 +27,5 @@ module.exports.get = async function(req, res){
const challenge = await altchaUtils.genCaptcha(); const challenge = await altchaUtils.genCaptcha();
//Render page //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)});
} }

View file

@ -27,5 +27,5 @@ module.exports.get = async function(req, res){
const challenge = await altchaUtils.genCaptcha(); const challenge = await altchaUtils.genCaptcha();
//render the page //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)});
} }

View file

@ -19,5 +19,5 @@ const config = require('../../../config.json');
//popout panel container functions //popout panel container functions
module.exports.get = async function(req, res){ module.exports.get = async function(req, res){
res.render('popoutContainer', {instance: config.instanceName}); res.render('popoutContainer', {instance: config.instanceName, links: config.links});
} }

View file

@ -47,11 +47,11 @@ module.exports.get = async function(req, res){
*/ */
//Render page //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 //If we didn't get a valid token
}else{ }else{
//otherwise render generic page //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){ }catch(err){
return exceptionHandler(res, err); return exceptionHandler(res, err);

View file

@ -42,7 +42,7 @@ module.exports.get = async function(req, res){
const presence = await presenceUtils.getPresence(profile.user); const presence = await presenceUtils.getPresence(profile.user);
res.render('profile', { res.render('profile', {
instance: config.instanceName, instance: config.instanceName, links: config.links,
user: req.session.user, user: req.session.user,
profile, profile,
selfProfile, selfProfile,
@ -52,7 +52,7 @@ module.exports.get = async function(req, res){
}); });
}else{ }else{
res.render('profile', { res.render('profile', {
instance: config.instanceName, instance: config.instanceName, links: config.links,
user: req.session.user, user: req.session.user,
profile: null, profile: null,
selfProfile: false, selfProfile: false,

View file

@ -27,5 +27,5 @@ module.exports.get = async function(req, res){
const challenge = await altchaUtils.genCaptcha(); const challenge = await altchaUtils.genCaptcha();
//Render page //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)});
} }

View file

@ -20,13 +20,24 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. %>
</span> </span>
<span class="navbar-item" id="right-controls"> <span class="navbar-item" id="right-controls">
<% if(user){ %> <% if(user){ %>
<p class="navbar-item">Welcome, <a class="navbar-item" id="username" href="/profile"><%= user.user %></a> - <% if(user.rank == "admin"){ %><a href="/adminPanel" title="Admin Panel" class="bi bi-server navbar-item"></a> - <% } %> <a class="navbar-item" href="/about">About</a> - <a class="navbar-item" href="javascript:" id="logout-button">Logout</a></p> <p class="navbar-item">Welcome, <a class="navbar-item" id="username" href="/profile"><%= user.user %></a> - <% if(user.rank == "admin"){ %>
<a href="/adminPanel" title="Admin Panel" class="bi bi-server navbar-item"></a> -
<% } %>
<% for(link of Object.keys(links)){ %>
<a target="_blank" class="navbar-item" href="<%- links[link] %>"><%= link %></a> -
<% } %>
<a class="navbar-item" href="javascript:" id="logout-button">Logout</a></p>
<% }else{ %> <% }else{ %>
<p class="navbar-item">Remember Me:</p> <p class="navbar-item">Remember Me:</p>
<input class="navbar-item login-prompt" id="remember-me" type="checkbox"> <input class="navbar-item login-prompt" id="remember-me" type="checkbox">
<input class="navbar-item login-prompt" id="username-prompt" placeholder="username"> <input class="navbar-item login-prompt" id="username-prompt" placeholder="username">
<input class="navbar-item login-prompt" id="password-prompt" placeholder="password" type="password"> <input class="navbar-item login-prompt" id="password-prompt" placeholder="password" type="password">
<p class="navbar-item"><a class="navbar-item" href="javascript:" id="login-button">Login</a> - <a class="navbar-item" href="/passwordReset">Forgot Password</a> - <a class="navbar-item" href="/register">Register</a> - <a class="navbar-item" href="/about">About</a></p> <p class="navbar-item"><a class="navbar-item" href="javascript:" id="login-button">Login</a> - <a class="navbar-item" href="/passwordReset">Forgot Password</a> - <a class="navbar-item" href="/register">Register</a>
<% for(link of Object.keys(links)){ %>
- <a target="_blank" class="navbar-item" href="<%- links[link] %>"><%= link %></a>
<% } %></p>
<% } %> <% } %>
</span> </span>
</div> </div>