Advertisement
Guest User

Untitled

a guest
Apr 20th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var express = require("express");
  2. var sassMiddleware = require("node-sass-middleware");
  3. var mongo = require("mongodb");
  4. var MongoClient = mongo.MongoClient;
  5. var bodyParser = require('body-parser');
  6. var app = express();
  7. var https = require("https");
  8. var nodemailer = require("nodemailer");
  9. var urlParse = require("url");
  10. app.listen( 80 );
  11.  
  12. app.locals.debug = true;
  13. app.locals.compileDebug = false;
  14. app.locals.dbUrl = "mongodb://localhost:27017/website";
  15.  
  16. //Sass middleware
  17. app.use(sassMiddleware({
  18.     src: __dirname + '/sass',
  19.     dest: __dirname + '/public/styles/',
  20.     debug: app.locals.compileDebug,
  21.     prefix: '/styles'
  22. }));
  23.  
  24. app.use(bodyParser.json());
  25. app.use(bodyParser.urlencoded({ extended: true }));
  26. app.use(express.static(__dirname + '/public'));
  27. app.set('view engine', 'jade');
  28.  
  29. //Jade templating
  30. var templates = [];
  31. function Template( template, urls, regex, error, nav ) {
  32.     this.urls = urls;
  33.     this.template = template;
  34.     this.error = error || false;
  35.     this.regex = regex || false;
  36.     this.nav = nav || false;
  37.     this.currentUrl = null
  38.    
  39.     this.canUse = function( url ){
  40.         if( urls.indexOf( url ) != -1 )
  41.             return true;
  42.        
  43.         var matched = false;
  44.         if( this.regex )
  45.         {
  46.             urls.forEach( function( el ){
  47.                 if( url.match( el ) )
  48.                     matched = true;
  49.             });
  50.         }
  51.                    
  52.         return matched;
  53.     }
  54. }
  55.  
  56. Template.prototype.onMethod = function( method, body, callback ){ callback() };
  57. Template.prototype.requestData = function( callback, nav, template ) {
  58.     var thisTemplate = this;
  59.     nav = nav || true;
  60.        
  61.     //Connect to db
  62.     MongoClient.connect( app.locals.dbUrl, function( err, db ){
  63.         if( err )
  64.         {
  65.             console.error( err );
  66.             callback( null );
  67.             return;
  68.         }
  69.        
  70.         //Get all templates
  71.         db.collection("templates").find(nav ? {} : { "template" : template ? template : thisTemplate.template }, function( err, templates ) {
  72.             if( err )
  73.             {
  74.                 console.error( err );
  75.                 callback( null );
  76.  
  77.                 db.close();
  78.                 return;
  79.             }
  80.            
  81.             if( nav )
  82.             {
  83.                 var result = {};
  84.                 result.nav = [];
  85.                 templates.each( function( err, item ){
  86.                     if( err )
  87.                     {
  88.                         console.error( err );
  89.                         callback( null );
  90.  
  91.                         db.close();
  92.                         return;
  93.                     }
  94.                    
  95.                     if( item )
  96.                     {
  97.                         //Is this template
  98.                         if( item.template == (template ?  template : thisTemplate.template ) )
  99.                         {
  100.                             //Copy all properties over
  101.                             for ( var k in item )
  102.                                 result[k] = item[k];
  103.                         }
  104.                        
  105.                         //Add to nav
  106.                         for ( var k in item )
  107.                         {
  108.                             //Ignore everything but name and href
  109.                             if( k != "name" && k != "href" )
  110.                                 k = null;
  111.                         }
  112.                        
  113.                         result.nav.push( item );
  114.                     }else{
  115.                         //Finished
  116.                         callback( result );
  117.                         db.close();
  118.                     }
  119.                 });
  120.             }else{
  121.                 //Finished
  122.                 callback( templates );
  123.                 db.close();
  124.             }
  125.         });
  126.     });
  127. };
  128.  
  129. //Add templates
  130. templates.push( new Template( "index", ["/", "/index"] ) );
  131. templates.push( new Template( "projects", ["/projects"] ) );
  132. templates.push( new Template( "project", ["/projects/."], true ) );
  133. templates.push( new Template( "error", [""], false, true ) );
  134.  
  135. //CMS templates
  136. var consoleTemplate = new Template( "./admin/index", ["/admin/index", "/admin/"] );
  137. consoleTemplate.onMethod = function( method, body, callback ){
  138.     if( method == "POST" )
  139.     {
  140.         //Reset
  141.         consoleTemplate.result = null;
  142.         consoleTemplate.message = "";
  143.         consoleTemplate.success = false;
  144.         consoleTemplate.command = "";
  145.        
  146.         if( body.tab == "console")
  147.         {
  148.             //Connect to db
  149.             MongoClient.connect( app.locals.dbUrl, function( err, db ){
  150.                 if( err )
  151.                 {
  152.                     consoleTemplate.message = "Database connection failed";
  153.                     console.error( err );
  154.                     callback( null );
  155.                     return;
  156.                 }
  157.                
  158.                 try
  159.                 {
  160.                     var json = JSON.parse( body.command );
  161.                    
  162.                     //Execute command
  163.                     db.command( json, function( err, result ) {
  164.                         if( err )
  165.                         {
  166.                             consoleTemplate.message = "Command failed: "+err.message;
  167.                             console.error( err );
  168.                             callback( null );
  169.                             return;
  170.                         }
  171.                        
  172.                         consoleTemplate.message = "Command successful";
  173.                         consoleTemplate.success = true;
  174.                         callback( null );
  175.                        
  176.                         //Command result
  177.                         consoleTemplate.result = result;
  178.                         consoleTemplate.command = json;
  179.                     });
  180.                 }catch(e){
  181.                     consoleTemplate.message = "JSON parser error: "+e;
  182.                     console.error( e );
  183.                     callback( null );
  184.                 }
  185.             });
  186.         }else if ( body.tab == "add" ){
  187.             //Connect to db
  188.             MongoClient.connect( app.locals.dbUrl, function( err, db ){
  189.                 if( err )
  190.                 {
  191.                     consoleTemplate.message = "Database connection failed";
  192.                     console.error( err );
  193.                     callback( null );
  194.                     return;
  195.                 }
  196.                
  197.                 db.collection("templates").insertOne( { "name": body.name, "href": body.href, "template": body.template }, function( err ){
  198.                     if( err )
  199.                     {
  200.                         consoleTemplate.message = "Template insert failed";
  201.                         console.error( err );
  202.                         callback( null );
  203.                         return;
  204.                     }
  205.                    
  206.                     consoleTemplate.message = "Template added";
  207.                     consoleTemplate.success = true;
  208.                     callback( null );
  209.                 });
  210.             });
  211.         }else if(body.tab == "remove"){
  212.             //Connect to db
  213.             MongoClient.connect( app.locals.dbUrl, function( err, db ){
  214.                 if( err )
  215.                 {
  216.                     consoleTemplate.message = "Database connection failed";
  217.                     console.error( err );
  218.                     callback( null );
  219.                     return;
  220.                 }
  221.                
  222.                 db.collection("templates").deleteOne( { "_id": new mongo.ObjectID(body.template) }, function( err, result ){
  223.                     if( err )
  224.                     {
  225.                         consoleTemplate.message = "Template removal failed";
  226.                         console.error( err );
  227.                         callback( null );
  228.                         return;
  229.                     }
  230.                    
  231.                     if( result.result.ok )
  232.                     {
  233.                         consoleTemplate.message = "Template removed successfully";
  234.                         consoleTemplate.success = true;
  235.                     }else
  236.                         consoleTemplate.message = "Template removed failed";
  237.                    
  238.                     callback( null );
  239.                 });
  240.             });
  241.         }else
  242.             callback( null );
  243.     }else
  244.         callback( null );
  245. };
  246.  
  247. //Return message and result
  248. consoleTemplate.requestData = function( callback, nav, template ){
  249.     Template.prototype.requestData( function( result ) {
  250.         if( !result ) result = {};
  251.         result.message = consoleTemplate.message;
  252.         result.success = consoleTemplate.success;
  253.        
  254.         //Command result
  255.         result.commandResult = consoleTemplate.result;
  256.         result.command = consoleTemplate.command;
  257.         callback( result );
  258.     });
  259. };
  260.  
  261. templates.push( consoleTemplate );
  262.  
  263. //Action template
  264. var action = new Template( "./admin/action", ["/admin/(.*?)/action"], true );
  265. action.onMethod = function( method, body, callback ){
  266.     if( method == "POST" )
  267.     {
  268.         var template = urlParse.parse( action.currentUrl ).pathname.split('/')[2];
  269.        
  270.         //Reset
  271.         action.message = "";
  272.         action.success = false;
  273.        
  274.         if( body.action == "add_slide")
  275.         {
  276.             //Connect to db
  277.             MongoClient.connect( app.locals.dbUrl, function( err, db ){
  278.                 if( err )
  279.                 {
  280.                     action.message = "Database connection failed";
  281.                     console.error( err );
  282.                     callback( null );
  283.                     return;
  284.                 }
  285.                
  286.                 db.collection("templates").updateOne( { "template": template }, { $push: { sliders: { title: body.name, description: body.description} } }, function( err, result ){
  287.                     if( err )
  288.                     {
  289.                         action.message = "Slide addition failed"
  290.                         console.error( err );
  291.                         callback( null );
  292.                         return;
  293.                     }
  294.  
  295.                     if( result.result.ok )
  296.                     {
  297.                         action.message = "Slide successfully added";
  298.                         action.success = true;
  299.                     }else
  300.                         action.message = "Slide addition failed";
  301.                        
  302.                     callback( null );
  303.                 });
  304.             });
  305.         }else if(body.action == "remove_slide"){
  306.             //Connect to db
  307.             MongoClient.connect( app.locals.dbUrl, function( err, db ){
  308.                 if( err )
  309.                 {
  310.                     action.message = "Database connection failed";
  311.                     console.error( err );
  312.                     callback( null );
  313.                     return;
  314.                 }
  315.                
  316.                 db.collection("templates").updateOne( { "template": template }, { "$pull": { "sliders": { "title": body.slide } } }, function( err, result ){
  317.                     if( err )
  318.                     {
  319.                         action.message = "Slide removal failed";
  320.                         console.error( err );
  321.                         callback( null );
  322.                         return;
  323.                     }
  324.                    
  325.                     if( result.result.ok )
  326.                     {
  327.                         action.message = "Slide removed successfully";
  328.                         action.success = true;
  329.                     }else
  330.                         action.message = "Slide removed failed";
  331.                    
  332.                     callback( null );
  333.                 });
  334.             });
  335.         }else
  336.             callback( null );
  337.     }else
  338.         callback(null);
  339. };
  340.  
  341. //Return template info for action
  342. action.requestData = function( callback, nav, template ){
  343.     var paths = urlParse.parse( action.currentUrl ).pathname.split('/');
  344.     Template.prototype.requestData( function( result ) {
  345.         if( !result ) result = {};
  346.         result.message = action.message;
  347.         result.success = action.success;
  348.        
  349.         callback( result );
  350.     }, false, paths[2]);
  351. };
  352.  
  353. templates.push( action );
  354.  
  355. //Contact template with post handler
  356. var contact = new Template( "contact", ["/contact"] );
  357. contact.onMethod = function( method, body, callback ){
  358.     if( method == "POST" )
  359.     {
  360.         this.message = "";
  361.        
  362.         //Check body values
  363.         if( body["g-recaptcha-response"] == "" )
  364.         {
  365.             this.message = "You must verify the captcha";
  366.             callback( null );
  367.             return;
  368.         }else if( body["email"] == "" ){
  369.             this.message = "You must enter an email";
  370.             callback( null );
  371.             return;
  372.         }else if( body["message"] == "" ){
  373.             this.message = "You must enter a message";
  374.             callback( null );
  375.             return;
  376.         }
  377.        
  378.         var url = "https://www.google.com/recaptcha/api/siteverify?secret=6LeDOBYTAAAAAKuAV5AFSkuBalIfSZ24eekan8kg&response=" + body["g-recaptcha-response"];
  379.         https.get( url, function(res) {
  380.             var data = "";
  381.             res.on("data", function(chunk) {
  382.                 data += chunk.toString();
  383.             });
  384.            
  385.             res.on("end", function(){
  386.                 var json = JSON.parse( data );
  387.                 if( json.success )
  388.                 {
  389.                     //Setup smtp
  390.                     var transporter = nodemailer.createTransport({
  391.                         service: "Zoho",
  392.                         auth: {
  393.                             user: "info@tingtom.co.uk",
  394.                             pass: "cd7jjhjmec1f"
  395.                         }
  396.                     });
  397.                    
  398.                     //Send email
  399.                     var mail = {
  400.                       from: "website@tingtom.co.uk",
  401.                       to: "info@tingtom.co.uk",
  402.                       subject: "Contact form message",
  403.                       html: "Email: "+body.email+"<br>Message: "+ body.message
  404.                     };
  405.                    
  406.                     transporter.sendMail( mail, function( err, info ){
  407.                         if( err )
  408.                         {
  409.                             callback( err );
  410.                             return;
  411.                         }
  412.                        
  413.                         contact.message = "Email sent successfully";
  414.                         callback( null );
  415.                     });
  416.                 }else{
  417.                     contact.message = "Captcha failed, please try again";
  418.                     callback( "Captcha failed" );
  419.                 }
  420.             });
  421.         }).on( "error", function( error ) {
  422.             contact.message = "Captcha communication error";
  423.             callback( error );
  424.         });
  425.     }else
  426.         callback( null );
  427. };
  428.  
  429. //Add the post result message to the data
  430. contact.requestData = function( callback, nav, template ){
  431.     Template.prototype.requestData( function( result ) {
  432.         if( !result ) result = {};
  433.         result.message = contact.message;
  434.         callback( result );
  435.     });
  436. };
  437.  
  438. templates.push(contact);
  439.  
  440. //Middleware
  441. app.use( function(req, res, next) {
  442.     //Debug
  443.     if( app.locals.debug )
  444.         console.log( "Request: "+req.url+" "+req.method );
  445.    
  446.     //Check templates
  447.     var rendered = false;
  448.     templates.every( function( template ){
  449.         if( template.canUse( req.url ) )
  450.         {
  451.             //Debug
  452.             if( app.locals.debug )
  453.                 console.log( "Template: "+template.template );
  454.                
  455.             template.currentUrl = req.url;
  456.            
  457.             //Call method
  458.             template.onMethod( req.method, req.body, function( err ) {
  459.                 if( err && app.locals.debug )
  460.                 {
  461.                     console.error( err );
  462.                     return;
  463.                 }
  464.                
  465.                 //Get data then render using it
  466.                 template.requestData( function( result ){
  467.                     try
  468.                     {
  469.                         result = result || {}
  470.                         result.debug = app.locals.compileDebug;
  471.                         result.compileDebug = app.locals.compileDebug;
  472.                         res.render( template.template, result );
  473.                     } catch( e ) {
  474.                         console.error( e );
  475.                     }
  476.                     next();
  477.                 }, true, null);
  478.             });
  479.            
  480.             rendered = true;
  481.             return false;
  482.         }
  483.        
  484.         return true;
  485.     });
  486.    
  487.     if( !rendered )
  488.     {
  489.         console.log( "Sending error page" );
  490.        
  491.         templates.forEach( function( template ){
  492.            if( template.error )
  493.            {
  494.                res.render( template.template, { errorCode: "404", errorMessage: "Not found or whatever", debug: app.locals.compileDebug, compileDebug: app.locals.compileDebug } );  
  495.                next();
  496.            }
  497.         });
  498.     }
  499. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement