Files
zoff/server/routing/admin/api.js
2019-11-16 21:13:45 +01:00

757 lines
18 KiB
JavaScript

import {
pathThumbnails
} from "../settings/globals";
var express = require("express");
var router = express.Router();
var path = require("path");
try {
var mongo_db_cred = require(path.join(
__dirname,
"../../config/mongo_config.js"
));
} catch (e) {
console.log(
"(!) Missing file - /config/mongo_config.js. Have a look at /config/mongo_config.example.js. The server won't run without this existing."
);
process.exit(1);
}
var mongojs = require("mongojs");
var db = mongojs(mongo_db_cred.config);
var token_db = mongojs("tokens");
var uniqid = require("uniqid");
var crypto = require("crypto");
var ObjectId = mongojs.ObjectId;
var sIO = require(path.join(__dirname, "../../apps/client.js")).socketIO;
var projects = require(pathThumbnails + "/handlers/aggregates.js");
router.use(function (req, res, next) {
next(); // make sure we go to the next routes and don't stop here
});
router.route("/api/lists").get(function (req, res) {
if (req.isAuthenticated()) {
db.collection("frontpage_lists")
.find()
.sort({
count: -1
}, function (err, docs) {
res.json(docs);
});
} else {
res.send(false);
}
});
router.route("/api/thumbnails").get(function (req, res) {
if (req.isAuthenticated()) {
db.collection("suggested_thumbnails").find(function (err, docs) {
res.json(docs);
});
} else {
res.send(false);
}
});
router.route("/api/descriptions").get(function (req, res) {
if (req.isAuthenticated()) {
db.collection("suggested_descriptions").find(function (err, docs) {
res.json(docs);
});
} else {
res.send(false);
}
});
router.route("/api/rules").get(function (req, res) {
if (req.isAuthenticated()) {
db.collection("suggested_rules").find(function (err, docs) {
res.json(docs);
});
} else {
res.send(false);
}
});
router.route("/api/approve_thumbnail").post(function (req, res) {
if (req.isAuthenticated()) {
var channel = req.body.channel;
db.collection("suggested_thumbnails").find({
channel: channel
}, function (
err,
docs
) {
var thumbnail = docs[0].thumbnail;
db.collection("frontpage_lists").update({
_id: channel
}, {
$set: {
thumbnail: thumbnail
}
}, {
upsert: true
},
function (err, docs) {
db.collection(channel + "_settings").update({
views: {
$exists: true
}
}, {
$set: {
thumbnail: thumbnail
}
}, {
upsert: true
},
function (err, docs) {
db.collection("suggested_thumbnails").remove({
channel: channel
},
function (err, docs) {
db.collection(channel + "_settings").aggregate(
[{
$match: {
id: "config"
}
},
{
$project: projects.toShowConfig
}
],
function (err, docs) {
if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs);
res.send(true);
}
);
}
);
}
);
}
);
});
} else {
res.send(false);
}
});
router.route("/api/deny_thumbnail").post(function (req, res) {
if (req.isAuthenticated()) {
var channel = req.body.channel;
db.collection("suggested_thumbnails").remove({
channel: channel
}, function (
err,
docs
) {
res.send(true);
});
} else {
res.send(false);
}
});
router.route("/api/approve_rules").post(function (req, res) {
if (req.isAuthenticated()) {
var channel = req.body.channel;
db.collection("suggested_rules").find({
channel: channel
}, function (
err,
docs
) {
var rules = docs[0].rules;
db.collection(channel + "_settings").update({
views: {
$exists: true
}
}, {
$set: {
rules: rules
}
}, {
upsert: true
},
function (err, docs) {
db.collection("suggested_rules").remove({
channel: channel
},
function (err, docs) {
db.collection(channel + "_settings").aggregate(
[{
$match: {
id: "config"
}
},
{
$project: projects.toShowConfig
}
],
function (err, docs) {
if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs);
res.send(true);
}
);
}
);
}
);
});
} else {
res.send(false);
}
});
router.route("/api/deny_rules").post(function (req, res) {
if (req.isAuthenticated()) {
var channel = req.body.channel;
db.collection("suggested_rules").remove({
channel: channel
}, function (
err,
docs
) {
res.send(true);
});
} else {
res.send(false);
}
});
router.route("/api/remove_rules").post(function (req, res) {
if (req.isAuthenticated()) {
var channel = req.body.channel;
db.collection(channel + "_settings").update({
views: {
$exists: true
}
}, {
$set: {
rules: ""
}
},
function (err, docs) {
db.collection(channel + "_settings").aggregate(
[{
$match: {
id: "config"
}
},
{
$project: projects.toShowConfig
}
],
function (err, docs) {
if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (docs[0].hasOwnProperty("userpass") && docs[0].userpass != "")
docs[0].userpass = true;
else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs);
res.send(true);
}
);
}
);
} else {
res.send(false);
}
});
router.route("/api/approve_description").post(function (req, res) {
if (req.isAuthenticated()) {
var channel = req.body.channel;
db.collection("suggested_descriptions").find({
channel: channel
}, function (
err,
docs
) {
var description = docs[0].description;
db.collection("frontpage_lists").update({
_id: channel
}, {
$set: {
description: description
}
}, {
upsert: true
},
function (err, docs) {
db.collection(channel + "_settings").update({
views: {
$exists: true
}
}, {
$set: {
description: description
}
},
function (err, docs) {
db.collection("suggested_descriptions").remove({
channel: channel
},
function (err, docs) {
db.collection(channel + "_settings").aggregate(
[{
$match: {
id: "config"
}
},
{
$project: projects.toShowConfig
}
],
function (err, docs) {
if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs);
res.send(true);
}
);
}
);
}
);
}
);
});
} else {
res.send(false);
}
});
router.route("/api/deny_description").post(function (req, res) {
if (req.isAuthenticated()) {
var channel = req.body.channel;
db.collection("suggested_descriptions").remove({
channel: channel
},
1,
function (err, docs) {
res.send(true);
}
);
} else {
res.send(false);
}
});
router.route("/api/remove_thumbnail").post(function (req, res) {
if (req.isAuthenticated()) {
var channel = req.body.channel;
db.collection("frontpage_lists").update({
_id: channel
}, {
$set: {
thumbnail: ""
}
},
function (err, docs) {
db.collection(channel + "_settings").update({
views: {
$exists: true
}
}, {
$set: {
thumbnail: ""
}
},
function (err, docs) {
db.collection(channel + "_settings").aggregate(
[{
$match: {
id: "config"
}
},
{
$project: projects.toShowConfig
}
],
function (err, docs) {
if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs);
res.send(true);
}
);
}
);
}
);
} else {
res.send(false);
}
});
router.route("/api/remove_description").post(function (req, res) {
if (req.isAuthenticated()) {
var channel = req.body.channel;
db.collection("frontpage_lists").update({
_id: channel
}, {
$set: {
description: ""
}
},
function (err, docs) {
db.collection(channel + "_settings").update({
views: {
$exists: true
}
}, {
$set: {
description: ""
}
},
function (err, docs) {
db.collection(channel + "_settings").aggregate(
[{
$match: {
id: "config"
}
},
{
$project: projects.toShowConfig
}
],
function (err, docs) {
if (docs[0].adminpass !== "") docs[0].adminpass = true;
if (
docs[0].hasOwnProperty("userpass") &&
docs[0].userpass != ""
)
docs[0].userpass = true;
else docs[0].userpass = false;
sIO.to(channel).emit("conf", docs);
res.send(true);
}
);
}
);
}
);
} else {
res.send(false);
}
});
router.route("/api/names").get(function (req, res) {
if (req.isAuthenticated()) {
db.collection("registered_users").find({
_id: {
$exists: true
}
}, {
_id: 1,
icon: 1
},
function (err, docs) {
res.json(docs);
}
);
} else {
res.send(false);
}
});
router.route("/api/names").post(function (req, res) {
if (req.isAuthenticated()) {
var icon = req.body.icon;
var name = req.body.name;
db.collection("registered_users").update({
_id: name
}, {
$set: {
icon: icon
}
},
function (err, docs) {
if (err) res.send(false);
else res.send(true);
}
);
} else {
res.send(false);
}
});
router.route("/api/names").delete(function (req, res) {
if (req.isAuthenticated()) {
var name = req.body.name;
db.collection("registered_users").remove({
_id: name
}, function (
err,
docs
) {
if (err) res.send(false);
else res.send(true);
});
} else {
res.send(false);
}
});
router.route("/api/token").get(function (req, res) {
if (req.isAuthenticated()) {
token_db.collection("tokens").find(function (err, docs) {
if (docs.length == 1) {
res.json({
token: docs[0].token
});
} else {
var id = new Buffer(makeid()).toString("base64");
token_db
.collection("tokens")
.insert({
token: id
}, function (err, docs) {
res.json({
token: id
});
});
}
});
} else {
res.send(false);
}
});
router.route("/api/api_token").get(function (req, res) {
if (req.isAuthenticated()) {
token_db
.collection("api_token")
.find({
token: {
$exists: true
}
}, function (err, all) {
res.json(all);
});
} else {
res.sendStatus(403);
}
});
router.route("/api/api_token").delete(function (req, res) {
if (req.isAuthenticated()) {
var id = req.body.id;
token_db
.collection("api_token")
.remove({
_id: ObjectId(id)
}, function (err, success) {
if (err) {
res.send("failed");
return;
}
res.send("success");
});
}
});
router.route("/api/api_token").put(function (req, res) {
if (req.isAuthenticated()) {
var id = req.body.id;
var limit = req.body.limit;
if (limit < 0) {
res.sendStatus(500);
return;
}
token_db
.collection("api_token")
.update({
_id: ObjectId(id)
}, {
$set: {
limit: limit
}
}, function (
err,
success
) {
if (err) {
res.sendStatus(500);
return;
}
res.sendStatus(200);
});
}
});
router.route("/api/api_token").post(function (req, res) {
if (req.isAuthenticated()) {
var name = req.body.name;
var id = crypto
.createHash("sha256")
.update(uniqid())
.digest("base64");
token_db
.collection("api_token")
.insert({
name: name,
token: id,
usage: 0
}, function (err, docs) {
token_db.collection("api_token").find({
token: id
}, function (err, d) {
res.json({
token: id,
_id: d[0]._id
});
});
});
} else {
res.send(false);
}
});
router.route("/api/delete").post(function (req, res) {
if (req.isAuthenticated()) {
var list = req.body._id;
db.collection(list).drop(function (err, docs) {
db.collection(list + "_settings").drop(function (err, docs) {
db.collection("frontpage_lists").remove({
_id: list
}, function (
err,
docs
) {
res.send(true);
});
});
});
} else {
res.send(false);
}
});
router.route("/api/remove_token").get(function (req, res) {
if (req.isAuthenticated()) {
token_db.collection("tokens").find(function (err, docs) {
if (docs.length == 1) {
token_db
.collection("tokens")
.remove({
token: docs[0].token
}, function (err, docs) {
res.send(true);
});
} else {
res.send(false);
}
});
} else {
res.send(false);
}
});
router.route("/api/pinned").post(function (req, res) {
if (req.isAuthenticated()) {
var to_pin = req.body._id;
db.collection("frontpage_lists").update({
pinned: 1
}, {
$set: {
pinned: 0
}
},
function (err, resp) {
db.collection("frontpage_lists").update({
_id: to_pin
}, {
$set: {
pinned: 1
}
},
function (err, resp) {
res.send(true);
}
);
}
);
} else {
res.send(false);
}
});
router.route("/api/admin").post(function (req, res) {
if (req.isAuthenticated()) {
var to_remove = req.body._id;
db.collection(to_remove + "_settings").update({
views: {
$exists: true
}
}, {
$set: {
adminpass: ""
}
},
function (err, docs) {
res.send(true);
}
);
} else {
res.send(false);
}
});
router.route("/api/userpass").post(function (req, res) {
if (req.isAuthenticated()) {
var to_remove = req.body._id;
db.collection(to_remove + "_settings").update({
views: {
$exists: true
}
}, {
$set: {
userpass: ""
}
},
function (err, docs) {
res.send(true);
}
);
} else {
res.send(false);
}
});
function makeid() {
var text = "";
var possible =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 20; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
module.exports = router;