URL shortener
This commit is contained in:
parent
b69184eaea
commit
20593c5ecc
@ -5,6 +5,7 @@ const fsa = require('fs')
|
||||
const fs = fsa.promises
|
||||
const sqlite = require('sqlite')
|
||||
const crypto = require('crypto')
|
||||
const URL = require('url')
|
||||
|
||||
const router = express.Router()
|
||||
const cfgLoader = require(path.join('..', '..', 'config-loader'))(path.join(__dirname, 'config.json'), {
|
||||
@ -12,6 +13,10 @@ const cfgLoader = require(path.join('..', '..', 'config-loader'))(path.join(__di
|
||||
root: './files',
|
||||
expiry: 2246400,
|
||||
gateway: 'https://distributed.icynet.eu',
|
||||
shortener: {
|
||||
url: 'https://go.lunasqu.ee',
|
||||
bytes: 2,
|
||||
},
|
||||
tokens: {}
|
||||
})
|
||||
|
||||
@ -155,6 +160,58 @@ async function init () {
|
||||
res.send(uploadedFiles.join('\n'))
|
||||
})
|
||||
|
||||
router.post('/shorten', async (req, res) => {
|
||||
let ip = req.ip
|
||||
let url = req.body.url
|
||||
|
||||
// Simple URL validator
|
||||
try {
|
||||
let a = new URL(url)
|
||||
if (a.protocol.indexOf('http') !== 0 || a.protocol.indexOf('ftp') !== -1) {
|
||||
throw new Error('Unsupported protocol')
|
||||
}
|
||||
} catch (e) {
|
||||
throw new Error('Invalid URL!')
|
||||
}
|
||||
|
||||
let db = await dbPromise
|
||||
|
||||
// Get a hash that isnt in use
|
||||
let use
|
||||
for (let i = 0; i < 8; i++) {
|
||||
let add = Math.floor(i / 2)
|
||||
let hash = crypto.randomBytes((config.shortener.bytes || 2) + add).toString('hex')
|
||||
let exists = await db.get('SELECT timeat FROM Short WHERE hash = ?', hash)
|
||||
if (!exists) {
|
||||
use = hash
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (!use) throw new Error('Server could not find a proper hash for some reason')
|
||||
|
||||
await db.run('INSERT INTO Short (url,hash,timeat,ip) VALUES (?,?,?,?)', url, use, Date.now(), ip)
|
||||
|
||||
let ua = req.get('User-Agent')
|
||||
let reqRaw = false
|
||||
if (!reqRaw && ua && (ua.match(/curl\//i) != null || ua.match(/wget\//i) != null)) reqRaw = true
|
||||
let resp = config.shortener.url + '/' + use
|
||||
if (!reqRaw) resp = '<a href="' + resp + '" rel="nofollow">' + resp + '</a>'
|
||||
res.send(resp)
|
||||
})
|
||||
|
||||
router.get('/shorten/:hash', async (req, res) => {
|
||||
let hash = req.params.hash
|
||||
let db = await dbPromise
|
||||
let get = await db.get('SELECT url FROM Short WHERE hash = ?', hash)
|
||||
if (!get) throw new Error('No such hash exists in the database.')
|
||||
res.redirect(get.url)
|
||||
})
|
||||
|
||||
router.get('/shorten', (req, res) => {
|
||||
res.send('<h1>Basic URL Shortener</h1><form action=""><input type="url" name="url" placeholder="URL to shorten"/><input type="submit" value="Go!"></form>')
|
||||
})
|
||||
|
||||
return router
|
||||
}
|
||||
|
||||
|
11
applications/tempfiles/migrations/003-shorten.sql
Normal file
11
applications/tempfiles/migrations/003-shorten.sql
Normal file
@ -0,0 +1,11 @@
|
||||
-- Up
|
||||
|
||||
CREATE TABLE Short (
|
||||
url TEXT,
|
||||
hash TEXT,
|
||||
timeat TEXT,
|
||||
ip TEXT
|
||||
);
|
||||
|
||||
-- Down
|
||||
DROP TABLE Short;
|
Loading…
Reference in New Issue
Block a user