<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head profile="http://internetalchemy.org/2003/02/profile"> <link rel="foaf" type="application/rdf+xml" title="FOAF" href="http://www.openlinksw.com/dataspace/uda/about.rdf" /> <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" /> <meta name="dc.title" content="Function: vsp_calculate_digest - Virtuoso Functions Guide" /> <meta name="dc.subject" content="Function: vsp_calculate_digest - Virtuoso Functions Guide" /> <meta name="dc.creator" content="OpenLink Software Documentation Team ; " /> <meta name="dc.copyright" content="OpenLink Software, 1999 - 2009" /> <link rel="top" href="index.html" title="OpenLink Virtuoso Universal Server: Documentation" /> <link rel="search" href="/doc/adv_search.vspx" title="Search OpenLink Virtuoso Universal Server: Documentation" /> <link rel="parent" href="functions.html" title="Chapter Contents" /> <link rel="prev" href="appendixa.html" title="Appendix" /> <link rel="next" href="functions.html#.html" title="" /> <link rel="shortcut icon" href="../images/misc/favicon.ico" type="image/x-icon" /> <link rel="stylesheet" type="text/css" href="doc.css" /> <link rel="stylesheet" type="text/css" href="/doc/translation.css" /> <title>Function: vsp_calculate_digest - Virtuoso Functions Guide</title> <meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" /> <meta name="author" content="OpenLink Software Documentation Team ; " /> <meta name="copyright" content="OpenLink Software, 1999 - 2009" /> <meta name="keywords" content="" /> <meta name="GENERATOR" content="OpenLink XSLT Team" /> </head> <body> <div id="header"> <a name="fn_vsp_calculate_digest" /> <img src="../images/misc/logo.jpg" alt="" /> <h1>22. Virtuoso Functions Guide - vsp_calculate_digest</h1> </div> <div id="navbartop"> <div> <a class="link" href="functions.html">Chapter Contents</a> | <a class="link" href="fn_vhost_remove.html" title="VHOST_REMOVE">Prev</a> | <a class="link" href="fn_wsdl_import_udt.html" title="wsdl_import_udt">Next</a> </div> </div> <div id="currenttoc"> <form method="post" action="/doc/adv_search.vspx"> <div class="search">Keyword Search: <br /> <input type="text" name="q" /> <input type="submit" name="go" value="Go" /> </div> </form> <div> <a href="http://www.openlinksw.com/">www.openlinksw.com</a> </div> <div> <a href="http://docs.openlinksw.com/">docs.openlinksw.com</a> </div> <br /> <div> <a href="index.html">Book Home</a> </div> <br /> <div> <a href="contents.html">Contents</a> </div> <div> <a href="preface.html">Preface</a> </div> <br /> <div> <a class="selected" href="functions.html">Virtuoso Functions Guide</a> </div> <br /> <div> <a href="functions.html#admin">Administration</a> </div> <div> <a href="functions.html#aggr">Aggregate Functions</a> </div> <div> <a href="functions.html#array">Array Manipulation</a> </div> <div> <a href="functions.html#bpel">BPEL APIs</a> </div> <div> <a href="functions.html#backup">Backup</a> </div> <div> <a href="functions.html#compression">Compression</a> </div> <div> <a href="functions.html#cursors">Cursor</a> </div> <div> <a href="functions.html#time">Date & Time Manipulation</a> </div> <div> <a href="functions.html#debug">Debug</a> </div> <div> <a href="functions.html#dict">Dictionary Manipulation</a> </div> <div> <a href="functions.html#encoding">Encoding & Decoding</a> </div> <div> <a href="functions.html#file">File Manipulation</a> </div> <div> <a href="functions.html#ft">Free Text</a> </div> <div> <a href="functions.html#hash">Hashing / Cryptographic</a> </div> <div> <a href="functions.html#ldap">LDAP</a> </div> <div> <a href="functions.html#localization">Locale</a> </div> <div> <a href="functions.html#mail">Mail</a> </div> <div> <a href="functions.html#misc">Miscellaneous</a> </div> <div> <a href="functions.html#number">Number</a> </div> <div> <a href="functions.html#phrz">Phrases</a> </div> <div> <a href="functions.html#rdf">RDF data</a> </div> <div> <a href="functions.html#rmt">Remote SQL Data Source</a> </div> <div> <a href="functions.html#repl">Replication</a> </div> <div> <a href="functions.html#soap">SOAP</a> </div> <div> <a href="functions.html#sql">SQL</a> </div> <div> <a href="functions.html#string">String</a> </div> <div> <a href="functions.html#txn">Transaction</a> </div> <div> <a href="functions.html#type">Type Mapping</a> </div> <div> <a href="functions.html#uddi">UDDI</a> </div> <div> <a href="functions.html#udt">User Defined Types & The CLR</a> </div> <div> <a href="functions.html#vad">VAD</a> </div> <div> <a href="functions.html#jvmpl">Virtuoso Java PL API</a> </div> <div> <a href="functions.html#bif">Virtuoso Server Extension Interface (VSEI)</a> </div> <div> <a class="selected" href="functions.html#ws">Web & Internet</a> </div> <div class="selected"> <div> <a href="fn_dav_api_add.html">dav add & update fun...</a> </div> <div> <a href="fn_dav_api_lock.html">dav lock manipulatio...</a> </div> <div> <a href="fn_dav_api_change.html">dav manipulation fun...</a> </div> <div> <a href="fn_dav_api_search.html">dav search functions</a> </div> <div> <a href="fn_dav_exp.html">dav_exp</a> </div> <div> <a href="fn_lfs_exp.html">lfs_exp</a> </div> <div> <a href="fn_serv_queue_top.html">serv_queue_top</a> </div> <div> <a href="fn_urlrewrite_create_regex_rule.html">urlrewrite_create_re...</a> </div> <div> <a href="fn_USER_KEY_LOAD.html">user_key_load</a> </div> <div> <a href="fn_vhost_define.html">vhost_define</a> </div> <div> <a href="fn_vhost_remove.html">vhost_remove</a> </div> <div> <a href="fn_dav_api_user.html">webdav users & group...</a> </div> <div> <a href="fn_client_attr.html">client_attr</a> </div> <div> <a href="fn_connection_get.html">connection_get</a> </div> <div> <a href="fn_connection_id.html">connection_id</a> </div> <div> <a href="fn_connection_is_dirty.html">connection_is_dirty</a> </div> <div> <a href="fn_connection_set.html">connection_set</a> </div> <div> <a href="fn_connection_vars.html">connection_vars</a> </div> <div> <a href="fn_connection_vars_set.html">connection_vars_set</a> </div> <div> <a href="fn_dbname.html">dbname</a> </div> <div> <a href="fn_ftp_get.html">ftp_get</a> </div> <div> <a href="fn_ftp_ls.html">ftp_ls</a> </div> <div> <a href="fn_ftp_put.html">ftp_put</a> </div> <div> <a href="fn_get_certificate_info.html">get_certificate_info</a> </div> <div> <a href="fn_get_keyword.html">get_keyword</a> </div> <div> <a href="fn_get_keyword_ucase.html">get_keyword_ucase</a> </div> <div> <a href="fn_http.html">http</a> </div> <div> <a href="fn_http_acl_get.html">http_acl_get</a> </div> <div> <a href="fn_http_acl_remove.html">http_acl_remove</a> </div> <div> <a href="fn_http_acl_set.html">http_acl_set</a> </div> <div> <a href="fn_http_body_read.html">http_body_read</a> </div> <div> <a href="fn_http_client.html">http_client</a> </div> <div> <a href="fn_http_client_ext.html">http_client_ext</a> </div> <div> <a href="fn_http_client_ip.html">http_client_ip</a> </div> <div> <a href="fn_http_debug_log.html">http_debug_log</a> </div> <div> <a href="fn_http_enable_gz.html">http_enable_gz</a> </div> <div> <a href="fn_http_file.html">http_file</a> </div> <div> <a href="fn_http_flush.html">http_flush</a> </div> <div> <a href="fn_http_get.html">http_get</a> </div> <div> <a href="fn_http_header.html">http_header</a> </div> <div> <a href="fn_http_header_get.html">http_header_get</a> </div> <div> <a href="fn_http_kill.html">http_kill</a> </div> <div> <a href="fn_http_listen_host.html">http_listen_host</a> </div> <div> <a href="fn_http_lock.html">http_lock</a> </div> <div> <a href="fn_http_map_get.html">http_map_get</a> </div> <div> <a href="fn_http_map_table.html">http_map_table</a> </div> <div> <a href="fn_http_param.html">http_param</a> </div> <div> <a href="fn_http_path.html">http_path</a> </div> <div> <a href="fn_http_pending_req.html">http_pending_req</a> </div> <div> <a href="fn_http_physical_path.html">http_physical_path</a> </div> <div> <a href="fn_http_proxy.html">http_proxy</a> </div> <div> <a href="fn_http_request_get.html">http_request_get</a> </div> <div> <a href="fn_http_request_header.html">http_request_header</a> </div> <div> <a href="fn_http_request_status.html">http_request_status</a> </div> <div> <a href="fn_http_rewrite.html">http_rewrite</a> </div> <div> <a href="fn_http_root.html">http_root</a> </div> <div> <a href="fn_http_unlock.html">http_unlock</a> </div> <div> <a href="fn_http_url.html">http_url</a> </div> <div> <a href="fn_http_value.html">http_value</a> </div> <div> <a href="fn_http_xslt.html">http_xslt</a> </div> <div> <a href="fn_json_parse.html">json_parse</a> </div> <div> <a href="fn_ses_connect.html">ses_connect</a> </div> <div> <a href="fn_ses_disconnect.html">ses_disconnect</a> </div> <div> <a href="fn_ses_read_line.html">ses_read_line</a> </div> <div> <a href="fn_ses_write.html">ses_write</a> </div> <div> <a href="fn_tcpip_gethostbyaddr.html">tcpip_gethostbyaddr</a> </div> <div> <a href="fn_tcpip_gethostbyname.html">tcpip_gethostbyname</a> </div> <div> <a class="selected" href="fn_vsp_calculate_digest.html">vsp_calculate_digest</a> </div> <div> <a href="fn_wsdl_import_udt.html">wsdl_import_udt</a> </div> </div> <div> <a href="functions.html#xml">XML</a> </div> <div> <a href="functions.html#XPATH">XPATH & XQUERY</a> </div> <br /> <div> <a href="functionidx.html">Functions Index</a> </div> <br /> </div> <div id="text"> <h2>vsp_calculate_digest</h2> <div class="refpurpose">calculate on server-side a digest to perform a HTTP digest authentication</div> <div class="funcsynopsis"> <span class="funcdef"> <span class="function">vsp_calculate_digest</span> </span> (<span class="paramdef">in <span class="parameter">username</span> varchar</span>, <span class="paramdef">in <span class="parameter">password</span> varchar</span>, <span class="paramdef">in <span class="parameter">credentials</span> any</span>); </div> <div class="refsect1"> <div class="refsect1title">Description</div> <p>The vsp_calculate_digest() function is used to calculate on server-side a digest to perform a HTTP digest authentication. When the authentication type is 'digest' the function will return a md5 checksum based on credentials, user name and password. The checksum calculation will be made as required for HTTP Digest authentication to compare against 'response' element of credentials. If the authentication is basic a NULL will be returned. </p> </div> <div class="refsect1"> <div class="refsect1title">Parameters</div> <div class="refsect2"> <span class="refsect2title">username – </span> A string with name of the user account name </div> <div class="refsect2"> <span class="refsect2title">password – </span> A string with a plain text password from the users table (can be from external LDAP server etc.) </div> <div class="refsect2"> <span class="refsect2title">credentials – </span> A vector of name/value pairs (the keyword and value are strings) of: <table class="data"> <caption>Table: 22.1. Valid values</caption> <tr> <th class="data">Name</th> <th class="data">Description</th> </tr> <tr> <td class="data">authtype</td> <td class="data">'digest' or 'basic'</td> </tr> <tr> <td class="data">realm</td> <td class="data">from HTTP Authorization request header</td> </tr> <tr> <td class="data">method</td> <td class="data">from HTTP request line</td> </tr> <tr> <td class="data">uri</td> <td class="data">from HTTP Authorization request header</td> </tr> <tr> <td class="data">nonce</td> <td class="data">from HTTP Authorization request header</td> </tr> <tr> <td class="data">nc</td> <td class="data">from HTTP Authorization request header</td> </tr> <tr> <td class="data">cnonce</td> <td class="data">from HTTP Authorization request header</td> </tr> <tr> <td class="data">qop</td> <td class="data">from HTTP Authorization request header</td> </tr> <tr> <td class="data">response</td> <td class="data">the client-side calculated digest</td> </tr> </table> <br /> </div> </div> <div class="refsect1"> <div class="refsect1title">Return Types</div> <p> A string containing md5 digest, if 'authtype' option is 'digest'. Otherwise returns null. </p> </div> <div class="refsect1"> <div class="refsect1title">Examples</div> <a name="ex_vsp_calculate_digest" /> <div class="example"> <div class="exampletitle">A VSP page performing digest authentication</div> <p>The following page check for digest authentication and returns OK if authentication succeeds, otherwise it asks for authentication again. </p> <div> <pre class="programlisting"> <?vsp declare auth any; declare cs varchar; auth := app_auth_vec (lines); if (not isarray (auth)) app_get_auth (); cs := vsp_calculate_digest ('u1', 'secret', auth); if (cs is not null and cs = get_keyword ('response',auth)) http ('OK'); else app_get_auth (); ?> -- making the HTTP Digest authentication header create procedure app_get_auth () { http_request_status ('HTTP/1.1 401 Unauthorized'); http_header (sprintf ('WWW-Authenticate: Digest realm="%s", domain="%s", nonce="%s", opaque="%s", stale="%s", qop="auth", algorithm="MD5"\r\n', 'my_realm', http_path(), md5 (datestring (now ())), md5 ('some string for hash'), 'false')); }; -- returns an array suitable for vsp_calculate_digest create procedure app_auth_vec (in lines any) { declare ahdr, arr, authvec any; ahdr := http_request_header (lines, 'Authorization'); if (isstring (ahdr) and ahdr like 'Digest%') { ahdr := subseq (ahdr, 6, length (ahdr)); arr := split_and_decode (ahdr, 0, '\0\0,='); authvec := vector ('authtype', 'Digest', 'method', http_request_get ('REQUEST_METHOD')); foreach (varchar elm in arr) do { declare elm1 varchar; elm1 := trim (elm, '" '); authvec := vector_concat (authvec, vector (elm1)); } } return authvec; } </pre> </div> </div> </div> <div class="refsect1"> <div class="refsect1title">See Also</div> <p> <a href="fn_vhost_define.html">vhost_define</a> </p> </div> </div> <div id="footer"> <div>Copyright© 1999 - 2009 OpenLink Software All rights reserved.</div> <div id="validation"> <a href="http://validator.w3.org/check/referer"> <img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /> </a> <a href="http://jigsaw.w3.org/css-validator/"> <img src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" height="31" width="88" /> </a> </div> </div> </body> </html>