<?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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>willnorris.com &#187; technology</title>
	<atom:link href="http://willnorris.com/category/technology/feed" rel="self" type="application/rss+xml" />
	<link>http://willnorris.com</link>
	<description>managing identity</description>
	<pubDate>Mon, 17 Nov 2008 20:17:37 +0000</pubDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
		<item>
		<title>Consolidating domains</title>
		<link>http://willnorris.com/2008/11/consolidating-domains</link>
		<comments>http://willnorris.com/2008/11/consolidating-domains#comments</comments>
		<pubDate>Fri, 14 Nov 2008 01:37:24 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[identity]]></category>

		<category><![CDATA[music]]></category>

		<category><![CDATA[news]]></category>

		<category><![CDATA[personal]]></category>

		<category><![CDATA[technology]]></category>

		<category><![CDATA[.com]]></category>

		<category><![CDATA[.name]]></category>

		<category><![CDATA[domain]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=391</guid>
		<description><![CDATA[For a while now, I&#8217;ve had two different personal websites. I have my personal blog at willnorris.com, which you&#8217;re reading now.  And I also have my &#8220;identity site&#8221; at will.norris.name, which includes my hcard, activity stream, contact list, and a list of my profiles on various websites.  I&#8217;ve also used this identity site [...]]]></description>
			<content:encoded><![CDATA[<p>For a while now, I&#8217;ve had two different personal websites. I have my personal blog at <a href="http://willnorris.com/">willnorris.com</a>, which you&#8217;re reading now.  And I also have my &#8220;identity site&#8221; at <a href="http://will.norris.name/">will.norris.name</a>, which includes my hcard, activity stream, contact list, and a list of my profiles on various websites.  I&#8217;ve also used this identity site as my primary OpenID for quite a while.  </p>

<p>I&#8217;ve been considering consolidating these down into a single site, putting my activity stream on the front page and my blog under a sub-directory.  Of course I&#8217;ll setup proper redirects and such so that no links will be broken.  I can also update my OpenID at all of the services I use, so that&#8217;s not really a problem.  .com as a TLD is certainly more familiar with people, but the .name is technically the &#8220;correct&#8221; TLD for individuals.  So now I&#8217;m relying on others to give me input&#8230; which domain should I use?</p>

<p><script type="text/javascript" language="javascript" src="http://static.polldaddy.com/p/1104598.js"></script><noscript> <a href ="http://answers.polldaddy.com/poll/1104598/" >Which domain should I use?</a>  <br/> <span style="font-size:9px;"> (<a href ="http://www.polldaddy.com">  surveys</a>)</span></noscript></p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/11/consolidating-domains/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>WordPress OpenID v3.0</title>
		<link>http://willnorris.com/2008/10/wordpress-openid-v3</link>
		<comments>http://willnorris.com/2008/10/wordpress-openid-v3#comments</comments>
		<pubDate>Thu, 02 Oct 2008 01:44:29 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[identity]]></category>

		<category><![CDATA[technology]]></category>

		<category><![CDATA[openid]]></category>

		<category><![CDATA[wp-openid]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=337</guid>
		<description><![CDATA[I&#8217;m happy to announce that version 3.0 of the WordPress OpenID plugin is now available.  As previously mentioned, there are a lot of new features in this release:


OpenID Provider - Specific user roles can be given the capability of using the built-in OpenID provider, turning their author posts URL into a valid OpenID which [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m happy to announce that version 3.0 of the WordPress OpenID plugin is <a href="http://wordpress.org/extend/plugins/openid/">now available</a>.  As <a href="http://willnorris.com/2008/09/the-next-steps-with-wp-openid">previously mentioned</a>, there are a lot of new features in this release:</p>

<ul>
<li><strong>OpenID Provider</strong> - Specific user roles can be given the capability of using the built-in OpenID provider, turning their author posts URL into a valid OpenID which can be used to login to other sites.  This includes support for OpenID 1.0 and 2.0 as well as Simple Registration 1.0, with hooks to add other OpenID extensions.</li>
<li><strong>OpenID Delegation</strong> - Users authorized to use the built-in provider can optionally choose to delegate their OpenID to another provider instead.</li>
<li><strong>EAUT Mapper</strong> - Support for the draft <a href="http://eaut.org">Email Address to URL Transformation</a> protocol.  If you use an email address at the domain of your WordPress blog, you can now use use that email address to login wherever EAUT is supported.</li>
<li><strong>Extensibility</strong> - the plugin now has a number of public functions and hooks that other plugins can use to integrate with or extend the OpenID plugin.  These are all <a href="http://wiki.diso-project.org/WordPress-OpenID">documented here</a>.</li>
</ul>

<p>It&#8217;s worth mentioning that pretty much all of the new features require that you also have the <a href="http://wordpress.org/extend/plugins/xrds-simple/">XRDS-Simple plugin</a> installed.  There are also a number of other changes in regards to simplifying and stabilizing the plugin, than can be read about <a href="http://willnorris.com/2008/09/wp-openid-faster-stronger-better">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/10/wordpress-openid-v3/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>WordPress MU in a development environment</title>
		<link>http://willnorris.com/2008/09/wordpress-mu-in-a-development-environment</link>
		<comments>http://willnorris.com/2008/09/wordpress-mu-in-a-development-environment#comments</comments>
		<pubDate>Fri, 19 Sep 2008 05:44:44 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[technology]]></category>

		<category><![CDATA[buddypress]]></category>

		<category><![CDATA[localhosting]]></category>

		<category><![CDATA[mu]]></category>

		<category><![CDATA[wordpress]]></category>

		<category><![CDATA[wpmu]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=311</guid>
		<description><![CDATA[Most of the development I do for my job is within WordPress, so I have quite a few WordPress instances running on my local workstation.  I&#8217;ve been using the same custom Apache setup for three years, and have been developing on WordPress for almost as long, so I&#8217;ve been a bit bewildered with the [...]]]></description>
			<content:encoded><![CDATA[<p>Most of the development I do for my job is within WordPress, so I have quite a few WordPress instances running on my local workstation.  I&#8217;ve been using the same <a href="http://willnorris.com/2005/05/dev_environment">custom Apache setup</a> for three years, and have been developing on WordPress for almost as long, so I&#8217;ve been a bit bewildered with the amount of trouble I&#8217;ve had the several times I&#8217;ve attempted to get <a href="http://mu.wordpress.org/">WordPress MU</a> running on my laptop.  I identified a couple of specific problems and solutions, which I wanted to outline here.</p>

<p><span id="more-311"></span></p>

<h3>Choosing the right hostname</h3>

<p>Part of my custom setup is that I have a whole slew of bogus hostnames pointing to localhost, which Apache then dynamically maps to the correct document root.  For the most part, I just drop the TLD from the actual hostname&#8230; so <em>http://willnorris/</em> is my locally hosted development site for this blog <em>http://willnorris.com/</em>, and <em>http://will.norris/</em> is my development site for <em>http://will.norris.name/</em>.  I also keep a handful of WordPress versions running locally, so I can test plugins in those different environments &#8212; <em>http://wordpress-2.3/</em>, <em>http://wordpress-2.5/</em>, etc.  When I began to setup my WordPress MU (and <a href="http://buddypress.org/">BuddyPress</a>) instance, I used the site <em>http://wpmu/</em>.  The installation went fine, but when I tried to login it failed every time.  Given that this same setup worked fine with single-user WordPress, I was quite confused.  I quickly realized though, that the authentication cookies were never being set for WPMU&#8230; in fact no cookies were.</p>

<p>The difference between the two versions of WordPress is the value of <code>COOKIE_DOMAIN</code> which is passed to <a href="http://php.net/setcookie">setcookie()</a>.  Both flavors of WordPress allow you to define this constant in <code>wp-config.php</code>, but they differ in what happens if it is not defined there.  WordPress sets it to the boolean false, whereas WordPress MU sets it to <code>'.'.$current_site-&gt;domain</code>.  This results in a different <code>Set-Cookie</code> HTTP header between the two.  Take for example the <code>wordpress_test_cookie</code> cookie.  WordPress sends the response header</p>

<pre><code>Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/
</code></pre>

<p>whereas WordPress MU sends the response header</p>

<pre><code>Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/; domain=.wpmu
</code></pre>

<p>The difference of course is the <code>domain=.wpmu</code> there on the end.  In a production environment, this wouldn&#8217;t make a bit of difference.  But because I&#8217;m using fake hostnames in a development environment, this makes all the difference in the world.  You see, the <a href="http://www.ietf.org/rfc/rfc2109.txt">HTTP Cookie Spec</a> (Section 4.3.2 Rejecting Cookies) requires that the domain attribute includes an &#8220;embedded dot&#8221;.  This is a security feature that prevents a site from setting a cookie on a top level domain like &#8220;.com&#8221;.  Since single-user WordPress wasn&#8217;t specifying a domain attribute, it didn&#8217;t have any problem setting the cookie.  Because my hostname <em>wpmu</em> doesn&#8217;t contain an embedded dot, the browser was properly rejecting the cookies, preventing me from being able to login.  So our solution here was to use the site <em>http://wp.mu/</em> (note the added dot in the middle) for hosting our WordPress MU development site.</p>

<h3>Sending Mail</h3>

<p>The other main problem I had with WordPress MU was that none of the notification emails were being delivered.  This was actually a problem with single-user WordPress as well, but it didn&#8217;t matter as much then.  Now I&#8217;m needing to test the account sign-up process a bit more, and so I need the activation emails that are being sent out.  It&#8217;s been a long time since I&#8217;ve administered an email server, so I won&#8217;t embarrass myself by trying to explain what the problem was (something along the lines of my ISP&#8217;s SMTP server not liking what <a href="http://php.net/mail">mail()</a> was sending) .  I was however able to fix it by writing a very simple plugin, <a href="http://willnorris.com/svn/will.norris.name/trunk/public/wordpress-content/plugins/development-mailer.php">Development Mailer</a>, that changes a few configuration options of PHPMailer.  This works for me on Mac OS X (Leopard), but I make no guarantees for anyone else.  Keep in mind that his plugin should only ever be needed for a development environment&#8230; if you&#8217;re unable to send notification emails from your production blog, then you&#8217;ve got other problems.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/09/wordpress-mu-in-a-development-environment/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>tr.im python script (for Mac)</title>
		<link>http://willnorris.com/2008/09/trim-python-script-for-mac</link>
		<comments>http://willnorris.com/2008/09/trim-python-script-for-mac#comments</comments>
		<pubDate>Thu, 18 Sep 2008 00:52:26 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[technology]]></category>

		<category><![CDATA[gtd]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[quicksilver]]></category>

		<category><![CDATA[tr.im]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=305</guid>
		<description><![CDATA[For a while I have been using a simple AppleScript script to convert URLs into shortened URLs.  The flow goes something like:


Initiate script from Quicksilver
Grab URL from the front-most window in Safari
Submit URL to URL shortening service (previously xrl.us, but more recently bit.ly)
Copy shortened URL to system clipboard (for pasting into Twitterific)
Notify of process [...]]]></description>
			<content:encoded><![CDATA[<p>For a while I have been using a simple AppleScript script to convert URLs into shortened URLs.  The flow goes something like:</p>

<ul>
<li>Initiate script from <a href="http://www.blacktree.com/">Quicksilver</a></li>
<li>Grab URL from the front-most window in Safari</li>
<li>Submit URL to URL shortening service (previously <a href="http://xrl.us/">xrl.us</a>, but more recently <a href="http://bit.ly/">bit.ly</a>)</li>
<li>Copy shortened URL to system clipboard (for pasting into <a href="http://iconfactory.com/software/twitterrific">Twitterific</a>)</li>
<li>Notify of process completion via <a href="http://growl.info/">Growl</a></li>
</ul>

<p>I&#8217;ve tried a number of different workflows including bookmarklets and the like, but this one works best for me (read: I honestly don&#8217;t care what you think of this flow or what you do instead&#8230; this is what I prefer).</p>

<p>Recently I discovered a new URL shortening service, <a href="http://tr.im/">tr.im</a>, and decided to give them a try.  However, unlike most services, tr.im doesn&#8217;t simply return the shortened URL. Instead it returns either an XML or JSON structure that includes the shortened URL along with some other data.  Quickly realizing that AppleScript doesn&#8217;t handle JSON very well, I decided that this would be a good opportunity to start learning Python.  The result was the following Python script:</p>

<p><a href="http://willnorris.com/svn/homedir/packages/tools/local/bin/trimURL">http://willnorris.com/svn/homedir/packages/tools/local/bin/trimURL</a></p>

<p>It follows the same flow as mentioned above, making use of a couple of Python modules (which are required for running this script): <a href="http://pypi.python.org/pypi/simplejson">simplejson</a> and <a href="http://appscript.sourceforge.net/">appscript</a>.  Put this script in a directory that Quicksilver scans (I think the Terminal Quicksilver plugin is also required).  If you want to authenticate to tr.im, add your username and password to your <code>~/.netrc</code> file.  I also set the script&#8217;s file icon to be the <a href="http://willnorris.com/svn/homedir/packages/tools/local/bin/.trim.png">tr.im icon</a>, so it will be displayed in the Growl notification.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/09/trim-python-script-for-mac/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>Providing and Delegating OpenIDs</title>
		<link>http://willnorris.com/2008/09/providing-and-delegating-openids</link>
		<comments>http://willnorris.com/2008/09/providing-and-delegating-openids#comments</comments>
		<pubDate>Tue, 16 Sep 2008 21:18:00 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[identity]]></category>

		<category><![CDATA[technology]]></category>

		<category><![CDATA[openid]]></category>

		<category><![CDATA[wordpress]]></category>

		<category><![CDATA[wp-openid]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=270</guid>
		<description><![CDATA[The next major release of wp-openid includes a built-in OpenID provider and delegation engine.  This will certainly be the most exciting feature of this release for most people, so let me explain a bit how it works.  Each authorized user on the WordPress blog will have an OpenID at the author posts URL [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://willnorris.com/2008/09/the-next-steps-with-wp-openid">next major release</a> of wp-openid includes a built-in OpenID provider and delegation engine.  This will certainly be the most exciting feature of this release for most people, so let me explain a bit how it works.  Each authorized user on the WordPress blog will have an OpenID at the author posts URL (ie. http://example.com/author/admin).  Authorization to use the OpenID provider is controlled based on user roles and is managed in the main OpenID settings page.  Each user can choose between one of three options for their OpenID:</p>

<ul>
<li>Don&#8217;t use OpenID at all</li>
<li>Use the local OpenID provider built in to the plugin</li>
<li>Delegate to another OpenID</li>
</ul>

<p><span id="more-270"></span>
If a the local OpenID provider is used, it also supports transmitting sreg attributes pulled from the user&#8217;s WordPress profile and the DiSo Profiles plugin, if it&#8217;s installed.  The user can update this data before releasing it to the relying party, but those changes aren&#8217;t currently stored.  In addition, trust decisions are recorded and stored for the user, and can be modified from their config page at any time.</p>

<p>If a user chooses to delegate to another OpenID, they need only provide the delegate OpenID itself.  All server configuration and supported extensions from that provider are discovered and published in the local XRDS document.  Of course this data will have to be cached and probably updated on some interval, but it makes setting up delegation a breeze.</p>

<h3>Server Modes</h3>

<p>Remember that every user&#8217;s OpenID is their author posts URL.  So what about the home URL for the blog itself?  Well, the OpenID server can operate in two basic modes: <strong>multi-user</strong> and <strong>blog-owner</strong>&#8230; perhaps not the best names, but they&#8217;ll work for now.  </p>

<p>In multi-user, the default configuration, the server supports a feature in OpenID 2.0 called <em>OpenID Provider driven identifier selection</em>.  What this means is that ANY user on that blog can enter the home URL as their OpenID, and the OpenID provider itself will make sure that the correct identifier is returned to the relying party.  The final identifier will still be something like <em>http://example.com/author/admin/</em>, but the user only needs to enter <em>example.com</em> at a relying party.  If you&#8217;ve used ever used Yahoo&#8217;s OpenID provider, then you&#8217;ve probably seen how this works.</p>

<p>I suspect the more common mode will be blog-owner, which is appropriate for personal blogs.  Even if there are multiple users in the system, the blog is basically owned by one individual and it makes sense for that individual to use the blog home URL as their OpenID.  This mode is activated by selecting a &#8220;Blog Owner&#8221; on the main plugin configuration page.  Once set, this user&#8217;s personal OpenID configuration (whether turned off, using the local provider, or delegated to another OpenID) will be used at the blog home URL.  Other user&#8217;s on the blog could still use their OpenIDs, but they would need to type in the full URL each time&#8230; they just lose the convenience of being able to use the blog home URL.</p>

<p>For security, once a blog owner is set, no other user can update the setting.  The blog owner can set someone else as the new blog owner (a push mechanism), but no-one can take ownership away (a pull mechanism).  Additionally, if a multi-user blog wants to ensure no-one is ever set as the blog owner, they can add the following to their wp-config.php file:</p>

<pre><code>define("OPENID_DISALLOW_OWNER", 1);
</code></pre>

<h3>What&#8217;s left to do</h3>

<p>The main outstanding work to be done before release is the user interface.  You&#8217;ll notice that the user&#8217;s configuration screen (where they manage their external OpenIDs, OpenID Provider preference, and Trusted Sites) is a bit confusing if you&#8217;re not to familiar with OpenID.  The current layout was done simply for convenience while developing the OpenID Provider, and will be overhauled to some degree before the release.</p>

<p>I&#8217;m also not too sure about compatibility with older versions of PHP and WordPress.  I&#8217;ve been developing using PHP 5.2.6, MySQL 5.0.51, and WordPress 2.6.1.  I do intend to remain as backwards compatible on these as possible (within reason), but make no guarantees for the current development code.  I&#8217;ll also be working to make everything compatible with WordPressMU and BuddyPress.  For now, I just wanted to get the code out there, and get people playing with it a little bit.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/09/providing-and-delegating-openids/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>wp-openid - faster, stronger, better</title>
		<link>http://willnorris.com/2008/09/wp-openid-faster-stronger-better</link>
		<comments>http://willnorris.com/2008/09/wp-openid-faster-stronger-better#comments</comments>
		<pubDate>Tue, 16 Sep 2008 21:17:48 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[identity]]></category>

		<category><![CDATA[technology]]></category>

		<category><![CDATA[openid]]></category>

		<category><![CDATA[wordpress]]></category>

		<category><![CDATA[wp-openid]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=268</guid>
		<description><![CDATA[One of the primary focuses for this next major release of wp-openid is stability.  While most people have had great success with the plugin, there are a fair number that seem to have all kinds of strange problems, ranging from conflicts with other plugins, data corruption, library issues, etc.  In order to reach [...]]]></description>
			<content:encoded><![CDATA[<p>One of the primary focuses for this <a href="http://willnorris.com/2008/09/the-next-steps-with-wp-openid">next major release</a> of wp-openid is stability.  While most people have had great success with the plugin, there are a fair number that seem to have all kinds of strange problems, ranging from conflicts with other plugins, data corruption, library issues, etc.  In order to reach the level of adoption I&#8217;d love to see, we have to make this plugin as easy to install and run as WordPress itself.  This is certainly no easy task, but we&#8217;ve come a very long way.  To this end, you&#8217;ll find the following changes:</p>

<p><span id="more-268"></span></p>

<h3>Simplified Database Structure</h3>

<p>Version 1.0 of wp-openid added four new database tables and overloaded one of the comment table fields in a weird way.  Version 2.0 required only three of those four tables and added one column to the comment table to eliminate the overloaded field.  The current development version doesn&#8217;t add any columns or overload fields of existing tables, and adds only one new table of its own, which I&#8217;m still hoping to eliminate.</p>

<p>The two removed tables were used to store OpenID associations and nonces, both of which are temporary data necessary to make OpenID security actually work.  Instead of using these tables, I&#8217;ve opted to use an updated version of the OpenID store used in Simon Willison&#8217;s <a href="http://wordpress.org/extend/plugins/mu-open-id/">mu-open-id</a> plugin which uses the WordPress options table to store this data.  I&#8217;ve updated his store to use the latest php-openid APIs as well as to reduce the potential for race conditions.</p>

<p>I&#8217;ve removed the column from the comments table that was tracking which comments were left using OpenIDs, and am instead storing this in the postmeta table for the post the comment is associated with.  It would certainly be preferable to have a commentmeta table, but I like this better than the previous solution.</p>

<p>The one remaining table is the identity table which tracks the identity URLs of each user.  I would like to store this in the usermeta table, but because <a href="http://trac.wordpress.org/ticket/7540">it requires unique keys</a> there&#8217;s just not a real clean way to do this and keep the plugin scalable to support large deployments.  If this is fixed in 2.7, we could theoretically eliminate any custom database stuff in the plugin, which I&#8217;d absolutely love.</p>

<h3>Removed PEAR_LOG</h3>

<p>For the time being I&#8217;ve removed PEAR&#95;LOG and am simply using error&#95;log() for what logging still remains.  The problem is that most people weren&#8217;t taking advantage of the logs anyway, so they were just taking up space.  I&#8217;ll likely look at making use of the WP&#95;DEBUG constant to allow more verbose logging when it&#8217;s desired.  For now this just simplifies things a bit, and eliminates at least one case of library conflict that was reported.</p>

<h3>Code Refactoring</h3>

<p>Really?  More refactoring?  Didn&#8217;t I just do a lot of this in the last point release?  Well yes, but more was needed&#8230; MUCH more.  Previously, code was roughly divided based on the MVC (model, view, controller) model into store.php, interface.php, and logic.php, respectively.  That worked for a while, but got to be pretty confusing as those individual files became a bit unmanageable.  Instead, things are now broken into more logical segments&#8230; comments, admin panel, logging in through wp-login.php, etc.  This seems to be a lot easier to manage and more importantly, easier to extend.</p>

<h3>More Hooks</h3>

<p>I haven&#8217;t sat down to document them all yet, but I&#8217;m adding in more hooks for other plugins to add functionality.  Want to pull profile data from FOAF instead of sreg?  No problem, now you have a hook you can implement.  This makes everything in the plugin much more lightweight and &#8220;loosely joined&#8221; which is always good.  All of the existing non-core OpenID functionality (like SREG) is currently using these hooks.</p>

<h3>Bug Fixes</h3>

<p>Though I&#8217;m not always good about replying, I generally do monitor <a href="http://wordpress.org/tags/openid">the conversations</a> on the WordPress support forums.  I will try and put together a more exhaustive list of what bugs have been addressed, but I will simply say for now that most of the major bugs people have reported there should be absent from the current development branch.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/09/wp-openid-faster-stronger-better/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>The Next Steps with wp-openid</title>
		<link>http://willnorris.com/2008/09/the-next-steps-with-wp-openid</link>
		<comments>http://willnorris.com/2008/09/the-next-steps-with-wp-openid#comments</comments>
		<pubDate>Tue, 16 Sep 2008 21:17:21 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[identity]]></category>

		<category><![CDATA[technology]]></category>

		<category><![CDATA[openid]]></category>

		<category><![CDATA[wordpress]]></category>

		<category><![CDATA[wp-openid]]></category>

		<category><![CDATA[xrds-simple]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=265</guid>
		<description><![CDATA[I&#8217;m really excited about what&#8217;s been happening with the WordPress OpenID plugin the last couple of weeks.  When it&#8217;s ready to ship, I&#8217;m sure I&#8217;ll do some really deep contemplative post about &#8220;how far we&#8217;ve come&#8221; or something like that.  In the meantime however, I think I&#8217;ve got something that is mostly feature [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m really excited about what&#8217;s been happening with the WordPress OpenID plugin the last couple of weeks.  When it&#8217;s ready to ship, I&#8217;m sure I&#8217;ll do some really deep contemplative post about &#8220;how far we&#8217;ve come&#8221; or something like that.  In the meantime however, I think I&#8217;ve got something that is mostly feature complete and more or less ready for some &#8220;alpha&#8221; level testing.  There&#8217;s a lot that will be new in this release, which I&#8217;m going to try and cover in my next couple of posts.  That should give people more manageable chunks to look at, test, and comment on.  If you&#8217;ve got a test WordPress instance laying around and like playing with unreleased code, please dive right in.</p>

<h3>Here Be Dragons!</h3>

<p>Let me say first and foremost, don&#8217;t use this on a production blog.  I always say that when I blog about unreleased code, but this time it&#8217;s much more important.  There are major database changes in this version&#8230; changes which are non-trivial to reverse.  There is a very good chance there will be more database changes before the final release, and there will not be an upgrade path from this development version (there will however be an upgrade path from the last stable version&#8230; 2.2.x).</p>

<h3>What&#8217;s New</h3>

<p>For now, I&#8217;m just going to have two follow-up posts talking about changes in the coming release.  I&#8217;m sure I&#8217;ll overlook something and may have to add a third post, but for now we&#8217;re looking at:</p>

<ul>
<li><a href="http://willnorris.com/2008/09/wp-openid-faster-stronger-better">Making the plugin more stable, extensible, and overall simpler</a></li>
<li><a href="http://willnorris.com/2008/09/providing-and-delegating-openids">OpenID Providing and Delegation</a></li>
</ul>

<h3>Test it Out</h3>

<p>The current plugin can be checked out from the DiSo subversion repository; grab the <a href="http://diso.googlecode.com/svn/wordpress/wp-openid/branches/3.0/">3.0 branch</a> .  In addition, it requires a special branch of the <a href="http://diso.googlecode.com/svn/wordpress/wp-xrds-simple/branches/refactoring/">XRDS-Simple plugin</a> to provide all the XRDS publishing stuff.  If you have a previous version of wp-openid installed, you <strong>must</strong> deactivate and reactivate the plugin for the database changes to be applied.  Again, keep in mind that these will be somewhat substantial changes to the OpenID portions of the database, so don&#8217;t do this on your production blog just yet. Please direct any support questions to the <a href="http://groups.google.com/group/diso-project">DiSo Mailing List</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/09/the-next-steps-with-wp-openid/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>Delta and the Security Question Anti-Pattern</title>
		<link>http://willnorris.com/2008/08/delta-and-the-security-question-anti-pattern</link>
		<comments>http://willnorris.com/2008/08/delta-and-the-security-question-anti-pattern#comments</comments>
		<pubDate>Thu, 14 Aug 2008 00:47:49 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[identity]]></category>

		<category><![CDATA[technology]]></category>

		<category><![CDATA[anti-pattern]]></category>

		<category><![CDATA[antipattern]]></category>

		<category><![CDATA[delta]]></category>

		<category><![CDATA[security questions]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=251</guid>
		<description><![CDATA[High on my list of most aggravating anti-patterns is that of setting up (in)security questions.  You know, where you have to choose three questions along the lines of:


What is your father&#8217;s middle name?
What is the name of your first pet?


Questions which, if answered truthfully, are incredibly easy to guess with just a modicum of [...]]]></description>
			<content:encoded><![CDATA[<p>High on my list of most aggravating anti-patterns is that of setting up (in)security questions.  You know, where you have to choose three questions along the lines of:</p>

<ul>
<li>What is your father&#8217;s middle name?</li>
<li>What is the name of your first pet?</li>
</ul>

<p>Questions which, if answered truthfully, are incredibly easy to guess with just a modicum of research.  But if you make something up, then you&#8217;re likely to forget what answer you gave.  It is <a href="http://www.google.com/search?q=%22security+questions%22">widely agreed</a> that these kinds of questions do not provide any real security, and there are a number of tricks people recommend for creating more secure answers.  I have my own solution, so that&#8217;s not really the point of this post.  This post is about what happened when I logged onto the <a href="http://www.delta.com/">Delta website</a> today.  <a href="http://www.flickr.com/photos/wnorris/2761469630/" title="Delta Security Questions" class="flickr" onclick="javascript:pageTracker._trackPageview ('/outbound/www.flickr.com');"><img src="http://farm4.static.flickr.com/3260/2761469630_104ece5d55_t.jpg" class="flickr right" /></a> After logging in with my four digit PIN (no, I&#8217;m not kidding&#8230; their website only supports four digit passwords), I was prompted to setup security questions for my account.  My account which I&#8217;ve had since 2001, where I&#8217;ve deliberately chosen not to setup the optional security questions.  However this time, I was notified that if I don&#8217;t setup security questions by September 17th, then I will lose access to my account.  Delta has decided to make security questions mandatory now for all of their SkyMiles customers.  That wouldn&#8217;t be so bad if it weren&#8217;t for <a href="https://www.delta.com/help/faqs/security_questions_faqs/index.jsp#cant_remember">what happens</a> when you forget your security questions:</p>

<blockquote>
  <p><strong>What happens if I can&#8217;t remember my security questions or answers?</strong><br />
  If you forget the answers to the security questions, and you exceed the maximum 
  allowable attempts to answer your security questions, your PIN will be emailed 
  to the address stored in your SkyMiles profile. If you don&#8217;t have an email address 
  on file then you can reset your PIN online provided you remember your personal 
  information.</p>
</blockquote>

<p>They simply email the PIN to you (in plain text) anyway!  I&#8217;m not sure what kind of &#8220;personal information&#8221; you would have to provide if you don&#8217;t have an email address on your account, but it can&#8217;t be much more than address and phone number.  </p>

<p>So I&#8217;m left wondering why on earth they are now forcing security questions down their customers&#8217; throats.  It would be one thing if they didn&#8217;t already have an automated password retrieval process, and this was an effort to cut support costs associated with forgotten passwords, but that&#8217;s not the case.  It might also be acceptable if they recognized the danger of simply emailing passwords around in plain text, and so enforced this based on the incorrect belief that it&#8217;s more secure.  But again, that is also not the case.  All they&#8217;ve managed to do is to provide someone with yet another way to potentially gain unauthorized access to my account.  If they really wanted to beef up security, how about allowing for more than a four digit PIN.  If you really want to make things more secure, allow me to sign in using my OpenID which supports <a href="http://www.myvidoop.com/">multi-factor authentication</a>.</p>

<p>Of course I know this is not a unique problem by any means.  Delta is not the only, nor the worst, offender.  And I&#8217;m not really sure why someone would want to break into my Delta account anyway&#8230; there&#8217;s really nothing in there of any value.  I know it was probably some schmuck at Delta with a three letter title and no clue about online security who forced the delta.com team to implement this.  I know all this&#8230; it&#8217;s just really aggravating.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/08/delta-and-the-security-question-anti-pattern/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>OpenID help at WordCamp SF</title>
		<link>http://willnorris.com/2008/08/openid-help-at-wordcamp-sf</link>
		<comments>http://willnorris.com/2008/08/openid-help-at-wordcamp-sf#comments</comments>
		<pubDate>Tue, 12 Aug 2008 05:19:30 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[technology]]></category>

		<category><![CDATA[openid]]></category>

		<category><![CDATA[wordcamp]]></category>

		<category><![CDATA[wordpress]]></category>

		<category><![CDATA[wp-openid]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=247</guid>
		<description><![CDATA[I just finally saw Lloyd&#8217;s post about the WordCamp SF Genius Bar, and I felt a bit inspired.  One of the problems that has plagued wp-openid for a while is the rather random problems people tend to have in getting the plugin to work.  It often has to do with some setting in [...]]]></description>
			<content:encoded><![CDATA[<p>I just finally saw Lloyd&#8217;s post about the <a href="http://foolswisdom.com/geniuses-for-wordcamp-sf-bar/">WordCamp SF Genius Bar</a>, and I felt a bit inspired.  One of the problems that has plagued wp-openid for a while is the rather random problems people tend to have in getting the plugin to work.  It often has to do with some setting in their hosting environment or the OpenID provider they&#8217;re attempting to use.  So if anyone is having a problem like this and you&#8217;re planning to attend <a href="http://2008.sf.wordcamp.org/">WordCamp SF 2008</a>, come and find me and show me what you&#8217;ve got.  I&#8217;ll be speaking during the camp about OAuth at some point, and will do my best to make myself available the rest of the time.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/08/openid-help-at-wordcamp-sf/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
		<item>
		<title>wp-openid 2.2.0 released</title>
		<link>http://willnorris.com/2008/07/wp-openid-220-released</link>
		<comments>http://willnorris.com/2008/07/wp-openid-220-released#comments</comments>
		<pubDate>Thu, 24 Jul 2008 01:44:50 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
		
		<category><![CDATA[identity]]></category>

		<category><![CDATA[technology]]></category>

		<category><![CDATA[eaut]]></category>

		<category><![CDATA[openid]]></category>

		<category><![CDATA[wordpress]]></category>

		<category><![CDATA[wp-openid]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=235</guid>
		<description><![CDATA[I&#8217;ve just released version 2.2.0 of the OpenID plugin for WordPress.  Notable additions in this version:


POST replay for comments - this should fix all the compatibility issues with other comment related plugins like reCaptcha.
MUCH better memory usage - like no longer needlessly building a 2MB object on every page load!
support for Email Address to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just released version 2.2.0 of the OpenID plugin for WordPress.  Notable additions in this version:</p>

<ul>
<li>POST replay for comments - this should fix all the compatibility issues with other comment related plugins like reCaptcha.</li>
<li>MUCH better memory usage - like no longer needlessly building a 2MB object on every page load!</li>
<li>support for <a href="http://eaut.org">Email Address to URL Transformation</a> - now you can use an email address anywhere you normally use an OpenID</li>
<li>fixed <a href="http://plugins.trac.wordpress.org/ticket/702">OpenID Spoofing vulnerability</a> - users&#8217; profile URLs must match one of their OpenIDs</li>
<li>using hooks for gathering user data - other plugins can now hook in and gather user info from FOAF, hCard, whatever</li>
<li>If OpenID authentication fails for whatever reason, the user is given the opportunity to submit their comment without OpenID</li>
<li>lots of little fixes, code refactoring and cleanup, and a lot of UI tweaks</li>
</ul>

<p>Download at <a href="http://wordpress.org/extend/plugins/openid/">http://wordpress.org/extend/plugins/openid/</a>.</p>

<p>I tested pretty thoroughly on WordPress 2.2 through 2.6 using PHP5.  I&#8217;m fairly certain I didn&#8217;t break PHP4, but let me know if you find any problems.</p>

<p>With this out the door, I&#8217;ll be jumping right into my feature list for the next major release &#8212; adding a native OpenID Server and delegation capabilities.  At that point, it should be able to handle all of your OpenID related needs.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2008/07/wp-openid-220-released/feed</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
	</item>
	</channel>
</rss>
