UNPKG

saml2

Version:

SAML 2.0 IDP-agnostic transports and logic

205 lines (138 loc) 7.64 kB
<!DOCTYPE html> <html> <head> <title>transport-redirect-producer.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <ul id="jump_to"> <li> <a class="large" href="javascript:void(0);">Jump To &hellip;</a> <a class="small" href="javascript:void(0);">+</a> <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="identity-provider-example.html"> identity-provider-example.js </a> <a class="source" href="index.html"> index.js </a> <a class="source" href="identity-provider.html"> identity-provider.js </a> <a class="source" href="oasis_names_tc_saml__2_0_assertion.html"> oasis_names_tc_saml__2_0_assertion.js </a> <a class="source" href="oasis_names_tc_saml__2_0_metadata.html"> oasis_names_tc_saml__2_0_metadata.js </a> <a class="source" href="oasis_names_tc_saml__2_0_protocol.html"> oasis_names_tc_saml__2_0_protocol.js </a> <a class="source" href="oasis_names_tc_xacml__3_0_core_schema_wd_17.html"> oasis_names_tc_xacml__3_0_core_schema_wd_17.js </a> <a class="source" href="org_w3__2000__09_xmldsig.html"> org_w3__2000__09_xmldsig.js </a> <a class="source" href="org_w3__2001__04_xmlenc.html"> org_w3__2001__04_xmlenc.js </a> <a class="source" href="protocol.html"> protocol.js </a> <a class="source" href="service-provider.html"> service-provider.js </a> <a class="source" href="transport-post-consumer.html"> transport-post-consumer.js </a> <a class="source" href="transport-post.html"> transport-post.js </a> <a class="source" href="transport-redirect-consumer.html"> transport-redirect-consumer.js </a> <a class="source" href="transport-redirect-producer.html"> transport-redirect-producer.js </a> <a class="source" href="transport-redirect.html"> transport-redirect.js </a> <a class="source" href="service-provider-example.html"> service-provider-example.js </a> </div> </li> </ul> <ul class="sections"> <li id="title"> <div class="annotation"> <h1>transport-redirect-producer.js</h1> </div> </li> <li id="section-1"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-1">&#182;</a> </div> </div> <div class="content"><div class='highlight'><pre><span class="keyword">var</span> querystring = require(<span class="string">"querystring"</span>), zlib = require(<span class="string">"zlib"</span>), c14n = require(<span class="string">"xml-c14n"</span>)(); <span class="keyword">var</span> canonicaliser = c14n.createCanonicaliser(<span class="string">"http://www.w3.org/2001/10/xml-exc-c14n#WithComments"</span>); <span class="keyword">var</span> RedirectProducer = module.exports = <span class="function"><span class="keyword">function</span> <span class="title">RedirectProducer</span><span class="params">(res, idp, fields, cb)</span> {</span> <span class="keyword">var</span> keys = Object.keys(fields); <span class="keyword">var</span> data = {}; <span class="keyword">var</span> next = <span class="function"><span class="keyword">function</span> <span class="title">next</span><span class="params">(err)</span> {</span> <span class="keyword">if</span> (err) { <span class="keyword">return</span> cb(err); } <span class="keyword">if</span> (keys.length === <span class="number">0</span>) { data.SAMLEncoding = <span class="string">"urn:oasis:names:tc:SAML:2.0:bindings:URL-Encoding:DEFLATE"</span>; res.writeHead(<span class="number">302</span>, { location: idp.singleSignOnService + <span class="string">"?"</span> + querystring.stringify(data), }); res.end(); <span class="keyword">return</span> cb(); } <span class="keyword">var</span> from, to; from = to = keys.shift(); <span class="keyword">if</span> (from === <span class="string">"request"</span>) { to = <span class="string">"SAMLRequest"</span>; } <span class="keyword">if</span> (from === <span class="string">"response"</span>) { to = <span class="string">"SAMLResponse"</span>; } <span class="keyword">if</span> (from === <span class="string">"relayState"</span>) { to = <span class="string">"RelayState"</span>; } <span class="keyword">if</span> (Buffer.isBuffer(fields[from])) { data[to] = fields[from].toString(); <span class="keyword">return</span> next(); } <span class="keyword">if</span> (<span class="keyword">typeof</span> fields[from] === <span class="string">"string"</span>) { data[to] = fields[from]; <span class="keyword">return</span> next(); } <span class="keyword">if</span> (<span class="keyword">typeof</span> fields[from] === <span class="string">"object"</span> &amp;&amp; <span class="keyword">typeof</span> fields[from].toDocument === <span class="string">"function"</span>) { <span class="keyword">return</span> canonicaliser.canonicalise(fields[from].toDocument(), <span class="function"><span class="keyword">function</span><span class="params">(err, xml)</span> {</span> <span class="keyword">if</span> (err) { <span class="keyword">return</span> cb(err); } <span class="keyword">return</span> zlib.deflateRaw(xml, <span class="function"><span class="keyword">function</span><span class="params">(err, deflated)</span> {</span> <span class="keyword">if</span> (err) { <span class="keyword">return</span> cb(err); } data[to] = deflated.toString(<span class="string">"base64"</span>); <span class="keyword">return</span> next(); }); }); } <span class="keyword">return</span> next(Error(<span class="string">"can't handle type "</span> + (<span class="keyword">typeof</span> fields[from]) + <span class="string">" found in field "</span> + from)); }; next(); };</pre></div></div> </li> </ul> </div> </body> </html>