Skip to content

Commit

Permalink
Normalize repository at the top level
Browse files Browse the repository at this point in the history
  • Loading branch information
kisonecat committed Aug 4, 2017
1 parent 24b5f2d commit 9a15f47
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 18 deletions.
48 changes: 39 additions & 9 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,25 @@ function addUserImplicitly(req, res, next) {

app.version = require('./package.json').version;

function redirectUnnormalizeRepositoryName( req, res, next ) {
if (req.params.repository) {
var normalized = req.params.repository.replace( /[^0-9A-Za-z-]/, '' ).toLowerCase();
if (req.params.repository != normalized) {
var splitted = req.url.split('/');
splitted[1] = normalized;
res.redirect(301, splitted.join('/'));
return;
}
}
next();
}

function normalizeRepositoryName( req, res, next ) {
if (req.params.repository)
req.params.repository = req.params.repository.replace( /[^0-9A-Za-z-]/, '' ).toLowerCase();
next();
}

////////////////////////////////////////////////////////////////
// API endpoints for the xake tool

Expand All @@ -144,21 +163,21 @@ function addUserImplicitly(req, res, next) {

app.use( '/gpg/', limiter );
app.use( '/pks/', limiter );
app.use( '/:repository.git', limiter );
app.use( '/:repository.git', normalizeRepositoryName, limiter );

app.get( '/gpg/token/:keyid', keyserver.token );
app.get( '/gpg/tokens/:keyid', keyserver.token );
app.post( '/pks/add', keyserver.add );

app.post( '/:repository.git', keyserver.authorization );
app.post( '/:repository.git', hashcash.hashcash );
app.post( '/:repository.git', gitBackend.create );
app.post( '/:repository.git', normalizeRepositoryName, keyserver.authorization );
app.post( '/:repository.git', normalizeRepositoryName, hashcash.hashcash );
app.post( '/:repository.git', normalizeRepositoryName, gitBackend.create );

app.use( '/:repository.git/log.sz', gitBackend.authorization );
app.use( '/:repository.git/log.sz', sendSeekable );
app.get( '/:repository.git/log.sz', tincan.get );
app.use( '/:repository.git/log.sz', normalizeRepositoryName, gitBackend.authorization );
app.use( '/:repository.git/log.sz', normalizeRepositoryName, sendSeekable );
app.get( '/:repository.git/log.sz', normalizeRepositoryName, tincan.get );

app.use( '/:repository.git', repositories.git );
app.use( '/:repository.git', normalizeRepositoryName, repositories.git );

////////////////////////////////////////////////////////////////
// Static content
Expand Down Expand Up @@ -190,7 +209,7 @@ function addUserImplicitly(req, res, next) {

app.post('/xAPI/statements', function(req,res) { res.status(200).send('ignoring statements without a repository.'); } );

app.post('/:repository/xAPI/statements', tincan.postStatements);
app.post('/:repository/xAPI/statements', normalizeRepositoryName, tincan.postStatements);

////////////////////////////////////////////////////////////////
// User identity
Expand Down Expand Up @@ -244,6 +263,7 @@ function addUserImplicitly(req, res, next) {

app.get( '/statistics/:repository/:path(*)/:activityHash',
// include some sort of authorization here -- being an LTI "instuctor" in any xourse in the repo suffices
normalizeRepositoryName,
statistics.get );

// app.get( '/statistics/:commit/:hash/successes', course.successes );
Expand Down Expand Up @@ -320,14 +340,17 @@ function addUserImplicitly(req, res, next) {
app.get('/users/:id/completions', state.getCompletions);

app.get( '/:repository/:path(*)/gradebook',
normalizeRepositoryName,
gradebook.record );
app.put( '/:repository/:path(*)/gradebook',
normalizeRepositoryName,
gradebook.record );

////////////////////////////////////////////////////////////////
// Activity page rendering

app.get( '/:repository/:path(*)/certificate',
redirectUnnormalizeRepositoryName,
gitBackend.activitiesFromRecentCommitsOnMaster,
gitBackend.chooseMostRecentBlob,
gitBackend.parseActivity,
Expand All @@ -336,15 +359,18 @@ function addUserImplicitly(req, res, next) {
// BADBAD: i also need to serve pngs and pdfs and such from the repo here

app.get( '/:repository/:path/lti.xml',
redirectUnnormalizeRepositoryName,
gitBackend.activitiesFromRecentCommitsOnMaster,
gitBackend.ltiConfig );

var serveContent = function( regexp, callback ) {
app.get( '/:repository/:path(' + regexp + ')',
redirectUnnormalizeRepositoryName,
gitBackend.activitiesFromRecentCommitsOnMaster,
callback );

app.get( '/users/:masqueradingUserId/:repository/:path(' + regexp + ')',
normalizeRepositoryName,
gitBackend.activitiesFromRecentCommitsOnMaster,
callback );
};
Expand All @@ -356,6 +382,7 @@ function addUserImplicitly(req, res, next) {
serveContent( '*.js', gitBackend.serve('text/javascript') );

app.get( '/:repository/:path(*.tex)',
redirectUnnormalizeRepositoryName,
gitBackend.activitiesFromRecentCommitsOnMaster,
gitBackend.source );

Expand All @@ -379,6 +406,7 @@ function addUserImplicitly(req, res, next) {

// Instructors should be based around a context instead?
app.get( '/:repository/:path/instructors',
redirectUnnormalizeRepositoryName,
gitBackend.activitiesFromRecentCommitsOnMaster,
gitBackend.chooseMostRecentBlob,
parallel([gitBackend.fetchMetadataFromActivity,
Expand All @@ -387,13 +415,15 @@ function addUserImplicitly(req, res, next) {

app.get( '/:repository/:path(*)',
remember,
redirectUnnormalizeRepositoryName,
gitBackend.activitiesFromRecentCommitsOnMaster,
gitBackend.chooseMostRecentBlob,
parallel([gitBackend.fetchMetadataFromActivity,
gitBackend.parseActivity]),
gitBackend.render );

app.get( '/:repository',
redirectUnnormalizeRepositoryName,
gitBackend.mostRecentMetadata,
xourses.index );

Expand Down
3 changes: 1 addition & 2 deletions routes/gradebook.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var mdb = require('../mdb');
var gitBackend = require('./git');
var request = require('request');
var pug = require('pug');
var path = require('path');
Expand All @@ -10,7 +9,7 @@ const uuidv1 = require('uuid/v1');
var passback = pug.compileFile(path.join(__dirname,'../views/lti/passback.pug'));

exports.record = function(req, res, next) {
var repositoryName = gitBackend.normalizeRepositoryName(req.params.repository);
var repositoryName = req.params.repository;

if (!req.user) {
next('No user logged in.');
Expand Down
7 changes: 0 additions & 7 deletions routes/repositories.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,6 @@ client.on('error', function (err) {
console.log("Error " + err);
});


function normalizeRepositoryName( name ) {
return name.replace( /[^0-9A-Za-z-]/, '' ).toLowerCase();
}

exports.normalizeRepositoryName = normalizeRepositoryName;

var repositoryCache = {};

function invalidateRepositoryCache(repositoryName) {
Expand Down

0 comments on commit 9a15f47

Please sign in to comment.