undoxxed :sungalsses:

This commit is contained in:
Expand-sys 2021-04-19 17:32:02 +10:00
commit f218524d14
21 changed files with 3454 additions and 0 deletions

23
.gitignore vendored Normal file
View file

@ -0,0 +1,23 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

2
README.md Normal file
View file

@ -0,0 +1,2 @@
# ccashfrontend
# yeah so like i dont have to document shit and if you wanna fight meet me round back of maccas mmmkay

12
config/admin.js Normal file
View file

@ -0,0 +1,12 @@
module.exports = {
checkAdmin : function(req,res, next) {
if(req.session.admin != false) {
if(req.session.admin != undefined){
return next();
}
}
req.flash('error_msg' , 'admins only');
res.redirect('/');
}
}

9
config/auth.js Normal file
View file

@ -0,0 +1,9 @@
module.exports = {
ensureAuthenticated : function(req,res,next) {
if(req.session.user != undefined) {
return next();
}
req.flash('error_msg' , 'please login to view this resource');
res.redirect('/login');
}
}

26
helpers/functions.js Normal file
View file

@ -0,0 +1,26 @@
const got = require('got');
async function postUser(name, password){
try{
const {body} = await got.post('https://ccash.ryzerth.com/BankF/user',{
json:{
name: name,
init_pass: password
},
responseType:'json'
})
return body
} catch(err){
console.log(err)
}
console.log(body)
return body.value
}
module.exports = { postUser }

302
index.js Normal file
View file

@ -0,0 +1,302 @@
const express = require('express');
const path = require('path');
const https = require('https')
const got = require('got')
const bodyParser = require('body-parser')
const expressValidator = require('express-validator');
const flash = require ('connect-flash');
const session = require('express-session');
const {postUser} = require('./helpers/functions.js')
const {ensureAuthenticated} = require("./config/auth.js")
const app = express();
const MemoryStore = require('memorystore')(session)
const url = require('url')
const dotenv = require('dotenv');
const fs = require('fs');
dotenv.config();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(flash());
app.use(require('connect-flash')());
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json())
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(function(req, res, next) {
res.locals.messages = require('express-messages')(req, res);
next();
});
app.set('trust proxy', 1) // trust first proxy
let secure = false
if(process.env.SECURE=='true'||process.env.SECURE=='True'||process.env.SECURE=='TRUE'){secure = true}
let setup = false
if(process.env.SETUP=='true'||process.env.SETUP=='True'||process.env.SETUP=='TRUE'){setup=true}
app.use(session({
secret: 'fuck shit cunt',
resave: true,
store: new MemoryStore({
checkPeriod: 86400000 // prune expired entries every 24h
}),
saveUninitialized: true,
cookie: { secure: secure, maxAge: 86400000 },
}))
app.use(expressValidator({
errorFormatter: function(param, msg, value) {
var namespace = param.split('.')
, root = namespace.shift()
, formParam = root;
while(namespace.length){
formParam += '[' + namespace.shift() + ']';
}
return{
param : formParam,
msg : msg,
value : value
};
}
}));
app.post('/setup', async function(req, res){
console.log(req.body)
let apiurl = 'BANKAPIURL='+req.body.url
process.env.BANKAPIURL = req.body.url
let banksecure = 'SECURE=false'
process.env.SECURE = false
if(req.body.secure){
banksecure = 'SECURE=true'
process.env.SECURE = true
}
process.env.SETUP = true
fs.writeFileSync('.env', apiurl+'\n'+banksecure+'\nSETUP=true')
dotenv.config();
res.redirect('/')
})
app.get('/', async function(req, res){
if(setup==false){
res.render('setup')
}else{
let checkalive;
try{
checkalive = await got(process.env.BANKAPIURL+'BankF/help')
} catch(err){
console.log(err)
}
let alive = false;
try{
if(checkalive.body){
alive = true
}
}catch(err){
console.log(err)
}
res.render('index', {
user: req.session.user,
admin: req.session.admin,
alive: alive
})
}
});
app.get('/BankF', ensureAuthenticated, async function(req, res){
let successes = [];
if(req.session.sucess == true){
successes.push({ msg: "Transfer successful"})
}
let admin
try{
admin = req.session.admin;
}catch(err){
console.log(err)
}
let balance = 0
try{
balance = await got(process.env.BANKAPIURL+'BankF/'+req.session.user+'/bal')
balance = JSON.parse(balance.body)
} catch(err){
console.log(err)
}
res.render('bankf',{
user: req.session.user,
balance: balance.value,
user: req.session.user,
admin: req.session.admin,
sucesses: successes,
})
});
app.post('/sendfunds', async function(req, res){
let balance = 0;
try{
balance = await got(process.env.BANKAPIURL+'BankF/'+req.session.user+'/bal')
balance = JSON.parse(balance.body)
} catch(err){
console.log(err)
}
let {amount, name, senderpass} = req.body
let a_name = req.session.user
let successes = [];
let errors = [];
let result = {}
result = await got.post(process.env.BANKAPIURL+'BankF/sendfunds',{
json:{
a_name: a_name,
b_name: name,
amount: parseInt(amount),
attempt: senderpass
},
responseType:'json'
})
if(result.body.value == true || result.body.value){
req.session.success = true;
res.redirect('/BankF')
} else {
errors.push({msg: "Transfer Unsuccessful"})
res.render("bankf",{
errors:errors,
successes: successes,
balance:balance.value,
user: req.session.user,
admin: req.session.admin,
})
}
})
app.post('/register', async function(req, res){
var {name, password, password2} = req.body;
let checkuser = await got(process.env.BANKAPIURL+'BankF/contains/'+name)
checkuser = JSON.parse(checkuser.body).value
let errors = [];
let successes = [];
if(checkuser == false){
if(!name || !password || !password2) {
errors.push({msg : "please fill in all fields"});
}
if(password !== password2) {
errors.push({msg : "Passwords don't match"});
}
if(password.length < 6 ) {
errors.push({msg : 'Password must be at least 6 characters'})
}
if(errors[0]){
res.render('register', {
errors:errors
})
} else {
if(postUser(name, password)){
successes.push({msg:"User Registered Please Log In"})
res.render('login',{
errors:errors,
successes: successes,
})
}
}
} else {
errors.push({msg: "User already exists"})
res.render('register',{
errors:errors,
})
}
})
app.post('/login', async function(req, res){
if(req.session.user){
res.redirect("/")
}
let {name,password} = req.body
let adminTest;
let errors = [];
try{
adminTest = await got.post(process.env.BANKAPIURL+'BankF/admin/vpass',{
json:{
attempt: password,
},
responseType:'json'
})
} catch(err){
console.log(err)
}
req.session.admin = adminTest.body.value
req.session.adminp = password
let verified
try{
verified = await got.post(process.env.BANKAPIURL+'BankF/vpass', {
json:{
name: name,
attempt: password
},
responseType:'json'
})
} catch(err){
console.log(err)
} finally {
console.log(verified.body.value)
if(verified.body.value == 0){
errors.push({msg: 'Password wrong'})
res.render('login',{
errors:errors
})
}else if(verified.body.value == 1){
req.session.user = name;
console.log(req.session.user)
res.redirect('/BankF')
} else {
errors.push({msg: 'User not found'})
res.render('login',{
errors:errors
})
}
}
//res.redirect('/login')
})
let admin = require('./routes/admin');
app.use('/admin', admin);
let settings = require('./routes/settings');
app.use('/settings', settings)
app.get('/logout', function(req, res){
req.session.regenerate(function(err) {
res.render('login', {
})
})
});
app.get('/login', function(req, res){
req.session.regenerate(function(err) {
res.render('login', {
user: req.session.user,
})
})
});
app.get('/register', function(req, res){
res.render('register', {
user: req.session.user,
admin: req.session.admin,
})
});
app.listen(process.env.PORT || 3000, function(){
console.log('Server started on port 3000...');
});

2428
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

36
package.json Normal file
View file

@ -0,0 +1,36 @@
{
"dependencies": {
"connect-flash": "^0.1.1",
"express": "^4.17.1",
"express-messages": "^1.0.1",
"express-session": "^1.17.1",
"express-validator": "5.3.1",
"got": "^11.8.2",
"https": "^1.0.0",
"memorystore": "*",
"path": "^0.12.7",
"pug": "^3.0.2",
"url": "^0.11.0",
"validator": "^13.5.2"
},
"name": "ccashfrontend",
"description": "",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Expand-sys/ccashfrontend.git"
},
"author": "Expand",
"license": "ISC",
"bugs": {
"url": "https://github.com/Expand-sys/ccashfrontend/issues"
},
"homepage": "https://github.com/Expand-sys/ccashfrontend#readme",
"engines": {
"node": "15.12.x"
}
}

BIN
public/CCashLogo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

137
public/css/style.css Normal file
View file

@ -0,0 +1,137 @@
.main {
display: flex;
flex-direction: column;
justify-content: space-around;
height: 100vh;
}
body{
background: #7f8891 ;
}
.container-large{
padding-left: 10%;
padding-right: 10%;
}
.col{
padding: 0px;
padding-left: 0px;
padding-right: 0px;
}
.card{
padding: 10px;
}
.row{
margin-left: 0px;
margin-right: 0px;
}
.logo{
width: 250px;
background-color:white;
}
.content{ flex-grow: 1; }
.gallery{
background-color: white;
margin-bottom: 50px;
box-shadow: 10px 10px 5px black;
}
.bg-custom{
background-color:#130f40;
}
.button-fixed{
bottom: 0;
position: fixed;
right: 0;
border-radius: 4px;
}
.fas{
cursor: pointer;
font-size: 24px;
}
p{
font-size: 14px;
}
/* The sidepanel menu */
.sidepanel {
height: 100%; /* Specify a height */
width: 0; /* 0 width - change this with JavaScript */
position: fixed; /* Stay in place */
z-index: 1; /* Stay on top */
top: 0;
left: 0;
background-color: #111; /* Black*/
overflow-x: hidden; /* Disable horizontal scroll */
padding-top: 60px; /* Place content 60px from the top */
transition: 0.5s; /* 0.5 second transition effect to slide in the sidepanel */
}
/* The sidepanel links */
.sidepanel a {
padding: 8px 8px 8px 32px;
text-decoration: none;
font-size: 25px;
color: #818181;
display: block;
transition: 0.3s;
}
/* When you mouse over the navigation links, change their color */
.sidepanel a:hover {
color: #f1f1f1;
}
/* Position and style the close button (top right corner) */
.sidepanel .closebtn {
position: absolute;
top: 0;
right: 25px;
font-size: 36px;
margin-left: 50px;
}
/* Style the button that is used to open the sidepanel */
.openbtn {
font-size: 20px;
cursor: pointer;
background-color: #111;
color: white;
padding: 10px 15px;
border: none;
}
.openbtn:hover {
background-color: #444;
}
.reveal-if-active {
opacity: 0;
max-height: 0;
overflow: hidden;
}
.text-black{
color:black;
}
.form-check-input{
margin-left:0;
padding:inherit;
}
input[type="radio"]:checked ~ .reveal-if-active,
input[type="checkbox"]:checked ~ .reveal-if-active {
opacity: 1;
max-height: 100px; /* little bit of a magic number :( */
overflow: visible;
}
h1, h2, h3, h4, h5, h6, p, label{
font-family: 'Josefin Sans', sans-serif;=
}
h1{
color: white;
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

168
routes/admin.js Normal file
View file

@ -0,0 +1,168 @@
const express = require('express');
const router = express.Router();
const path = require('path');
const {ensureAuthenticated} = require("../config/auth.js")
const {checkAdmin} = require ("../config/admin.js")
var pug = require('pug');
const flash = require ('connect-flash');
const expressValidator = require('express-validator');
const session = require('express-session');
const {postUser} = require('../helpers/functions.js')
const got = require('got')
console.log('Sen was here')
router.get('/', checkAdmin, function(req, res){
res.render('adminsettings', {
user: req.session.user,
admin: req.session.admin,
})
});
router.post('/user',checkAdmin , async function(req,res){
let {name, init_pass, init_bal, password2} = req.body
let contains = await got(process.env.BANKAPIURL+'BankF/contains/'+name)
contains = JSON.parse(contains.body).value
let errors = [];
let successes = [];
if(contains == true){
errors.push({msg: 'User already exists'})
res.render('adminsettings',{
errors:errors
})
}else {
if(!name || !init_pass || !init_bal || !password2) {
errors.push({msg : "please fill in all fields"});
}
//check if match
if(init_pass !== password2) {
errors.push({msg : "Passwords don't match"});
}
//check if password is more than 6 characters
if(init_pass.length < 6 ) {
errors.push({msg : 'Password must be at least 6 characters'})
}
let post;
let successes = [];
try{
post = await got.post(process.env.BANKAPIURL+'BankF/admin/user',{
json:{
name: name,
attempt: req.session.adminp,
init_bal: parseInt(init_bal),
init_pass: init_pass,
},
responseType:'json'
})
} catch(err){
console.log(err)
}
if(post.body.value == true){
successes.push({msg: "Account Creation Successful"})
}
}
res.render('adminsettings',{
user: req.session.user,
admin: req.session.admin,
successes: successes,
})
})
router.post('/baluser',checkAdmin , async function(req,res){
let {name} = req.body
let balance;
let successes = [];
let errors = [];
try{
balance = await got(process.env.BANKAPIURL+'BankF/'+name+'/bal')
balance = JSON.parse(balance.body)
} catch(err){
console.log(err)
}
if(balance.value == -1 || balance.value == undefined){
errors.push({msg: "User not found"})
}else{
successes.push({msg: "User: "+name+" has "+balance.value+" monies"})
}
res.render('adminsettings',{
user: req.session.user,
admin: req.session.admin,
successes: successes,
errors: errors,
})
})
router.post('/bal',checkAdmin , async function(req,res){
let {name, amount} = req.body
let patch;
let successes = [];
try{
patch = await got.patch(process.env.BANKAPIURL+'BankF/admin/'+name+'/bal',{
json:{
name: name,
attempt: req.session.adminp,
amount: parseInt(amount),
},
responseType:'json'
})
} catch(err){
console.log(err)
}
if(patch.body.value == true){
successes.push({msg: "Change Funds Successful"})
}
res.render('adminsettings',{
user: req.session.user,
admin: req.session.admin,
successes: successes,
})
})
router.post('/userdelete', checkAdmin, async function(req,res){
let {name, attempt} = req.body
console.log(name)
let contains = await got(process.env.BANKAPIURL+'BankF/contains/'+name)
contains = JSON.parse(contains.body).value
let deleteUser;
let successes = [];
let errors = [];
if(attempt != req.session.adminp){
errors.push({msg:"Wrong Admin Password"})
}
console.log(contains)
if(contains == true){
deleteUser = got.delete(process.env.BANKAPIURL+'BankF/admin/user',{
json:{
name: name,
attempt: attempt,
},
responseType:'json'
})
successes.push({msg: "User Deletion Successful"})
} else{
errors.push({msg: "User Deletion Failed, User Not Found"})
}
res.render('adminsettings',{
user: req.session.user,
admin: req.session.admin,
successes: successes,
errors: errors,
})
})
router.post('/close', checkAdmin, async function(req,res){
let {attempt} = req.body;
let close;
close = got.post(process.env.BANKAPIURL+'BankF/admin/close', {
json:{
attempt: attempt,
},
responseType:'json'
})
res.redirect('../')
})
module.exports = router;

73
routes/settings.js Normal file
View file

@ -0,0 +1,73 @@
const express = require('express');
const router = express.Router();
const path = require('path');
const {ensureAuthenticated} = require("../config/auth.js")
const {checkAdmin} = require ("../config/admin.js")
var pug = require('pug');
const flash = require ('connect-flash');
const expressValidator = require('express-validator');
const session = require('express-session');
const {postUser} = require('../helpers/functions.js')
const got = require('got')
router.get('/',ensureAuthenticated , function(req, res){
res.render('settings', {
user: req.session.user,
admin: req.session.admin,
})
});
router.post('/pass', ensureAuthenticated, async function(req, res){
let {attempt, new_pass, password2} = req.body
let patch;
let successes = [];
let errors = [];
if(!attempt || !new_pass || !password2) {
errors.push({msg : "please fill in all fields"});
}
//check if match
if(new_pass !== password2) {
errors.push({msg : "Passwords don't match"});
}
//check if password is more than 6 characters
if(new_pass.length < 6 ) {
errors.push({msg : 'Password must be at least 6 characters'})
}
if(errors[0]){
res.render('settings', {
errors:errors,
user: req.session.user,
admin: req.session.admin,
})
}
try{
patch = await got.patch('https://ccash.ryzerth.com/BankF/changepass',{
json:{
name: req.session.user,
attempt: attempt,
new_pass: new_pass,
},
responseType:'json'
})
} catch(err){
console.log(err)
}
console.log(patch)
if(patch.body.value == true){
successes.push({msg: "Change Password Successful, Please Login Again"})
}
req.session.regenerate(function(err) {
res.render('login', {
successes: successes,
errors:errors,
})
})
})
module.exports = router;

68
views/adminsettings.pug Normal file
View file

@ -0,0 +1,68 @@
extends layout
block content
.container
h1 Settings, logged in as: #{user}
if admin == true
br
.card
center
h4 here are your settings king
br
.card
h4 Add User
form(method='POST', action='/admin/user')
#form-group
label Username:
input.form-control(name='name', type='name')
label Starting balance:
input.form-control(name='init_bal', type='number')
label Password:
input.form-control(name='init_pass',type='password')
label Confirm:
input.form-control(name='password2',type='password')
br
input.btn.btn-primary(type='submit',value='Submit')
br
.card
h4 Check User Balance
form(method='POST', action='/admin/baluser')
#form-group
label Username:
input.form-control(name='name', type='name')
br
input.btn.btn-primary(type='submit',value='Submit')
br
.card
h4 Change Balance of User
form(method='POST', action='/admin/bal')
#form-group
label Username:
input.form-control(name='name', type='name')
label Set balance to:
input.form-control(name='amount', type='number')
br
input.btn.btn-primary(type='submit',value='Submit')
br
.card
h4 Delete user
p This will permanently delete user make sure you get it right
form(method='POST', action='/admin/userdelete')
#form-group
label Username:
input.form-control(name='name', type='name')
label Confirm Admin Password:
input.form-control(name='attempt', type='password')
br
input.btn.btn-primary(type='submit',value='Submit')
br
.card
h4 Close Server
form(method='POST', action='/admin/close')
#form-group
p WARNING THIS WILL CLOSE THE SERVER DOWN, IT WILL REQUIRE MANUAL RESTART
label Confirm admin password to shutdown
input.form-control(name='attempt', type='password')
br
input.btn.btn-danger(type='submit',value='Shutdown')

29
views/bankf.pug Normal file
View file

@ -0,0 +1,29 @@
extends layout
block content
.container
h1 Welcome to the bank interface #{user}
.card
h2 Send Funds
h4 Balance: #{balance}
form(method='POST', action='/sendfunds')
#form-group
label amount to send:
input(type="number" min="0" max=balance name="amount")
br
#form-group
label reciever:
input(name='name', type='text')
br
#form-group
label Your Password:
input(name='senderpass', type='password')
br
br
input.btn.btn-primary(type='submit', value='Submit')
br

13
views/index.pug Normal file
View file

@ -0,0 +1,13 @@
extends layout
block content
.container
h1 Welcome to CCashBank Front End
.card
center
h4 Is the server online?
if alive
h4 YES!
if !alive
H4 no :(

52
views/layout.pug Normal file
View file

@ -0,0 +1,52 @@
doctype html
html
head
title CCashBank
link(href="https://fonts.googleapis.com/css2?family=Josefin+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap" rel="stylesheet")
link(rel="stylesheet", href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css", integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z", crossorigin="anonymous")
link(rel='stylesheet' href='/css/style.css')
meta(name='viewport', content='width=device-width, initial-scale=1.0')
body
nav.navbar.navbar-expand-lg.navbar-light.bg-light
.container
a.navbar-brand(href='/')
img(src="./CCashLogo2.png" style="width:75px")
button.navbar-toggler(type='button', data-toggle='collapse', data-target='#navbars', aria-controls='navbars', aria-expanded='false', aria-label='Toggle navigation')
span.navbar-toggler-icon
#navbars.collapse.navbar-collapse
ul.navbar-nav.mr-auto
ul.navbar-nav.mr-right
if user == undefined
li.nav-item
a.nav-link(href='/login') Login
li.nav-item
a.nav-link(href='/register') Register
if user
li.nav-item
a.nav-link(href='/logout') Log out
li.nav-item
a.nav-link(href='/BankF') Bank Dashboard
li.nav-item
a.nav-link(href='/settings') Settings
if admin == true
li.nav-item
a.nav-link(href='/admin') Admin
.container
!= messages('message', locals)
if errors
each error, i in errors
div(class="alert alert-danger") #{error.msg}
if successes
each success, i in successes
div(class="alert alert-success") #{success.msg}
br
br
block content
br
hr
script(src="https://code.jquery.com/jquery-3.6.0.slim.min.js" integrity="sha256-u7e5khyithlIdTpu22PHhENmPcRdFiHRjhAuHcs05RI="
crossorigin="anonymous")
script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js", integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV", crossorigin="anonymous")

20
views/login.pug Normal file
View file

@ -0,0 +1,20 @@
extends layout
block content
.container
h1 Login
hr
p
form(method='POST', action='/login')
#form-group
label Username:
input.form-control(name='name', type='text')
br
#form-group
label Password:
input.form-control(name='password', type='password')
br
input.btn.btn-primary(type='submit', value='Submit')

20
views/register.pug Normal file
View file

@ -0,0 +1,20 @@
extends layout
block content
.container
h1 Register
form(method='POST', action='/register')
#form-group
label Username:
input.form-control(name='name', type='name')
label Password:
input.form-control(name='password',type='password')
label Confirm:
input.form-control(name='password2',type='password')
br
input.btn.btn-primary(type='submit',value='Submit')
br
br
p Have An Account?
a(href="/login").btn.btn-primary Login

18
views/settings.pug Normal file
View file

@ -0,0 +1,18 @@
extends layout
block content
.container
h1 Settings, logged in as: #{user}
.card
h4 Change password
form(method='POST', action='/settings/pass')
#form-group
label Current Password:
input.form-control(name='attempt', type='Password')
label New Password:
input.form-control(name='new_pass',type='password')
label Confirm:
input.form-control(name='password2',type='password')
br
input.btn.btn-primary(type='submit',value='Submit')

18
views/setup.pug Normal file
View file

@ -0,0 +1,18 @@
extends layout
block content
.container
h1 Welcome to CCashBank Front End SETUP
.card
form(method='POST', action='/setup')
#form-group
label BANKAPIURL:
input.form-control(name='url', type='url')
label SSH enabled on front end? leave unchecked if unsure:
input.form-control(name='secure', type='checkbox')
br
input.btn.btn-primary(type='submit',value='Submit')
br
br
h2 THESE SETTINGS WILL REQUIRE A RESTART TO APPLY