From cb622ebea0b734a44a0a683bcb9eb0b0fca512e0 Mon Sep 17 00:00:00 2001 From: Gregory Ballantine Date: Tue, 24 May 2022 18:41:43 -0400 Subject: [PATCH] Added Twig templating engine for handling views; Removed some unneeded CoffeeScript files --- archon.js | 19 ++++++ assets/coffee/archon.coffee | 4 +- assets/coffee/index.coffee | 44 -------------- assets/coffee/login.coffee | 30 ---------- assets/coffee/user.coffee | 9 --- index.js | 11 ---- package-lock.json | 115 ++++++++++++++++++++++++++++++++---- package.json | 7 ++- routes/index.js | 2 +- views/index.twig | 34 +++++++++++ views/layout.twig | 32 ++++++++++ 11 files changed, 194 insertions(+), 113 deletions(-) create mode 100644 archon.js delete mode 100644 assets/coffee/index.coffee delete mode 100644 assets/coffee/login.coffee delete mode 100644 assets/coffee/user.coffee delete mode 100644 index.js create mode 100644 views/index.twig create mode 100644 views/layout.twig diff --git a/archon.js b/archon.js new file mode 100644 index 0000000..c51116b --- /dev/null +++ b/archon.js @@ -0,0 +1,19 @@ +const express = require('express'); +const app = express(); +const port = 3000; + +// Initialize the Twig template engine - this might get swapped for Twing later. +app.set('view engine', 'twig'); + +// Service static files from public/ +app.use(express.static('public')); + +// Load in route handlers +indexRoutes = require('./routes/index'); + +// Assign routes to handlers +app.get('/', indexRoutes.home); + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}); diff --git a/assets/coffee/archon.coffee b/assets/coffee/archon.coffee index ea75851..6586955 100644 --- a/assets/coffee/archon.coffee +++ b/assets/coffee/archon.coffee @@ -1,2 +1,2 @@ -@loadPage = (pagePath) -> - window.location.href = pagePath + '.html' +window.onload = () -> + console.log('Test.') diff --git a/assets/coffee/index.coffee b/assets/coffee/index.coffee deleted file mode 100644 index c4090d0..0000000 --- a/assets/coffee/index.coffee +++ /dev/null @@ -1,44 +0,0 @@ -ldap = require('ldapjs') - -userTable = {} - -window.onload = -> - document.getElementById('ldapHost').textContent = localStorage.getItem('ldap_hostname') - userTable = document.getElementById('ldapUserList') - ldapGetUserList() - return - -searchOpts = - filter: '(objectClass=posixAccount)' - scope: 'sub' - attributes: ['uid', 'displayName', 'mail'] - -ldapGetUserList = () -> - client = ldap.createClient(url: 'ldap://' + localStorage.getItem('ldap_hostname') + '/') - client.bind(localStorage.getItem('ldap_bind_dn'), localStorage.getItem('ldap_bind_pw'), (err) -> - if err - document.querySelector('h1').textContent = 'error' - return - else - client.search('ou=People,' + localStorage.getItem('ldap_base_dn'), searchOpts, (err, res) -> - if err - console.log(err) - return - else - res.on('searchEntry', (entry) -> - userEntry = document.createElement('tr') - - userUid = document.createElement('td') - userUid.innerText = entry.object.uid - userEntry.appendChild(userUid) - userName = document.createElement('td') - userName.innerText = entry.object.displayName - userEntry.appendChild(userName) - userMail = document.createElement('td') - userMail.innerText = entry.object.mail - userEntry.appendChild(userMail) - - userTable.appendChild(userEntry) - ) - ) - ) diff --git a/assets/coffee/login.coffee b/assets/coffee/login.coffee deleted file mode 100644 index 523ea18..0000000 --- a/assets/coffee/login.coffee +++ /dev/null @@ -1,30 +0,0 @@ -ldap = require('ldapjs') - -loginForm = (event) -> - event.preventDefault() - bindHost = document.forms.loginForm.ldap_host.value - bindDn = document.forms.loginForm.bind_dn.value - bindPw = document.forms.loginForm.bind_pw.value - client = ldap.createClient(url: 'ldap://' + bindHost + '/') - client.bind bindDn, bindPw, (err) -> - if err - document.querySelector('h1').textContent = 'error' - else - document.querySelector('h1').textContent = 'Logged in!' - bindDn = document.forms.loginForm.bind_dn.value - baseDnBits = bindDn.split(',') - baseDnBits.shift() - baseDn = baseDnBits.join(',') - - localStorage.setItem('ldap_hostname', document.forms.loginForm.ldap_host.value) - localStorage.setItem('ldap_bind_dn', bindDn) - localStorage.setItem('ldap_bind_pw', document.forms.loginForm.bind_pw.value) - localStorage.setItem('ldap_base_dn', baseDn) - - loadPage('index') - return - return - -window.onload = -> - document.getElementById('loginForm').addEventListener('submit', loginForm) - return diff --git a/assets/coffee/user.coffee b/assets/coffee/user.coffee deleted file mode 100644 index cd867cf..0000000 --- a/assets/coffee/user.coffee +++ /dev/null @@ -1,9 +0,0 @@ -userCreateFormSubmit = (e) -> - e.preventDefault() - - user_uid = document.forms.createUserForm.user_username.value - console.log(user_uid) - -window.onload = -> - document.getElementById('createUserForm').addEventListener('submit', userCreateFormSubmit) - return diff --git a/index.js b/index.js deleted file mode 100644 index 1ad6de3..0000000 --- a/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const express = require('express'); -const app = express(); -const port = 3000; - -indexRoutes = require('./routes/index'); - -app.get('/', indexRoutes.home); - -app.listen(port, () => { - console.log(`Example app listening on port ${port}`) -}); diff --git a/package-lock.json b/package-lock.json index 0f3e85b..c33c598 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "BSD-2-Clause", "dependencies": { "express": "^4.18.1", - "grunt-dart-sass": "^2.0.1" + "grunt-dart-sass": "^2.0.1", + "twig": "^1.15.4" }, "devDependencies": { "grunt": "^1.5.3", @@ -18,6 +19,17 @@ "grunt-contrib-watch": "^1.1.0" } }, + "node_modules/@babel/runtime": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", + "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -104,8 +116,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -174,7 +185,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -289,8 +299,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "node_modules/content-disposition": { "version": "0.5.4", @@ -617,6 +626,11 @@ "node": ">=0.10.0" } }, + "node_modules/foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1339,6 +1353,14 @@ "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", "dev": true }, + "node_modules/locutus": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/locutus/-/locutus-2.0.16.tgz", + "integrity": "sha512-pGfl6Hb/1mXLzrX5kl5lH7gz25ey0vwQssZp8Qo2CEF59di6KrAgdFm+0pW8ghLnvNzzJGj5tlWhhv2QbK3jeQ==", + "engines": { + "node": ">= 10" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -1479,7 +1501,6 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1810,6 +1831,11 @@ "node": ">= 0.10" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, "node_modules/resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -2068,6 +2094,23 @@ "node": ">=0.6" } }, + "node_modules/twig": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/twig/-/twig-1.15.4.tgz", + "integrity": "sha512-gRpGrpdf+MswqF6eSjEdYZTa/jt3ZWHK/NU59IbTYJMBQXJ1W+7IxaGEwLkQjd+mNT15j9sQTzQumxUBkuQueQ==", + "dependencies": { + "@babel/runtime": "^7.8.4", + "locutus": "^2.0.11", + "minimatch": "3.0.x", + "walk": "2.3.x" + }, + "bin": { + "twigjs": "bin/twigjs" + }, + "engines": { + "node": ">=8.16" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2172,6 +2215,14 @@ "node": ">= 0.8" } }, + "node_modules/walk": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", + "dependencies": { + "foreachasync": "^3.0.0" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -2215,6 +2266,14 @@ } }, "dependencies": { + "@babel/runtime": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", + "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2286,8 +2345,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "binary-extensions": { "version": "2.2.0", @@ -2348,7 +2406,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2430,8 +2487,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "content-disposition": { "version": "0.5.4", @@ -2686,6 +2742,11 @@ "for-in": "^1.0.1" } }, + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3238,6 +3299,11 @@ "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", "dev": true }, + "locutus": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/locutus/-/locutus-2.0.16.tgz", + "integrity": "sha512-pGfl6Hb/1mXLzrX5kl5lH7gz25ey0vwQssZp8Qo2CEF59di6KrAgdFm+0pW8ghLnvNzzJGj5tlWhhv2QbK3jeQ==" + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -3351,7 +3417,6 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3592,6 +3657,11 @@ "resolve": "^1.9.0" } }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, "resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -3789,6 +3859,17 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "twig": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/twig/-/twig-1.15.4.tgz", + "integrity": "sha512-gRpGrpdf+MswqF6eSjEdYZTa/jt3ZWHK/NU59IbTYJMBQXJ1W+7IxaGEwLkQjd+mNT15j9sQTzQumxUBkuQueQ==", + "requires": { + "@babel/runtime": "^7.8.4", + "locutus": "^2.0.11", + "minimatch": "3.0.x", + "walk": "2.3.x" + } + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -3873,6 +3954,14 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "walk": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", + "requires": { + "foreachasync": "^3.0.0" + } + }, "websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", diff --git a/package.json b/package.json index adc4686..e733713 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "name": "archon", "version": "0.1.0", "description": "A web-based LDAP user and group manager", - "main": "index.js", + "main": "archon.js", "scripts": { - "start": "node index.js", + "start": "node archon.js", "test": "echo \"Error: no test specified\" && exit 1", "grunt": "grunt" }, @@ -16,7 +16,8 @@ "license": "BSD-2-Clause", "dependencies": { "express": "^4.18.1", - "grunt-dart-sass": "^2.0.1" + "grunt-dart-sass": "^2.0.1", + "twig": "^1.15.4" }, "devDependencies": { "grunt": "^1.5.3", diff --git a/routes/index.js b/routes/index.js index 4e8e33f..fb169d2 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,3 +1,3 @@ exports.home = function(req, res, next) { - res.send('Hello World!'); + res.render('index'); }; diff --git a/views/index.twig b/views/index.twig new file mode 100644 index 0000000..59991d2 --- /dev/null +++ b/views/index.twig @@ -0,0 +1,34 @@ +{% extends 'layout.twig' %} + +{% block content %} +
+
+

Archon LDAP Manager

+
+
+ +
+
+

Connected to:

+
+
+ +
+ +
+ +
+ + + + + + + + + +
User IDDisplay NameEmail Address
+
+{% endblock %} diff --git a/views/layout.twig b/views/layout.twig new file mode 100644 index 0000000..da9c43b --- /dev/null +++ b/views/layout.twig @@ -0,0 +1,32 @@ + + + + + + + Archon LDAP Manager + + {% block scripts %}{% endblock %} + + +
+ {% block content %}{% endblock %} +
+ + + +