
12 changed files with 801 additions and 1 deletions
-
2.gitignore
-
1.npmrc
-
14config.js
-
98index.js
-
570package-lock.json
-
20package.json
-
3private.key
-
7public/css/app.css
-
10public/js/init.js
-
33readme.md
-
15views/editor.mustache
-
29views/index.mustache
@ -0,0 +1,2 @@ |
|||||
|
/node_modules |
||||
|
/*.log |
@ -0,0 +1 @@ |
|||||
|
package-lock=true |
@ -0,0 +1,14 @@ |
|||||
|
// Replace this with your api key from the "API Key Manager" at the tiny.cloud account page
|
||||
|
exports.apiKey = 'your-api-key'; |
||||
|
|
||||
|
// Replace the contents of the private.key file with the one from the "JWT Key Manager" at the tiny.cloud account page
|
||||
|
exports.privateKeyFile = ``; |
||||
|
|
||||
|
// This is the fake database that the login authenticates against
|
||||
|
exports.users = [ |
||||
|
{ login: 'johndoe', password: 'password', name: 'John Doe' }, |
||||
|
{ login: 'janedoe', password: 'password', name: 'Jane Doe' } |
||||
|
]; |
||||
|
|
||||
|
// If this is enabled the root of Tiny Drive will be within a directory named as the user login
|
||||
|
exports.scopeUser = false; |
@ -0,0 +1,98 @@ |
|||||
|
const express = require('express'); |
||||
|
const mustacheExpress = require('mustache-express'); |
||||
|
const portfinder = require('portfinder'); |
||||
|
const session = require('express-session'); |
||||
|
const jwt = require('jsonwebtoken'); |
||||
|
const config = require('./config'); |
||||
|
|
||||
|
const setupExpress = (port) => { |
||||
|
const app = express(); |
||||
|
|
||||
|
app.engine('mustache', mustacheExpress()); |
||||
|
app.set('view engine', 'mustache'); |
||||
|
app.set('views', __dirname + '/views'); |
||||
|
|
||||
|
app.set('trust proxy', 1); |
||||
|
app.use(session({ |
||||
|
secret: 'somesecret', |
||||
|
resave: false, |
||||
|
saveUninitialized: true, |
||||
|
cookie: { secure: false } |
||||
|
})); |
||||
|
|
||||
|
app.use(express.static('public')); |
||||
|
app.use(express.urlencoded({ extended: false })); |
||||
|
|
||||
|
setupRoutes(app); |
||||
|
|
||||
|
app.listen(port, () => console.log(`Tiny Drive starter project is now available at: http://localhost:${port}/`)); |
||||
|
}; |
||||
|
|
||||
|
const setupRoutes = (app) => { |
||||
|
app.get('/', (req, res) => { |
||||
|
res.render('index'); |
||||
|
}); |
||||
|
|
||||
|
app.get('/editor', (req, res) => { |
||||
|
if (req.session.user) { |
||||
|
res.render('editor', { apiKey: config.apiKey, user: req.session.user }); |
||||
|
} else { |
||||
|
res.redirect('/'); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
app.get('/logout', (req, res) => { |
||||
|
req.session.destroy(); |
||||
|
res.redirect('/'); |
||||
|
}); |
||||
|
|
||||
|
app.post('/jwt', (req, res) => { |
||||
|
const user = req.session.user; |
||||
|
if (user) { |
||||
|
const payload = { |
||||
|
sub: user.login, // Unique user id string
|
||||
|
name: user.name, // Full name of user
|
||||
|
exp: Math.floor(Date.now() / 1000) + (60 * 10) // 10 minutes expiration
|
||||
|
}; |
||||
|
|
||||
|
// Scopes the path to a specific user directory
|
||||
|
if (config.scopeUser) { |
||||
|
payload['https://claims.tiny.cloud/drive/root'] = `/${user.login}`; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
const privateKey = fs.readFileSync(config.privateKeyFile); |
||||
|
const token = jwt.sign(payload, privateKey, { algorithm: 'RS256'}); |
||||
|
res.json({ token }); |
||||
|
} catch (e) { |
||||
|
res.status(500); |
||||
|
res.send('Failed generate jwt token.'); |
||||
|
} |
||||
|
} else { |
||||
|
res.status(401); |
||||
|
res.send('Could not produce a jwt token since the user is not logged in.'); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
app.post('/', (req, res) => { |
||||
|
const user = config.users.find(({ login, password }) => login === req.body.login && password === req.body.password); |
||||
|
if (user) { |
||||
|
req.session.user = user; |
||||
|
res.redirect('/editor'); |
||||
|
} else { |
||||
|
res.render('index', { error: 'Incorrect username or password.' }) |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
portfinder.getPort({ |
||||
|
port: 3000, |
||||
|
stopPort: 4000 |
||||
|
}, (err, port) => { |
||||
|
if (err) { |
||||
|
console.error('Error:', err.message); |
||||
|
process.exit(-1); |
||||
|
} else { |
||||
|
setupExpress(port); |
||||
|
} |
||||
|
}); |
@ -0,0 +1,570 @@ |
|||||
|
{ |
||||
|
"name": "tinydrive-nodejs-starter", |
||||
|
"version": "1.0.0", |
||||
|
"lockfileVersion": 1, |
||||
|
"requires": true, |
||||
|
"dependencies": { |
||||
|
"accepts": { |
||||
|
"version": "1.3.5", |
||||
|
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", |
||||
|
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", |
||||
|
"requires": { |
||||
|
"mime-types": "~2.1.18", |
||||
|
"negotiator": "0.6.1" |
||||
|
} |
||||
|
}, |
||||
|
"array-flatten": { |
||||
|
"version": "1.1.1", |
||||
|
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", |
||||
|
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" |
||||
|
}, |
||||
|
"async": { |
||||
|
"version": "2.6.2", |
||||
|
"resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", |
||||
|
"integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", |
||||
|
"requires": { |
||||
|
"lodash": "^4.17.11" |
||||
|
} |
||||
|
}, |
||||
|
"body-parser": { |
||||
|
"version": "1.18.3", |
||||
|
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", |
||||
|
"integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", |
||||
|
"requires": { |
||||
|
"bytes": "3.0.0", |
||||
|
"content-type": "~1.0.4", |
||||
|
"debug": "2.6.9", |
||||
|
"depd": "~1.1.2", |
||||
|
"http-errors": "~1.6.3", |
||||
|
"iconv-lite": "0.4.23", |
||||
|
"on-finished": "~2.3.0", |
||||
|
"qs": "6.5.2", |
||||
|
"raw-body": "2.3.3", |
||||
|
"type-is": "~1.6.16" |
||||
|
} |
||||
|
}, |
||||
|
"buffer-equal-constant-time": { |
||||
|
"version": "1.0.1", |
||||
|
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", |
||||
|
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" |
||||
|
}, |
||||
|
"bytes": { |
||||
|
"version": "3.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", |
||||
|
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" |
||||
|
}, |
||||
|
"content-disposition": { |
||||
|
"version": "0.5.2", |
||||
|
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", |
||||
|
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" |
||||
|
}, |
||||
|
"content-type": { |
||||
|
"version": "1.0.4", |
||||
|
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", |
||||
|
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" |
||||
|
}, |
||||
|
"cookie": { |
||||
|
"version": "0.3.1", |
||||
|
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", |
||||
|
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" |
||||
|
}, |
||||
|
"cookie-signature": { |
||||
|
"version": "1.0.6", |
||||
|
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", |
||||
|
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" |
||||
|
}, |
||||
|
"crc": { |
||||
|
"version": "3.4.4", |
||||
|
"resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", |
||||
|
"integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" |
||||
|
}, |
||||
|
"debug": { |
||||
|
"version": "2.6.9", |
||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", |
||||
|
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", |
||||
|
"requires": { |
||||
|
"ms": "2.0.0" |
||||
|
} |
||||
|
}, |
||||
|
"depd": { |
||||
|
"version": "1.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", |
||||
|
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" |
||||
|
}, |
||||
|
"destroy": { |
||||
|
"version": "1.0.4", |
||||
|
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", |
||||
|
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" |
||||
|
}, |
||||
|
"ecdsa-sig-formatter": { |
||||
|
"version": "1.0.11", |
||||
|
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", |
||||
|
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", |
||||
|
"requires": { |
||||
|
"safe-buffer": "^5.0.1" |
||||
|
} |
||||
|
}, |
||||
|
"ee-first": { |
||||
|
"version": "1.1.1", |
||||
|
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", |
||||
|
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" |
||||
|
}, |
||||
|
"encodeurl": { |
||||
|
"version": "1.0.2", |
||||
|
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", |
||||
|
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" |
||||
|
}, |
||||
|
"escape-html": { |
||||
|
"version": "1.0.3", |
||||
|
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", |
||||
|
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" |
||||
|
}, |
||||
|
"etag": { |
||||
|
"version": "1.8.1", |
||||
|
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", |
||||
|
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" |
||||
|
}, |
||||
|
"express": { |
||||
|
"version": "4.16.4", |
||||
|
"resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", |
||||
|
"integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", |
||||
|
"requires": { |
||||
|
"accepts": "~1.3.5", |
||||
|
"array-flatten": "1.1.1", |
||||
|
"body-parser": "1.18.3", |
||||
|
"content-disposition": "0.5.2", |
||||
|
"content-type": "~1.0.4", |
||||
|
"cookie": "0.3.1", |
||||
|
"cookie-signature": "1.0.6", |
||||
|
"debug": "2.6.9", |
||||
|
"depd": "~1.1.2", |
||||
|
"encodeurl": "~1.0.2", |
||||
|
"escape-html": "~1.0.3", |
||||
|
"etag": "~1.8.1", |
||||
|
"finalhandler": "1.1.1", |
||||
|
"fresh": "0.5.2", |
||||
|
"merge-descriptors": "1.0.1", |
||||
|
"methods": "~1.1.2", |
||||
|
"on-finished": "~2.3.0", |
||||
|
"parseurl": "~1.3.2", |
||||
|
"path-to-regexp": "0.1.7", |
||||
|
"proxy-addr": "~2.0.4", |
||||
|
"qs": "6.5.2", |
||||
|
"range-parser": "~1.2.0", |
||||
|
"safe-buffer": "5.1.2", |
||||
|
"send": "0.16.2", |
||||
|
"serve-static": "1.13.2", |
||||
|
"setprototypeof": "1.1.0", |
||||
|
"statuses": "~1.4.0", |
||||
|
"type-is": "~1.6.16", |
||||
|
"utils-merge": "1.0.1", |
||||
|
"vary": "~1.1.2" |
||||
|
} |
||||
|
}, |
||||
|
"express-session": { |
||||
|
"version": "1.15.6", |
||||
|
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", |
||||
|
"integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", |
||||
|
"requires": { |
||||
|
"cookie": "0.3.1", |
||||
|
"cookie-signature": "1.0.6", |
||||
|
"crc": "3.4.4", |
||||
|
"debug": "2.6.9", |
||||
|
"depd": "~1.1.1", |
||||
|
"on-headers": "~1.0.1", |
||||
|
"parseurl": "~1.3.2", |
||||
|
"uid-safe": "~2.1.5", |
||||
|
"utils-merge": "1.0.1" |
||||
|
} |
||||
|
}, |
||||
|
"finalhandler": { |
||||
|
"version": "1.1.1", |
||||
|
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", |
||||
|
"integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", |
||||
|
"requires": { |
||||
|
"debug": "2.6.9", |
||||
|
"encodeurl": "~1.0.2", |
||||
|
"escape-html": "~1.0.3", |
||||
|
"on-finished": "~2.3.0", |
||||
|
"parseurl": "~1.3.2", |
||||
|
"statuses": "~1.4.0", |
||||
|
"unpipe": "~1.0.0" |
||||
|
} |
||||
|
}, |
||||
|
"forwarded": { |
||||
|
"version": "0.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", |
||||
|
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" |
||||
|
}, |
||||
|
"fresh": { |
||||
|
"version": "0.5.2", |
||||
|
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", |
||||
|
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" |
||||
|
}, |
||||
|
"http-errors": { |
||||
|
"version": "1.6.3", |
||||
|
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", |
||||
|
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", |
||||
|
"requires": { |
||||
|
"depd": "~1.1.2", |
||||
|
"inherits": "2.0.3", |
||||
|
"setprototypeof": "1.1.0", |
||||
|
"statuses": ">= 1.4.0 < 2" |
||||
|
} |
||||
|
}, |
||||
|
"iconv-lite": { |
||||
|
"version": "0.4.23", |
||||
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", |
||||
|
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", |
||||
|
"requires": { |
||||
|
"safer-buffer": ">= 2.1.2 < 3" |
||||
|
} |
||||
|
}, |
||||
|
"inherits": { |
||||
|
"version": "2.0.3", |
||||
|
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", |
||||
|
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" |
||||
|
}, |
||||
|
"ipaddr.js": { |
||||
|
"version": "1.8.0", |
||||
|
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", |
||||
|
"integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" |
||||
|
}, |
||||
|
"jsonwebtoken": { |
||||
|
"version": "8.5.0", |
||||
|
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", |
||||
|
"integrity": "sha512-IqEycp0znWHNA11TpYi77bVgyBO/pGESDh7Ajhas+u0ttkGkKYIIAjniL4Bw5+oVejVF+SYkaI7XKfwCCyeTuA==", |
||||
|
"requires": { |
||||
|
"jws": "^3.2.1", |
||||
|
"lodash.includes": "^4.3.0", |
||||
|
"lodash.isboolean": "^3.0.3", |
||||
|
"lodash.isinteger": "^4.0.4", |
||||
|
"lodash.isnumber": "^3.0.3", |
||||
|
"lodash.isplainobject": "^4.0.6", |
||||
|
"lodash.isstring": "^4.0.1", |
||||
|
"lodash.once": "^4.0.0", |
||||
|
"ms": "^2.1.1", |
||||
|
"semver": "^5.6.0" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"ms": { |
||||
|
"version": "2.1.1", |
||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", |
||||
|
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"jwa": { |
||||
|
"version": "1.3.0", |
||||
|
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.3.0.tgz", |
||||
|
"integrity": "sha512-SxObIyzv9a6MYuZYaSN6DhSm9j3+qkokwvCB0/OTSV5ylPq1wUQiygZQcHT5Qlux0I5kmISx3J86TxKhuefItg==", |
||||
|
"requires": { |
||||
|
"buffer-equal-constant-time": "1.0.1", |
||||
|
"ecdsa-sig-formatter": "1.0.11", |
||||
|
"safe-buffer": "^5.0.1" |
||||
|
} |
||||
|
}, |
||||
|
"jws": { |
||||
|
"version": "3.2.1", |
||||
|
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.1.tgz", |
||||
|
"integrity": "sha512-bGA2omSrFUkd72dhh05bIAN832znP4wOU3lfuXtRBuGTbsmNmDXMQg28f0Vsxaxgk4myF5YkKQpz6qeRpMgX9g==", |
||||
|
"requires": { |
||||
|
"jwa": "^1.2.0", |
||||
|
"safe-buffer": "^5.0.1" |
||||
|
} |
||||
|
}, |
||||
|
"lodash": { |
||||
|
"version": "4.17.11", |
||||
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", |
||||
|
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" |
||||
|
}, |
||||
|
"lodash.includes": { |
||||
|
"version": "4.3.0", |
||||
|
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", |
||||
|
"integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" |
||||
|
}, |
||||
|
"lodash.isboolean": { |
||||
|
"version": "3.0.3", |
||||
|
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", |
||||
|
"integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" |
||||
|
}, |
||||
|
"lodash.isinteger": { |
||||
|
"version": "4.0.4", |
||||
|
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", |
||||
|
"integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" |
||||
|
}, |
||||
|
"lodash.isnumber": { |
||||
|
"version": "3.0.3", |
||||
|
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", |
||||
|
"integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" |
||||
|
}, |
||||
|
"lodash.isplainobject": { |
||||
|
"version": "4.0.6", |
||||
|
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", |
||||
|
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" |
||||
|
}, |
||||
|
"lodash.isstring": { |
||||
|
"version": "4.0.1", |
||||
|
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", |
||||
|
"integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" |
||||
|
}, |
||||
|
"lodash.once": { |
||||
|
"version": "4.1.1", |
||||
|
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", |
||||
|
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" |
||||
|
}, |
||||
|
"lru-cache": { |
||||
|
"version": "4.1.5", |
||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", |
||||
|
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", |
||||
|
"requires": { |
||||
|
"pseudomap": "^1.0.2", |
||||
|
"yallist": "^2.1.2" |
||||
|
} |
||||
|
}, |
||||
|
"media-typer": { |
||||
|
"version": "0.3.0", |
||||
|
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", |
||||
|
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" |
||||
|
}, |
||||
|
"merge-descriptors": { |
||||
|
"version": "1.0.1", |
||||
|
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", |
||||
|
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" |
||||
|
}, |
||||
|
"methods": { |
||||
|
"version": "1.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", |
||||
|
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" |
||||
|
}, |
||||
|
"mime": { |
||||
|
"version": "1.4.1", |
||||
|
"resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", |
||||
|
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" |
||||
|
}, |
||||
|
"mime-db": { |
||||
|
"version": "1.38.0", |
||||
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", |
||||
|
"integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" |
||||
|
}, |
||||
|
"mime-types": { |
||||
|
"version": "2.1.22", |
||||
|
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", |
||||
|
"integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", |
||||
|
"requires": { |
||||
|
"mime-db": "~1.38.0" |
||||
|
} |
||||
|
}, |
||||
|
"minimist": { |
||||
|
"version": "0.0.8", |
||||
|
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", |
||||
|
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" |
||||
|
}, |
||||
|
"mkdirp": { |
||||
|
"version": "0.5.1", |
||||
|
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", |
||||
|
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", |
||||
|
"requires": { |
||||
|
"minimist": "0.0.8" |
||||
|
} |
||||
|
}, |
||||
|
"ms": { |
||||
|
"version": "2.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", |
||||
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" |
||||
|
}, |
||||
|
"mustache": { |
||||
|
"version": "2.3.2", |
||||
|
"resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", |
||||
|
"integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==" |
||||
|
}, |
||||
|
"mustache-express": { |
||||
|
"version": "1.2.8", |
||||
|
"resolved": "https://registry.npmjs.org/mustache-express/-/mustache-express-1.2.8.tgz", |
||||
|
"integrity": "sha512-QUwqtyi7ctV+LZCTVjz/A6XXhsGsSy9p1V3RzrYDIMfXsloLsGI62mVqNXnJ0pRHiiXZoEuV1O4NfT7+UDGZgg==", |
||||
|
"requires": { |
||||
|
"async": "~2.6.0", |
||||
|
"lru-cache": "~4.1.3", |
||||
|
"mustache": "~2.3.0" |
||||
|
} |
||||
|
}, |
||||
|
"negotiator": { |
||||
|
"version": "0.6.1", |
||||
|
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", |
||||
|
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" |
||||
|
}, |
||||
|
"on-finished": { |
||||
|
"version": "2.3.0", |
||||
|
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", |
||||
|
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", |
||||
|
"requires": { |
||||
|
"ee-first": "1.1.1" |
||||
|
} |
||||
|
}, |
||||
|
"on-headers": { |
||||
|
"version": "1.0.2", |
||||
|
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", |
||||
|
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" |
||||
|
}, |
||||
|
"parseurl": { |
||||
|
"version": "1.3.2", |
||||
|
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", |
||||
|
"integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" |
||||
|
}, |
||||
|
"path-to-regexp": { |
||||
|
"version": "0.1.7", |
||||
|
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", |
||||
|
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" |
||||
|
}, |
||||
|
"portfinder": { |
||||
|
"version": "1.0.20", |
||||
|
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", |
||||
|
"integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", |
||||
|
"requires": { |
||||
|
"async": "^1.5.2", |
||||
|
"debug": "^2.2.0", |
||||
|
"mkdirp": "0.5.x" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"async": { |
||||
|
"version": "1.5.2", |
||||
|
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", |
||||
|
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"proxy-addr": { |
||||
|
"version": "2.0.4", |
||||
|
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", |
||||
|
"integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", |
||||
|
"requires": { |
||||
|
"forwarded": "~0.1.2", |
||||
|
"ipaddr.js": "1.8.0" |
||||
|
} |
||||
|
}, |
||||
|
"pseudomap": { |
||||
|
"version": "1.0.2", |
||||
|
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", |
||||
|
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" |
||||
|
}, |
||||
|
"qs": { |
||||
|
"version": "6.5.2", |
||||
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", |
||||
|
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" |
||||
|
}, |
||||
|
"random-bytes": { |
||||
|
"version": "1.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", |
||||
|
"integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" |
||||
|
}, |
||||
|
"range-parser": { |
||||
|
"version": "1.2.0", |
||||
|
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", |
||||
|
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" |
||||
|
}, |
||||
|
"raw-body": { |
||||
|
"version": "2.3.3", |
||||
|
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", |
||||
|
"integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", |
||||
|
"requires": { |
||||
|
"bytes": "3.0.0", |
||||
|
"http-errors": "1.6.3", |
||||
|
"iconv-lite": "0.4.23", |
||||
|
"unpipe": "1.0.0" |
||||
|
} |
||||
|
}, |
||||
|
"safe-buffer": { |
||||
|
"version": "5.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", |
||||
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" |
||||
|
}, |
||||
|
"safer-buffer": { |
||||
|
"version": "2.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |
||||
|
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" |
||||
|
}, |
||||
|
"semver": { |
||||
|
"version": "5.6.0", |
||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", |
||||
|
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" |
||||
|
}, |
||||
|
"send": { |
||||
|
"version": "0.16.2", |
||||
|
"resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", |
||||
|
"integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", |
||||
|
"requires": { |
||||
|
"debug": "2.6.9", |
||||
|
"depd": "~1.1.2", |
||||
|
"destroy": "~1.0.4", |
||||
|
"encodeurl": "~1.0.2", |
||||
|
"escape-html": "~1.0.3", |
||||
|
"etag": "~1.8.1", |
||||
|
"fresh": "0.5.2", |
||||
|
"http-errors": "~1.6.2", |
||||
|
"mime": "1.4.1", |
||||
|
"ms": "2.0.0", |
||||
|
"on-finished": "~2.3.0", |
||||
|
"range-parser": "~1.2.0", |
||||
|
"statuses": "~1.4.0" |
||||
|
} |
||||
|
}, |
||||
|
"serve-static": { |
||||
|
"version": "1.13.2", |
||||
|
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", |
||||
|
"integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", |
||||
|
"requires": { |
||||
|
"encodeurl": "~1.0.2", |
||||
|
"escape-html": "~1.0.3", |
||||
|
"parseurl": "~1.3.2", |
||||
|
"send": "0.16.2" |
||||
|
} |
||||
|
}, |
||||
|
"setprototypeof": { |
||||
|
"version": "1.1.0", |
||||
|
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", |
||||
|
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" |
||||
|
}, |
||||
|
"statuses": { |
||||
|
"version": "1.4.0", |
||||
|
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", |
||||
|
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" |
||||
|
}, |
||||
|
"type-is": { |
||||
|
"version": "1.6.16", |
||||
|
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", |
||||
|
"integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", |
||||
|
"requires": { |
||||
|
"media-typer": "0.3.0", |
||||
|
"mime-types": "~2.1.18" |
||||
|
} |
||||
|
}, |
||||
|
"uid-safe": { |
||||
|
"version": "2.1.5", |
||||
|
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", |
||||
|
"integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", |
||||
|
"requires": { |
||||
|
"random-bytes": "~1.0.0" |
||||
|
} |
||||
|
}, |
||||
|
"unpipe": { |
||||
|
"version": "1.0.0", |
||||
|
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", |
||||
|
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" |
||||
|
}, |
||||
|
"utils-merge": { |
||||
|
"version": "1.0.1", |
||||
|
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", |
||||
|
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" |
||||
|
}, |
||||
|
"vary": { |
||||
|
"version": "1.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", |
||||
|
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" |
||||
|
}, |
||||
|
"yallist": { |
||||
|
"version": "2.1.2", |
||||
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", |
||||
|
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,20 @@ |
|||||
|
{ |
||||
|
"name": "tinydrive-nodejs-starter", |
||||
|
"private": true, |
||||
|
"version": "1.0.0", |
||||
|
"description": "", |
||||
|
"main": "index.js", |
||||
|
"scripts": { |
||||
|
"start": "node index" |
||||
|
}, |
||||
|
"keywords": [], |
||||
|
"author": "Tiny Technologies Inc", |
||||
|
"license": "MIT", |
||||
|
"dependencies": { |
||||
|
"express": "^4.16.4", |
||||
|
"express-session": "^1.15.6", |
||||
|
"jsonwebtoken": "^8.5.0", |
||||
|
"mustache-express": "^1.2.8", |
||||
|
"portfinder": "^1.0.20" |
||||
|
} |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
-----BEGIN PRIVATE KEY----- |
||||
|
... |
||||
|
-----END PRIVATE KEY----- |
@ -0,0 +1,7 @@ |
|||||
|
body { |
||||
|
font-family: sans-serif; |
||||
|
} |
||||
|
|
||||
|
.logout { |
||||
|
font-size: 16px; |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
tinymce.init({ |
||||
|
selector: 'textarea', |
||||
|
plugins: 'tinydrive code image link media', |
||||
|
toolbar: 'insertfile | undo redo | link image media | code', |
||||
|
height: 600, |
||||
|
// Tiny Drive specific options for more details on what these does check https://www.tiny.cloud/docs/plugins/drive/
|
||||
|
tinydrive_token_provider: '/jwt', |
||||
|
// tinydrive_upload_path: '/uploads',
|
||||
|
// tinydrive_max_image_dimension: 1024
|
||||
|
}); |
@ -1,3 +1,34 @@ |
|||||
# Tiny Drive NodeJS Starter Project |
# Tiny Drive NodeJS Starter Project |
||||
|
|
||||
.... |
|
||||
|
This project will help you get started with Tiny Drive and allow you to play around with it's features. |
||||
|
|
||||
|
## Pre requirements |
||||
|
|
||||
|
NodeJS 11 on any supported platform. |
||||
|
|
||||
|
These are the steps needed to get this project running on your machine: |
||||
|
|
||||
|
## Getting started steps |
||||
|
|
||||
|
### 1. Clone this repo to your local machine using |
||||
|
|
||||
|
``` |
||||
|
$ git clone git@github.com:tinymce/tinydrive-nodejs-starter.git |
||||
|
``` |
||||
|
|
||||
|
### 2. Change the `apiKey` in `config.js` |
||||
|
|
||||
|
You get the api key from the `API Key Manager` account manager at http://tiny.cloud. |
||||
|
|
||||
|
### 3. Replace the `private.key` file with your generated private RSA key |
||||
|
|
||||
|
You get the private RSA key from the `JWT Key Manager` account manager at http://tiny.cloud. |
||||
|
|
||||
|
### 4. Go to the directory and start the dev server |
||||
|
|
||||
|
``` |
||||
|
$ cd tinydrive-nodejs-starter |
||||
|
$ node index.js |
||||
|
``` |
||||
|
|
||||
|
### 5. Open the example project at http://localhost:3000 |
@ -0,0 +1,15 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en"> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>Editor</title> |
||||
|
<link rel="stylesheet" href="/css/app.css"> |
||||
|
</head> |
||||
|
<body> |
||||
|
<h1>Welcome {{user.name}} <a class="logout" href="/logout">Logout</a></h1> |
||||
|
<p>TinyMCE editor instance setup with Tiny Drive integated into the link, image and media dialogs and with a separate direct insertfile button.</p> |
||||
|
<textarea></textarea> |
||||
|
<script src="https://cloud.tinymce.com/5/tinymce.min.js?apiKey={{apiKey}}"></script> |
||||
|
<script src="/js/init.js"></script> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,29 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en"> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>Login</title> |
||||
|
<link rel="stylesheet" href="/css/app.css"> |
||||
|
</head> |
||||
|
<body> |
||||
|
<form method="post" action="/"> |
||||
|
{{#error}} |
||||
|
<div>{{error}}</div> |
||||
|
{{/error}} |
||||
|
|
||||
|
<p>Login with the user/passwords available in the config.js file</p> |
||||
|
|
||||
|
<div> |
||||
|
<label for="login">User:</label> |
||||
|
<input type="text" id="login" name="login" value="johndoe"> |
||||
|
</div> |
||||
|
|
||||
|
<div> |
||||
|
<label for="password">Password:</label> |
||||
|
<input type="password" id="password" name="password" value="password"> |
||||
|
</div> |
||||
|
|
||||
|
<input type="submit" value="Login"> |
||||
|
</form> |
||||
|
</body> |
||||
|
</html> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue