Changeset 466


Ignore:
Timestamp:
06/26/13 14:43:57 (12 years ago)
Author:
hendrikvanantwerpen
Message:

Added authentication (fixed user now).

Location:
Dev/trunk
Files:
8 added
1 deleted
15 edited
1 moved

Legend:

Unmodified
Added
Removed
  • Dev/trunk/Gruntfile.js

    r464 r466  
    2929                    dest: developmentDir,
    3030                    ext: '.js'
     31                }]
     32            }
     33        },
     34        coffeelint: {
     35            compile: {
     36                options: require('./'+srcDir+'.coffeelint.json'),
     37                files: [{
     38                    expand: true,
     39                    cwd: srcDir,
     40                    src: ['client/qed-client/**/*.coffee', 'server/**.coffee']
    3141                }]
    3242            }
     
    116126    });
    117127
     128    grunt.loadNpmTasks('grunt-coffeelint');
    118129    grunt.loadNpmTasks('grunt-contrib-clean');
    119130    grunt.loadNpmTasks('grunt-contrib-coffee');
     
    126137    // development tasks
    127138    grunt.registerTask('install-deps', ['copy:server-deps', 'copy:client-deps']);
    128     grunt.registerTask('compile', ['less:compile', 'jshint:compile', 'htmlhint:compile', 'coffee:compile', 'copy:compile']);
     139    grunt.registerTask('lint', ['jshint:compile', 'htmlhint:compile', 'coffeelint:compile']);
     140    grunt.registerTask('compile', ['lint', 'less:compile', 'coffee:compile', 'copy:compile']);
    129141    grunt.registerTask('build', ['clean:development', 'install-deps', 'compile']);
    130142
     
    135147    grunt.registerTask('default', ['compile']);
    136148
     149    // util functions
     150
    137151};
  • Dev/trunk/package.json

    r464 r466  
    1313    "grunt-contrib-clean": "~0.4.1",
    1414    "grunt-contrib-coffee": "~0.7.0",
    15     "underscore": "~1.4.4"
     15    "underscore": "~1.4.4",
     16    "grunt-coffeelint": "0.0.6"
    1617  }
    1718}
  • Dev/trunk/src/client/index.html

    r452 r466  
    3030        </div>
    3131        <div id="toaster" data-dojo-type="qed-client/app/Notifications"></div>
     32        <div id="loginDialog" data-dojo-type="qed-client/ui/LoginDialog"></div>
    3233    </body>
    3334</html>
  • Dev/trunk/src/client/qed-client/index.js

    r463 r466  
    44    "./app/Router",
    55    "./routes",
     6    "./session",
    67    "./store",
    78    "./store/request",
     
    910    "dojo/_base/array",
    1011    "dojo/parser",
    11     "dojo/request/registry",
    1212    "./stddeps",
    1313    "dojo/domReady!"
    14 ], function(Content, Page, Router, routes, store, request, MainMenu, array, parser, registry) {
     14], function(Content, Page, Router, routes, session, store, request, MainMenu, array, parser) {
    1515
    16     registry.register(/.*/,request);
     16    parser.parse();
     17
     18    new MainMenu({},"menu").startup();
     19
     20    array.forEach(routes,function(route){
     21        Router.register(route);
     22    });
     23    Router.startup();
     24
     25    session.restore();
    1726   
    18     parser.parse();
    19     store.info()
    20     .then(function(){
    21         new MainMenu({},"menu").startup();
    22         array.forEach(routes,function(route){
    23             Router.register(route);
    24         });
    25         Router.startup();
    26     },function(){
    27         Content.startup();
    28         Content.set(new Page({
    29             templateString: "<div>Application database is not properly configured. Contact your system administrator.</div>"
    30         }));
    31     });
    3227});
  • Dev/trunk/src/client/qed-client/pages/surveyRun.js

    r463 r466  
    8686        },
    8787        _link: function(url,label) {
    88             return '<a target="_black" href="'+url+'">'+(label || url)+'</a>';
     88            return '<a target="_blank" href="'+url+'">'+(label || url)+'</a>';
    8989        },
    9090        _onSave: function(evt) {
     
    111111            if ( evt ) { event.stop(evt); }
    112112            return false;
    113         },
    114         _onExport: function(evt) {
    115             if ( evt ) { event.stop(evt); }
    116             return false;
    117113        }
    118114    });
  • Dev/trunk/src/client/qed-client/pages/templates/question.html

    r443 r466  
    1 <div class="orange">
     1<form class="orange">
    22    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
    33        <h2>
     
    1515        </div>
    1616    </div>
    17 </div>
     17</form>
  • Dev/trunk/src/client/qed-client/pages/templates/surveyRun.html

    r463 r466  
    4545            <div>
    4646                <div class="qedLabel">Export results</div>
    47                 <button data-dojo-type="dijit/form/Button"
    48                         class="qedField blue"
    49                         data-dojo-props="baseClass: 'rftBlockButton', iconClass: 'rftIcon rftIconSave'"
    50                         data-dojo-attach-event="onClick:_onExport">To CSV</button>
     47                <a target="_blank" href="/surveyRun/${surveyRunId}/csv" class="qedField">To CSV</a>
    5148            </div>
    5249        </fieldset>
  • Dev/trunk/src/client/qed-client/stddeps.js

    r457 r466  
    3333    './model/widgets/SurveyWidget',
    3434
     35    './ui/LoginDialog',
    3536    './ui/MainMenu',
    3637    './ui/MenuBarLink',
    3738    './ui/MenuLink',
     39    './ui/SessionMenu',
    3840
    3941    './widgets/LineWithActionsWidget',
  • Dev/trunk/src/client/qed-client/store.js

    r443 r466  
    99   
    1010    var couchStore = new CouchStore({
    11         target: 'data/couch/' /*,
     11        target: 'api/data/' /*,
    1212        validate: function(object) {
    1313            var result = jsonSchema.validate(object,schema);
  • Dev/trunk/src/client/qed-client/store/CouchStore.js

    r463 r466  
    55    "dojo/_base/json",
    66    "dojo/_base/lang",
    7     "dojo/request/registry",
     7    "dojo/request",
    88    "dojo/store/util/QueryResults"
    99], function(Deferred, array, declare, json, lang, request, QueryResults) {
  • Dev/trunk/src/client/qed-client/ui/MenuLink.js

    r443 r466  
    1 define(['dojo/_base/declare','dijit/MenuItem','../app/Router'
    2 ], function(declare,MenuItem,Router) {
     1define([
     2    "../app/Router",
     3    "dijit/MenuItem",
     4    "dojo/_base/declare",
     5    "dojo/_base/event"
     6], function(Router, MenuItem, declare, event) {
    37    return declare([MenuItem],{
    48        options:{
    59            path: null
    610        },
    7         onClick: function() {
     11        onClick: function(evt) {
    812            if ( this.path ) { Router.go(this.path); }
     13            if ( evt ) { event.stop(evt); }
     14            return false;
    915        }
    1016    });
  • Dev/trunk/src/client/qed-client/ui/templates/MainMenu.html

    r443 r466  
    1212        </div>
    1313        <div class="rftMainMenuButton" data-dojo-type="./MenuBarLink" data-dojo-props="path:'/results'">Results</div>
    14         <div class="rftMainMenuButton" data-dojo-type="./MenuBarLink">Logout</div>
     14        <div class="rftMainMenuButton" data-dojo-type="./SessionMenu"></div>
    1515    </div>
    1616</div>
  • Dev/trunk/src/client/qed-client/widgets/_ComplexValueMixin.coffee

    r465 r466  
    1515            @inherited arguments
    1616            if @domNode.tagName.toLowerCase() isnt "form"
    17                 console.warn "Not scoping a _ComplexValueMixin in a form element can cause name clashes. E.g. radio buttons might stop working correctly. It is recommended to use <form> as the root element in your template for", @declaredClass
     17                console.warn "Not scoping a _ComplexValueMixin in a
     18                        form element can cause name clashes. E.g.
     19                        radio buttons might stop working correctly.
     20                        It is recommended to use <form> as the root
     21                        element in your template for", @declaredClass
    1822
    1923        _setDisabledAttr: (value) ->
    2024            @_set "disabled", value
    21             array.forEach @_getDescendantFormWidgets(), (child) => 
     25            array.forEach @_getDescendantFormWidgets(), (child) =>
    2226                child.set "disabled", value
    2327
  • Dev/trunk/src/server/app.js

    r464 r466  
    44var fs = require("fs");
    55var path = require("path");
    6 var proxy = require("./simple-http-proxy");
     6var proxy = require("./util/simple-http-proxy");
    77var _ = require("underscore");
    88
     
    3131        }
    3232    }));
     33    passport.serializeUser(function(user, done) {
     34        done(null, user.username);
     35    });
     36    passport.deserializeUser(function(id, done) {
     37        done(null, {username: id});
     38    });
    3339
    3440    var app = express();
     
    5662    });
    5763
     64   
    5865    // url to login (might work on others as well?)
    5966    // you should then have a session to work with
    60     app.post('/api/login');
     67    // should return a user info object
     68    function returnUser(req,res) {
     69        res.send(200, req.user);
     70    }
     71    app.post(
     72        '/api/login',
     73        passport.authenticate('local'),
     74        returnUser);
    6175
     76    // ensure we're authenticated on API calls
     77    app.use('/api', function(req,res,next){
     78        if (!req.user) {
     79            return res.send(401,{error:"Login before accessing API."});
     80        } else {
     81            return next();
     82        }
     83    });
     84   
     85    app.get(
     86        '/api/login',
     87        returnUser);
     88
     89    app.post(
     90        '/api/logout', function(req,res){
     91            req.logout();
     92            res.send(200,{});
     93        });
     94
     95    app.get('/api/surveyRun/:id/response/csv',
     96            function(req, res) {
     97                var id = req.params.id;
     98                // query CouchDB and build the CSV file
     99                res.set({
     100                    'Content-Type': 'text/csv',
     101                    'Content-Disposition': 'attachment; filename=responses-'+id+'.csv'
     102                });
     103                res.send(200, "Response for surveyRun "+id);
     104            });
     105   
    62106    // forward to couch
    63     app.use('/data/couch', proxy(settings.couchDbURL));
     107    app.use('/api/data', proxy(settings.couchDbURL));
    64108
    65109    return app;
  • Dev/trunk/src/server/config/config-couchdb.js

    r464 r466  
    11var q = require('q');
    2 var HTTP = require('q-io/http');
    3 var URL = require('url');
     2var request = require('../util/request');
    43var _ = require('underscore');
    54var util = require('util');
     
    2726    }
    2827
    29     function request(method,path,content) {
     28    function dbRequest(method,path,content) {
    3029        var url = couchDbURL+path;
    31         var parsedURL = URL.parse(url);
    3230        var options = {
    33             url: url,
    3431            method: method,
    3532            headers: {
     
    3734                'accept': 'application/json'
    3835            },
    39             body: {
    40                 forEach: function(callback) {
    41                     callback(JSON.stringify(content || {}));
    42                 }
    43             }
     36            body: content
    4437        };
    45         // because q-io doesn't support auth properly, we have to
    46         // build the f*ing wheel again.
    47         if ( parsedURL.auth ) {
    48             var auth = new Buffer(parsedURL.auth).toString("base64");
    49             options.headers.authorization = 'Basic '+auth;
    50         }
    51         return HTTP.request(options)
    52         .then(function(res){
    53             return res.body.read().then(function(content){
    54                 return JSON.parse(content.toString() || "{}");
    55             });
    56         },function(res){
    57             return res.body.read().then(function(error){
    58                 console.warn(error); // q.all doesn't do errors, so let's show them here
    59                 return JSON.parse(error.toString() || "{}");
    60             });
    61         });
     38        return request(url,options);
    6239    }
    6340
    6441    console.log("Configuring CouchDB for QED");
    6542    console.log("Checking CouchDB version");
    66     return request('GET','')
     43    return dbRequest('GET','')
    6744    .then(function(res){
    6845        if (res.version !== "1.2.0" ) {
     
    7350    }).then(function(res){
    7451        console.log("Checking database 'qed'");
    75         return request('GET','qed')
     52        return dbRequest('GET','qed')
    7653        .then(function(res){
    7754            console.log("Database 'qed' found.");
    7855        },function(err){
    7956            console.log("Creating database 'qed'");
    80             return request('PUT','qed');
     57            return dbRequest('PUT','qed');
    8158        });
    8259    }).then(function(){
     
    9269                case "update":
    9370                    console.log(docUrl+" updating.");
    94                     return request('GET',docUrl)
     71                    return dbRequest('GET',docUrl)
    9572                    .then(function(oldDoc){
    9673                        _.extend(oldDoc,doc);
    97                         return request('PUT',docUrl,oldDoc);
     74                        return dbRequest('PUT',docUrl,oldDoc);
    9875                    },function(){
    99                         return request('PUT',docUrl,doc);
     76                        return dbRequest('PUT',docUrl,doc);
    10077                    });
    10178                break;
     
    10380                default:
    10481                    console.log(docUrl+" replacing.");
    105                     return request('GET',docUrl)
     82                    return dbRequest('GET',docUrl)
    10683                    .then(function(oldDoc){
    10784                        _.extend(doc,_.pick(oldDoc,'_id','_rev'));
    108                         return request('PUT',docUrl,doc);
     85                        return dbRequest('PUT',docUrl,doc);
    10986                    },function(){
    110                         return request('PUT',docUrl,doc);
     87                        return dbRequest('PUT',docUrl,doc);
    11188                    });
    11289                break;
Note: See TracChangeset for help on using the changeset viewer.