<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>config/.gitignore</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/CHANGELOG</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/INSTALL</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/LICENSE</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/NOTICE</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/README</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/UPGRADE</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/admin/runtests.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/README</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/active_record_openid_store/README</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/active_record_openid_store/XXX_upgrade_open_id_store.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/active_record_openid_store/init.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/active_record_openid_store/lib/association.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/active_record_openid_store/lib/nonce.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/active_record_openid_store/lib/open_id_setting.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/active_record_openid_store/lib/openid_ar_store.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/active_record_openid_store/test/store_test.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/discover</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/README</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/Rakefile</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/controllers/application.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/controllers/consumer_controller.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/controllers/login_controller.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/controllers/server_controller.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/helpers/application_helper.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/helpers/login_helper.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/helpers/server_helper.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/views/consumer/index.rhtml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/views/layouts/server.rhtml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/views/login/index.rhtml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/app/views/server/decide.rhtml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/config/boot.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/config/database.yml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/config/environment.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/config/environments/development.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/config/environments/production.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/config/environments/test.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/config/routes.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/doc/README_FOR_APP</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/404.html</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/500.html</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/dispatch.cgi</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/dispatch.fcgi</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/dispatch.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/favicon.ico</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/images/openid_login_bg.gif</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/javascripts/controls.js</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/javascripts/dragdrop.js</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/javascripts/effects.js</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/javascripts/prototype.js</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/public/robots.txt</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/about</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/breakpointer</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/console</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/destroy</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/generate</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/performance/benchmarker</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/performance/profiler</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/plugin</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/process/reaper</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/process/spawner</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/process/spinner</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/runner</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/script/server</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/test/functional/login_controller_test.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/test/functional/server_controller_test.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/examples/rails_openid/test/test_helper.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/hmac/hmac.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/hmac/sha1.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/hmac/sha2.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/association.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/consumer.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/consumer/associationmanager.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/consumer/checkid_request.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/consumer/discovery.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/consumer/discovery_manager.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/consumer/html_parse.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/consumer/idres.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/consumer/responses.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/cryptutil.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/dh.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/extension.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/extensions/ax.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/extensions/pape.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/extensions/sreg.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/extras.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/fetchers.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/kvform.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/kvpost.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/message.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/protocolerror.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/server.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/store/filesystem.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/store/interface.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/store/memory.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/store/nonce.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/trustroot.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/urinorm.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/util.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/accept.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/constants.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/discovery.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/filters.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/htmltokenizer.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/parsehtml.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/services.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/xrds.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/xri.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/lib/openid/yadis/xrires.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/accept.txt</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/dh.txt</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/example-xrds.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/linkparse.txt</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/n2b64</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test1-discover.txt</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test1-parsehtml.txt</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/openid.html</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/openid2.html</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/openid2_xrds.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/openid2_xrds_no_local_id.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/openid_1_and_2.html</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/openid_1_and_2_xrds.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/openid_1_and_2_xrds_bad_delegate.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/openid_and_yadis.html</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/openid_no_delegate.html</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/yadis_0entries.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/yadis_2_bad_local_id.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/yadis_2entries_delegate.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/yadis_2entries_idp.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/yadis_another_delegate.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/yadis_idp.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/yadis_idp_delegate.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_discover/yadis_no_delegate.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/=j3h.2007.11.14.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/README</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/delegated-20060809-r1.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/delegated-20060809-r2.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/delegated-20060809.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/no-xrd.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/not-xrds.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/prefixsometimes.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/ref.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/sometimesprefix.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/spoof1.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/spoof2.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/spoof3.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/status222.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/subsegments.xrds</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/test_xrds/valid-populated-xrds.xml</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/trustroot.txt</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/data/urinorm.txt</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/discoverdata.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_accept.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_association.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_associationmanager.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_ax.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_checkid_request.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_consumer.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_cryptutil.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_dh.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_discover.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_discovery_manager.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_extension.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_extras.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_fetchers.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_filters.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_idres.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_kvform.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_kvpost.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_linkparse.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_message.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_nonce.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_openid_yadis.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_pape.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_parsehtml.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_responses.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_server.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_sreg.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_stores.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_trustroot.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_urinorm.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_util.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_xrds.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_xri.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_xrires.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/test_yadis_discovery.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/testutil.rb</filename>
    </added>
    <added>
      <filename>vendor/ruby-openid-2.1.2/test/util.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -3,3 +3,4 @@
 *~
 *#*
 public/songs/*.mp3
+config/*</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -14,6 +14,11 @@ div#header {
 }
 div#subtitle { font-size: 18px; }
 div#wrapper { width: 100%; }
+
+div#content {padding: 0 1em; margin: 1em;}
+div#content h1 { font-size: 32px; margin: 0;}
+div#content p { padding: 0; margin: 0; margin-bottom: .25em; }
+
 ul.songs { 
     list-style-image:none;
     list-style-position:outside;</diff>
      <filename>public/assets/styles.css</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,62 @@
 #!/usr/bin/env ruby
 
 $:.unshift File.dirname(__FILE__) + &quot;/vendor&quot;
-%w(camping mime/types mp3info).each { |lib| require lib}
+%w(camping mime/types mp3info yaml openid base64).each { |lib| require lib}
+
+module Camping
+  module CookieSessions
+    def service(*a)
+      if @cookies.identity
+        blob, secure_hash = @cookies.identity.to_s.split(':', 2)
+        blob = Base64.decode64(blob)
+        data = Marshal.restore(blob)
+        data = {} unless secure_blob_hasher(blob).strip.downcase == secure_hash.strip.downcase
+      else
+        blob = ''; data = {}
+      end
+      
+      app = self.class.name.gsub(/^(\w+)::.+$/, '\1')
+      @state = (data[app] ||= Camping::H[])
+      hash_before = blob.hash
+      return super(*a)
+    ensure
+      data[app] = @state
+      blob = Marshal.dump(data)
+      unless hash_before == blob.hash
+        secure_hash = secure_blob_hasher(blob)
+        @cookies.identity = Base64.encode64(blob).gsub(&quot;\n&quot;, '').strip + ':' + secure_hash
+        @headers['Set-Cookie'] = @cookies.map { |k,v| &quot;#{k}=#{C.escape(v)}; path=#{self/&quot;/&quot;}&quot; if v != @k[k] } - [nil]
+      end
+    end
+    
+    def secure_blob_hasher(data)
+      require 'digest'
+      require 'digest/sha2'
+      Digest::SHA512::hexdigest(self.class.module_eval('@@state_secret') + data)
+    end
+  end
+end
 
 Camping.goes :Ruxtape
 
+module Ruxtape
+  include Camping::CookieSessions
+  @@state_secret = &quot;27c9436319ae7c1e760dbd344de08f82b4c7cfcf&quot;
+end
+
 module Ruxtape::Models
+  class Config
+    CONFIG_FILE = File.join(File.expand_path(File.dirname(__FILE__)), 'config', 'config.yml')
+    attr_accessor :values
+    class &lt;&lt; self
+      def setup?; return true if File.exist?(CONFIG_FILE) end
+      def load; values = YAML.load_file(CONFIG_FILE); end
+      def setup(openid)  
+        File.open(CONFIG_FILE, &quot;w&quot;) { |f| YAML.dump(openid, f) }
+      end
+    end
+  end
+
   class Song
     MP3_PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'public', 'songs')
     attr_accessor :title, :artist, :length
@@ -35,16 +86,70 @@ end
 module Ruxtape::Controllers
   class Index &lt; R '/'
     def get
-      setup = true
-      if setup
-        @songs = Song.ruxtape
-        render :index
+      if Config.setup? 
+        @songs = Song.ruxtape 
+        render(:index) 
+      else 
+        render(:setup)
+      end
+    end
+  end
+
+  class Admin &lt; R '/admin'
+    def get
+      render :admin
+    end
+  end
+
+  class Login &lt; R '/login'
+    def get
+      this_url = 'http' + URL('/login').to_s
+      unless input.finish.to_s == '1'
+        begin
+          request_state = { }
+          oid_request = OpenID::Consumer.new(request_state, nil).begin(input.openid_identifier)
+          oid_request.return_to_args['finish'] = '1'
+          @state.openid_request = Marshal.dump(request_state)
+          redirect(oid_request.redirect_url('http:' + URL('/').to_s, this_url))
+        rescue OpenID::DiscoveryFailure
+          return 'Couldn\'t find an OpenID at that address, are you sure it is one?'
+        end
       else
-        render :setup
+        request_state = Marshal.restore(@state.openid_request)
+        response = OpenID::Consumer.new(request_state, nil).complete(input, this_url)
+        @state.delete('openid_request')
+        case response.status
+        when OpenID::Consumer::SUCCESS
+          @state.identity = response.identity_url.to_s
+          return redirect(R(HomeScreen))
+        when OpenID::Consumer::FAILURE
+          'The OpenID thing doesn\'t think you really are that person, they said: ' + response.message
+        end
       end
     end
   end
 
+  class Setup &lt; R '/setup'
+    def get; Config.setup? ? render(:setup) : redirect(R(Index)); end
+
+    def post
+      unless Config.setup?
+        Config.setup(:openid =&gt; input.openid_address)
+        redirect R(Setup)
+      else
+        redirect R(Index)
+      end
+    end
+  end
+
+  class Upload &lt; R '/upload'
+    def post
+      file = input.file
+
+      redirect R(Admin)
+    end
+  end
+
   class Static &lt; R '/assets/(.+)'         
     MIME_TYPES = {'.css' =&gt; 'text/css', '.js' =&gt; 'text/javascript'}
     PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'public')
@@ -65,7 +170,7 @@ end
 
 module Ruxtape::Views
   def layout
-    html do 
+    xhtml_strict do 
       head do 
         title &quot;Ruxtape&quot;
         link(:rel =&gt; 'stylesheet', :type =&gt; 'text/css',
@@ -77,9 +182,7 @@ module Ruxtape::Views
             div.title! { &quot;Ruxtape, sucka&quot;} 
             div.subtitle! {&quot;#{Ruxtape::Models::Song.ruxtape_song_count} songs, #{Ruxtape::Models::Song.ruxtape_time}&quot;}
           end
-          div.content! do 
-            self &lt;&lt; yield
-          end
+          self &lt;&lt; yield
           div.footer! do 
             a &quot;Ruxtape 0.1&quot;, :href =&gt; &quot;http://github.com/ch0wda/ruxtape&quot;
           end
@@ -103,8 +206,36 @@ module Ruxtape::Views
   end
 
   def setup
-    h1 &quot;Get Mixin'&quot;
-    p &quot;Create a password for the admin sections.&quot;
-    p &quot;TODO: a form goes here.&quot;
+    div.content! do 
+      h1 &quot;Get Mixin'&quot;
+      if Ruxtape::Models::Config.setup?
+        p { text(&quot;You're all set and ready to go. Login below&quot;) }
+        form({ :method =&gt; 'get', :action =&gt; R(Login)}) do 
+          input :type =&gt; &quot;text&quot;, :name =&gt; &quot;openid_identifier&quot;
+          input :type =&gt; &quot;submit&quot;, :value =&gt; &quot;Login OpenID&quot;
+        end
+      else
+        p &quot;Type in your OpenID address below to get started.&quot;
+        form({ :method =&gt; 'post', :action =&gt; R(Setup)}) do 
+          input :type =&gt; &quot;text&quot;, :name =&gt; &quot;openid_address&quot;
+          input :type =&gt; &quot;submit&quot;, :value =&gt; &quot;Save&quot;
+        end
+      end
+    end
+  end
+  
+  def admin
+    div.content! do 
+      h1 &quot;Switch Up Your Tape&quot;
+      hr
+      h2 &quot;Upload a New Song&quot;
+      form({ :method =&gt; 'post', :enctype =&gt; &quot;multipart/form-data&quot;, :action =&gt; R(Upload)}) do 
+        input :type =&gt; &quot;file&quot;, :name =&gt; &quot;file&quot;; br
+        input :type =&gt; &quot;submit&quot;, :value =&gt; &quot;Upload&quot;
+      end
+      hr
+      h2 &quot;Rearrange Your Mixtape Order&quot;
+      p &quot;Drag and drop to get the optimal soundz. (Saves automatically.)&quot;
+    end
   end
 end</diff>
      <filename>ruxtape.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>ade2e070820924123b4cf011aef90659aa2cca4b</id>
    </parent>
  </parents>
  <author>
    <name>Josh Schairbaum</name>
    <email>joshua.schairbaum@gmail.com</email>
  </author>
  <url>http://github.com/ch0wda/ruxtape/commit/1dd2c934da27be79cd4d149971ec4b7acdaecf99</url>
  <id>1dd2c934da27be79cd4d149971ec4b7acdaecf99</id>
  <committed-date>2008-08-27T18:18:58-07:00</committed-date>
  <authored-date>2008-08-27T18:18:58-07:00</authored-date>
  <message>adding openid support, it's busted now, but working on it.  also, started admin page</message>
  <tree>d53469077fe015cfe691dc6040a486dbcdd81ecc</tree>
  <committer>
    <name>Josh Schairbaum</name>
    <email>joshua.schairbaum@gmail.com</email>
  </committer>
</commit>
