<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Margin Notes 2.0</title>
	<atom:link href="http://marginnotes2.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://marginnotes2.wordpress.com</link>
	<description>More about...</description>
	<lastBuildDate>Mon, 20 May 2013 15:57:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='marginnotes2.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Margin Notes 2.0</title>
		<link>http://marginnotes2.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://marginnotes2.wordpress.com/osd.xml" title="Margin Notes 2.0" />
	<atom:link rel='hub' href='http://marginnotes2.wordpress.com/?pushpress=hub'/>
		<item>
		<title>OpenDJ: REST to LDAP, part 4</title>
		<link>http://marginnotes2.wordpress.com/2013/05/14/opendj-rest-to-ldap-part-4/</link>
		<comments>http://marginnotes2.wordpress.com/2013/05/14/opendj-rest-to-ldap-part-4/#comments</comments>
		<pubDate>Tue, 14 May 2013 06:52:57 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Directory Services and LDAP]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=1059</guid>
		<description><![CDATA[Since my last post on the subject, Matt and Jean-Noël have added additional features in REST/HTTP access to OpenDJ data, as well as fixes for issues found in testing. The patch operation is now supported. The HTTP connection handler now &#8230; <a href="http://marginnotes2.wordpress.com/2013/05/14/opendj-rest-to-ldap-part-4/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1059&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://opendj.forgerock.org/"><img class="alignleft" alt="OpenDJ Community Logo" src="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" width="179" height="65" /></a> Since <a title="OpenDJ: REST to LDAP, part 3" href="http://marginnotes2.wordpress.com/2013/04/05/opendj-rest-to-ldap-part-3/">my last post on the subject</a>, Matt and Jean-Noël have added additional features in REST/HTTP access to OpenDJ data, as well as fixes for issues found in testing.</p>
<ul>
<li>The patch operation is now supported.</li>
<li>The HTTP connection handler now has its own access log.</li>
</ul>
<p><strong>Patch</strong></p>
<p>OpenDJ now lets you patch JSON resources in addition to replacing them entirely. For example, you can replace an old email address with a new one. The data for the HTTP PATCH request would be an array with a single email value to replace that of the &#8220;emailAddress&#8221; field.</p>
<pre>[
  {
    "operation": "replace",
    "field": "/contactInformation/emailAddress",
    "value": "babs@example.com"
  }
]</pre>
<p>OpenDJ supports four patch &#8220;operation&#8221; types.</p>
<ol>
<li>&#8220;add&#8221;: ensures the target field of the resource contains the value(s) you provide, creating parent fields as necessary.</li>
<li>&#8220;remove&#8221;: ensures the target field does not contain the value(s) you provide. If you do not provide a value, the entire field is removed if it already exists.</li>
<li>&#8220;replace&#8221;: like a &#8220;remove&#8221; followed by an &#8220;add&#8221;, this removes existing values, replacing them with the values you provide.</li>
<li>&#8220;increment&#8221;: increments numeric value(s) when you provide a positive number value. Decrements when you provide a negative number value.</li>
</ol>
<p>For details on the patch operation types, in particular on how OpenDJ handles single-valued fields versus multi-valued fields, see the <a href="http://sources.forgerock.org/cru/CR-1681">draft documentation that&#8217;s currently in review</a>.</p>
<p>The &#8220;field&#8221; value points to the field you aim to change. An important nuance here is that OpenDJ handles arrays as sets. So you cannot have duplicates, and it is not meaningful to reference a value in array by its index. For many operations with identity data, you probably want sets anyway. For example, here&#8217;s how you would add Babs Jensen&#8217;s entry to a group.</p>
<pre>$ curl
 --user kvaughan:bribery
 --request PATCH
 --header "Content-Type: application/json"
 --data '[
  {
    "operation": "add",
    "field": "/members",
    "value": [
      {
        "_id": "bjensen"
      }
    ]
  }
 ]'

http://opendj.example.com:8080/groups/Directory%20Administrators

 ?_prettyPrint=true
{
  "_rev" : "00000000b70c881a",
  "schemas" : [ "urn:scim:schemas:core:1.0" ],
  "_id" : "Directory Administrators",
  "displayName" : "Directory Administrators",
  "meta" : {
    "lastModified" : "2013-05-13T16:40:23Z"
  },
  "members" : [ {
    "_id" : "kvaughan",
    "displayName" : "Kirsten Vaughan"
  }, {
    "_id" : "rdaugherty",
    "displayName" : "Robert Daugherty"
  }, {
    "_id" : "bjensen",
    "displayName" : "Barbara Jensen"
  }, {
    "_id" : "hmiller",
    "displayName" : "Harry Miller"
  } ]
}</pre>
<p>With the patch operation, you can also use resource revision numbers to make sure that you only patch the resource if it still is the version that you expect.</p>
<pre>$ curl
 --user kvaughan:bribery
 "http://opendj.example.com:8080/users/bjensen?_prettyPrint=true&amp;_fields=_rev"
{
  "_rev" : "00000000c1b6d4c7"
}
$ curl
 --user kvaughan:bribery
 --request PATCH
 --header "If-Match: 00000000c1b6d4c7"
 --header "Content-Type: application/json"
 --data '[
  {
    "operation": "add",
    "field": "/contactInformation/emailAddress",
    "value": "babs@example.com"
  }
 ]'

http://opendj.example.com:8080/users/bjensen?_prettyPrint=true

{
  "_rev" : "00000000f946d377",
  "schemas" : [ "urn:scim:schemas:core:1.0" ],
  "contactInformation" : {
    "telephoneNumber" : "+1 408 555 1862",
    "emailAddress" : "babs@example.com"
  },
  "_id" : "bjensen",
  "name" : {
    "familyName" : "Jensen",
    "givenName" : "Barbara"
  },
  "userName" : "babs@example.com",
  "displayName" : "Barbara Jensen",
  "meta" : {
    "lastModified" : "2013-05-13T16:56:33Z"
  },
  "manager" : [ {
    "_id" : "trigden",
    "displayName" : "Torrey Rigden"
  } ]
}</pre>
<p><strong>HTTP Access Log</strong></p>
<p>HTTP access to OpenDJ is now logged in <code>logs/http-access</code>, next to the other OpenDJ log files. The HTTP access log format is what you would expect to see in a web server.</p>
<pre>localhost kvaughan [13/May/2013:18:54:34 +0200] "GET /users/bjensen/_prettyPrint=true&amp;_fields=_rev HTTP/1.1" 200 "curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5"
localhost kvaughan [13/May/2013:18:55:37 +0200] "PATCH /users/bjensen/_prettyPrint=true HTTP/1.1" 200 "curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5"</pre>
<p>Internal operations performed by the HTTP connection handler are logged to the LDAP access log, <code>logs/access</code>. However, these are hidden by default, because by default the <code>suppress-internal-operations</code> property on the (LDAP) file based access log publisher is set to <code>true</code>. Set it to <code>false</code> if you want to see those internal operations in the LDAP access log. (To see this advanced property when running the <code>dsconfig</code> command interactively, try <code>/path/to/opendj/bin/dsconfig --advanced</code>.)</p>
<p>Although this OpenDJ and the gateway now support each of the CRUDPAQ operations, there are still some improvements on the way, from additional actions (think password modify) to paged results and sorting for searches. I&#8217;m still holding off on documenting how to configure authentication, expecting that we will see <a href="https://bugster.forgerock.org/jira/browse/OPENDJ-827">a simplification of the configuration model</a>.</p>
<p>More to come&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/1059/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1059&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2013/05/14/opendj-rest-to-ldap-part-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>

		<media:content url="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" medium="image">
			<media:title type="html">OpenDJ Community Logo</media:title>
		</media:content>
	</item>
		<item>
		<title>OpenDJ: REST to LDAP, part 3</title>
		<link>http://marginnotes2.wordpress.com/2013/04/05/opendj-rest-to-ldap-part-3/</link>
		<comments>http://marginnotes2.wordpress.com/2013/04/05/opendj-rest-to-ldap-part-3/#comments</comments>
		<pubDate>Fri, 05 Apr 2013 12:48:56 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Directory Services and LDAP]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=1039</guid>
		<description><![CDATA[Since my last post on this topic, there have been some important changes in RESTful access to OpenDJ. Here&#8217;s a short list. Jean-Noël added an HTTP connection handler to OpenDJ directory server. All you have to do is enable the &#8230; <a href="http://marginnotes2.wordpress.com/2013/04/05/opendj-rest-to-ldap-part-3/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1039&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://opendj.forgerock.org/"><img class="alignleft" alt="OpenDJ Community Logo" src="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" width="179" height="65" /></a> Since <a title="OpenDJ: REST to LDAP Gateway, part 2" href="http://marginnotes2.wordpress.com/2013/03/12/opendj-rest-to-ldap-gateway-part-2/">my last post on this topic</a>, there have been some important changes in RESTful access to OpenDJ.</p>
<p>Here&#8217;s a short list.</p>
<ul>
<li>Jean-Noël added an HTTP connection handler to OpenDJ directory server.
<p>All you have to do is enable the HTTP connection handler, and you can start using the RESTful API without installing any other software.</li>
<li>Matt added authentication support to let you do:
<ul>
<li>HTTP Basic authentication (with different ways to map the user ID to an entry)</li>
<li>OpenIDM-style authentication (using headers, by default <code>X-OpenIDM-Username</code> and <code>X-OpenIDM-Password</code>)</li>
<li>Something else if you want to write your own Servlet Filter to handle authentication</li>
</ul>
</li>
<li>Matt added support for deleting resources.</li>
<li>Matt renamed the REST API HTTP query request parameter <code>_filter</code> to <code>_queryFilter</code> (which is more consistent with <code>_queryId</code> and <code>_queryExpression</code> in OpenIDM).</li>
</ul>
<p><strong>HTTP Connection Handler</strong></p>
<p>Enable the HTTP connection handler after installing OpenDJ.</p>
<pre>$ dsconfig set-connection-handler-prop \
--hostname opendj.example.com --port 4444 \
--bindDN "cn=Directory Manager" --bindPassword password \
--handler-name "HTTP Connection Handler" \
--set enabled:true --no-prompt</pre>
<p>Once you have enabled the HTTP connection handler, OpenDJ listens on port 8080 by default. The paths start at the root context. (As of this writing, April 5, 2013, you also need to authenticate for GET.)</p>
<pre>$ curl --user bjensen:hifalutin \

http://opendj.example.com:8080/users/bjensen?_prettyPrint=true

{
  "schemas" : [ "urn:scim:schemas:core:1.0" ],
  "contactInformation" : {
    "telephoneNumber" : "+1 408 555 1862",
    "emailAddress" : "bjensen@example.com"
  },
  "_id" : "bjensen",
  "name" : {
    "familyName" : "Jensen",
    "givenName" : "Barbara"
  },
  "userName" : "bjensen@example.com",
  "displayName" : "Barbara Jensen",
  "manager" : [ {
    "_id" : "trigden",
    "displayName" : "Torrey Rigden"
  } ]
}</pre>
<p>You configure the HTTP connection handler in the same way you configure the REST LDAP gateway, by using a JSON format configuration file. By default, the file is <code>/path/to/OpenDJ/config/http-config.json</code>.</p>
<p><strong>Authentication Support</strong></p>
<p>Matt implemented authentication support a couple of weeks ago. Right now the docs are out of sync with the trunk.  I am waiting on an enhancement, <a href="https://bugster.forgerock.org/jira/browse/OPENDJ-827">OPENDJ-827</a> (Simplify Rest2LDAP&#8217;s authentication configuration model), before updating the appendix on configuration.</p>
<p>In the meantime, if you want to start reconfiguring authentication now, read the comments the configuration file.</p>
<p><strong>Deleting Resources</strong></p>
<p>As of this writing, April 5, 2013, you can delete resources through the gateway, though not yet through the HTTP connection handler. That is likely to change soon.</p>
<p>By default, the configuration has <code>"useSubtreeDelete" : true</code>, so if you try to delete as a user without access rights to perform a tree delete, you can get an error because that control is not in the ACIs.</p>
<pre>$ curl --request DELETE \
--user kvaughan:bribery \

http://opendj.example.com:8080/rest2ldap/users/bjensen?_prettyPrint=true

{
  "code" : 500,
  "reason" : "Internal Server Error",
  "message" : "Unavailable Critical Extension: The request control with Object Identifier (OID) \"1.2.840.113556.1.4.805\" cannot be used due to insufficient access rights"
}</pre>
<p>If you set <code>"useSubtreeDelete" : false</code> in the configuration file, <code>opendj-rest2ldap-servlet.json</code> and reload the gateway, then you can use delete for individual resources.</p>
<pre>$ curl --request DELETE \
--user kvaughan:bribery \

http://opendj.example.com:8080/rest2ldap/users/bjensen?_prettyPrint=true

{
  "_rev" : "000000007f413b85",
  "schemas" : [ "urn:scim:schemas:core:1.0" ],
  "contactInformation" : {
    "telephoneNumber" : "+1 408 555 1862",
    "emailAddress" : "bjensen@example.com"
  },
  "_id" : "bjensen",
  "name" : {
    "familyName" : "Jensen",
    "givenName" : "Barbara"
  },
  "userName" : "bjensen@example.com",
  "displayName" : "Barbara Jensen",
  "manager" : [ {
    "_id" : "trigden",
    "displayName" : "Torrey Rigden"
  } ]
}</pre>
<p>As you can see, the delete returns the resource you removed.</p>
<p>You can also use the resource revision in an <code>If-Match</code> header to assert that the resource to delete is in fact the same version of the resource that you expect.</p>
<p>To try this, get the revision.</p>
<pre>$ curl --user kvaughan:bribery \
"http://opendj.example.com:8080/rest2ldap/users/ajensen?_fields=_rev&amp;_prettyPrint=true"
{
  "_rev" : "000000002222a818"
}</pre>
<p>If you have the wrong revision for the current resource and use the assertion, the delete fails.</p>
<pre>$ curl --request DELETE \
--header "If-Match: wrong-rev" \
--user kvaughan:bribery \

http://opendj.example.com:8080/rest2ldap/users/ajensen?_prettyPrint=true

{
  "code" : 412,
  "reason" : "Precondition Failed",
  "message" : "Assertion Failed: Entry uid=ajensen,ou=People,dc=example,dc=com cannot be removed because the request contained an LDAP assertion control and the associated filter did not match the contents of the entry"
}</pre>
<p>If you have the right revision, the delete can complete successfully.</p>
<pre>$ curl --request DELETE \
--header "If-Match: 000000002222a818" \
--user kvaughan:bribery \

http://opendj.example.com:8080/rest2ldap/users/ajensen?_prettyPrint=true

{
  "_rev" : "000000007eea3869",
  "schemas" : [ "urn:scim:schemas:core:1.0" ],
  "contactInformation" : {
    "telephoneNumber" : "+1 408 555 7892",
    "emailAddress" : "ajensen@example.com"
  },
  "_id" : "ajensen",
  "name" : {
    "familyName" : "Jensen",
    "givenName" : "Allison"
  },
  "userName" : "ajensen@example.com",
  "displayName" : "Allison Jensen",
  "manager" : [ {
    "_id" : "kwinters",
    "displayName" : "Kelly Winters"
  } ]
}</pre>
<p>More to come&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/1039/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/1039/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1039&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2013/04/05/opendj-rest-to-ldap-part-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>

		<media:content url="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" medium="image">
			<media:title type="html">OpenDJ Community Logo</media:title>
		</media:content>
	</item>
		<item>
		<title>OpenDJ: REST to LDAP Gateway, part 2</title>
		<link>http://marginnotes2.wordpress.com/2013/03/12/opendj-rest-to-ldap-gateway-part-2/</link>
		<comments>http://marginnotes2.wordpress.com/2013/03/12/opendj-rest-to-ldap-gateway-part-2/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 11:02:28 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Directory Services and LDAP]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=1029</guid>
		<description><![CDATA[The REST to LDAP gateway that you read about a few days ago is continuing to improve. If you look at the latest configuration, you will notice some changes: DN reference mapping lets you map LDAP attributes like manager and uniqueMember &#8230; <a href="http://marginnotes2.wordpress.com/2013/03/12/opendj-rest-to-ldap-gateway-part-2/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1029&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://opendj.forgerock.org/"><img class="alignleft" alt="OpenDJ Community Logo" src="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" width="179" height="65" /></a>The REST to LDAP gateway that <a title="OpenDJ: REST to LDAP Gateway" href="http://marginnotes2.wordpress.com/2013/03/04/opendj-rest-to-ldap-gateway/">you read about a few days ago</a> is continuing to improve. If you look at the latest configuration, you will notice some changes:</p>
<ul>
<li>DN reference mapping lets you map LDAP attributes like <code>manager</code> and <code>uniqueMember</code> that take DN values.</li>
<li>The <code>"/users"</code> mapping adds <code>"manager"</code> and <code>"groups"</code> fields, taking advantage of the reference mapping capability.</li>
<li>The default configuration now also includes a <code>"/groups"</code> mapping.</li>
<li>The <code>"/users"</code> and <code>"/groups"</code> mappings add <code>"meta"</code> fields to JSON resources. In the default configuration the <code>"meta"</code> field shows information about when the underlying entry was created and last modified.</li>
<li>ID and revision attributes in the default config are now <code>"_id"</code> and <code>"_rev"</code> as in <a href="http://openidm.forgerock.org/">OpenIDM</a>.</li>
</ul>
<p>The reference mapping prevents RESTful client applications from having to understand LDAP DNs. For example, if you look at Babs Jensen&#8217;s entry through LDAP, you notice that her manager is <code>trigden</code>.</p>
<pre>$ ldapsearch -p 1389 -b dc=example,dc=com "(uid=bjensen)" cn manager
dn: uid=bjensen,ou=People,dc=example,dc=com
cn: Barbara Jensen
cn: Babs Jensen
manager: uid=trigden, ou=People, dc=example,dc=com</pre>
<p>In the JSON resource for Babs Jensen, <code>trigden</code> is mapped to <code>"_id"</code>, and the manager&#8217;s name is pulled out of the referenced entry, so you can now see who <code>trigden</code> is without doing another search.</p>
<pre>$ curl 'http://opendj.example.com:8080/rest2ldap/users/bjensen?_fields=displayName,manager&amp;_prettyPrint=true'
{
  "displayName" : "Barbara Jensen",
  "manager" : [ {
    "_id" : "trigden",
    "displayName" : "Torrey Rigden"
  } ]
}</pre>
<p>If you look at Torrey Rigden&#8217;s entry through LDAP, you see the groups that Torrey is a member of are also referenced by DN.</p>
<pre>$ ldapsearch -p 1389 -b dc=example,dc=com "(uid=trigden)" cn isMemberOf
dn: uid=trigden,ou=People,dc=example,dc=com
cn: Torrey Rigden
isMemberOf: cn=PD Managers,ou=groups,dc=example,dc=com</pre>
<p>The REST to LDAP gateway uses the reference mapping for this as well.</p>
<pre>$ curl 'http://opendj.example.com:8080/rest2ldap/users/trigden?_fields=displayName,groups&amp;_prettyPrint=true'
{
  "displayName" : "Torrey Rigden",
  "groups" : [ {
    "_id" : "PD Managers"
  } ]
}</pre>
<p>The <code>"/groups"</code> mapping gives you what you would expect, using the reference mapping for members.</p>
<pre>$ curl 'http://opendj.example.com:8080/rest2ldap/groups?_filter=true&amp;_fields=displayName,members&amp;_prettyPrint=true'
{
  "result" : [ {
    "displayName" : "Accounting Managers",
    "members" : [ {
      "_id" : "scarter",
      "displayName" : "Sam Carter"
    }, {
      "_id" : "tmorris",
      "displayName" : "Ted Morris"
    } ]
  }, {
    "displayName" : "Directory Administrators",
    "members" : [ {
      "_id" : "kvaughan",
      "displayName" : "Kirsten Vaughan"
    }, {
      "_id" : "hmiller",
      "displayName" : "Harry Miller"
    }, {
      "_id" : "rdaugherty",
      "displayName" : "Robert Daugherty"
    } ]
  }, {
    "displayName" : "HR Managers",
    "members" : [ {
      "_id" : "kvaughan",
      "displayName" : "Kirsten Vaughan"
    }, {
      "_id" : "cschmith",
      "displayName" : "Chris Schmith"
    } ]
  }, {
    "displayName" : "PD Managers",
    "members" : [ {
      "_id" : "kwinters",
      "displayName" : "Kelly Winters"
    }, {
      "_id" : "trigden",
      "displayName" : "Torrey Rigden"
    } ]
  }, {
    "displayName" : "QA Managers",
    "members" : [ {
      "_id" : "abergin",
      "displayName" : "Andy Bergin"
    }, {
      "_id" : "jwalker",
      "displayName" : "John Walker"
    } ]
  } ],
  "resultCount" : 5,
  "pagedResultsCookie" : null,
  "remainingPagedResults" : -1
}</pre>
<p>Get the updated REST to LDAP gateway for yourself and look at <code>opendj-rest2ldap-servlet.json</code> to see how this works in the configuration. Updates to the doc for these changes are <a href="http://sources.forgerock.org/cru/CR-1403">in review</a>.</p>
<p>Still more to come&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/1029/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/1029/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1029&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2013/03/12/opendj-rest-to-ldap-gateway-part-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>

		<media:content url="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" medium="image">
			<media:title type="html">OpenDJ Community Logo</media:title>
		</media:content>
	</item>
		<item>
		<title>OpenDJ: REST to LDAP Gateway</title>
		<link>http://marginnotes2.wordpress.com/2013/03/04/opendj-rest-to-ldap-gateway/</link>
		<comments>http://marginnotes2.wordpress.com/2013/03/04/opendj-rest-to-ldap-gateway/#comments</comments>
		<pubDate>Mon, 04 Mar 2013 10:16:47 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Directory Services and LDAP]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=1017</guid>
		<description><![CDATA[The REST to LDAP mapping is a new feature for the next release of OpenDJ. Although it is still early and the features is not finished yet, you can already play with some of the new capabilities. REST to LDAP &#8230; <a href="http://marginnotes2.wordpress.com/2013/03/04/opendj-rest-to-ldap-gateway/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1017&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://opendj.forgerock.org/"><img class="alignleft" alt="OpenDJ Community Logo" src="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" width="179" height="65" /></a>The REST to LDAP mapping is a new feature for the next release of OpenDJ. Although it is still early and the features is not finished yet, you can already play with some of the new capabilities.</p>
<p>REST to LDAP exposes directory data over HTTP as JSON resources. This opens up directory data to applications that do not support LDAP.</p>
<p><span style="line-height:1.7;">The initial artifact for serving JSON resources is a REST to LDAP gateway, which is a Servlet. (The Servlet will be followed by a REST to LDAP connection handler within OpenDJ.) To give the gateway a try, run it with an OpenDJ directory server in back.</span></p>
<p>As of this writing, the gateway .war is not yet posted on the <a href="http://forgerock.org/opendj.html">builds page</a>. Try one of these options instead:</p>
<ul>
<li><span style="line-height:1.7;">You can download a build of the .war from the ForgeRock Maven repository under </span><a style="line-height:1.7;" href="http://maven.forgerock.org/repo/simple/snapshots/org/forgerock/opendj/opendj-rest2ldap-servlet/3.0.0-SNAPSHOT/">opendj-rest2ldap-servlet/3.0.0-SNAPSHOT/</a><span style="line-height:1.7;">.</span></li>
<li>You can get the code, and then build and run the gateway yourself.
<pre>$ svn co https://svn.forgerock.org/opendj/trunk/opendj3
$ cd opendj3/opendj-rest2ldap-servlet &amp;&amp; mvn jetty:run</pre>
<p>By default, the gateway listens on <code>localhost:8080</code>, and connects to the directory server on <code>localhost:1389</code> as <code>cn=Directory Manager</code> with password <code>password</code>. The gateway is also configured to work out of the box with sample data (entries under <code>dc=example,dc=com</code>, either those generated at setup time or loaded from <a href="http://opendj.forgerock.org/Example.ldif">Example.ldif</a>).</li>
</ul>
<p>With a default OpenDJ configuration, you probably only need to start the directory server. (Don&#8217;t have OpenDJ? Try the <a href="http://opendj.forgerock.org/doc/install-guide/#chap-install-gui">quick install</a>.)</p>
<pre>$ /path/to/OpenDJ/bin/start-ds</pre>
<p>If the defaults do not work for your setup, know that the configuration file for the gateway is <code>opendj3/opendj-rest2ldap-servlet/src/main/webapp/opendj-rest2ldap-servlet.json</code>. If you downloaded and deployed the gateway .war, then find <code>opendj-rest2ldap-servlet.json</code> under the directory where you deployed the .war. Also see the links to the doc below.</p>
<p>Once the gateway and OpenDJ are configured and started, REST clients can access the gateway to get at directory data, as in the following example.</p>
<pre>$ curl http://localhost:8080/users/bjensen?_prettyPrint=true
{
  "id" : "bjensen",
  "rev" : "000000002f43b789",
  "schemas" : [ "urn:scim:schemas:core:1.0" ],
  "contactInformation" : {
    "telephoneNumber" : "+1 408 555 1862",
    "emailAddress" : "bjensen@example.com"
  },
  "name" : {
    "familyName" : "Jensen",
    "givenName" : "Barbara"
  },
  "userName" : "bjensen@example.com",
  "displayName" : "Barbara Jensen"
}</pre>
<p>At this early stage, the gateway supports three of the seven <a title="CRUDPAQ" href="http://marginnotes2.wordpress.com/2013/01/11/crudpaq/">CRUDPAQ</a> verbs: create, read, and query.</p>
<p>There is a bit of documentation for REST to LDAP. All of this is still in progress.</p>
<ul>
<li><span style="line-height:14px;"><a href="http://opendj.forgerock.org/doc/install-guide/#install-rest2ldap-servlet">To Install OpenDJ REST LDAP Gateway</a><br />
</span></li>
<li><a href="http://opendj.forgerock.org/doc/admin-guide/#appendix-rest2ldap">REST LDAP Gateway Configuration</a></li>
<li><a href="http://opendj.forgerock.org/doc/admin-guide/#chap-rest-operations">Performing RESTful Operations</a></li>
</ul>
<p>More to come&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/1017/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/1017/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1017&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2013/03/04/opendj-rest-to-ldap-gateway/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>

		<media:content url="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" medium="image">
			<media:title type="html">OpenDJ Community Logo</media:title>
		</media:content>
	</item>
		<item>
		<title>OpenDJ: Changing server certificates</title>
		<link>http://marginnotes2.wordpress.com/2013/02/13/opendj-changing-server-certificates/</link>
		<comments>http://marginnotes2.wordpress.com/2013/02/13/opendj-changing-server-certificates/#comments</comments>
		<pubDate>Wed, 13 Feb 2013 18:15:29 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Directory Services and LDAP]]></category>
		<category><![CDATA[Docs]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=1011</guid>
		<description><![CDATA[The default validity period for OpenDJ self-signed certificates used to be 730 days. Those of you who generated keys &#38; self-signed certificates a couple of years ago could have certificates that will expire soon. There&#8217;s a new chapter in the &#8230; <a href="http://marginnotes2.wordpress.com/2013/02/13/opendj-changing-server-certificates/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1011&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://opendj.forgerock.org/"><img class="alignleft" alt="" src="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" width="179" height="65" /></a> The default validity period for OpenDJ self-signed certificates used to be 730 days. Those of you who generated keys &amp; self-signed certificates a couple of years ago could have certificates that will expire soon.</p>
<p>There&#8217;s a new chapter in the <em>OpenDJ Administration Guide</em> that covers <a href="http://opendj.forgerock.org/doc/admin-guide/index.html#chap-change-certs"><em>Changing Server Certificates</em></a>, including not only replacing the keys for regular connection handlers, but also generating new keys &amp; self-signed <a href="http://opendj.forgerock.org/doc/admin-guide/index.html#replace-ads-cert">certs used to protect replication</a> traffic.</p>
<p>You will find the <a href="http://opendj.forgerock.org/doc/admin-guide/index.html#chap-listeners"><em>Configuring Servers For Client Application Access</em></a> chapter has been beefed up with more examples of manipulating certificates using the Java <code>keytool</code> command, including CA-signed certificates. Plus, the <em>Performing LDAP Operations</em> chapter now also demonstrates <a href="http://opendj.forgerock.org/doc/admin-guide/index.html#client-cert-auth"><em>Authenticating Using a Certificate</em></a>, showing the steps to have an application, for example, authenticate to OpenDJ without a user name and password.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/1011/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/1011/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=1011&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2013/02/13/opendj-changing-server-certificates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>

		<media:content url="http://opendj.forgerock.org/images/opendj-tagline-179x65.png" medium="image" />
	</item>
		<item>
		<title>CRUDPAQ</title>
		<link>http://marginnotes2.wordpress.com/2013/01/11/crudpaq/</link>
		<comments>http://marginnotes2.wordpress.com/2013/01/11/crudpaq/#comments</comments>
		<pubDate>Fri, 11 Jan 2013 17:00:49 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=996</guid>
		<description><![CDATA[Maybe you noticed that Matt has been building a foundation for common ForgeRock REST APIs. What makes the APIs common is that they all let you do the same seven kinds of operations. Create: Add a resource that does not &#8230; <a href="http://marginnotes2.wordpress.com/2013/01/11/crudpaq/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=996&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://commons.forgerock.org/forgerock-rest/json-resource-servlet/"><img class="alignleft" alt="" src="http://commons.forgerock.org/forgerock-rest/json-resource-servlet/images/ForgeRock-Community-grey-295x50.png" width="295" height="50" /></a>Maybe you noticed that Matt has been building a foundation for common ForgeRock REST APIs. What makes the APIs common is that they all let you do the same seven kinds of operations.</p>
<ol>
<li><span style="line-height:1.7;"><strong>Create</strong>: Add a resource that does not yet exist</span></li>
<li><span style="line-height:1.7;"><strong>Read</strong>: Retrieve a single resource</span></li>
<li><span style="line-height:1.7;"><strong>Update</strong>: Replace an existing resource</span></li>
<li><span style="line-height:1.7;"><strong>Delete</strong>: Remove an existing resource</span></li>
<li><span style="line-height:1.7;"><strong>Patch</strong>: Modify part of an existing resource</span></li>
<li><span style="line-height:1.7;"><strong>Action</strong>: Perform a predefined action</span></li>
<li><span style="line-height:1.7;"><strong>Query</strong>: List a set of resources</span></li>
</ol>
<p>When you hear someone from ForgeRock talking about CRUDPAQ, there&#8217;s nothing dirty involved. Just a mnemonic device.</p>
<p>(Note: In practice, action operations depend on the resource server, so actions might differ from server to server. Also, some bits of work remain. For example, patch is still <a href="https://bugster.forgerock.org/jira/browse/CREST-3">to be finished as of this writing</a>.)</p>
<p>Matt put together a <a href="http://commons.forgerock.org/forgerock-rest/json-resource/">JSON Resource</a> Java library. With that he built a <a href="http://commons.forgerock.org/forgerock-rest/json-resource-servlet/">JSON Resource Servlet</a>, which implements an in-memory store for your resources. (See the <a href="http://commons.forgerock.org/forgerock-rest/json-resource-servlet/">project page</a> for instructions on getting JSON Resource Servlet up and running.) JSON Resource Servlet provides a simple example of how these common REST APIs are likely to look and feel.</p>
<p>Matt included two endpoints by default, <code>/users</code> and <code>/groups</code>. Objects in this version do not have schema, so you can add whatever you like. I&#8217;ve played with arrays of SCIM-like <a href="https://raw.github.com/markcraig/forgerock-rest-demo/master/SCIMUsers.json">users</a> and <a href="https://raw.github.com/markcraig/forgerock-rest-demo/master/SCIMGroups.json">groups</a> based on the traditional example data we use in the directory server world.</p>
<p>The advantage of this is that it&#8217;s all language independent. Take your pick.</p>
<p>After getting a rise out of Jake&#8217;s cool work, especially on the OpenIDM UI, I felt it was high time to learn some JavaScript.</p>
<p>Even with my beginner&#8217;s confusion about JavaScript, it did not take long to write <a href="https://github.com/markcraig/forgerock-rest-demo/blob/master/common.js">CRUD and Q functions</a> for use in building a web page. (Creating a page that doesn&#8217;t look like I pulled it out of a time capsule from 1996 is a different story, however. My stance with respect to modern web development is <a href="http://c2.com/cgi/wiki?OrdersOfIgnorance">2nd or 3rd order ignorance</a>, depending on the topic.) There are slicker ways to do this, but as you can see, it is not hard to&#8230;</p>
<p>Create a resource from an object and a resource URI (ending in the resource ID like <code>/users/bjensen</code>, or more likely <code>/users/e7fa64c0-70dc-47fb-b102-7106ee480421</code>):</p>
<pre>function create(object, uri) {
    var xhr = new XMLHttpRequest();
    xhr.open('PUT', uri, false);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.setRequestHeader("If-None-Match", "*");
    xhr.send(JSON.stringify(object));
    return xhr.responseText;
}</pre>
<p>Read a resource, optionally limiting the resource fields in the response (check the response field &#8220;_id&#8221; for the resource ID):</p>
<pre>function read(uri, fields) {
    fields = (typeof fields === "undefined") ? [] : fields;

    var args = "";
    if (fields.length &gt; 0) {
        args = "?_fields=" + fields[0];
        for (var i = 1; i &lt; fields.length; i++) {
            args = args + "," + fields[i];
        }
    }
    uri = uri + args;

    var xhr = new XMLHttpRequest();
    xhr.open('GET', uri, false);
    xhr.send("");
    return xhr.responseText;
}</pre>
<p>Update a resource, for which you need the revision (check the resource &#8220;_rev&#8221; field):</p>
<pre>function update(object, revision, uri) {
    var xhr = new XMLHttpRequest();
    xhr.open('PUT', uri, false);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.setRequestHeader("If-Match", revision);
    xhr.send(JSON.stringify(object));
    return xhr.responseText;
}</pre>
<p>Delete a resource:</p>
<pre>function remove(uri) { // delete is a keyword
    var xhr = new XMLHttpRequest();
    xhr.open('DELETE', uri, false);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send("");
    return xhr.responseText;
}</pre>
<p>Query resources. Query lets you do a lot more than this example (filters, sorting, paging, &#8230; Scroll down the <a href="http://commons.forgerock.org/forgerock-rest/json-resource-servlet/">JSON Resource Servlet page</a> to the section on <em>Querying/listing resources</em>). This one just lists resources. Here <code>containerUri</code> is <code>/users</code>, or <code>/groups</code>:</p>
<pre>function queryObjects(containerUri, fields) {
    fields = (typeof fields === "undefined") ? [] : fields;

    var query = containerUri + "?_filter=true";
    var args = "";
    if (fields.length &gt; 0) {
        args = "&amp;_fields=" + fields[0];
        for (var i = 1; i &lt; fields.length; i++) {
            args = args + "," + fields[i];
        }
        query = query + args;
    }

    var xhr = new XMLHttpRequest();
    xhr.open('GET', query, false);
    xhr.send("");

    var allObjects = [];
    if (xhr.status === 200) { // OK
        allObjects = JSON.parse(xhr.responseText);
        if (allObjects.result.length &gt; 0) {
            allObjects = allObjects.result;
        } else {
            allObjects = [];
        }
    }
    return allObjects;
}</pre>
<p>Not shown here are actions. The JSON Resource Servlet for example lets you create a resource and let the servlet create the ID. (Hint: Use a POST with <code>?_action=create</code> to the container URI.)</p>
<p>As you can see, the basic operations are fairly easy to use.</p>
<p>By the way, not all ForgeRock REST APIs will look like this. The REST API for OAuth 2.0 in OpenAM will not, for example, because that API is already clearly defined at the IETF. But there&#8217;s a good chance that many APIs will follow this pattern.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/996/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/996/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=996&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2013/01/11/crudpaq/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>

		<media:content url="http://commons.forgerock.org/forgerock-rest/json-resource-servlet/images/ForgeRock-Community-grey-295x50.png" medium="image" />
	</item>
		<item>
		<title>Docs: .example vs. .com</title>
		<link>http://marginnotes2.wordpress.com/2013/01/04/docs-example-vs-com/</link>
		<comments>http://marginnotes2.wordpress.com/2013/01/04/docs-example-vs-com/#comments</comments>
		<pubDate>Fri, 04 Jan 2013 09:30:28 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Access Management]]></category>
		<category><![CDATA[Docs]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=977</guid>
		<description><![CDATA[In OpenAM docs we often need to differentiate between second-level DNS domains. When writing about federation, for example, we need to distinguish among providers. In the real world, many providers use .com as the top-level domain and their brand as &#8230; <a href="http://marginnotes2.wordpress.com/2013/01/04/docs-example-vs-com/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=977&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>In OpenAM docs we often need to differentiate between second-level DNS domains. When writing about federation, for example, we need to distinguish among providers. In the real world, many providers use .com as the top-level domain and their brand as the second level domain. Hence we have ended up accidentally squatting on other people&#8217;s property, like idp.com or sp.com.</p>
<p>Read them again: idp.com and sp.com.</p>
<p>If they look like Internet domain names, that is because they are.</p>
<p>Now read these: idp.example and sp.example.</p>
<p>Hesitation? Actually these are the &#8220;correct&#8221; examples for use in documentation.</p>
<p>The string &#8220;.com&#8221; is self-evidently obvious as a top-level domain even to people who cannot say what DNS stands for or what it does. So adding something in front of .com makes it instantly recognizable: &#8220;Oh, that&#8217;s an Internet name.&#8221;</p>
<p>Unfortunately, we ought not use .com in documentation where we need to differentiate by second-level domain. Almost all *.com domains can belong to somebody else.</p>
<p>As mentioned, there is a workaround. <a href="http://tools.ietf.org/html/rfc2606">RFC 2606</a> sets aside .example, .example.com, .example.net, .example.org for use in documentation. It also sets aside others like .test.</p>
<blockquote>
<pre>".test" is recommended for use in testing of current or new DNS
related code.</pre>
</blockquote>
<p>Similar story with .invalid and .localhost. These are reserved but not suited to most documentation.</p>
<p>Our docs do use .example.com, .example.net, .example.org. But those hide the differentiation in the top-level domain instead of where we want it in this case, which is the second level. We would have idp.example.net and sp.example.com, which is technically correct but harder to understand when reading.</p>
<p>The reserved top-level .example looks weird to anybody who has not read RFC 2606. I have read RFC 2606 and it still looks weird to me. idp.example in the doc is technically correct. The trade off is that readers have to slow down and think, &#8220;What the heck is idp.example? (Quick search&#8230;) Oh, these writers have read RFC 2606, which says .example is like .com, except that it&#8217;s reserved as community property so that it can be used in documentation. Okay, what was I thinking about before I got stuck on that&#8230;?&#8221;</p>
<p>Even though the reserved names in RFC 2606 can violate the rule of least surprise, as long as we are consistent in applying RFC 2606, then .example might be the best choice in the long term.</p>
<p>First, using .example is the best correct workaround that we know of at this point.</p>
<p>Second, using .example might actually encourage people who like the challenge of getting their heads around reasonably complex topics such as access management federation. After one stumbles on .example once or twice, one looks it up and learns what is &#8220;correct.&#8221; This once again confirms the reader&#8217;s status as a power user who knows sundry Internet arcana, turning the stumbling block into its own reward.</p>
<p>Third, it also makes us writers look like we know what we are writing about. We even pay attention to details like RFC 2606. (On the other hand, now that we pay attention to RFC 2606, we probably should be extra careful about the really important details, too.)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/977/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/977/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=977&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2013/01/04/docs-example-vs-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>
	</item>
		<item>
		<title>OpenAM 10.0.1 released</title>
		<link>http://marginnotes2.wordpress.com/2012/12/14/openam-10-0-1-released/</link>
		<comments>http://marginnotes2.wordpress.com/2012/12/14/openam-10-0-1-released/#comments</comments>
		<pubDate>Fri, 14 Dec 2012 16:13:12 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Access Management]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=967</guid>
		<description><![CDATA[As announced on the mailing list, OpenAM 10.0.1 is now available. This is a maintenance release that brings important fixes, so be sure to update your OpenAM 10.0.0 installations. You can get OpenAM 10.0.1 from the OpenAM download page under &#8230; <a href="http://marginnotes2.wordpress.com/2012/12/14/openam-10-0-1-released/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=967&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://forgerock.org/openam.html"><img class="alignleft" alt="OpenAM Community Logo" src="http://openam.forgerock.org/images/openam-tagline-200x65.png" width="200" height="65" /></a> As <a href="http://lists.forgerock.org/pipermail/openam/2012-December/009552.html">announced on the mailing list</a>, OpenAM 10.0.1 is now available. This is a maintenance release that brings important fixes, so be sure to update your OpenAM 10.0.0 installations.</p>
<p>You can get OpenAM 10.0.1 from the <a href="http://forgerock.org/openam.html">OpenAM download page</a> under <em><strong>Latest stable</strong></em> releases.</p>
<p>OpenAM 10.0.1 brings you over 48 bug fixes, including important security fixes, and 6 enhancements. For details, see the <a href="http://docs.forgerock.org/en/openam/10.0.1/release-notes/index.html">release notes</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/967/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/967/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=967&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2012/12/14/openam-10-0-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>

		<media:content url="http://openam.forgerock.org/images/openam-tagline-200x65.png" medium="image">
			<media:title type="html">OpenAM Community Logo</media:title>
		</media:content>
	</item>
		<item>
		<title>forgerock-doc-maven-plugin 1.1.0 released</title>
		<link>http://marginnotes2.wordpress.com/2012/12/07/forgerock-doc-maven-plugin-1-1-0-released/</link>
		<comments>http://marginnotes2.wordpress.com/2012/12/07/forgerock-doc-maven-plugin-1-1-0-released/#comments</comments>
		<pubDate>Fri, 07 Dec 2012 01:10:28 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=963</guid>
		<description><![CDATA[It&#8217;s always satisfying to release something, even if you&#8217;re just scratching your own itch. Today the ForgeRock doc build plugin reached 1.1.0. As mentioned on the mailing list, &#8220;This release fixes a few issues, and includes a number of improvements &#8230; <a href="http://marginnotes2.wordpress.com/2012/12/07/forgerock-doc-maven-plugin-1-1-0-released/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=963&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><img class="alignleft" alt="ForgeRock Community Logo" src="http://commons.forgerock.org/forgerock-doc-maven-plugin/images/ForgeRock-Community-grey-295x50.png" height="50" width="295" /> It&#8217;s always satisfying to release something, even if you&#8217;re just scratching your own itch. Today the <a href="https://github.com/markcraig/forgerock-doc-maven-plugin#forgerock-doc-build-maven-plugin">ForgeRock doc build plugin</a> reached <a href="http://sources.forgerock.org/browse/commons/forgerock-doc-maven-plugin/tags/forgerock-doc-maven-plugin-1.1.0">1.1.0</a>.</p>
<p>As mentioned on the <a href="http://lists.forgerock.org/pipermail/docs/2012-December/000161.html">mailing list</a>, &#8220;This release fixes a few issues, and includes a number of improvements that have already been visible in the documentation for a while now.&#8221; Basically, it&#8217;s something stable before we embark on 2.0.0, which I hope will reach release in the fall next year, and include <a href="https://bugster.forgerock.org/jira/browse/DOCS/fixforversion/10552">many significant improvements</a> to doc layout and usability.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/963/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/963/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=963&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2012/12/07/forgerock-doc-maven-plugin-1-1-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>

		<media:content url="http://commons.forgerock.org/forgerock-doc-maven-plugin/images/ForgeRock-Community-grey-295x50.png" medium="image">
			<media:title type="html">ForgeRock Community Logo</media:title>
		</media:content>
	</item>
		<item>
		<title>ForgeRock welcomes Mike Jang</title>
		<link>http://marginnotes2.wordpress.com/2012/11/30/forgerock-welcomes-mike-jang/</link>
		<comments>http://marginnotes2.wordpress.com/2012/11/30/forgerock-welcomes-mike-jang/#comments</comments>
		<pubDate>Fri, 30 Nov 2012 17:48:55 +0000</pubDate>
		<dc:creator>Mark Craig</dc:creator>
				<category><![CDATA[Access Management]]></category>
		<category><![CDATA[Docs]]></category>

		<guid isPermaLink="false">http://marginnotes2.wordpress.com/?p=951</guid>
		<description><![CDATA[Welcome to Mike Jang who joined the ForgeRock documentation team this past Monday. Glad to have you with us, Mike! If you have studied for a Linux certification exam, you might have done so with one of Mike&#8217;s books. He &#8230; <a href="http://marginnotes2.wordpress.com/2012/11/30/forgerock-welcomes-mike-jang/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=951&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://forgerock.org"><img class="alignleft size-full" alt="ForgeRock Community Logo" src="http://forgerock.org/images/ForgeRock-Community-grey-295x50.png" height="50" width="295" /></a>Welcome to <a href="http://www.amazon.com/Michael-H.-Jang/e/B001IU12KS/ref=sr_ntt_srch_lnk_1?qid=1354235499&amp;sr=8-1">Mike Jang</a> who joined the ForgeRock documentation team this past Monday. Glad to have you with us, Mike!</p>
<p>If you have studied for a Linux certification exam, you might have done so with one of Mike&#8217;s books. He likes learning new software, having taught himself SELinux, iptables-based firewalls, LDAP, Kerberos, repository-based package management tools, virtualization and more, with ForgeRock access management software next on his list. Mike has done both technical writing and also teaching. As you might have noticed, he started contributing to the OpenAM mailing list before joining ForgeRock.</p>
<p>Mike&#8217;s main focus at ForgeRock will be access management documentation for the <a href="http://openam.forgerock.org">OpenAM</a> and <a href="http://openig.forgerock.org">OpenIG</a> projects. It&#8217;s great to have another skilled writer, and especially good for the community to have someone so well-versed in what system administrators really need to know.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/marginnotes2.wordpress.com/951/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/marginnotes2.wordpress.com/951/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=marginnotes2.wordpress.com&#038;blog=21765187&#038;post=951&#038;subd=marginnotes2&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://marginnotes2.wordpress.com/2012/11/30/forgerock-welcomes-mike-jang/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/81d5ba08e5641c25870f5458eb016016?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">markcraig</media:title>
		</media:content>

		<media:content url="http://forgerock.org/images/ForgeRock-Community-grey-295x50.png" medium="image">
			<media:title type="html">ForgeRock Community Logo</media:title>
		</media:content>
	</item>
	</channel>
</rss>
