diff --git a/.gitattributes b/.gitattributes index 140b571..e54da31 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,3 @@ -server/uploads/* linguist-vendored +src/server/uploads/* linguist-vendored .github/* linguist-vendored -server/views/* linguist-vendored +src/server/views/* linguist-vendored \ No newline at end of file diff --git a/.gitignore b/.gitignore index 18eb16b..9cb3b56 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -/node_modules -config.real.json -package-lock.json \ No newline at end of file +src/node_modules +src/config.real.json +src/package-lock.json \ No newline at end of file diff --git a/Images_and_Files.sxcu b/Images_and_Files.sxcu new file mode 100644 index 0000000..b41c309 --- /dev/null +++ b/Images_and_Files.sxcu @@ -0,0 +1,12 @@ +{ + "Version": "12.4.0", + "Name": "Images_and_Files", + "DestinationType": "ImageUploader, FileUploader", + "RequestMethod": "POST", + "RequestURL": "http://[YOUR_DOMAIN]/api/files", + "Body": "MultipartFormData", + "Arguments": { + "key": "YOUR_PASSWORD" + }, + "FileFormName": "fdata" +} \ No newline at end of file diff --git a/Text.sxcu b/Text.sxcu new file mode 100644 index 0000000..a9cde4e --- /dev/null +++ b/Text.sxcu @@ -0,0 +1,12 @@ +{ + "Version": "12.4.0", + "Name": "Text", + "DestinationType": "TextUploader", + "RequestMethod": "POST", + "RequestURL": "http://[YOUR_DOMAIN]/api/paste", + "Body": "MultipartFormData", + "Arguments": { + "key": "YOUR_PASSWORD" + }, + "FileFormName": "fdata" +} \ No newline at end of file diff --git a/URL_Shortener.sxcu b/URL_Shortener.sxcu new file mode 100644 index 0000000..72a6471 --- /dev/null +++ b/URL_Shortener.sxcu @@ -0,0 +1,15 @@ +{ + "Version": "12.4.0", + "Name": "URL_Shortener", + "DestinationType": "URLShortener", + "RequestMethod": "POST", + "RequestURL": "http://[YOUR_DOMAIN]/api/shortener", + "Headers": { + "url": "$input$" + }, + "Body": "MultipartFormData", + "Arguments": { + "key": "YOUR_PASSWORD" + }, + "FileFormName": "fdata" +} \ No newline at end of file diff --git a/server/routes/paste.js b/server/routes/paste.js deleted file mode 100644 index 6a65eb4..0000000 --- a/server/routes/paste.js +++ /dev/null @@ -1,64 +0,0 @@ -const path = require("path") -const formidable = require("formidable") -const fs = require("fs-extra") -const ejs = require("ejs") -async function paste(req, res) { - res.setHeader("Content-Type", "text/text") - let fileName = this.randomToken(5) // 916,132,832 possible file names - let form = new formidable.IncomingForm() - form.parse(req, (err, fields, files) => { - let userIP = req.headers["x-forwarded-for"] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress - if (!this.auth(this.c.key, fields.key, this.c)) { - res.statusCode = 401 - res.write("Unauthorized"); - res.end(); - return this.log.warning(`Unauthorized User | File Upload | ${userIP}`) - } - this.db.get("files") - .push({path: `/${fileName}`, ip: userIP, views: 0}) - .write(); - let oldpath = files.fdata.path - let newpath = `${__dirname}/../uploads/${fileName+files.fdata.name.toString().match(/(\.)+([a-zA-Z0-9]+)+/g, "").toString()}`; - if (!this.c.paste.allowed.includes(files.fdata.name.substring(files.fdata.name.lastIndexOf(".") + 1, files.fdata.name.length))) { - res.statusCode = 415 - res.write(`http://${req.headers.host}/ERR_ILLEGAL_FILE_TYPE`) - return res.end() - } else { - if (Math.round((files.fdata.size / 1024) / 1000) > this.c.paste.max_upload_size) { - if (this.monitorChannel !== null) this.bot.createMessage(this.monitorChannel, `\`\`\`MARKDOWN\n[FAILED PASTE][USER]\n[FILE](${files.fdata.name})\n[SIZE](${Math.round(files.fdata.size/1024)}KB)\n[TYPE](${files.fdata.type})\n[IP](${userIP})\n\n[ERROR](ERR_FILE_TOO_BIG)\`\`\``) - res.statusCode = 413 - res.write(`http://${req.headers.host}/ERR_FILE_TOO_BIG`) - return res.end() - } else { - let lv = this.log.verbose - let le = this.log.error - fs.move(oldpath, newpath, err => { - fs.readFile(newpath, "utf-8", function read(err, data) { - let stream = fs.createWriteStream(`${__dirname}/../uploads/${fileName}.html`) - stream.once("open", fd => { - let cleaned = data.replace(/>/g, ">") - cleaned = cleaned.replace(/ { - stream.write(str) - }) - stream.end() - fs.unlink(newpath, err => { - if (err) return //le(err) - }); - //lv(`New Paste: http://${req.headers.host}/${fileName} | IP: ${userIP}`) - let insecure = `http://${req.headers.host}/${fileName}` - let secure = `https://${req.headers.host}/${fileName}` - res.write(req.secure ? secure : insecure) - //if (this.monitorChannel !== null) this.bot.createMessage(this.monitorChannel, `\`\`\`MARKDOWN\n[NEW PASTE]\n[IP](${userIP})\n\`\`\`\nhttp://${req.headers.host}/${fileName}`) - return res.end() - }) - }) - }) - } - } - }) -} -module.exports = paste \ No newline at end of file diff --git a/bot/commands/banIP.js b/src/bot/commands/banIP.js similarity index 100% rename from bot/commands/banIP.js rename to src/bot/commands/banIP.js diff --git a/bot/commands/deleteFile.js b/src/bot/commands/deleteFile.js similarity index 100% rename from bot/commands/deleteFile.js rename to src/bot/commands/deleteFile.js diff --git a/bot/commands/eval.js b/src/bot/commands/eval.js similarity index 100% rename from bot/commands/eval.js rename to src/bot/commands/eval.js diff --git a/bot/commands/exec.js b/src/bot/commands/exec.js similarity index 100% rename from bot/commands/exec.js rename to src/bot/commands/exec.js diff --git a/bot/commands/help.js b/src/bot/commands/help.js similarity index 100% rename from bot/commands/help.js rename to src/bot/commands/help.js diff --git a/bot/commands/recentVisitors.js b/src/bot/commands/recentVisitors.js similarity index 100% rename from bot/commands/recentVisitors.js rename to src/bot/commands/recentVisitors.js diff --git a/bot/commands/restart.js b/src/bot/commands/restart.js similarity index 100% rename from bot/commands/restart.js rename to src/bot/commands/restart.js diff --git a/bot/commands/trafficfor.js b/src/bot/commands/trafficfor.js similarity index 100% rename from bot/commands/trafficfor.js rename to src/bot/commands/trafficfor.js diff --git a/bot/commands/unbanIP.js b/src/bot/commands/unbanIP.js similarity index 100% rename from bot/commands/unbanIP.js rename to src/bot/commands/unbanIP.js diff --git a/bot/events/index.js b/src/bot/events/index.js similarity index 100% rename from bot/events/index.js rename to src/bot/events/index.js diff --git a/bot/events/messageCreate.js b/src/bot/events/messageCreate.js similarity index 100% rename from bot/events/messageCreate.js rename to src/bot/events/messageCreate.js diff --git a/bot/events/ready.js b/src/bot/events/ready.js similarity index 100% rename from bot/events/ready.js rename to src/bot/events/ready.js diff --git a/config.json b/src/config.json similarity index 80% rename from config.json rename to src/config.json index efa15b9..76c64e8 100644 --- a/config.json +++ b/src/config.json @@ -1,30 +1,27 @@ -{ - "key": "", - "public": false, - "maxUploadSize": 50, - "markdown": true, - "port": 80, - "secure": true, - "securePort": 443, - "ratelimit": 1000, - "allowed":[ - "png", "jpg", "gif", "mp4", "mp3", "jpeg", "tiff", "bmp", "ico", "psd", "eps", "raw", "cr2", "nef", "sr2", "orf", "svg", "wav", "webm", "aac", "flac", "ogg", "wma", "m4a", "gifv" - ], - "admin":{ - "key": "admin pass key goes here", - "maxUploadSize": 1024, - "allowed": [ - "png", "jpg", "gif", "mp4", "mp3","jpeg", "tiff", "bmp", "ico", "psd", "eps", "raw", "cr2", "nef", "sr2", "orf", "svg", "wav", "webm", "aac", "flac", "ogg", "wma", "m4a", "gifv", "html" - ] - }, - "paste": { - "maxUploadSize": 20, - "allowed": [ - "js", "php", "html", "txt", "lua", "json", "yml", "go", "cr", "bat", "css", "cs", "java", "py", "less", "c", "cpp", "ini", "pl", "sql", "rb", "md" - ] - }, - "discordToken": "Discord Token Here (required if you want API monitoring through Discord)", - "discordAdminIDs": ["discord IDs of people who can run commands go here", "Like this"], - "discordChannelID": "the channel you're trying to send api monitor updates to", - "prefix": "enter prefix for bot commands here" +{ + "key": "", + "public": false, + "maxUploadSize": 50, + "markdown": true, + "port": 80, + "secure": true, + "securePort": 443, + "ratelimit": 1000, + "allowed":[ + "png", "jpg", "gif", "mp4", "mp3", "jpeg", "tiff", "bmp", "ico", "psd", "eps", "raw", "cr2", "nef", "sr2", "orf", "svg", "wav", "webm", "aac", "flac", "ogg", "wma", "m4a", "gifv" + ], + "admin":{ + "key": "admin pass key goes here", + "maxUploadSize": 1024, + "allowed": [ + "png", "jpg", "gif", "mp4", "mp3","jpeg", "tiff", "bmp", "ico", "psd", "eps", "raw", "cr2", "nef", "sr2", "orf", "svg", "wav", "webm", "aac", "flac", "ogg", "wma", "m4a", "gifv", "html" + ] + }, + "paste": { + "maxUploadSize": 20 + }, + "discordToken": "Discord Token Here (required if you want API monitoring through Discord)", + "discordAdminIDs": ["discord IDs of people who can run commands go here", "Like this"], + "discordChannelID": "the channel you're trying to send api monitor updates to", + "prefix": "enter prefix for bot commands here" } \ No newline at end of file diff --git a/db.json b/src/db.json similarity index 100% rename from db.json rename to src/db.json diff --git a/index.js b/src/index.js similarity index 100% rename from index.js rename to src/index.js diff --git a/src/install.sh b/src/install.sh new file mode 100644 index 0000000..86f1fe4 --- /dev/null +++ b/src/install.sh @@ -0,0 +1,8 @@ +if which node > /dev/null + then + echo "\x1b[32mNode is already installed, skipping...\x1b[0m" + else + curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash - + sudo apt-get install -y nodejs +fi +npm i \ No newline at end of file diff --git a/package.json b/src/package.json similarity index 94% rename from package.json rename to src/package.json index 1e67f05..00ce238 100644 --- a/package.json +++ b/src/package.json @@ -1,6 +1,6 @@ { "name": "sharexapi", - "version": "3.5.0", + "version": "4.0.0", "description": "ShareX API made in Nodejs. Includes images, videos, code, text, and url shortening", "dependencies": { "body-parser": "^1.18.3", diff --git a/server/app.js b/src/server/app.js similarity index 100% rename from server/app.js rename to src/server/app.js diff --git a/server/routes/err404.js b/src/server/routes/err404.js similarity index 100% rename from server/routes/err404.js rename to src/server/routes/err404.js diff --git a/server/routes/fileTooBig.js b/src/server/routes/fileTooBig.js similarity index 100% rename from server/routes/fileTooBig.js rename to src/server/routes/fileTooBig.js diff --git a/server/routes/files.js b/src/server/routes/files.js similarity index 99% rename from server/routes/files.js rename to src/server/routes/files.js index 788f7b7..137a3cc 100644 --- a/server/routes/files.js +++ b/src/server/routes/files.js @@ -4,7 +4,7 @@ const fs = require("fs-extra") const Remarkable = require("remarkable") const ejs = require("ejs") const md = new Remarkable("full", { - html: true, + html: false, linkify: true, typographer: true }) diff --git a/server/routes/gallery.js b/src/server/routes/gallery.js similarity index 100% rename from server/routes/gallery.js rename to src/server/routes/gallery.js diff --git a/server/routes/illegalFileType.js b/src/server/routes/illegalFileType.js similarity index 100% rename from server/routes/illegalFileType.js rename to src/server/routes/illegalFileType.js diff --git a/server/routes/index.js b/src/server/routes/index.js similarity index 100% rename from server/routes/index.js rename to src/server/routes/index.js diff --git a/server/routes/main.js b/src/server/routes/main.js similarity index 100% rename from server/routes/main.js rename to src/server/routes/main.js diff --git a/src/server/routes/paste.js b/src/server/routes/paste.js new file mode 100644 index 0000000..d25bd92 --- /dev/null +++ b/src/server/routes/paste.js @@ -0,0 +1,58 @@ +const path = require("path") +const formidable = require("formidable") +const fs = require("fs-extra") +const ejs = require("ejs") +async function paste(req, res) { + res.setHeader("Content-Type", "text/text") + let fileName = this.randomToken(5) // 916,132,832 possible file names + let form = new formidable.IncomingForm() + form.parse(req, (err, fields, files) => { + let userIP = req.headers["x-forwarded-for"] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress + if (!this.auth(this.c.key, fields.key, this.c)) { + res.statusCode = 401 + res.write("Unauthorized"); + res.end(); + return this.log.warning(`Unauthorized User | File Upload | ${userIP}`) + } + this.db.get("files") + .push({ + path: `/${fileName}`, + ip: userIP, + views: 0 + }) + .write(); + let oldpath = files.fdata.path + let newpath = `${__dirname}/../uploads/${fileName+files.fdata.name.toString().match(/(\.)+([a-zA-Z0-9]+)+/g, "").toString()}`; + if (Math.round((files.fdata.size / 1024) / 1000) > this.c.paste.max_upload_size) { + if (this.monitorChannel !== null) this.bot.createMessage(this.monitorChannel, `\`\`\`MARKDOWN\n[FAILED PASTE][USER]\n[FILE](${files.fdata.name})\n[SIZE](${Math.round(files.fdata.size/1024)}KB)\n[TYPE](${files.fdata.type})\n[IP](${userIP})\n\n[ERROR](ERR_FILE_TOO_BIG)\`\`\``) + res.statusCode = 413 + res.write(`http://${req.headers.host}/ERR_FILE_TOO_BIG`) + return res.end() + } else { + fs.move(oldpath, newpath, err => { + fs.readFile(newpath, "utf-8", function read(err, data) { + let stream = fs.createWriteStream(`${__dirname}/../uploads/${fileName}.html`) + stream.once("open", fd => { + let cleaned = data.replace(/>/g, ">") + cleaned = cleaned.replace(/ { + stream.write(str) + }) + stream.end() + fs.unlink(newpath, err => { + if (err) return + }); + let insecure = `http://${req.headers.host}/${fileName}` + let secure = `https://${req.headers.host}/${fileName}` + res.write(req.secure ? secure : insecure) + return res.end() + }) + }) + }) + } + }) +} +module.exports = paste \ No newline at end of file diff --git a/server/routes/short.js b/src/server/routes/short.js similarity index 100% rename from server/routes/short.js rename to src/server/routes/short.js diff --git a/server/routes/shortener.js b/src/server/routes/shortener.js similarity index 100% rename from server/routes/shortener.js rename to src/server/routes/shortener.js diff --git a/server/routes/upload.js b/src/server/routes/upload.js similarity index 100% rename from server/routes/upload.js rename to src/server/routes/upload.js diff --git a/server/uploads/atom-one-dark.css b/src/server/uploads/atom-one-dark.css similarity index 100% rename from server/uploads/atom-one-dark.css rename to src/server/uploads/atom-one-dark.css diff --git a/server/uploads/favicon.ico b/src/server/uploads/favicon.ico similarity index 100% rename from server/uploads/favicon.ico rename to src/server/uploads/favicon.ico diff --git a/server/uploads/highlight.pack.js b/src/server/uploads/highlight.pack.js similarity index 100% rename from server/uploads/highlight.pack.js rename to src/server/uploads/highlight.pack.js diff --git a/server/uploads/highlightjs-line-numbers.min.js b/src/server/uploads/highlightjs-line-numbers.min.js similarity index 100% rename from server/uploads/highlightjs-line-numbers.min.js rename to src/server/uploads/highlightjs-line-numbers.min.js diff --git a/server/uploads/paste.css b/src/server/uploads/paste.css similarity index 100% rename from server/uploads/paste.css rename to src/server/uploads/paste.css diff --git a/server/uploads/sample.html b/src/server/uploads/sample.html similarity index 100% rename from server/uploads/sample.html rename to src/server/uploads/sample.html diff --git a/server/uploads/sample.png b/src/server/uploads/sample.png similarity index 100% rename from server/uploads/sample.png rename to src/server/uploads/sample.png diff --git a/server/views/404.ejs b/src/server/views/404.ejs similarity index 100% rename from server/views/404.ejs rename to src/server/views/404.ejs diff --git a/server/views/ERR_FILE_TOO_BIG.ejs b/src/server/views/ERR_FILE_TOO_BIG.ejs similarity index 100% rename from server/views/ERR_FILE_TOO_BIG.ejs rename to src/server/views/ERR_FILE_TOO_BIG.ejs diff --git a/server/views/ERR_ILLEGAL_FILE_TYPE.ejs b/src/server/views/ERR_ILLEGAL_FILE_TYPE.ejs similarity index 100% rename from server/views/ERR_ILLEGAL_FILE_TYPE.ejs rename to src/server/views/ERR_ILLEGAL_FILE_TYPE.ejs diff --git a/server/views/assets/css/styles.min.css b/src/server/views/assets/css/styles.min.css similarity index 100% rename from server/views/assets/css/styles.min.css rename to src/server/views/assets/css/styles.min.css diff --git a/server/views/css/404.css b/src/server/views/css/404.css similarity index 100% rename from server/views/css/404.css rename to src/server/views/css/404.css diff --git a/server/views/gallery.ejs b/src/server/views/gallery.ejs similarity index 100% rename from server/views/gallery.ejs rename to src/server/views/gallery.ejs diff --git a/server/views/galleryLogin.ejs b/src/server/views/galleryLogin.ejs similarity index 100% rename from server/views/galleryLogin.ejs rename to src/server/views/galleryLogin.ejs diff --git a/server/views/index.ejs b/src/server/views/index.ejs similarity index 100% rename from server/views/index.ejs rename to src/server/views/index.ejs diff --git a/server/views/md.ejs b/src/server/views/md.ejs similarity index 100% rename from server/views/md.ejs rename to src/server/views/md.ejs diff --git a/server/views/paste.ejs b/src/server/views/paste.ejs similarity index 100% rename from server/views/paste.ejs rename to src/server/views/paste.ejs diff --git a/server/views/short.ejs b/src/server/views/short.ejs similarity index 100% rename from server/views/short.ejs rename to src/server/views/short.ejs diff --git a/server/views/unauthorized.ejs b/src/server/views/unauthorized.ejs similarity index 100% rename from server/views/unauthorized.ejs rename to src/server/views/unauthorized.ejs diff --git a/server/views/upload.ejs b/src/server/views/upload.ejs similarity index 100% rename from server/views/upload.ejs rename to src/server/views/upload.ejs diff --git a/util/auth.js b/src/util/auth.js similarity index 100% rename from util/auth.js rename to src/util/auth.js diff --git a/util/index.js b/src/util/index.js similarity index 100% rename from util/index.js rename to src/util/index.js diff --git a/util/log.js b/src/util/log.js similarity index 100% rename from util/log.js rename to src/util/log.js diff --git a/util/randomToken.js b/src/util/randomToken.js similarity index 100% rename from util/randomToken.js rename to src/util/randomToken.js