diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f9ee1a1f6a..0000000000 --- a/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Sahat Yalkabov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cluster_app.js b/cluster_app.js deleted file mode 100755 index fb236f2b08..0000000000 --- a/cluster_app.js +++ /dev/null @@ -1,15 +0,0 @@ -var os = require('os'); -var cluster = require('cluster'); - -cluster.setupMaster({ - exec: 'app.js' -}); - -cluster.on('exit', function(worker) { - console.log('worker ' + worker.id + ' died'); - cluster.fork(); -}); - -for (var i = 0; i < os.cpus().length; i++) { - cluster.fork(); -} \ No newline at end of file diff --git a/generator.js b/generator.js deleted file mode 100644 index 788ead2d11..0000000000 --- a/generator.js +++ /dev/null @@ -1,1062 +0,0 @@ -var _ = require('underscore'); -var colors = require('colors'); -var fs = require('fs'); -var inquirer = require('inquirer'); -var M = require('mstring'); -var os = require('os'); - -colors.setTheme({ - silly: 'rainbow', - input: 'grey', - verbose: 'cyan', - prompt: 'grey', - info: 'green', - data: 'grey', - help: 'white', - warn: 'yellow', - debug: 'blue', - error: 'red' -}); - -inquirer.prompt({ - type: 'list', - name: 'category', - message: 'Hackathon Starter:', - choices: ['☂ Authentication', '☎ Email Service', '☱ Exit'] -}, function(answer) { - - if (answer.category.match('Email Service')) { - inquirer.prompt({ - type: 'list', - name: 'email', - message: 'Choose Email Delivery Service:', - choices: ['SendGrid', 'Mailgun', 'Mandrill', 'Cancel'] - }, function(answer) { - - var index; - - var contactControllerFile = 'controllers/contact.js'; - var userControllerFile = 'controllers/user.js'; - - var contactController = fs.readFileSync(contactControllerFile).toString().split(os.EOL); - var userController = fs.readFileSync(userControllerFile).toString().split(os.EOL); - - if (answer.email.match('SendGrid')) { - - // Change SMPT Transport to SendGrid in controllers/contact.js - index = contactController.indexOf('var smtpTransport = nodemailer.createTransport(\'SMTP\', {'); - contactController.splice(index + 1, 1, ' service: \'SendGrid\','); - contactController.splice(index + 3, 1, ' user: secrets.sendgrid.user,'); - contactController.splice(index + 4, 1, ' pass: secrets.sendgrid.password'); - fs.writeFileSync(contactControllerFile, contactController.join(os.EOL)); - - // Change SMPT Transport to SendGrid in controllers/user.js - index = userController.indexOf(' var smtpTransport = nodemailer.createTransport(\'SMTP\', {'); - userController.splice(index + 1, 1, ' service: \'SendGrid\','); - userController.splice(index + 3, 1, ' user: secrets.sendgrid.user,'); - userController.splice(index + 4, 1, ' pass: secrets.sendgrid.password'); - index = userController.indexOf(' var smtpTransport = nodemailer.createTransport(\'SMTP\', {', (index + 1)); - userController.splice(index + 1, 1, ' service: \'SendGrid\','); - userController.splice(index + 3, 1, ' user: secrets.sendgrid.user,'); - userController.splice(index + 4, 1, ' pass: secrets.sendgrid.password'); - fs.writeFileSync(userControllerFile, userController.join(os.EOL)); - - console.log('✓ Email Delivery Service has been switched to'.info, 'SendGrid'.help); - } - - if (answer.email.match('Mailgun')) { - - // Change SMPT Transport to Mailgun in controllers/contact.js - index = contactController.indexOf('var smtpTransport = nodemailer.createTransport(\'SMTP\', {'); - contactController.splice(index + 1, 1, ' service: \'Mailgun\','); - contactController.splice(index + 3, 1, ' user: secrets.mailgun.login,'); - contactController.splice(index + 4, 1, ' pass: secrets.mailgun.password'); - fs.writeFileSync(contactControllerFile, contactController.join(os.EOL)); - - // Change SMPT Transport to Mailgun in controllers/user.js - index = userController.indexOf(' var smtpTransport = nodemailer.createTransport(\'SMTP\', {'); - userController.splice(index + 1, 1, ' service: \'Mailgun\','); - userController.splice(index + 3, 1, ' user: secrets.mailgun.login,'); - userController.splice(index + 4, 1, ' pass: secrets.mailgun.password'); - index = userController.indexOf(' var smtpTransport = nodemailer.createTransport(\'SMTP\', {', (index + 1)); - userController.splice(index + 1, 1, ' service: \'Mailgun\','); - userController.splice(index + 3, 1, ' user: secrets.mailgun.login,'); - userController.splice(index + 4, 1, ' pass: secrets.mailgun.password'); - fs.writeFileSync(userControllerFile, userController.join(os.EOL)); - - console.log('✓ Email Delivery Service has been switched to'.info, '@'.error + 'mail'.data + 'gun'.error); - } - - if (answer.email.match('Mandrill')) { - - // Change SMPT Transport to Mailgun in controllers/contact.js - index = contactController.indexOf('var smtpTransport = nodemailer.createTransport(\'SMTP\', {'); - contactController.splice(index + 1, 1, ' service: \'Mandrill\','); - contactController.splice(index + 3, 1, ' user: secrets.mandrill.login,'); - contactController.splice(index + 4, 1, ' pass: secrets.mandrill.password'); - fs.writeFileSync(contactControllerFile, contactController.join(os.EOL)); - - // Change SMPT Transport to Mailgun in controllers/user.js - index = userController.indexOf(' var smtpTransport = nodemailer.createTransport(\'SMTP\', {'); - userController.splice(index + 1, 1, ' service: \'Mandrill\','); - userController.splice(index + 3, 1, ' user: secrets.mandrill.login,'); - userController.splice(index + 4, 1, ' pass: secrets.mandrill.password'); - index = userController.indexOf(' var smtpTransport = nodemailer.createTransport(\'SMTP\', {', (index + 1)); - userController.splice(index + 1, 1, ' service: \'Mandrill\','); - userController.splice(index + 3, 1, ' user: secrets.mandrill.login,'); - userController.splice(index + 4, 1, ' pass: secrets.mandrill.password'); - fs.writeFileSync(userControllerFile, userController.join(os.EOL)); - - console.log('✓ Email Delivery Service has been switched to'.info, 'Mandrill'.help); - } - }); - } - - if (answer.category.match('Authentication')) { - inquirer.prompt({ - type: 'checkbox', - message: 'Select Authentication Providers', - name: 'auth', - choices: [ - new inquirer.Separator(M(function() { - /*** - - ╔══════════════════════════════════════════════════════════════════════╗ - ║ THIS TOOL IS STILL IN EXPERIMENTAL STAGE! USE AT YOUR OWN RISK. ║ - ║ ALWAYS USE VERSION CONTROL SYSTEM SO YOU COULD REVERT THE CHANGES. ║ - ║ REPORT BUGS AT HTTPS://GITHUB.COM/SAHAT/HACKATHON-STARTER/ISSUES/NEW ║ - ╚══════════════════════════════════════════════════════════════════════╝ - - ***/ - })), - { name: 'Facebook', checked: true }, - { name: 'GitHub', checked: true }, - { name: 'Google', checked: true }, - { name: 'Twitter', checked: true }, - { name: 'LinkedIn', checked: true }, - { name: 'Instagram', checked: true }, - new inquirer.Separator('Press ctrl+c to cancel'.warn) - ] - }, function(answer) { - var index; - - var passportConfigFile = 'config/passport.js'; - var userModelFile = 'models/User.js'; - var appFile = 'app.js'; - var secretsFile = 'config/secrets.js'; - var profileTemplateFile = 'views/account/profile.jade'; - var loginTemplateFile = 'views/account/login.jade'; - - var passportConfig = fs.readFileSync(passportConfigFile).toString().split(os.EOL); - var loginTemplate = fs.readFileSync(loginTemplateFile).toString().split(os.EOL); - var profileTemplate = fs.readFileSync(profileTemplateFile).toString().split(os.EOL); - var userModel = fs.readFileSync(userModelFile).toString().split(os.EOL); - var app = fs.readFileSync(appFile).toString().split(os.EOL); - var secrets = fs.readFileSync(secretsFile).toString().split(os.EOL); - - ///////////////////////////// - // Facebook Authentication // - ///////////////////////////// - - var facebookRoutes = M(function() { - /*** - app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['email', 'user_location'] })); - app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }), function(req, res) { - res.redirect(req.session.returnTo || '/'); - }); - ***/ - }); - var facebookStrategyRequire = "var FacebookStrategy = require('passport-facebook').Strategy;"; - var facebookStrategy = M(function() { - /*** - // Sign in with Facebook. - - passport.use(new FacebookStrategy(secrets.facebook, function(req, accessToken, refreshToken, profile, done) { - if (req.user) { - User.findOne({ facebook: profile.id }, function(err, existingUser) { - if (existingUser) { - req.flash('errors', { msg: 'There is already a Facebook account that belongs to you. Sign in with that account or delete it, then link it with your current account.' }); - done(err); - } else { - User.findById(req.user.id, function(err, user) { - user.facebook = profile.id; - user.tokens.push({ kind: 'facebook', accessToken: accessToken }); - user.profile.name = user.profile.name || profile.displayName; - user.profile.gender = user.profile.gender || profile._json.gender; - user.profile.picture = user.profile.picture || 'https://graph.facebook.com/' + profile.id + '/picture?type=large'; - user.save(function(err) { - req.flash('info', { msg: 'Facebook account has been linked.' }); - done(err, user); - }); - }); - } - }); - } else { - User.findOne({ facebook: profile.id }, function(err, existingUser) { - if (existingUser) return done(null, existingUser); - User.findOne({ email: profile._json.email }, function(err, existingEmailUser) { - if (existingEmailUser) { - req.flash('errors', { msg: 'There is already an account using this email address. Sign in to that account and link it with Facebook manually from Account Settings.' }); - done(err); - } else { - var user = new User(); - user.email = profile._json.email; - user.facebook = profile.id; - user.tokens.push({ kind: 'facebook', accessToken: accessToken }); - user.profile.name = profile.displayName; - user.profile.gender = profile._json.gender; - user.profile.picture = 'https://graph.facebook.com/' + profile.id + '/picture?type=large'; - user.profile.location = (profile._json.location) ? profile._json.location.name : ''; - user.save(function(err) { - done(err, user); - }); - } - }); - }); - } - })); - - ***/ - }); - var facebookButton = M(function() { - /*** - a.btn.btn-block.btn-facebook.btn-social(href='/auth/facebook') - i.fa.fa-facebook - | Sign in with Facebook - ***/ - }); - var facebookLinkUnlink = M(function() { - /*** - - if user.facebook - p: a.text-danger(href='/account/unlink/facebook') Unlink your Facebook account - else - p: a(href='/auth/facebook') Link your Facebook account - ***/ - }); - var facebookModel = ' facebook: String,'; - - if (_.contains(answer.auth, 'Facebook')) { - if (passportConfig.indexOf(facebookStrategyRequire) < 0) { - - // Add Facebook to config/passport.js - index = passportConfig.indexOf("var passport = require('passport');"); - passportConfig.splice(index + 1, 0, facebookStrategyRequire); - index = passportConfig.indexOf('passport.deserializeUser(function(id, done) {'); - passportConfig.splice(index + 6, 0, facebookStrategy); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // Add Facebook to views/account/login.jade - loginTemplate.push(facebookButton); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // Add Facebook to views/account/profile.jade - index = profileTemplate.indexOf(' h3 Linked Accounts'); - profileTemplate.splice(index + 1, 0, facebookLinkUnlink); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // Add Facebook to models/User.js - index = userModel.indexOf(' tokens: Array,'); - userModel.splice(index - 1, 0, facebookModel); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Add Facebook to app.js - index = app.indexOf(' * OAuth routes for sign-in.'); - app.splice(index + 3, 0, facebookRoutes); - fs.writeFileSync(appFile, app.join(os.EOL)); - - console.log('✓ Facebook authentication has been added.'.info); - } else { - console.log('✓ Facebook authentication is already active.'.data); - } - } else { - - // config/passport.js - index = passportConfig.indexOf(facebookStrategyRequire); - passportConfig.splice(index, 1); - index = passportConfig.indexOf('// Sign in with Facebook.'); - passportConfig.splice(index, 47); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // views/account/login.jade - index = loginTemplate.indexOf(" a.btn.btn-block.btn-facebook.btn-social(href='/auth/facebook')"); - loginTemplate.splice(index, 3); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // views/account/profile.jade - index = profileTemplate.indexOf(" if user.facebook"); - profileTemplate.splice(index - 1, 5); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // models/User.js - index = userModel.indexOf(' facebook: String,'); - userModel.splice(index, 1); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Remove Facebook from app.js - index = app.indexOf("app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['email', 'user_location'] }));"); - app.splice(index, 4); - fs.writeFileSync(appFile, app.join(os.EOL)); - - console.log('✗ Facebook authentication has been removed.'.error); - } - - /////////////////////////// - // GitHub Authentication // - /////////////////////////// - - var githubRoutes = M(function() { - /*** - app.get('/auth/github', passport.authenticate('github')); - app.get('/auth/github/callback', passport.authenticate('github', { failureRedirect: '/login' }), function(req, res) { - res.redirect(req.session.returnTo || '/'); - }); - ***/ - }); - var githubStrategyRequire = "var GitHubStrategy = require('passport-github').Strategy;"; - var githubStrategy = M(function() { - /*** - // Sign in with GitHub. - - passport.use(new GitHubStrategy(secrets.github, function(req, accessToken, refreshToken, profile, done) { - if (req.user) { - User.findOne({ github: profile.id }, function(err, existingUser) { - if (existingUser) { - req.flash('errors', { msg: 'There is already a GitHub account that belongs to you. Sign in with that account or delete it, then link it with your current account.' }); - done(err); - } else { - User.findById(req.user.id, function(err, user) { - user.github = profile.id; - user.tokens.push({ kind: 'github', accessToken: accessToken }); - user.profile.name = user.profile.name || profile.displayName; - user.profile.picture = user.profile.picture || profile._json.avatar_url; - user.profile.location = user.profile.location || profile._json.location; - user.profile.website = user.profile.website || profile._json.blog; - user.save(function(err) { - req.flash('info', { msg: 'GitHub account has been linked.' }); - done(err, user); - }); - }); - } - }); - } else { - User.findOne({ github: profile.id }, function(err, existingUser) { - if (existingUser) return done(null, existingUser); - User.findOne({ email: profile._json.email }, function(err, existingEmailUser) { - if (existingEmailUser) { - req.flash('errors', { msg: 'There is already an account using this email address. Sign in to that account and link it with GitHub manually from Account Settings.' }); - done(err); - } else { - var user = new User(); - user.email = profile._json.email; - user.github = profile.id; - user.tokens.push({ kind: 'github', accessToken: accessToken }); - user.profile.name = profile.displayName; - user.profile.picture = profile._json.avatar_url; - user.profile.location = profile._json.location; - user.profile.website = profile._json.blog; - user.save(function(err) { - done(err, user); - }); - } - }); - }); - } - })); - - ***/ - }); - - var githubButton = M(function() { - /*** - a.btn.btn-block.btn-github.btn-social(href='/auth/github') - i.fa.fa-github - | Sign in with GitHub - ***/ - }); - var githubLinkUnlink = M(function() { - /*** - - if user.github - p: a.text-danger(href='/account/unlink/github') Unlink your GitHub account - else - p: a(href='/auth/github') Link your GitHub account - ***/ - }); - var githubModel = ' github: String,'; - - if (_.contains(answer.auth, 'GitHub')) { - if (passportConfig.indexOf(githubStrategyRequire) < 0) { - - // config/passport.js - index = passportConfig.indexOf("var passport = require('passport');"); - passportConfig.splice(index + 1, 0, githubStrategyRequire); - index = passportConfig.indexOf('passport.deserializeUser(function(id, done) {'); - passportConfig.splice(index + 6, 0, githubStrategy); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // views/account/login.jade - loginTemplate.push(githubButton); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // views/account/profile.jade - index = profileTemplate.indexOf(' h3 Linked Accounts'); - profileTemplate.splice(index + 1, 0, githubLinkUnlink); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // models/User.js - index = userModel.indexOf(' tokens: Array,'); - userModel.splice(index - 1, 0, githubModel); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Add GitHub to app.js - index = app.indexOf(' * OAuth routes for sign-in.'); - app.splice(index + 3, 0, githubRoutes); - fs.writeFileSync(appFile, app.join(os.EOL)); - - console.log('✓ GitHub authentication has been added.'.info); - } else { - console.log('✓ GitHub authentication is already active.'.data); - } - } else { - - // config/passport.js - index = passportConfig.indexOf(githubStrategyRequire); - passportConfig.splice(index, 1); - index = passportConfig.indexOf('// Sign in with GitHub.'); - passportConfig.splice(index, 48); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // views/account/login.jade - index = loginTemplate.indexOf(" a.btn.btn-block.btn-github.btn-social(href='/auth/github')"); - loginTemplate.splice(index, 3); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // views/account/profile.jade - index = profileTemplate.indexOf(' if user.github'); - profileTemplate.splice(index - 1, 5); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // models/User.js - index = userModel.indexOf(' github: String,'); - userModel.splice(index, 1); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Remove GitHub from app.js - index = app.indexOf("app.get('/auth/github', passport.authenticate('github'));"); - app.splice(index, 4); - fs.writeFileSync(appFile, app.join(os.EOL)); - - console.log('✗ GitHub authentication has been removed.'.error); - } - - /////////////////////////// - // Google Authentication // - /////////////////////////// - - var googleRoutes = M(function() { - /*** - app.get('/auth/google', passport.authenticate('google', { scope: 'profile email' })); - app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/login' }), function(req, res) { - res.redirect(req.session.returnTo || '/'); - }); - ***/ - }); - var googleStrategyRequire = "var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;"; - var googleStrategy = M(function() { - /*** - // Sign in with Google. - - passport.use(new GoogleStrategy(secrets.google, function(req, accessToken, refreshToken, profile, done) { - if (req.user) { - User.findOne({ google: profile.id }, function(err, existingUser) { - if (existingUser) { - req.flash('errors', { msg: 'There is already a Google account that belongs to you. Sign in with that account or delete it, then link it with your current account.' }); - done(err); - } else { - User.findById(req.user.id, function(err, user) { - user.google = profile.id; - user.tokens.push({ kind: 'google', accessToken: accessToken }); - user.profile.name = user.profile.name || profile.displayName; - user.profile.gender = user.profile.gender || profile._json.gender; - user.profile.picture = user.profile.picture || profile._json.picture; - user.save(function(err) { - req.flash('info', { msg: 'Google account has been linked.' }); - done(err, user); - }); - }); - } - }); - } else { - User.findOne({ google: profile.id }, function(err, existingUser) { - if (existingUser) return done(null, existingUser); - User.findOne({ email: profile._json.email }, function(err, existingEmailUser) { - if (existingEmailUser) { - req.flash('errors', { msg: 'There is already an account using this email address. Sign in to that account and link it with Google manually from Account Settings.' }); - done(err); - } else { - var user = new User(); - user.email = profile._json.email; - user.google = profile.id; - user.tokens.push({ kind: 'google', accessToken: accessToken }); - user.profile.name = profile.displayName; - user.profile.gender = profile._json.gender; - user.profile.picture = profile._json.picture; - user.save(function(err) { - done(err, user); - }); - } - }); - }); - } - })); - - ***/ - }); - - var googleButton = M(function() { - /*** - a.btn.btn-block.btn-google-plus.btn-social(href='/auth/google') - i.fa.fa-google-plus - | Sign in with Google - ***/ - }); - var googleLinkUnlink = M(function() { - /*** - - if user.google - p: a.text-danger(href='/account/unlink/google') Unlink your Google account - else - p: a(href='/auth/google') Link your Google account - ***/ - }); - var googleModel = ' google: String,'; - - if (_.contains(answer.auth, 'Google')) { - if (passportConfig.indexOf(googleStrategyRequire) < 0) { - - // Add Google to config/passport.js - index = passportConfig.indexOf("var passport = require('passport');"); - passportConfig.splice(index + 1, 0, googleStrategyRequire); - index = passportConfig.indexOf('passport.deserializeUser(function(id, done) {'); - passportConfig.splice(index + 6, 0, googleStrategy); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // Add Google to views/account/login.jade - loginTemplate.push(googleButton); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // Add Google to views/account/profile.jade - index = profileTemplate.indexOf(' h3 Linked Accounts'); - profileTemplate.splice(index + 1, 0, googleLinkUnlink); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // Add Google to models/User.js - index = userModel.indexOf(' tokens: Array,'); - userModel.splice(index - 1, 0, googleModel); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Add Google to app.js - index = app.indexOf(' * OAuth routes for sign-in.'); - app.splice(index + 3, 0, googleRoutes); - fs.writeFileSync(appFile, app.join(os.EOL)); - - console.log('✓ Google authentication has been added.'.info); - } else { - console.log('✓ Google authentication is already active.'.data); - } - } else { - - // Remove Google from config/passport.js - index = passportConfig.indexOf(googleStrategyRequire); - passportConfig.splice(index, 1); - index = passportConfig.indexOf('// Sign in with Google.'); - passportConfig.splice(index, 46); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // Remove Google from views/account/login.jade - index = loginTemplate.indexOf(" a.btn.btn-block.btn-google-plus.btn-social(href='/auth/google')"); - loginTemplate.splice(index, 3); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // Remove Google from views/account/profile.jade - index = profileTemplate.indexOf(' if user.google'); - profileTemplate.splice(index - 1, 5); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // Remove Google from models/User.js - index = userModel.indexOf(' google: String,'); - userModel.splice(index, 1); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Remove Google from app.js - index = app.indexOf("app.get('/auth/google', passport.authenticate('google', { scope: 'profile email' }));"); - app.splice(index, 4); - fs.writeFileSync(appFile, app.join(os.EOL)); - - console.log('✗ Google authentication has been removed.'.error); - } - - //////////////////////////// - // Twitter Authentication // - //////////////////////////// - - var twitterRoutes = M(function() { - /*** - app.get('/auth/twitter', passport.authenticate('twitter')); - app.get('/auth/twitter/callback', passport.authenticate('twitter', { failureRedirect: '/login' }), function(req, res) { - res.redirect(req.session.returnTo || '/'); - }); - ***/ - }); - var twitterStrategyRequire = "var TwitterStrategy = require('passport-twitter').Strategy;"; - var twitterStrategy = M(function() { - /*** - // Sign in with Twitter. - - passport.use(new TwitterStrategy(secrets.twitter, function(req, accessToken, tokenSecret, profile, done) { - if (req.user) { - User.findOne({ twitter: profile.id }, function(err, existingUser) { - if (existingUser) { - req.flash('errors', { msg: 'There is already a Twitter account that belongs to you. Sign in with that account or delete it, then link it with your current account.' }); - done(err); - } else { - User.findById(req.user.id, function(err, user) { - user.twitter = profile.id; - user.tokens.push({ kind: 'twitter', accessToken: accessToken, tokenSecret: tokenSecret }); - user.profile.name = user.profile.name || profile.displayName; - user.profile.location = user.profile.location || profile._json.location; - user.profile.picture = user.profile.picture || profile._json.profile_image_url; - user.save(function(err) { - req.flash('info', { msg: 'Twitter account has been linked.' }); - done(err, user); - }); - }); - } - }); - } else { - User.findOne({ twitter: profile.id }, function(err, existingUser) { - if (existingUser) return done(null, existingUser); - var user = new User(); - // Twitter will not provide an email address. Period. - // But a person’s twitter username is guaranteed to be unique - // so we can "fake" a twitter email address as follows: - user.email = profile.username + "@twitter.com"; - user.twitter = profile.id; - user.tokens.push({ kind: 'twitter', accessToken: accessToken, tokenSecret: tokenSecret }); - user.profile.name = profile.displayName; - user.profile.location = profile._json.location; - user.profile.picture = profile._json.profile_image_url; - user.save(function(err) { - done(err, user); - }); - }); - } - })); - ***/ - }); - - var twitterButton = M(function() { - /*** - a.btn.btn-block.btn-twitter-plus.btn-social(href='/auth/twitter') - i.fa.fa-twitter - | Sign in with Twitter - ***/ - }); - var twitterLinkUnlink = M(function() { - /*** - - if user.twitter - p: a.text-danger(href='/account/unlink/twitter') Unlink your Twitter account - else - p: a(href='/auth/twitter') Link your Twitter account - ***/ - }); - var twitterModel = ' twitter: String,'; - - if (_.contains(answer.auth, 'Twitter')) { - if (passportConfig.indexOf(twitterStrategyRequire) < 0) { - - // config/passport.js - index = passportConfig.indexOf("var passport = require('passport');"); - passportConfig.splice(index + 1, 0, twitterStrategyRequire); - index = passportConfig.indexOf('passport.deserializeUser(function(id, done) {'); - passportConfig.splice(index + 6, 0, twitterStrategy); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // views/account/login.jade - loginTemplate.push(twitterButton); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // views/account/profile.jade - index = profileTemplate.indexOf(' h3 Linked Accounts'); - profileTemplate.splice(index + 1, 0, twitterLinkUnlink); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // models/User.js - index = userModel.indexOf(' tokens: Array,'); - userModel.splice(index - 1, 0, twitterModel); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Add Twitter to app.js - index = app.indexOf(' * OAuth routes for sign-in.'); - app.splice(index + 3, 0, twitterRoutes); - fs.writeFileSync(appFile, app.join(os.EOL)); - - console.log('✓ Twitter authentication has been added.'.info); - } else { - console.log('✓ Twitter authentication is already active.'.data); - } - } else { - - // Remove Twitter from config/passport.js - index = passportConfig.indexOf(twitterStrategyRequire); - passportConfig.splice(index, 1); - index = passportConfig.indexOf('// Sign in with Twitter.'); - passportConfig.splice(index, 43); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // Remove Twitter from views/account/login.jade - index = loginTemplate.indexOf(" a.btn.btn-block.btn-twitter.btn-social(href='/auth/twitter')"); - loginTemplate.splice(index, 3); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // Remove Twitter from views/account/profile.jade - index = profileTemplate.indexOf(' if user.twitter'); - profileTemplate.splice(index - 1, 5); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // Remove Twitter from models/User.js - index = userModel.indexOf(' twitter: String,'); - userModel.splice(index, 1); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Remove Twitter from app.js - index = app.indexOf("app.get('/auth/twitter', passport.authenticate('twitter'));"); - app.splice(index, 4); - fs.writeFileSync(appFile, app.join(os.EOL)); - - console.log('✗ Twitter authentication has been removed.'.error); - } - - ///////////////////////////// - // LinkedIn Authentication // - ///////////////////////////// - - var linkedinRoutes = M(function() { - /*** - app.get('/auth/linkedin', passport.authenticate('linkedin', { state: 'SOME STATE' })); - app.get('/auth/linkedin/callback', passport.authenticate('linkedin', { failureRedirect: '/login' }), function(req, res) { - res.redirect(req.session.returnTo || '/'); - }); - ***/ - }); - var linkedinStrategyRequire = "var LinkedInStrategy = require('passport-linkedin-oauth2').Strategy;"; - var linkedinStrategy = M(function() { - /*** - // Sign in with LinkedIn. - - passport.use(new LinkedInStrategy(secrets.linkedin, function(req, accessToken, refreshToken, profile, done) { - if (req.user) { - User.findOne({ linkedin: profile.id }, function(err, existingUser) { - if (existingUser) { - req.flash('errors', { msg: 'There is already a LinkedIn account that belongs to you. Sign in with that account or delete it, then link it with your current account.' }); - done(err); - } else { - User.findById(req.user.id, function(err, user) { - user.linkedin = profile.id; - user.tokens.push({ kind: 'linkedin', accessToken: accessToken }); - user.profile.name = user.profile.name || profile.displayName; - user.profile.location = user.profile.location || profile._json.location.name; - user.profile.picture = user.profile.picture || profile._json.pictureUrl; - user.profile.website = user.profile.website || profile._json.publicProfileUrl; - user.save(function(err) { - req.flash('info', { msg: 'LinkedIn account has been linked.' }); - done(err, user); - }); - }); - } - }); - } else { - User.findOne({ linkedin: profile.id }, function(err, existingUser) { - if (existingUser) return done(null, existingUser); - User.findOne({ email: profile._json.emailAddress }, function(err, existingEmailUser) { - if (existingEmailUser) { - req.flash('errors', { msg: 'There is already an account using this email address. Sign in to that account and link it with LinkedIn manually from Account Settings.' }); - done(err); - } else { - var user = new User(); - user.linkedin = profile.id; - user.tokens.push({ kind: 'linkedin', accessToken: accessToken }); - user.email = profile._json.emailAddress; - user.profile.name = profile.displayName; - user.profile.location = profile._json.location.name; - user.profile.picture = profile._json.pictureUrl; - user.profile.website = profile._json.publicProfileUrl; - user.save(function(err) { - done(err, user); - }); - } - }); - }); - } - })); - ***/ - }); - - var linkedinButton = M(function() { - /*** - a.btn.btn-block.btn-linkedin.btn-social(href='/auth/linkedin') - i.fa.fa-linkedin - | Sign in with LinkedIn - ***/ - }); - var linkedinLinkUnlink = M(function() { - /*** - - if user.linkedin - p: a.text-danger(href='/account/unlink/linkedin') Unlink your LinkedIn account - else - p: a(href='/auth/linkedin') Link your LinkedIn account - ***/ - }); - var linkedinModel = ' linkedin: String,'; - - if (_.contains(answer.auth, 'LinkedIn')) { - if (passportConfig.indexOf(linkedinStrategyRequire) < 0) { - - // Add LinkedIn to passport.js - index = passportConfig.indexOf("var passport = require('passport');"); - passportConfig.splice(index + 1, 0, linkedinStrategyRequire); - index = passportConfig.indexOf('passport.deserializeUser(function(id, done) {'); - passportConfig.splice(index + 6, 0, linkedinStrategy); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // Add LinkedIn to login.jade - loginTemplate.push(linkedinButton); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // Add LinkedIn to profile.jade - index = profileTemplate.indexOf(' h3 Linked Accounts'); - profileTemplate.splice(index + 1, 0, linkedinLinkUnlink); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // Add LinkedIn to models/User.js - index = userModel.indexOf(' tokens: Array,'); - userModel.splice(index - 1, 0, linkedinModel); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Add LinkedIn to app.js - index = app.indexOf(' * OAuth routes for sign-in.'); - app.splice(index + 3, 0, linkedinRoutes); - fs.writeFileSync(appFile, app.join(os.EOL)); - - console.log('✓ LinkedIn authentication has been added.'.info); - } else { - console.log('✓ LinkedIn authentication is already active.'.data); - } - } else { - - // Check if we have LinkedIn authentication to begin with. - if (passportConfig.indexOf(linkedinStrategyRequire) < 0) return; - - // Removed LinkedIn from passport.js - index = passportConfig.indexOf(linkedinStrategyRequire); - passportConfig.splice(index, 1); - index = passportConfig.indexOf('// Sign in with LinkedIn.'); - passportConfig.splice(index, 51); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // Remove LinkedIn from login.jade - index = loginTemplate.indexOf(" a.btn.btn-block.btn-linkedin.btn-social(href='/auth/linkedin')"); - loginTemplate.splice(index, 3); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // Remove LinkedIn from profile.jade - index = profileTemplate.indexOf(' if user.linkedin'); - profileTemplate.splice(index - 1, 5); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // Remove LinkedIn from app.js - index = app.indexOf("app.get('/auth/linkedin', passport.authenticate('linkedin', { state: 'SOME STATE' }));"); - app.splice(index, 4); - fs.writeFileSync(appFile, app.join(os.EOL)); - - // Remove LinkedIn from User.js - index = userModel.indexOf(' linkedin: String,'); - userModel.splice(index, 1); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - console.log('✗ LinkedIn authentication has been removed.'.error); - } - - ////////////////////////////// - // Instagram Authentication // - ////////////////////////////// - - var instagramRoutes = M(function() { - /*** - app.get('/auth/instagram', passport.authenticate('instagram')); - app.get('/auth/instagram/callback', passport.authenticate('instagram', { failureRedirect: '/login' }), function(req, res) { - res.redirect(req.session.returnTo || '/'); - }); - ***/ - }); - var instagramSecrets = M(function() { - /*** - instagram: { - clientID: process.env.INSTAGRAM_ID || 'Your Client ID', - clientSecret: process.env.INSTAGRAM_SECRET || 'Your Client Secret', - callbackURL: '/auth/instagram/callback', - passReqToCallback: true - }, - - ***/ - }); - var instagramStrategyRequire = "var InstagramStrategy = require('passport-instagram').Strategy;"; - var instagramStrategy = M(function() { - /*** - // Sign in with Instagram. - - passport.use(new InstagramStrategy(secrets.instagram,function(req, accessToken, refreshToken, profile, done) { - if (req.user) { - User.findOne({ instagram: profile.id }, function(err, existingUser) { - if (existingUser) { - req.flash('errors', { msg: 'There is already an Instagram account that belongs to you. Sign in with that account or delete it, then link it with your current account.' }); - done(err); - } else { - User.findById(req.user.id, function(err, user) { - user.instagram = profile.id; - user.tokens.push({ kind: 'instagram', accessToken: accessToken }); - user.profile.name = user.profile.name || profile.displayName; - user.profile.picture = user.profile.picture || profile._json.data.profile_picture; - user.profile.website = user.profile.website || profile._json.data.website; - user.save(function(err) { - req.flash('info', { msg: 'Instagram account has been linked.' }); - done(err, user); - }); - }); - } - }); - } else { - User.findOne({ instagram: profile.id }, function(err, existingUser) { - if (existingUser) return done(null, existingUser); - - var user = new User(); - user.instagram = profile.id; - user.tokens.push({ kind: 'instagram', accessToken: accessToken }); - user.profile.name = profile.displayName; - // Similar to Twitter API, assigns a temporary e-mail address - // to get on with the registration process. It can be changed later - // to a valid e-mail address in Profile Management. - user.email = profile.username + "@instagram.com"; - user.profile.website = profile._json.data.website; - user.profile.picture = profile._json.data.profile_picture; - user.save(function(err) { - done(err, user); - }); - }); - } - })); - - ***/ - }); - - var instagramButton = M(function() { - /*** - a.btn.btn-block.btn-instagram.btn-social(href='/auth/instagram') - i.fa.fa-instagram - | Sign in with Instagram - ***/ - }); - var instagramLinkUnlink = M(function() { - /*** - - if user.instagram - p: a.text-danger(href='/account/unlink/instagram') Unlink your Instagram account - else - p: a(href='/auth/instagram') Link your Instagram account - ***/ - }); - var instagramModel = ' instagram: String,'; - - if (_.contains(answer.auth, 'Instagram')) { - - if (passportConfig.indexOf(instagramStrategyRequire) < 0) { - - // Add Instagram to passport.js - index = passportConfig.indexOf("var passport = require('passport');"); - passportConfig.splice(index + 1, 0, instagramStrategyRequire); - index = passportConfig.indexOf('passport.deserializeUser(function(id, done) {'); - passportConfig.splice(index + 6, 0, instagramStrategy); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // Add Instagram to login.jade - loginTemplate.push(instagramButton); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // Add Instagram to profile.jade - index = profileTemplate.indexOf(' h3 Linked Accounts'); - profileTemplate.splice(index + 1, 0, instagramLinkUnlink); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // Add Instagram to User.js - index = userModel.indexOf(' tokens: Array,'); - userModel.splice(index - 1, 0, instagramModel); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - // Add Instagram to app.js - index = app.indexOf(' * OAuth routes for sign-in.'); - app.splice(index + 3, 0, instagramRoutes); - fs.writeFileSync(appFile, app.join(os.EOL)); - - // Add Instagram to secrets.js - index = secrets.indexOf('module.exports = {'); - secrets.splice(index + 1, 0, instagramSecrets); - fs.writeFileSync(secretsFile, secrets.join(os.EOL)); - - console.log('✓ Instagram authentication has been added.'.info); - } else { - console.log('✓ Instagram authentication is already active.'.data); - } - } else { - - if (passportConfig.indexOf(instagramStrategyRequire) < 0) return; - - // Remove Instagram from passport.js - index = passportConfig.indexOf(instagramStrategyRequire); - passportConfig.splice(index, 1); - index = passportConfig.indexOf('// Sign in with Instagram.'); - passportConfig.splice(index, 40); - fs.writeFileSync(passportConfigFile, passportConfig.join(os.EOL)); - - // Remove Instagram from login.jade - index = loginTemplate.indexOf(" a.btn.btn-block.btn-instagram.btn-social(href='/auth/instagram')"); - loginTemplate.splice(index, 3); - fs.writeFileSync(loginTemplateFile, loginTemplate.join(os.EOL)); - - // Remove Instagram from profile.jade - index = profileTemplate.indexOf(' if user.instagram'); - profileTemplate.splice(index - 1, 5); - fs.writeFileSync(profileTemplateFile, profileTemplate.join(os.EOL)); - - // Remove Instagram from app.js - index = app.indexOf("app.get('/auth/instagram', passport.authenticate('instagram'));"); - app.splice(index, 4); - fs.writeFileSync(appFile, app.join(os.EOL)); - - // Remove Instagram from secrets.js - index = secrets.indexOf(' instagram: {'); - secrets.splice(index, 7); - fs.writeFileSync(secretsFile, secrets.join(os.EOL)); - - // Remove Instagram from User.js - index = userModel.indexOf(' instagram: String,'); - userModel.splice(index, 1); - fs.writeFileSync(userModelFile, userModel.join(os.EOL)); - - console.log('✗ Instagram authentication has been removed.'.error); - } - }); - } -}); diff --git a/package.json b/package.json index 4c84e83181..7b74402308 100755 --- a/package.json +++ b/package.json @@ -58,12 +58,11 @@ "yui": "^3.17.0-rc-1" }, "devDependencies": { + "blessed": "0.0.29", "chai": "^1.9.1", "colors": "^0.6.2", - "inquirer": "^0.4.1", "mocha": "^1.18.2", - "mstring": "^0.1.2", - "supertest": "^0.11.0", - "workshop": "0.0.0" + "multiline": "^0.3.4", + "supertest": "^0.11.0" } } diff --git a/setup.js b/setup.js new file mode 100644 index 0000000000..4a71b149ee --- /dev/null +++ b/setup.js @@ -0,0 +1,622 @@ +var fs = require('fs'); +var os = require('os'); +var blessed = require('blessed'); +var multiline = require('multiline'); + +var screen = blessed.screen({ + autoPadding: true +}); + +screen.key('q', function() { + process.exit(0); +}); + +var home = blessed.list({ + parent: screen, + padding: { top: 2 }, + mouse: true, + keys: true, + fg: 'white', + bg: 'blue', + selectedFg: 'blue', + selectedBg: 'white', + items: [ + '» REMOVE AUTHENTICATION PROVIDER', + '» CHANGE EMAIL SERVICE', + '» ADD NODE.JS CLUSTER SUPPORT', + '» EXIT' + ] +}); + +var homeTitle = blessed.text({ + parent: screen, + align: 'center', + fg: 'blue', + bg: 'white', + content: 'Hackathon Starter (c) 2014' +}); + +var footer = blessed.text({ + parent: screen, + bottom: 0, + fg: 'white', + bg: 'blue', + tags: true, + content: ' {cyan-fg}{/cyan-fg} moves | {cyan-fg}{/cyan-fg} selects | {cyan-fg}{/cyan-fg} exits' +}); + +var inner = blessed.form({ + top: 'center', + left: 'center', + mouse: true, + keys: true, + width: 33, + height: 10, + border: { + type: 'line', + fg: 'white', + bg: 'red' + }, + fg: 'white', + bg: 'red' +}); + +var success = blessed.box({ + top: 'center', + left: 'center', + mouse: true, + keys: true, + tags: true, + width: '50%', + height: '40%', + border: { + type: 'line', + fg: 'white', + bg: 'green' + }, + fg: 'white', + bg: 'green', + padding: 1 +}); + +success.on('keypress', function() { + home.focus(); + home.remove(success); +}); + +var clusterText = blessed.text({ + top: 'top', + bg: 'red', + fg: 'white', + tags: true, + content: 'Take advantage of multi-core systems using built-in {underline}cluster{/underline} module.' +}); + + +var enable = blessed.button({ + parent: inner, + bottom: 0, + mouse: true, + shrink: true, + name: 'enable', + content: ' ENABLE ', + border: { + type: 'line', + fg: 'white', + bg: 'red' + }, + style: { + fg: 'white', + bg: 'red', + focus: { + fg: 'red', + bg: 'white' + } + } +}); + + +var disable = blessed.button({ + parent: inner, + bottom: 0, + left: 10, + mouse: true, + shrink: true, + name: 'disable', + content: ' DISABLE ', + border: { + type: 'line', + fg: 'white', + bg: 'red' + }, + style: { + fg: 'white', + bg: 'red', + focus: { + fg: 'red', + bg: 'white' + } + } +}); + +var cancel = blessed.button({ + parent: inner, + bottom: 0, + left: 21, + mouse: true, + shrink: true, + name: 'cancel', + content: ' CANCEL ', + border: { + type: 'line', + fg: 'white', + bg: 'red' + }, + style: { + fg: 'white', + bg: 'red', + focus: { + fg: 'red', + bg: 'white' + } + } +}); + +cancel.on('press', function() { + home.focus(); + home.remove(inner); + screen.render(); + +}); + +var authForm = blessed.form({ + mouse: true, + keys: true, + fg: 'white', + bg: 'blue', + padding: { left: 1, right: 1 } +}); + +authForm.on('submit', function() { + var passportConfig = fs.readFileSync('config/passport.js').toString().split(os.EOL); + var loginTemplate = fs.readFileSync('views/account/login.jade').toString().split(os.EOL); + var profileTemplate = fs.readFileSync('views/account/profile.jade').toString().split(os.EOL); + var userModel = fs.readFileSync('models/User.js').toString().split(os.EOL); + var app = fs.readFileSync('app.js').toString().split(os.EOL); + var secrets = fs.readFileSync('config/secrets.js').toString().split(os.EOL); + + var index = passportConfig.indexOf("var FacebookStrategy = require('passport-facebook').Strategy;"); + if (facebookCheckbox.checked && index !== -1) { + passportConfig.splice(index, 1); + index = passportConfig.indexOf('// Sign in with Facebook.'); + passportConfig.splice(index, 47); + fs.writeFileSync('config/passport.js', passportConfig.join(os.EOL)); + + index = loginTemplate.indexOf(" a.btn.btn-block.btn-facebook.btn-social(href='/auth/facebook')"); + loginTemplate.splice(index, 3); + fs.writeFileSync('views/account/login.jade', loginTemplate.join(os.EOL)); + + index = profileTemplate.indexOf(" if user.facebook"); + profileTemplate.splice(index - 1, 5); + fs.writeFileSync('views/account/profile.jade', profileTemplate.join(os.EOL)); + + index = userModel.indexOf(' facebook: String,'); + userModel.splice(index, 1); + fs.writeFileSync('models/User.js', userModel.join(os.EOL)); + + index = app.indexOf("app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['email', 'user_location'] }));"); + app.splice(index, 4); + fs.writeFileSync('app.js', app.join(os.EOL)); + } + + index = passportConfig.indexOf("var GitHubStrategy = require('passport-github').Strategy;"); + if (githubCheckbox.checked && index !== -1) { + console.log(index); + passportConfig.splice(index, 1); + index = passportConfig.indexOf('// Sign in with GitHub.'); + passportConfig.splice(index, 48); + fs.writeFileSync('config/passport.js', passportConfig.join(os.EOL)); + + index = loginTemplate.indexOf(" a.btn.btn-block.btn-github.btn-social(href='/auth/github')"); + loginTemplate.splice(index, 3); + fs.writeFileSync('views/account/login.jade', loginTemplate.join(os.EOL)); + + index = profileTemplate.indexOf(' if user.github'); + profileTemplate.splice(index - 1, 5); + fs.writeFileSync('views/account/profile.jade', profileTemplate.join(os.EOL)); + + index = userModel.indexOf(' github: String,'); + userModel.splice(index, 1); + fs.writeFileSync('models/User.js', userModel.join(os.EOL)); + + index = app.indexOf("app.get('/auth/github', passport.authenticate('github'));"); + app.splice(index, 4); + fs.writeFileSync('app.js', app.join(os.EOL)); + } + + index = passportConfig.indexOf("var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;"); + if (googleCheckbox.checked && index !== -1) { + passportConfig.splice(index, 1); + index = passportConfig.indexOf('// Sign in with Google.'); + passportConfig.splice(index, 46); + fs.writeFileSync('config/passport.js', passportConfig.join(os.EOL)); + + index = loginTemplate.indexOf(" a.btn.btn-block.btn-google-plus.btn-social(href='/auth/google')"); + loginTemplate.splice(index, 3); + fs.writeFileSync('views/account/login.jade', loginTemplate.join(os.EOL)); + + index = profileTemplate.indexOf(' if user.google'); + profileTemplate.splice(index - 1, 5); + fs.writeFileSync('views/account/profile.jade', profileTemplate.join(os.EOL)); + + index = userModel.indexOf(' google: String,'); + userModel.splice(index, 1); + fs.writeFileSync('models/User.js', userModel.join(os.EOL)); + + index = app.indexOf("app.get('/auth/google', passport.authenticate('google', { scope: 'profile email' }));"); + app.splice(index, 4); + fs.writeFileSync('app.js', app.join(os.EOL)); + } + + index = passportConfig.indexOf("var TwitterStrategy = require('passport-twitter').Strategy;"); + if (twitterCheckbox.checked && index !== -1) { + passportConfig.splice(index, 1); + index = passportConfig.indexOf('// Sign in with Twitter.'); + passportConfig.splice(index, 43); + fs.writeFileSync('config/passport.js', passportConfig.join(os.EOL)); + + index = loginTemplate.indexOf(" a.btn.btn-block.btn-twitter.btn-social(href='/auth/twitter')"); + loginTemplate.splice(index, 3); + fs.writeFileSync('views/account/login.jade', loginTemplate.join(os.EOL)); + + index = profileTemplate.indexOf(' if user.twitter'); + profileTemplate.splice(index - 1, 5); + fs.writeFileSync('views/account/profile.jade', profileTemplate.join(os.EOL)); + + index = userModel.indexOf(' twitter: String,'); + userModel.splice(index, 1); + fs.writeFileSync('models/User.js', userModel.join(os.EOL)); + + index = app.indexOf("app.get('/auth/twitter', passport.authenticate('twitter'));"); + app.splice(index, 4); + fs.writeFileSync('app.js', app.join(os.EOL)); + } + + index = passportConfig.indexOf("var LinkedInStrategy = require('passport-linkedin-oauth2').Strategy;"); + if (linkedinCheckbox.checked && index !== -1) { + passportConfig.splice(index, 1); + index = passportConfig.indexOf('// Sign in with LinkedIn.'); + passportConfig.splice(index, 47); + fs.writeFileSync('config/passport.js', passportConfig.join(os.EOL)); + + index = loginTemplate.indexOf(" a.btn.btn-block.btn-linkedin.btn-social(href='/auth/linkedin')"); + loginTemplate.splice(index, 3); + fs.writeFileSync('views/account/login.jade', loginTemplate.join(os.EOL)); + + index = profileTemplate.indexOf(' if user.linkedin'); + profileTemplate.splice(index - 1, 5); + fs.writeFileSync('views/account/profile.jade', profileTemplate.join(os.EOL)); + + index = userModel.indexOf(' linkedin: String,'); + userModel.splice(index, 1); + fs.writeFileSync('models/User.js', userModel.join(os.EOL)); + + index = app.indexOf("app.get('/auth/linkedin', passport.authenticate('linkedin', { state: 'SOME STATE' }));"); + app.splice(index, 4); + fs.writeFileSync('app.js', app.join(os.EOL)); + } + + index = passportConfig.indexOf("var InstagramStrategy = require('passport-instagram').Strategy;"); + if (instagramCheckbox.checked && index !== -1) { + passportConfig.splice(index, 1); + index = passportConfig.indexOf('// Sign in with Instagram.'); + passportConfig.splice(index, 40); + fs.writeFileSync('config/passport.js', passportConfig.join(os.EOL)); + + index = loginTemplate.indexOf(" a.btn.btn-block.btn-instagram.btn-social(href='/auth/instagram')"); + loginTemplate.splice(index, 3); + fs.writeFileSync('views/account/login.jade', loginTemplate.join(os.EOL)); + + index = profileTemplate.indexOf(' if user.instagram'); + profileTemplate.splice(index - 1, 5); + fs.writeFileSync('views/account/profile.jade', profileTemplate.join(os.EOL)); + + index = app.indexOf("app.get('/auth/instagram', passport.authenticate('instagram'));"); + app.splice(index, 4); + fs.writeFileSync('app.js', app.join(os.EOL)); + + userModel.splice(index, 1); + fs.writeFileSync('models/User.js', userModel.join(os.EOL)); + } + + home.remove(authForm); + home.append(success); + success.setContent('Selected authentication providers have been removed from passportConfig.js, User.js, app.js, login.jade and profile.jade!'); + success.focus(); + screen.render(); +}); + +var authText = blessed.text({ + parent: authForm, + content: 'Selecting a checkbox adds an authentication provider. Unselecting a checkbox removes it. If authentication provider is already present, no action will be taken.', + padding: 1, + bg: 'magenta', + fg: 'white' +}); + +var facebookCheckbox = blessed.checkbox({ + parent: authForm, + top: 6, + mouse: true, + fg: 'white', + bg: 'blue', + content: 'Facebook' +}); + +var githubCheckbox = blessed.checkbox({ + parent: authForm, + top: 7, + mouse: true, + fg: 'white', + bg: 'blue', + content: 'GitHub' +}); + +var googleCheckbox = blessed.checkbox({ + parent: authForm, + top: 8, + mouse: true, + fg: 'white', + bg: 'blue', + content: 'Google' +}); + +var twitterCheckbox = blessed.checkbox({ + parent: authForm, + top: 9, + mouse: true, + fg: 'white', + bg: 'blue', + content: 'Twitter' +}); + +var linkedinCheckbox = blessed.checkbox({ + parent: authForm, + top: 10, + mouse: true, + fg: 'white', + bg: 'blue', + content: 'LinkedIn' +}); + +var instagramCheckbox = blessed.checkbox({ + parent: authForm, + top: 11, + mouse: true, + fg: 'white', + bg: 'blue', + content: 'Instagram' +}); + +var authSubmit = blessed.button({ + parent: authForm, + top: 13, + mouse: true, + shrink: true, + name: 'submit', + content: ' SUBMIT ', + style: { + fg: 'blue', + bg: 'white', + focus: { + fg: 'white', + bg: 'red' + } + } +}); + +authSubmit.on('press', function() { + authForm.submit(); +}); + +var authCancel = blessed.button({ + parent: authForm, + top: 13, + left: 9, + mouse: true, + shrink: true, + name: 'cancel', + content: ' CANCEL ', + style: { + fg: 'blue', + bg: 'white', + focus: { + fg: 'white', + bg: 'red' + } + } +}); + +authCancel.on('press', function() { + home.focus(); + home.remove(authForm); + screen.render(); +}); + +var emailForm = blessed.form({ + mouse: true, + keys: true, + fg: 'white', + bg: 'blue', + padding: { left: 1, right: 1 } +}); + +emailForm.on('submit', function() { + var contactCtrl = fs.readFileSync('controllers/contact.js').toString().split(os.EOL); + var userCtrl = fs.readFileSync('controllers/user.js').toString().split(os.EOL); + var choice = null; + + if (sendgridRadio.checked) { + choice = 'SendGrid'; + } else if (mailgunRadio.checked) { + choice = 'Mailgun'; + } else if (mandrillRadio.checked) { + choice = 'Mandrill'; + } + + var index = contactCtrl.indexOf('var smtpTransport = nodemailer.createTransport(\'SMTP\', {'); + contactCtrl.splice(index + 1, 1, " service: '" + choice + "',"); + contactCtrl.splice(index + 3, 1, ' user: secrets.' + choice.toLowerCase() +'.user,'); + contactCtrl.splice(index + 4, 1, ' pass: secrets.' + choice.toLowerCase() + '.password'); + fs.writeFileSync('controllers/contact.js', contactCtrl.join(os.EOL)); + + index = userCtrl.indexOf(' var smtpTransport = nodemailer.createTransport(\'SMTP\', {'); + userCtrl.splice(index + 1, 1, " service: '" + choice + "',"); + userCtrl.splice(index + 3, 1, ' user: secrets.' + choice.toLowerCase() + '.user,'); + userCtrl.splice(index + 4, 1, ' pass: secrets.' + choice.toLowerCase() + '.password'); + index = userCtrl.indexOf(' var smtpTransport = nodemailer.createTransport(\'SMTP\', {', (index + 1)); + userCtrl.splice(index + 1, 1, " service: '" + choice + "',"); + userCtrl.splice(index + 3, 1, ' user: secrets.' + choice.toLowerCase() + '.user,'); + userCtrl.splice(index + 4, 1, ' pass: secrets.' + choice.toLowerCase() + '.password'); + fs.writeFileSync('controllers/user.js', userCtrl.join(os.EOL)); + + home.remove(emailForm); + home.append(success); + success.setContent('Email Service has been switched to ' + choice); + success.focus(); + screen.render(); +}); + +var emailText = blessed.text({ + parent: emailForm, + content: 'Select one of the following email service providers for {underline}contact form{/underline} and {underline}password reset{/underline}.', + padding: 1, + bg: 'red', + fg: 'white', + tags: true +}); + +var sendgridRadio = blessed.radiobutton({ + parent: emailForm, + top: 5, + checked: true, + mouse: true, + fg: 'white', + bg: 'blue', + content: 'SendGrid' +}); + +var mailgunRadio = blessed.radiobutton({ + parent: emailForm, + top: 6, + mouse: true, + fg: 'white', + bg: 'blue', + content: 'Mailgun' +}); + +var mandrillRadio = blessed.radiobutton({ + parent: emailForm, + top: 7, + mouse: true, + fg: 'white', + bg: 'blue', + content: 'Mandrill' +}); + +var emailSubmit = blessed.button({ + parent: emailForm, + top: 9, + mouse: true, + shrink: true, + name: 'submit', + content: ' SUBMIT ', + style: { + fg: 'blue', + bg: 'white', + focus: { + fg: 'white', + bg: 'red' + } + } +}); + +emailSubmit.on('press', function() { + emailForm.submit(); +}); + +var emailCancel = blessed.button({ + parent: emailForm, + top: 9, + left: 9, + mouse: true, + shrink: true, + name: 'cancel', + content: ' CANCEL ', + style: { + fg: 'blue', + bg: 'white', + focus: { + fg: 'white', + bg: 'red' + } + } +}); + +emailCancel.on('press', function() { + home.focus(); + home.remove(emailForm); + screen.render(); + +}); + +home.on('select', function(child, index) { + switch (index) { + case 0: + home.append(authForm); + authForm.focus(); + screen.render(); + break; + case 1: + home.append(emailForm); + emailForm.focus(); + break; + case 2: + addClusterSupport(); + home.append(success); + success.setContent('New file {underline}cluster_app.js{/underline} has been created. Your app is now able to use more than 1 CPU by running {underline}node cluster_app.js{/underline}, which in turn spawns multiple instances of {underline}app.js{/underline}'); + success.focus(); + screen.render(); + break; + default: + process.exit(0); + } +}); + +screen.render(); + + +function addClusterSupport() { + + var fileContents = multiline(function() { +/* +var os = require('os'); +var cluster = require('cluster'); + +cluster.setupMaster({ + exec: 'app.js' +}); + +cluster.on('exit', function(worker) { + console.log('worker ' + worker.id + ' died'); + cluster.fork(); +}); + +for (var i = 0; i < os.cpus().length; i++) { + cluster.fork(); +} +*/ + }); + + fs.writeFileSync('cluster_app.js', fileContents); +} \ No newline at end of file