• Jump To … +
    identity-provider-example.js index.js identity-provider.js oasis_names_tc_saml__2_0_assertion.js oasis_names_tc_saml__2_0_metadata.js oasis_names_tc_saml__2_0_protocol.js oasis_names_tc_xacml__3_0_core_schema_wd_17.js org_w3__2000__09_xmldsig.js org_w3__2001__04_xmlenc.js protocol.js service-provider.js transport-post-consumer.js transport-post.js transport-redirect-consumer.js transport-redirect-producer.js transport-redirect.js service-provider-example.js
  • transport-redirect-consumer.js

  • ¶
    var url = require("url"),
        xmldom = require("xmldom"),
        zlib = require("zlib");
    
    var protocol = require("./protocol");
    
    var RedirectConsumer = module.exports = function RedirectConsumer(req, cb) {
      if (req.method !== "GET") {
        return cb(Error("RedirectConsumer only works with GET requests"));
      }
    
      var uri = url.parse(req.url, true);
    
      if (!uri.query || (!uri.query.SAMLRequest && !uri.query.SAMLResponse)) {
        return cb(Error("no SAML fields found in query"));
      }
    
      var data = {};
    
      var fields = [["SAMLRequest", "samlRequestXml", "samlRequest"], ["SAMLResponse", "samlResponseXml", "samlResponse"]];
    
      var next = function next(err) {
        if (err) {
          return cb(err);
        }
    
        if (!fields.length) {
          return cb(null, data);
        }
    
        var field = fields.shift();
    
        if (!uri.query[field[0]]) {
          return next();
        }
    
        var xml = Buffer(uri.query[field[0]], "base64");
    
        zlib.inflateRaw(xml, function(err, xml) {
          if (err) {
            return next(err);
          }
    
          try {
            xml = new xmldom.DOMParser().parseFromString(xml.toString("utf8"));
          } catch (e) {
            return next(e);
          }
    
          if (!xml) {
            return next(Error("couldn't parse " + field[0] + " field"));
          }
    
          try {
            var obj = protocol.fromDocument(xml.documentElement);
          } catch (e) {
            return next(e);
          }
    
          if (!obj) {
            return next(Error("couldn't figure out how to use a " + xml.documentElement.tagName + " to construct an object"));
          }
    
          data[field[1]] = xml;
          data[field[2]] = obj;
    
          return next();
        });
      };
    
      next();
    };