diff --git a/app.js b/app.js index 3b12de14dd..962d7dd1dd 100755 --- a/app.js +++ b/app.js @@ -32,6 +32,7 @@ var express = require('express'), expressValidator = require('express-validator'), connectAssets = require('connect-assets'), request = require('request'), + forceDomain = require('forcedomain'), /** * Controllers (route handlers). @@ -48,7 +49,7 @@ var express = require('express'), /** * Stories */ - storyController = require('./controllers/story'); + storyController = require('./controllers/story'), /** * API keys and Passport configuration. @@ -81,19 +82,15 @@ app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); if (process.env.NODE_ENV === 'production') { - app.all(/.*/, function (req, res, next) { - var host = req.header('host'); - var originalUrl = req['originalUrl']; - if (host.match(/^www\..*/i)) { - next(); - } else { - res.redirect(301, "http://www." + host + originalUrl); - } - }); + app.use(forceDomain({ + hostname: 'www.freecodecamp.com' + })); } app.use(compress()); var oneYear = 31557600000; +// todo +// another app.use(express.static...) call app.use(express.static(__dirname + '/public', {maxAge: oneYear})); app.use(connectAssets({ paths: [ @@ -134,8 +131,10 @@ app.use(helmet.xssFilter()); app.use(helmet.noSniff()); app.use(helmet.xframe()); app.use(function(req, res, next) { - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Headers', + 'Origin, X-Requested-With, Content-Type, Accept' + ); next(); }); @@ -183,7 +182,7 @@ app.use(helmet.contentSecurityPolicy({ scriptSrc: [ '*.optimizely.com', '*.aspnetcdn.com', - '*.d3js.org', + '*.d3js.org' ].concat(trusted), 'connect-src': [ 'ws://*.rafflecopter.com', @@ -203,7 +202,8 @@ app.use(helmet.contentSecurityPolicy({ 'graph.facebook.com', '*.githubusercontent.com', '*.googleusercontent.com', - '*' /* allow all input since we have user submitted images for public profile*/ + /* allow all input since we have user submitted images for public profile*/ + '*' ].concat(trusted), fontSrc: ['*.googleapis.com'].concat(trusted), mediaSrc: [ @@ -244,7 +244,8 @@ app.use(function (req, res, next) { app.use( express.static(path.join(__dirname, 'public'), {maxAge: 31557600000}) ); - +// todo +// why are there two express.static declarations? app.use(express.static(__dirname + '/public', { maxAge: 86400000 })); /** @@ -263,13 +264,15 @@ app.get('/twitch', resourcesController.twitch); // Agile Project Manager Onboarding -app.get('/pmi-acp-agile-project-managers', resourcesController.agileProjectManagers); +app.get('/pmi-acp-agile-project-managers', + resourcesController.agileProjectManagers); app.get('/agile', function(req, res) { res.redirect(301, '/pmi-acp-agile-project-managers'); }); -app.get('/pmi-acp-agile-project-managers-form', resourcesController.agileProjectManagersForm); +app.get('/pmi-acp-agile-project-managers-form', + resourcesController.agileProjectManagersForm); // Nonprofit Onboarding @@ -404,7 +407,7 @@ app.get('/api/slack', function(req, res) { }); return res.redirect('back'); } - }) + }); } else { req.flash('notice', { msg: "Before we can send your Slack invite, we need your email address. Please update your profile information here." @@ -550,7 +553,9 @@ app.post('/completed-bonfire/', bonfireController.completedBonfire); */ -app.get('/field-guide/:fieldGuideName', fieldGuideController.returnIndividualFieldGuide); +app.get('/field-guide/:fieldGuideName', + fieldGuideController.returnIndividualFieldGuide + ); app.get('/field-guide/', fieldGuideController.returnNextFieldGuide); @@ -574,9 +579,13 @@ app.post('/completed-zipline-or-basejump', coursewareController.completedZiplineOrBasejump); // Unique Check API route -app.get('/api/checkUniqueUsername/:username', userController.checkUniqueUsername); +app.get('/api/checkUniqueUsername/:username', + userController.checkUniqueUsername + ); -app.get('/api/checkExistingUsername/:username', userController.checkExistingUsername); +app.get('/api/checkExistingUsername/:username', + userController.checkExistingUsername + ); app.get('/api/checkUniqueEmail/:email', userController.checkUniqueEmail); diff --git a/package.json b/package.json index 791058bf8c..7112641f86 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "express-session": "^1.9.2", "express-validator": "^2.8.0", "font-awesome": "^4.3.0", + "forcedomain": "^0.4.0", "forever": "^0.14.1", "github-api": "^0.7.0", "gulp-minify-css": "^0.5.1", diff --git a/seed_data/field-guides.json b/seed_data/field-guides.json index d573ea45a3..f83b8990c9 100644 --- a/seed_data/field-guides.json +++ b/seed_data/field-guides.json @@ -245,6 +245,28 @@ "" ] }, + { + "_id": "bd7158d9c436eddfaeb5bd2f", + "name": "How do I get help when I get stuck?", + "description": [ + "
", + "

When you get stuck, remember: RSAP.

", + "

", + "
    ", + "
  1. Read the documentation or error
  2. ", + "
  3. Search Google
  4. ", + "
  5. Ask your friends for help
  6. ", + "
  7. Post on Stack Overflow
  8. ", + "
", + "

", + "

This is the most time-efficient way to handle being stuck, and it's the most respectful of other people's time, too.

", + "

Most of the time, you'll solve your problem after just one or two steps of this algorithm.

", + "

We have a special chat room just for getting help: https://freecode.slack.com/messages/help/

", + "

Also, if you need to post on Stack Overflow, be sure to read their guide to asking good questions: http://stackoverflow.com/help/how-to-ask.

", + "

Learning to code is hard. But it's a lot easier if you ask for help when you need it!

", + "
" + ] + }, { "_id": "bd7158d9c442eddfaeb5bdef", "name": "How do I best use the Global Control Shortcuts for Mac?", diff --git a/views/bonfire/show.jade b/views/bonfire/show.jade index 5e7f620224..e7c5a0f9f6 100644 --- a/views/bonfire/show.jade +++ b/views/bonfire/show.jade @@ -132,7 +132,7 @@ block content - if (user.progressTimestamps.length > 2) - a.animated.fadeIn.btn.btn-lg.btn-block.btn-twitter(target="_blank") + a.animated.fadeIn.btn.btn-lg.btn-block.btn-twitter(target="_blank", href="https://twitter.com/intent/tweet?text=I%20just%20#{verb}%20%40FreeCodeCamp%20Bonfire:%20#{name}&url=http%3A%2F%2Ffreecodecamp.com/bonfires/#{dashedName}&hashtags=LearnToCode, JavaScript") i.fa.fa-twitter   = phrase - else