jaumard
jaumard

Reputation: 8292

Sails Hook route forbidden

I try to make an installable hook to make some security verifications so under my hook.js I set :

routes     : {
      before : {
        "/" : function (req, res, view)
        {
          .....
          res.forbidden();
        }
      }
    },

And I have this error if I try to send forbidden page to the user :

error: Sending 500 ("Server Error") response: 
 TypeError: Object #<ServerResponse> has no method 'view'
    at Object.forbidden (/Users/jaumard/Documents/workspaceIDE/KikiLib/api/responses/forbidden.js:56:19)
    at ServerResponse.bound [as forbidden] (/usr/local/lib/node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
    at isRouteAllowed (/Users/jaumard/Documents/workspaceIDE/KikiLib/api/hooks/acl.js:66:18)
    at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:179:5)
    at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
    at param (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:138:11)
    at pass (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:145:5)
    at nextRoute (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:100:7)
    at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:167:11)
    at /usr/local/lib/node_modules/sails/lib/router/bind.js:187:7
    at /usr/local/lib/node_modules/sails/lib/hooks/i18n/index.js:35:7
    at Object.i18nInit [as init] (/usr/local/lib/node_modules/sails/node_modules/i18n/i18n.js:89:5)
    at addLocalizationMethod (/usr/local/lib/node_modules/sails/lib/hooks/i18n/index.js:33:11)
    at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:179:5)
    at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
    at param (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:138:11) [TypeError: Object #<ServerResponse> has no method 'view']
error: Server Error:
error: TypeError: Object #<ServerResponse> has no method 'view'
    at Object.forbidden (/Users/jaumard/Documents/workspaceIDE/KikiLib/api/responses/forbidden.js:56:19)
    at ServerResponse.bound [as forbidden] (/usr/local/lib/node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
    at isRouteAllowed (/Users/jaumard/Documents/workspaceIDE/KikiLib/api/hooks/acl.js:66:18)
    at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:179:5)
    at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
    at param (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:138:11)
    at pass (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:145:5)
    at nextRoute (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:100:7)
    at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:167:11)
    at /usr/local/lib/node_modules/sails/lib/router/bind.js:187:7
    at /usr/local/lib/node_modules/sails/lib/hooks/i18n/index.js:35:7
    at Object.i18nInit [as init] (/usr/local/lib/node_modules/sails/node_modules/i18n/i18n.js:89:5)
    at addLocalizationMethod (/usr/local/lib/node_modules/sails/lib/hooks/i18n/index.js:33:11)
    at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:179:5)
    at callbacks (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:164:37)
    at param (/usr/local/lib/node_modules/sails/node_modules/express/lib/router/index.js:138:11) [TypeError: Object #<ServerResponse> has no method 'view']

I'm under sails 0.11.0. I don't use policies cause policies apply only for controller action and I want to make ACL for view, controller and more...

All source code available here : https://github.com/jaumard/sails-hook-user-acl

For now I use : res.status(403).send("<h1>" + req.__("Forbidden") + "</h1>"); instead of res.forbidden(); but it would be nice to send a view

Upvotes: 1

Views: 864

Answers (1)

jaumard
jaumard

Reputation: 8292

Just found a workaround :

var _addResViewMethod = require("../sails/lib/hooks/views/res.view.js");
routes     : {
      before : {
        "/office" : function (req, res, view)
        {
          .....
          _addResViewMethod(req, res, function(){
               res.forbidden();
          });
        }
      }
    },

EDIT : A better way was given by sails team here https://github.com/balderdashy/sails/issues/2799#issuecomment-115333582

// Wait for the router to be initialized     
sails.on('router:before', function () {

    // Wait for the views hook to load, so that its routes get bound first 
    // (including the one that mixes in res.view)
    sails.after('hook:views:loaded', function () {
      // Bind your routes here
      sails.router.bind('/office', officeHandler, 'get', {});
    });

    function officeHandler(req, res) {...res.forbidden()...}

    return cb();
});

Upvotes: 1

Related Questions