mirror of
				https://github.com/KevinMidboe/zoff.git
				synced 2025-10-29 18:00:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			626 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			626 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 |