<?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/"
	>

<channel>
	<title>Code Spatter &#187; OpenID</title>
	<atom:link href="http://codespatter.com/category/programming/openid/feed/" rel="self" type="application/rss+xml" />
	<link>http://codespatter.com</link>
	<description></description>
	<lastBuildDate>Fri, 04 Sep 2009 14:59:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How to Write Reusable Apps for Pinax and Django</title>
		<link>http://codespatter.com/2009/01/15/how-to-write-reusable-apps-for-pinax-and-django/</link>
		<comments>http://codespatter.com/2009/01/15/how-to-write-reusable-apps-for-pinax-and-django/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 17:07:09 +0000</pubDate>
		<dc:creator>Greg Allard</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Pinax]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codespatter.com/?p=158</guid>
		<description><![CDATA[
	<script type="text/javascript">
	// <![CDATA[
		(function() {
			var links = document.getElementsByTagName('a');
			var query = '&';
			for(var i = 0; i < links.length; i++) {
				if(links[i].href.indexOf('#disqus_thread') >= 0) {
					links[i].innerHTML = 'View Comments';
					query += 'wpid' + i + '=' + encodeURIComponent(links[i].getAttribute('wpid')) + '&';
				}
			}
			document.write('<script charset="utf-8" type="text/javascript" src="http://disqus.com/forums/codespatter/get_num_replies_from_wpid.js?v=2.0' + query + '"><' + '/script>');
		})();
	//]]>
	</script>

	
Pinax is a collection of reusable django apps that brings together features that are common to many websites. It allows developers to focus on what makes their site unique. Here is an example of adding your own functionality to Pinax. It will also be an example of writing a reusable app since every individual app [...]


Related posts:<ol><li><a href='http://codespatter.com/2009/01/22/how-to-write-django-template-tags/' rel='bookmark' title='Permanent Link: How to Write Django Template Tags'>How to Write Django Template Tags</a> <small>Template tags can be useful for making your applications more...</small></li><li><a href='http://codespatter.com/2009/04/10/how-to-add-locations-to-python-path-for-reusable-django-apps/' rel='bookmark' title='Permanent Link: How to Add Locations to Python Path for Reusable Django Apps'>How to Add Locations to Python Path for Reusable Django Apps</a> <small>In my previous post I talk about reusable apps, but...</small></li><li><a href='http://codespatter.com/2009/09/02/how-to-display-realtime-traffic-analytics/' rel='bookmark' title='Permanent Link: How to Display Realtime Traffic Analytics'>How to Display Realtime Traffic Analytics</a> <small>Users of Presskit&#8217;n have been asking for traffic statistics on...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>
<a  href="http://pinaxproject.com" onclick="javascript:pageTracker._trackPageview('/external/pinaxproject.com');" >Pinax</a> is a collection of reusable django apps that brings together features that are common to many websites. It allows developers to focus on what makes their site unique. Here is an example of adding your own functionality to Pinax. It will also be an example of <strong>writing a <em>reusable</em> app</strong> since every individual app currently in Pinax can be used separately. Also, I&#8217;ve bundled the 
<a  href="http://code.google.com/p/django-books/" onclick="javascript:pageTracker._trackPageview('/external/code.google.com/p/django-books/');" >example files into a google code project</a>.</p>
<p>My example will be to create a list of books and allow them to be tied to any object using 
<a  href="http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/" onclick="javascript:pageTracker._trackPageview('/external/docs.djangoproject.com/en/dev/ref/contrib/contenttypes/');" >Django&#8217;s ContentType</a> framework. The books could be recommended reading for the members of a tribe (pinax group), a class, or anything in your project and will include title, description, and tags (requires 
<a  href="http://code.google.com/p/django-tagging/" onclick="javascript:pageTracker._trackPageview('/external/code.google.com/p/django-tagging/');" >django-tagging</a>). In another post I&#8217;ve shown 
<a  href="http://codespatter.com/2009/01/22/how-to-write-django-template-tags/">how to create template tags</a> to make it easy to show the list of books and a form to add a book. Obviously, there is a lot more that could be done with this app, but I will leave it out of the example to keep it simple.</p>
<h3>Starting the App</h3>
<p>Create a folder in the apps directory or any place that is on the python path (ex. /path/to/pinax/projects/complete_project/apps/books/)  and include these files:</p>
<ul>
<li>__init__.py even though it might be empty, it is required</li>
<li>forms.py</li>
<li>models.py</li>
<li>urls.py</li>
<li>views.py</li>
</ul>
<h3>models.py</h3>
<p>I will start with creating the model for the project. Below is all of the code I am placing in the file. I&#8217;ve added a lot of comments to explain everything that is happening.</p>

<div class="wp_syntax"><div class="code"><pre class="python"><span style="color: #808080; font-style: italic;">#import all of the things we will be using</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span>                          <span style="color: #ff7700;font-weight:bold;">import</span> models
<span style="color: #ff7700;font-weight:bold;">from</span> tagging.<span style="color: black;">fields</span>                     <span style="color: #ff7700;font-weight:bold;">import</span> TagField
<span style="color: #808080; font-style: italic;"># to help with translation of field names</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">utils</span>.<span style="color: black;">translation</span>  <span style="color: #ff7700;font-weight:bold;">import</span> ugettext_lazy as _
<span style="color: #808080; font-style: italic;"># to have a generic foreign key for any model</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">contenttypes</span>        <span style="color: #ff7700;font-weight:bold;">import</span> generic
<span style="color: #808080; font-style: italic;"># stores model info so this can be applied to any model</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">contenttypes</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> ContentType
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Book<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    The details of a Book
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: #808080; font-style: italic;"># fields that describe this book</span>
    name        = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>_<span style="color: black;">&#40;</span><span style="color: #483d8b;">'name'</span><span style="color: black;">&#41;</span>, max_length=<span style="color: #ff4500;">48</span><span style="color: black;">&#41;</span>
    description = models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span>_<span style="color: black;">&#40;</span><span style="color: #483d8b;">'description'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># to add to any model</span>
    content_type   = models.<span style="color: black;">ForeignKey</span><span style="color: black;">&#40;</span>ContentType<span style="color: black;">&#41;</span>
    object_id      = models.<span style="color: black;">PositiveIntegerField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    content_object = generic.<span style="color: black;">GenericForeignKey</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'content_type'</span>,
        <span style="color: #483d8b;">'object_id'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># for the list of tags for this book</span>
    tags        = TagField<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># misc fields</span>
    deleted     = models.<span style="color: black;">BooleanField</span><span style="color: black;">&#40;</span>default=<span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
    created     = models.<span style="color: black;">DateTimeField</span><span style="color: black;">&#40;</span>auto_now_add=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    <span style="color: #808080; font-style: italic;"># so that {{book.get_absolute_url}} outputs the whole url</span>
    @models.<span style="color: black;">permalink</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> get_absolute_url<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;book_details&quot;</span>, <span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">pk</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    <span style="color: #808080; font-style: italic;"># outputs name when printing this object as a string</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">name</span></pre></div></div>

<h3>forms.py</h3>
<p>Use Django&#8217;s ModelForm to create a form for our book model.</p>

<div class="wp_syntax"><div class="code"><pre class="python"><span style="color: #ff7700;font-weight:bold;">from</span> django <span style="color: #ff7700;font-weight:bold;">import</span> forms
<span style="color: #ff7700;font-weight:bold;">from</span> books.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Book
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> NewBookForm<span style="color: black;">&#40;</span>forms.<span style="color: black;">ModelForm</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">class</span> Meta:
        model = Book
        exclude = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'deleted'</span>, <span style="color: #483d8b;">'content_type'</span>,
            <span style="color: #483d8b;">'object_id'</span>, <span style="color: #483d8b;">'created'</span><span style="color: black;">&#41;</span></pre></div></div>

<h3>views.py</h3>
<p>In this file we create a view to show the details of a book and a view to create a new book for an object.</p>

<div class="wp_syntax"><div class="code"><pre class="python"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">shortcuts</span> <span style="color: #ff7700;font-weight:bold;">import</span> render_to_response
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">shortcuts</span> <span style="color: #ff7700;font-weight:bold;">import</span> get_object_or_404
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">http</span> <span style="color: #ff7700;font-weight:bold;">import</span> HttpResponseRedirect
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span> <span style="color: #ff7700;font-weight:bold;">import</span> RequestContext
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">core</span>.<span style="color: black;">urlresolvers</span> <span style="color: #ff7700;font-weight:bold;">import</span> reverse
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">utils</span>.<span style="color: black;">translation</span> <span style="color: #ff7700;font-weight:bold;">import</span> ugettext_lazy as _
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">decorators</span> <span style="color: #ff7700;font-weight:bold;">import</span> login_required
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> tribes.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Tribe
<span style="color: #ff7700;font-weight:bold;">from</span> books.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Book
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">contenttypes</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> ContentType
&nbsp;
@login_required
<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span>request, content_type_id, object_id,
            template_name=<span style="color: #483d8b;">&quot;books/new.html&quot;</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    creates a new book
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">from</span> books.<span style="color: black;">forms</span> <span style="color: #ff7700;font-weight:bold;">import</span> NewBookForm
&nbsp;
    <span style="color: #808080; font-style: italic;"># if a new book was posted</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> request.<span style="color: black;">method</span> == <span style="color: #483d8b;">'POST'</span>:
        book_form = NewBookForm<span style="color: black;">&#40;</span>request.<span style="color: black;">POST</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> book_form.<span style="color: black;">is_valid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #808080; font-style: italic;"># create it</span>
            book = book_form.<span style="color: black;">save</span><span style="color: black;">&#40;</span>commit=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
            content_type        = \
                ContentType.<span style="color: black;">objects</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span>=content_type_id<span style="color: black;">&#41;</span>
            content_object      = \
                content_type.<span style="color: black;">get_object_for_this_type</span><span style="color: black;">&#40;</span>
                <span style="color: #008000;">id</span>=object_id<span style="color: black;">&#41;</span>
            book.<span style="color: black;">content_object</span> = content_object
            book.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            request.<span style="color: #dc143c;">user</span>.<span style="color: black;">message_set</span>.<span style="color: black;">create</span><span style="color: black;">&#40;</span>
                message=
                _<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Successfully created book '%s'&quot;</span><span style="color: black;">&#41;</span>
                <span style="color: #66cc66;">%</span> book.<span style="color: black;">name</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># send to object page or book page</span>
            <span style="color: #ff7700;font-weight:bold;">try</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> HttpResponseRedirect<span style="color: black;">&#40;</span>
                    content_object.<span style="color: black;">get_absolute_url</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">except</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> HttpResponseRedirect<span style="color: black;">&#40;</span>reverse<span style="color: black;">&#40;</span>
                    <span style="color: #483d8b;">'book_details'</span>, args=<span style="color: black;">&#40;</span>book.<span style="color: #008000;">id</span>,<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># if invalid, it gets displayed below</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        book_form = NewBookForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span>template_name, <span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'book_form'</span>: book_form,
    <span style="color: black;">&#125;</span>, context_instance=RequestContext<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
@login_required
<span style="color: #ff7700;font-weight:bold;">def</span> details<span style="color: black;">&#40;</span>request, book_id,
    template_name=<span style="color: #483d8b;">&quot;books/details.html&quot;</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    displays details of a book
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    book = get_object_or_404<span style="color: black;">&#40;</span>Book, <span style="color: #008000;">id</span>=book_id<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span>template_name, <span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'book'</span>: book,
    <span style="color: black;">&#125;</span>, context_instance=RequestContext<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<h3>urls.py</h3>
<p>To tie our views to some urls, add this to the urls.py file.</p>

<div class="wp_syntax"><div class="code"><pre class="python"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">conf</span>.<span style="color: black;">urls</span>.<span style="color: black;">defaults</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">conf</span>.<span style="color: black;">urls</span>.<span style="color: black;">defaults</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
&nbsp;
urlpatterns = patterns<span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>,    
    <span style="color: #808080; font-style: italic;"># new book for object</span>
    url<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^new/(?P&lt;content_type_id&gt;<span style="color: #000099; font-weight: bold;">\d</span>+)/(?P&lt;object_id&gt;<span style="color: #000099; font-weight: bold;">\d</span>+)'</span>, 
        <span style="color: #483d8b;">'books.views.new'</span>, name=<span style="color: #483d8b;">&quot;new_book&quot;</span><span style="color: black;">&#41;</span>,
    <span style="color: #808080; font-style: italic;"># display details of a book</span>
    url<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^details/(?P&lt;book_id&gt;<span style="color: #000099; font-weight: bold;">\d</span>+)$'</span>, <span style="color: #483d8b;">'books.views.details'</span>, 
        name=<span style="color: #483d8b;">&quot;book_details&quot;</span><span style="color: black;">&#41;</span>,
<span style="color: black;">&#41;</span></pre></div></div>

<h3>More Features</h3>
<p>The rest of the application is described in the post titled: 
<a  href="http://codespatter.com/2009/01/22/how-to-write-django-template-tags/">How to Write Django Template Tags</a>. You can also check out all of the code from the 
<a  href="http://django-books.googlecode.com" onclick="javascript:pageTracker._trackPageview('/external/django-books.googlecode.com');" >google project</a> by doing the following command:</p>
<p>svn co http://django-books.googlecode.com/svn/trunk books</p>
<p>in a directory on the python path.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fcodespatter.com%2F2009%2F01%2F15%2Fhow-to-write-reusable-apps-for-pinax-and-django%2F';
  addthis_title  = 'How+to+Write+Reusable+Apps+for+Pinax+and+Django';
  addthis_pub    = 'gallard';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>


<p>Related posts:</p><ol><li><a href='http://codespatter.com/2009/01/22/how-to-write-django-template-tags/' rel='bookmark' title='Permanent Link: How to Write Django Template Tags'>How to Write Django Template Tags</a> <small>Template tags can be useful for making your applications more...</small></li><li><a href='http://codespatter.com/2009/04/10/how-to-add-locations-to-python-path-for-reusable-django-apps/' rel='bookmark' title='Permanent Link: How to Add Locations to Python Path for Reusable Django Apps'>How to Add Locations to Python Path for Reusable Django Apps</a> <small>In my previous post I talk about reusable apps, but...</small></li><li><a href='http://codespatter.com/2009/09/02/how-to-display-realtime-traffic-analytics/' rel='bookmark' title='Permanent Link: How to Display Realtime Traffic Analytics'>How to Display Realtime Traffic Analytics</a> <small>Users of Presskit&#8217;n have been asking for traffic statistics on...</small></li></ol>]]></content:encoded>
			<wfw:commentRss>http://codespatter.com/2009/01/15/how-to-write-reusable-apps-for-pinax-and-django/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>OpenID vs OAuth</title>
		<link>http://codespatter.com/2008/04/15/openid-vs-oauth/</link>
		<comments>http://codespatter.com/2008/04/15/openid-vs-oauth/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 21:07:27 +0000</pubDate>
		<dc:creator>Greg Allard</dc:creator>
				<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[TinyID]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://codespatter.com/?p=34</guid>
		<description><![CDATA[After attending the recent 
BarCamp, I realized how much talent the Orlando community has. Central Florida seems to be booming with web developers and start-ups. There was one such company that did about 3.5 presentations on the first day (I missed out on the second day). The .5 part was what interested me most. It [...]


Related posts:<ol><li><a href='http://codespatter.com/2007/08/10/openid-enabled/' rel='bookmark' title='Permanent Link: OpenID Enabled'>OpenID Enabled</a> <small>If you haven’t stumbled upon any sites that use OpenID...</small></li><li><a href='http://codespatter.com/2007/10/02/secure-your-openid/' rel='bookmark' title='Permanent Link: Secure Your OpenID'>Secure Your OpenID</a> <small>There are a lot of phishing vulnerabilities with OpenID: see...</small></li><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>After attending the recent 
<a  href="http://barcamporlando.org" onclick="javascript:pageTracker._trackPageview('/external/barcamporlando.org');" >BarCamp</a>, I realized how much talent the Orlando community has. Central Florida seems to be booming with web developers and start-ups. There was one such company that did about 3.5 presentations on the first day (I missed out on the second day). The .5 part was what interested me most. It was titled &#8220;
<a  href="http://b.lesseverything.com/2008/4/8/at-barcamp-orlando" onclick="javascript:pageTracker._trackPageview('/external/b.lesseverything.com/2008/4/8/at-barcamp-orlando');" >Fuck OpenID</a>&#8220;. Which I was definitely interested in since 
<a  href="http://jasonbuckner.com/" onclick="javascript:pageTracker._trackPageview('/external/jasonbuckner.com/');" >Jason Buckner</a> and I did a presentation at the previous BarCamp about OpenID, and threw in a quick plug for 
<a  href="http://tinyid.us" onclick="javascript:pageTracker._trackPageview('/external/tinyid.us');" >TinyID.us</a>.</p>
<p><span id="more-34"></span></p>
<p>Their main point as a downside was usability. Which I can agree isn&#8217;t perfect, but I don&#8217;t see their solution as any better since the same thing can be achieved by OpenID. They suggested using 
<a  href="http://oauth.net" onclick="javascript:pageTracker._trackPageview('/external/oauth.net');" >OAuth</a> with Google and directing your users towards a Google page that will authenticate you and send you back. OpenID enabled sites can do something similar. Since many people already use AIM, Yahoo, or LiveJournal, you can provide your users with a list they can choose from. A great example of this is 
<a  href="https://pibb.com/signin" onclick="javascript:pageTracker._trackPageview('/external/pibb.com/signin');" >Pibb</a>&#8217;s sign in page where they populate the login field for you so you only need to type your username.</p>
<p>At the time of the presentation there wasn&#8217;t a Google OpenID provider, but after Google launched the beta of their 
<a  href="http://code.google.com/appengine/" onclick="javascript:pageTracker._trackPageview('/external/code.google.com/appengine/');" >app engine</a>, 
<a  href="http://openid-provider.appspot.com/" onclick="javascript:pageTracker._trackPageview('/external/openid-provider.appspot.com/');" >someone made one</a>.</p>
<p>Hopefully browsers will begin to start implementing OpenID support (so I don&#8217;t have to use 
<a  href="https://pip.verisignlabs.com/seatbelt.do" onclick="javascript:pageTracker._trackPageview('/external/pip.verisignlabs.com/seatbelt.do');" >VeriSign&#8217;s SeatBelt</a>) to help with the usability challenge and phishing vulnerabilities, but for that to happen, I think more websites need to be supporting OpenID as a log in option. Also, more websites need to take the Pibb route with having it as the only option and making it easy, instead of hiding it behind a normal login page.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fcodespatter.com%2F2008%2F04%2F15%2Fopenid-vs-oauth%2F';
  addthis_title  = 'OpenID+vs+OAuth';
  addthis_pub    = 'gallard';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>


<p>Related posts:</p><ol><li><a href='http://codespatter.com/2007/08/10/openid-enabled/' rel='bookmark' title='Permanent Link: OpenID Enabled'>OpenID Enabled</a> <small>If you haven’t stumbled upon any sites that use OpenID...</small></li><li><a href='http://codespatter.com/2007/10/02/secure-your-openid/' rel='bookmark' title='Permanent Link: Secure Your OpenID'>Secure Your OpenID</a> <small>There are a lot of phishing vulnerabilities with OpenID: see...</small></li><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li></ol>]]></content:encoded>
			<wfw:commentRss>http://codespatter.com/2008/04/15/openid-vs-oauth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Stuff</title>
		<link>http://codespatter.com/2008/01/17/new-stuff/</link>
		<comments>http://codespatter.com/2008/01/17/new-stuff/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 04:33:44 +0000</pubDate>
		<dc:creator>Greg Allard</dc:creator>
				<category><![CDATA[OpenID]]></category>

		<guid isPermaLink="false">http://codespatter.com/?p=3</guid>
		<description><![CDATA[I installed WordPress since I didn&#8217;t have enough time to commit to making 
MorfU as awesome as I would like. The old Code Spatter layout was also getting stale, so I found some fresh WordPress skins that were listed on 
this list of 100.
I copied all of the old posts into here and made sure [...]


Related posts:<ol><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li><li><a href='http://codespatter.com/2007/08/10/openid-enabled/' rel='bookmark' title='Permanent Link: OpenID Enabled'>OpenID Enabled</a> <small>If you haven’t stumbled upon any sites that use OpenID...</small></li><li><a href='http://codespatter.com/2007/10/02/secure-your-openid/' rel='bookmark' title='Permanent Link: Secure Your OpenID'>Secure Your OpenID</a> <small>There are a lot of phishing vulnerabilities with OpenID: see...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>I installed WordPress since I didn&#8217;t have enough time to commit to making 
<a  href="http://morfu.com" onclick="javascript:pageTracker._trackPageview('/external/morfu.com');" >MorfU </a>as awesome as I would like. The old Code Spatter layout was also getting stale, so I found some fresh WordPress skins that were listed on 
<a  href="http://www.smashingmagazine.com/2008/01/08/100-excellent-free-high-quality-wordpress-themes/" onclick="javascript:pageTracker._trackPageview('/external/www.smashingmagazine.com/2008/01/08/100-excellent-free-high-quality-wordpress-themes/');" >this list of 100</a>.</p>
<p>I copied all of the old posts into here and made sure the date was the proper time. The comments don&#8217;t display a date, but they would be off since I didn&#8217;t bother to make them all correct. The threadedness of the discussion was also lost, but luckily there weren&#8217;t many posts using it anyways.</p>
<p>There was an easy-to-add 
<a  href="http://wordpress.org/extend/plugins/openid/" onclick="javascript:pageTracker._trackPageview('/external/wordpress.org/extend/plugins/openid/');" >OpenID plugin</a> so everyone can still post comments easily.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fcodespatter.com%2F2008%2F01%2F17%2Fnew-stuff%2F';
  addthis_title  = 'New+Stuff';
  addthis_pub    = 'gallard';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>


<p>Related posts:</p><ol><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li><li><a href='http://codespatter.com/2007/08/10/openid-enabled/' rel='bookmark' title='Permanent Link: OpenID Enabled'>OpenID Enabled</a> <small>If you haven’t stumbled upon any sites that use OpenID...</small></li><li><a href='http://codespatter.com/2007/10/02/secure-your-openid/' rel='bookmark' title='Permanent Link: Secure Your OpenID'>Secure Your OpenID</a> <small>There are a lot of phishing vulnerabilities with OpenID: see...</small></li></ol>]]></content:encoded>
			<wfw:commentRss>http://codespatter.com/2008/01/17/new-stuff/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Secure Your OpenID</title>
		<link>http://codespatter.com/2007/10/02/secure-your-openid/</link>
		<comments>http://codespatter.com/2007/10/02/secure-your-openid/#comments</comments>
		<pubDate>Tue, 02 Oct 2007 17:25:12 +0000</pubDate>
		<dc:creator>Greg Allard</dc:creator>
				<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TinyID]]></category>

		<guid isPermaLink="false">http://codespatter.com/?p=12</guid>
		<description><![CDATA[There are a lot of phishing vulnerabilities with OpenID: see 
http://marcoslot.net/apps/openid/ if you haven&#8217;t. One awesome solution I&#8217;ve come across is using 
https://pip.verisignlabs.com/ as your OpenID provider and using their security key.
PayPal uses the security key also (and sells it for much cheaper). They send you a small device that fits on your key chain [...]


Related posts:<ol><li><a href='http://codespatter.com/2008/04/15/openid-vs-oauth/' rel='bookmark' title='Permanent Link: OpenID vs OAuth'>OpenID vs OAuth</a> <small>After attending the recent BarCamp, I realized how much talent...</small></li><li><a href='http://codespatter.com/2007/08/10/openid-enabled/' rel='bookmark' title='Permanent Link: OpenID Enabled'>OpenID Enabled</a> <small>If you haven’t stumbled upon any sites that use OpenID...</small></li><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>There are a lot of phishing vulnerabilities with OpenID: see 
<a  href="http://marcoslot.net/apps/openid/" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/marcoslot.net/apps/openid/');" >http://marcoslot.net/apps/openid/</a> if you haven&#8217;t. One awesome solution I&#8217;ve come across is using 
<a  href="https://pip.verisignlabs.com/" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/pip.verisignlabs.com/');" >https://pip.verisignlabs.com/</a> as your OpenID provider and using their security key.</p>
<p>PayPal uses the security key also (and sells it for much cheaper). They send you a small device that fits on your key chain that has a token that is updated every thirty seconds. This adds an extra layer of security to your login and will help protect your accounts from unauthorized users.</p>
<p>The same device can be used in multiple places like PayPal, eBay, and VeriSign&#8217;s OpenID provider. When you use it for your VeriSign OpenID you add that additional layer of security to all places you use that OpenID.</p>
<p>To learn more about the security key, check this out 
<a  href="https://idprotect.verisign.com/learnmoretoken.v" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/idprotect.verisign.com/learnmoretoken.v');" >https://idprotect.verisign.com/learnmoretoken.v</a></p>
<p>When logged in to PayPal, go to this link<br />

<a  href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/securitycenter/general/PPSecurityKey" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/www.paypal.com/us/cgi-bin/webscr');" >https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/securitycenter/general/PPSecurityKey</a> to order the security key for $5.</p>
<p>When the device arrives, log in to your VeriSign provider and go to 
<a  href="https://pip.verisignlabs.com/managevipcred.do" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/pip.verisignlabs.com/managevipcred.do');" >https://pip.verisignlabs.com/managevipcred.do</a> to add it to your VeriSign OpenID.</p>
<p>Since the URI given by them is quite long, it might be useful to use a website to shorten that to a smaller id. Signing in to 
<a  href="http://tinyid.us" onclick="javascript:pageTracker._trackPageview('/external/tinyid.us');" >tinyid.us</a> will create a user on that site that will redirect to your other OpenID.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fcodespatter.com%2F2007%2F10%2F02%2Fsecure-your-openid%2F';
  addthis_title  = 'Secure+Your+OpenID';
  addthis_pub    = 'gallard';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>


<p>Related posts:</p><ol><li><a href='http://codespatter.com/2008/04/15/openid-vs-oauth/' rel='bookmark' title='Permanent Link: OpenID vs OAuth'>OpenID vs OAuth</a> <small>After attending the recent BarCamp, I realized how much talent...</small></li><li><a href='http://codespatter.com/2007/08/10/openid-enabled/' rel='bookmark' title='Permanent Link: OpenID Enabled'>OpenID Enabled</a> <small>If you haven’t stumbled upon any sites that use OpenID...</small></li><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li></ol>]]></content:encoded>
			<wfw:commentRss>http://codespatter.com/2007/10/02/secure-your-openid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenID Enabled</title>
		<link>http://codespatter.com/2007/08/10/openid-enabled/</link>
		<comments>http://codespatter.com/2007/08/10/openid-enabled/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 21:45:46 +0000</pubDate>
		<dc:creator>Greg Allard</dc:creator>
				<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[TinyID]]></category>

		<guid isPermaLink="false">http://codespatter.com/?p=10</guid>
		<description><![CDATA[If you haven’t stumbled upon any sites that use OpenID yet, I’ll fill you in on why you might be seeing it in more places soon. OpenID is a decentralized, single sign on system which allows visitors to use one set of credentials for multiple websites. And, since it&#8217;s decentralized, there are many providers to [...]


Related posts:<ol><li><a href='http://codespatter.com/2008/04/15/openid-vs-oauth/' rel='bookmark' title='Permanent Link: OpenID vs OAuth'>OpenID vs OAuth</a> <small>After attending the recent BarCamp, I realized how much talent...</small></li><li><a href='http://codespatter.com/2007/10/02/secure-your-openid/' rel='bookmark' title='Permanent Link: Secure Your OpenID'>Secure Your OpenID</a> <small>There are a lot of phishing vulnerabilities with OpenID: see...</small></li><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>If you haven’t stumbled upon any sites that use OpenID yet, I’ll fill you in on why you might be seeing it in more places soon. OpenID is a decentralized, single sign on system which allows visitors to use one set of credentials for multiple websites. And, since it&#8217;s decentralized, there are many providers to choose from.</p>
<p>This is a benefit for visitors as well as developers. It allows users to gain access to more websites without having to remember or create usernames and passwords. It helps developers by removing the requirements to authenticate usernames and passwords of users.</p>
<p>Once you sign up for an OpenID at a provider like 
<a  href="http://myopenid.com/" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/myopenid.com/');" >http://myopenid.com</a> you will use a URL (this URL is your OpenID) on websites that allow OpenID authentication. The application will redirect you to your provider so you can sign in there. The provider will then ask if you wish to authenticate to the requesting website. When you select <em>allow once</em> or <em>allow forever</em>, you will be redirected back to the requesting website.</p>
<p>If you want to <strong>try it now</strong>, get an OpenID from 
<a  href="http://myopenid.com/" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/myopenid.com/');" >http://myopenid.com</a> , sign in here, and post a comment on this article.</p>
<p>If you are interested in reducing the length of your OpenID, you can check out 
<a  href="http://tinyid.us/" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/tinyid.us/');" >http://tinyid.us</a> for a shorter ID.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fcodespatter.com%2F2007%2F08%2F10%2Fopenid-enabled%2F';
  addthis_title  = 'OpenID+Enabled';
  addthis_pub    = 'gallard';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>


<p>Related posts:</p><ol><li><a href='http://codespatter.com/2008/04/15/openid-vs-oauth/' rel='bookmark' title='Permanent Link: OpenID vs OAuth'>OpenID vs OAuth</a> <small>After attending the recent BarCamp, I realized how much talent...</small></li><li><a href='http://codespatter.com/2007/10/02/secure-your-openid/' rel='bookmark' title='Permanent Link: Secure Your OpenID'>Secure Your OpenID</a> <small>There are a lot of phishing vulnerabilities with OpenID: see...</small></li><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li></ol>]]></content:encoded>
			<wfw:commentRss>http://codespatter.com/2007/08/10/openid-enabled/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More CyTE Improvements</title>
		<link>http://codespatter.com/2007/08/10/more-cyte-improvements/</link>
		<comments>http://codespatter.com/2007/08/10/more-cyte-improvements/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 19:08:43 +0000</pubDate>
		<dc:creator>Greg Allard</dc:creator>
				<category><![CDATA[CyTE]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[CURL]]></category>
		<category><![CDATA[GMP]]></category>
		<category><![CDATA[LDAP]]></category>
		<category><![CDATA[TinyID]]></category>

		<guid isPermaLink="false">http://codespatter.com/?p=15</guid>
		<description><![CDATA[In addition to the changes listed at 
http://dev.cyproject.net/ , I will be modifying the OpenID authorization to be more usable.
The OpenID stuff packaged in the last release was just copied from 
http://tinyid.us when I was writing it for that.
I will add another auth_routine that doesn&#8217;t require a database and will just use sessions like the [...]


Related posts:<ol><li><a href='http://codespatter.com/2007/07/30/cyte-g7-to-cyte-g8-change-log/' rel='bookmark' title='Permanent Link: CyTE g7 to CyTE g8 Change Log'>CyTE g7 to CyTE g8 Change Log</a> <small>General Changes Error reporting is no longer set to E_ALL...</small></li><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li><li><a href='http://codespatter.com/2007/07/30/cyte-g8-available/' rel='bookmark' title='Permanent Link: CyTE g8 Available'>CyTE g8 Available</a> <small>CyTE g8 is now available for download. See http://cyte.googlecode.com for...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>In addition to the changes listed at 
<a  href="http://dev.cyproject.net/" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/dev.cyproject.net/');" >http://dev.cyproject.net/</a> , I will be modifying the OpenID authorization to be more usable.<br />
The OpenID stuff packaged in the last release was just copied from 
<a  href="http://tinyid.us/" target="_blank" onclick="javascript:pageTracker._trackPageview('/external/tinyid.us/');" >http://tinyid.us</a> when I was writing it for that.</p>
<p>I will add another auth_routine that doesn&#8217;t require a database and will just use sessions like the ldap version without the database. To follow the naming trend that I used for the ldap routines, I will rename the current one to <strong>openid_with_db</strong> and the new one will be named <strong>openid</strong>.</p>
<p>I will also set up a working example of using openid out of the box.</p>
<h3><strong>Limitations</strong></h3>
<p>I should probably note somewhere that this won&#8217;t work on all servers out of the box. I&#8217;ll list a few server requirements here and maybe include a readme.</p>
<ul>
<li>Enable either the <strong>GMP</strong> extension or Bcmath extension. (GMP is STRONGLY recommended because it&#8217;s MUCH faster!)</li>
<li>Enable the <strong>CURL</strong> extension.</li>
</ul>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fcodespatter.com%2F2007%2F08%2F10%2Fmore-cyte-improvements%2F';
  addthis_title  = 'More+CyTE+Improvements';
  addthis_pub    = 'gallard';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>


<p>Related posts:</p><ol><li><a href='http://codespatter.com/2007/07/30/cyte-g7-to-cyte-g8-change-log/' rel='bookmark' title='Permanent Link: CyTE g7 to CyTE g8 Change Log'>CyTE g7 to CyTE g8 Change Log</a> <small>General Changes Error reporting is no longer set to E_ALL...</small></li><li><a href='http://codespatter.com/2007/08/07/cyte-g9-released/' rel='bookmark' title='Permanent Link: CyTE g9 Released'>CyTE g9 Released</a> <small>CyTE g9 is now available for download. See http://cyte.googlecode.com for...</small></li><li><a href='http://codespatter.com/2007/07/30/cyte-g8-available/' rel='bookmark' title='Permanent Link: CyTE g8 Available'>CyTE g8 Available</a> <small>CyTE g8 is now available for download. See http://cyte.googlecode.com for...</small></li></ol>]]></content:encoded>
			<wfw:commentRss>http://codespatter.com/2007/08/10/more-cyte-improvements/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>CyTE g9 Released</title>
		<link>http://codespatter.com/2007/08/07/cyte-g9-released/</link>
		<comments>http://codespatter.com/2007/08/07/cyte-g9-released/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 05:36:15 +0000</pubDate>
		<dc:creator>Greg Allard</dc:creator>
				<category><![CDATA[CyTE]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://codespatter.com/?p=16</guid>
		<description><![CDATA[CyTE g9 is now available for download.
See 
http://cyte.googlecode.com for all versions.
Miscellaneous Changes

Added the include_files function to the utility functions. It will include all files in a directory. Used for including all files in the classes directory. (make sure dependencies are required in the class file since the order in which this function includes is &#8230; [...]


Related posts:<ol><li><a href='http://codespatter.com/2007/07/30/cyte-g7-to-cyte-g8-change-log/' rel='bookmark' title='Permanent Link: CyTE g7 to CyTE g8 Change Log'>CyTE g7 to CyTE g8 Change Log</a> <small>General Changes Error reporting is no longer set to E_ALL...</small></li><li><a href='http://codespatter.com/2007/07/30/cyte-g8-available/' rel='bookmark' title='Permanent Link: CyTE g8 Available'>CyTE g8 Available</a> <small>CyTE g8 is now available for download. See http://cyte.googlecode.com for...</small></li><li><a href='http://codespatter.com/2007/08/10/more-cyte-improvements/' rel='bookmark' title='Permanent Link: More CyTE Improvements'>More CyTE Improvements</a> <small>In addition to the changes listed at http://dev.cyproject.net/ , I...</small></li></ol>]]></description>
			<content:encoded><![CDATA[<p>CyTE g9 is now available for download.<br />
See 
<a  href="http://cyte.googlecode.com" onclick="javascript:pageTracker._trackPageview('/external/cyte.googlecode.com');" >http://cyte.googlecode.com</a> for all versions.</p>
<h3>Miscellaneous Changes</h3>
<ul>
<li>Added the include_files function to the utility functions. It will include all files in a directory. Used for including all files in the classes directory. (make sure dependencies are required in the class file since the order in which this function includes is &#8230; uhh &#8230; seemingly random.)</li>
<li>Files in /cyte/classes are now included automatically</li>
<li>Added singleton DB connection in the data_access class.</li>
<li>Added folder support in the keys folder so that keys may be organized. If there are multiple keys with the same name, the last one to be found will be used.</li>
<li>Added class_path to template conf array in config file.</li>
</ul>
<h3>OpenID Stuff Added</h3>
<ul>
<li>Added OpenID auth routine</li>
<li>Added OpenID post handler that handles the initial post of the OpenID.</li>
<li>Added a way to grab an OpenID when being sent back from an OpenID provider to the abstract authorizer class.</li>
<li>Added functions to user.class.php for managing OpenID stuff.</li>
<li>Added some PEAR modules for OpenID authentication.</li>
<li>Added sample SQL for creating tables for OpenID management.</li>
</ul>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fcodespatter.com%2F2007%2F08%2F07%2Fcyte-g9-released%2F';
  addthis_title  = 'CyTE+g9+Released';
  addthis_pub    = 'gallard';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>


<p>Related posts:</p><ol><li><a href='http://codespatter.com/2007/07/30/cyte-g7-to-cyte-g8-change-log/' rel='bookmark' title='Permanent Link: CyTE g7 to CyTE g8 Change Log'>CyTE g7 to CyTE g8 Change Log</a> <small>General Changes Error reporting is no longer set to E_ALL...</small></li><li><a href='http://codespatter.com/2007/07/30/cyte-g8-available/' rel='bookmark' title='Permanent Link: CyTE g8 Available'>CyTE g8 Available</a> <small>CyTE g8 is now available for download. See http://cyte.googlecode.com for...</small></li><li><a href='http://codespatter.com/2007/08/10/more-cyte-improvements/' rel='bookmark' title='Permanent Link: More CyTE Improvements'>More CyTE Improvements</a> <small>In addition to the changes listed at http://dev.cyproject.net/ , I...</small></li></ol>]]></content:encoded>
			<wfw:commentRss>http://codespatter.com/2007/08/07/cyte-g9-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
