diff options
author | Ezra Zygmuntowicz <ez@engineyard.com> | 2008-10-08 14:19:52 -0700 |
---|---|---|
committer | Ezra Zygmuntowicz <ez@engineyard.com> | 2008-10-08 14:19:52 -0700 |
commit | c5d33c1298834ce40b8fbf344f281045771b5371 (patch) | |
tree | 1f0d4c7eab1eb379b544282a7ce48052acf719a5 /chef/lib/chef/openid_registration.rb | |
parent | 3d14601aea23dee3899d097324875274da419d84 (diff) | |
download | chef-c5d33c1298834ce40b8fbf344f281045771b5371.tar.gz |
big refactor of the repo layout. move to a chef gem and a chef-server gem all with proper deps
Diffstat (limited to 'chef/lib/chef/openid_registration.rb')
-rw-r--r-- | chef/lib/chef/openid_registration.rb | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/chef/lib/chef/openid_registration.rb b/chef/lib/chef/openid_registration.rb new file mode 100644 index 0000000000..748c865097 --- /dev/null +++ b/chef/lib/chef/openid_registration.rb @@ -0,0 +1,175 @@ +# +# Author:: Adam Jacob (<adam@hjksolutions.com>) +# Copyright:: Copyright (c) 2008 HJK Solutions, LLC +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +require 'rubygems' +require 'json' + +class Chef + class OpenIDRegistration + + attr_accessor :name, :salt, :validated, :password, :couchdb_rev + + include Chef::Mixin::ParamsValidate + + DESIGN_DOCUMENT = { + "version" => 3, + "language" => "javascript", + "views" => { + "all" => { + "map" => <<-EOJS + function(doc) { + if (doc.chef_type == "openid_registration") { + emit(doc.name, doc); + } + } + EOJS + }, + "all_id" => { + "map" => <<-EOJS + function(doc) { + if (doc.chef_type == "openid_registration") { + emit(doc.name, doc.name); + } + } + EOJS + }, + "validated" => { + "map" => <<-EOJS + function(doc) { + if (doc.chef_type == "openid_registration") { + if (doc.validated == true) { + emit(doc.name, doc); + } + } + } + EOJS + }, + "unvalidated" => { + "map" => <<-EOJS + function(doc) { + if (doc.chef_type == "openid_registration") { + if (doc.validated == false) { + emit(doc.name, doc); + } + } + } + EOJS + }, + }, + } + + # Create a new Chef::OpenIDRegistration object. + def initialize() + @name = nil + @salt = nil + @password = nil + @validated = false + @couchdb_rev = nil + @couchdb = Chef::CouchDB.new + end + + def name=(n) + @name = n.gsub(/\./, '_') + end + + # Set the password for this object. + def set_password(password) + @salt = generate_salt + @password = encrypt_password(@salt, password) + end + + # Serialize this object as a hash + def to_json(*a) + attributes = Hash.new + recipes = Array.new + result = { + 'name' => @name, + 'json_class' => self.class.name, + 'salt' => @salt, + 'password' => @password, + 'validated' => @validated, + 'chef_type' => 'openid_registration', + } + result["_rev"] = @couchdb_rev if @couchdb_rev + result.to_json(*a) + end + + # Create a Chef::Node from JSON + def self.json_create(o) + me = new + me.name = o["name"] + me.salt = o["salt"] + me.password = o["password"] + me.validated = o["validated"] + me.couchdb_rev = o["_rev"] if o.has_key?("_rev") + me + end + + # List all the Chef::OpenIDRegistration objects in the CouchDB. If inflate is set to true, you will get + # the full list of all registration objects. Otherwise, you'll just get the IDs + def self.list(inflate=false) + rs = Chef::CouchDB.new.list("registrations", inflate) + if inflate + rs["rows"].collect { |r| r["value"] } + else + rs["rows"].collect { |r| r["key"] } + end + end + + # Load an OpenIDRegistration by name from CouchDB + def self.load(name) + Chef::CouchDB.new.load("openid_registration", name) + end + + # Whether or not there is an OpenID Registration with this key. + def self.has_key?(name) + Chef::CouchDB.new.has_key?("openid_registration", name) + end + + # Remove this node from the CouchDB + def destroy + @couchdb.delete("openid_registration", @name, @couchdb_rev) + end + + # Save this node to the CouchDB + def save + results = @couchdb.store("openid_registration", @name, self) + @couchdb_rev = results["rev"] + end + + # Set up our CouchDB design document + def self.create_design_document + Chef::CouchDB.new.create_design_document("registrations", DESIGN_DOCUMENT) + end + + protected + + def generate_salt + salt = Time.now.to_s + chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a + 1.upto(30) { |i| salt << chars[rand(chars.size-1)] } + salt + end + + def encrypt_password(salt, password) + Digest::SHA1.hexdigest("--#{salt}--#{password}--") + end + + end +end
\ No newline at end of file |