aurora 0.0.1 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -1,4 +1,150 @@
1
- require 'config/requirements'
2
- require 'config/hoe' # setup Hoe + all gem configuration
3
-
4
- Dir['tasks/**/*.rake'].each { |rake| load rake }
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "lib")))
2
+
3
+ %w(rubygems rake rake/clean rake/packagetask rake/gempackagetask rake/rdoctask rake/contrib/rubyforgepublisher fileutils pp).each{|dep|require dep}
4
+
5
+ include FileUtils
6
+
7
+ require 'lib/aurora'
8
+
9
+ project = {
10
+ :name => "aurora",
11
+ :version => Aurora.version,
12
+ :author => "Matt Todd",
13
+ :email => "chiology@gmail.com",
14
+ :description => "A Simple Authentication Server",
15
+ :homepath => 'http://aurora.rubyforge.org',
16
+ :bin_files => %w(aurora),
17
+ :rdoc_files => %w(lib),
18
+ :rdoc_opts => %w[
19
+ --all
20
+ --quiet
21
+ --op rdoc
22
+ --line-numbers
23
+ --inline-source
24
+ --title "Aurora\ Documentation"
25
+ --exclude "^(_darcs|test|pkg|.svn)/"
26
+ ],
27
+ :dependencies => {
28
+ 'halcyon' => '>=0.3.28'
29
+ },
30
+ :requirements => '',
31
+ :ruby_version_required => '>=1.8.6'
32
+ }
33
+
34
+ BASEDIR = File.expand_path(File.dirname(__FILE__))
35
+
36
+ spec = Gem::Specification.new do |s|
37
+ s.name = project[:name]
38
+ s.version = project[:version]
39
+ s.platform = Gem::Platform::RUBY
40
+ s.has_rdoc = true
41
+ s.extra_rdoc_files = project[:rdoc_files]
42
+ s.rdoc_options += project[:rdoc_opts]
43
+ s.summary = project[:description]
44
+ s.description = project[:description]
45
+ s.author = project[:author]
46
+ s.email = project[:email]
47
+ s.homepage = project[:homepath]
48
+ s.executables = project[:bin_files]
49
+ s.bindir = "bin"
50
+ s.require_path = "lib"
51
+ project[:dependencies].each{|dep|
52
+ s.add_dependency(dep[0], dep[1])
53
+ }
54
+ s.requirements << project[:requirements]
55
+ s.required_ruby_version = project[:ruby_version_required]
56
+ s.files = (project[:rdoc_files] + %w[Rakefile] + Dir["{test,lib}/**/*"]).uniq
57
+ end
58
+
59
+ Rake::GemPackageTask.new(spec) do |p|
60
+ p.need_zip = true
61
+ p.need_tar = true
62
+ end
63
+
64
+ desc "Package and Install aurora"
65
+ task :install do
66
+ name = "#{project[:name]}-#{project[:version]}.gem"
67
+ sh %{rake package}
68
+ sh %{sudo gem install pkg/#{name}}
69
+ end
70
+
71
+ desc "Uninstall the aurora gem"
72
+ task :uninstall => [:clean] do
73
+ sh %{sudo gem uninstall #{project[:name]}}
74
+ end
75
+
76
+ namespace 'spec' do
77
+ desc "generate spec"
78
+ task :gen do
79
+ sh "bacon -rlib/aurora -rtest/spec_helper test/**/* -s > test/SPEC"
80
+ end
81
+
82
+ desc "run rspec"
83
+ task :run do
84
+ sh "bacon -r~/lib/bacon/output -rlib/aurora -rtest/spec_helper test/**/* -o CTestUnit"
85
+ end
86
+
87
+ desc "run rspec verbosely"
88
+ task :verb do
89
+ sh "bacon -r~/lib/bacon/output -rlib/aurora -rtest/spec_helper test/**/* -o CSpecDox"
90
+ end
91
+ end
92
+
93
+ desc "Do predistribution stuff"
94
+ task :predist => [:chmod, :changelog, :manifest, :rdoc]
95
+
96
+ def manifest
97
+ require 'find'
98
+ paths = []
99
+ manifest = File.new('MANIFEST', 'w+')
100
+ Find.find('.') do |path|
101
+ path.gsub!(/\A\.\//, '')
102
+ next if path =~ /(\.svn|doc|pkg|^\.|MANIFEST)/
103
+ paths << path
104
+ end
105
+ paths.sort.each do |path|
106
+ manifest.puts path
107
+ end
108
+ manifest.close
109
+ end
110
+
111
+ desc "Make binaries executable"
112
+ task :chmod do
113
+ Dir["bin/*"].each { |binary| File.chmod(0775, binary) }
114
+ Dir["test/cgi/test*"].each { |binary| File.chmod(0775, binary) }
115
+ end
116
+
117
+ desc "Generate a MANIFEST"
118
+ task :manifest do
119
+ manifest
120
+ end
121
+
122
+ desc "Generate a CHANGELOG"
123
+ task :changelog do
124
+ sh "svn log > CHANGELOG"
125
+ end
126
+
127
+ desc "Generate RDoc documentation"
128
+ Rake::RDocTask.new(:rdoc) do |rdoc|
129
+ rdoc.options << '--line-numbers' << '--inline-source' <<
130
+ '--main' << 'README' <<
131
+ '--title' << 'Aurora Documentation' <<
132
+ '--charset' << 'utf-8'
133
+ rdoc.rdoc_dir = "doc"
134
+ rdoc.rdoc_files.include 'README'
135
+ rdoc.rdoc_files.include('lib/aurora.rb')
136
+ rdoc.rdoc_files.include('lib/aurora/*.rb')
137
+ rdoc.rdoc_files.include('lib/aurora/*/*.rb')
138
+ end
139
+
140
+ task :pushsite => [:rdoc] do
141
+ sh "rsync -avz doc/ mtodd@aurora.rubyforge.org:/var/www/gforge-projects/aurora/doc/"
142
+ sh "rsync -avz site/ mtodd@aurora.rubyforge.org:/var/www/gforge-projects/aurora/"
143
+ end
144
+
145
+ desc "find . -name \"*.rb\" | xargs wc -l | grep total"
146
+ task :loc do
147
+ sh "find . -name \"*.rb\" | xargs wc -l | grep total"
148
+ end
149
+
150
+ task :default => Rake::Task['spec:run']
@@ -0,0 +1,250 @@
1
+ #!/usr/bin/env ruby -KU
2
+ #--
3
+ # Created by Matt Todd on 2008-01-13.
4
+ # Copyright (c) 2007. All rights reserved.
5
+ #++
6
+
7
+ $:.unshift(File.join(File.dirname(__FILE__),'lib'))
8
+
9
+ #--
10
+ # dependencies
11
+ #++
12
+
13
+ %w(rubygems halcyon/server aurora/server optparse).each{|dep|require dep}
14
+
15
+ #--
16
+ # default options
17
+ #++
18
+
19
+ $debug = false
20
+ $test = false
21
+ options = Halcyon::Server::DEFAULT_OPTIONS
22
+
23
+ #--
24
+ # parse options
25
+ #++
26
+
27
+ opts = OptionParser.new("", 24, ' ') do |opts|
28
+ opts.banner << "Aurora Simple Authentication Server\n"
29
+ opts.banner << "http://aurora.rubyforge.org/\n"
30
+ opts.banner << "\n"
31
+ opts.banner << "Usage: aurora [-c config/file.yml] [options] appname\n"
32
+ opts.banner << "\n"
33
+ opts.banner << "Put -c or --config first otherwise it will overwrite higher precedence options."
34
+
35
+ opts.separator ""
36
+ opts.separator "Ruby options:"
37
+
38
+ opts.on("-d", "--debug", "set debugging flag (set $debug to true)") { $debug = true }
39
+ opts.on("-D", "--Debug", "enable verbose debugging (set $debug and $DEBUG to true)") { $debug = true; $DEBUG = true }
40
+ opts.on("-w", "--warn", "turn warnings on for your script") { $-w = true }
41
+
42
+ opts.on("-I", "--include PATH", "specify $LOAD_PATH (multiples OK)") do |path|
43
+ $:.unshift(*path.split(":"))
44
+ end
45
+
46
+ opts.on("-r", "--require LIBRARY", "require the library, before executing your script") do |library|
47
+ require library
48
+ end
49
+
50
+ opts.separator ""
51
+ opts.separator "Config file:"
52
+
53
+ opts.on("-c", "--config PATH", "load configuration (YAML) from PATH") do |conf_file|
54
+ if File.exist?(conf_file)
55
+ require 'yaml'
56
+
57
+ # load the config file
58
+ begin
59
+ conf = YAML.load_file(conf_file)
60
+ rescue Errno::EACCES => e
61
+ abort("Can't access #{conf_file}, try 'sudo #{$0}'")
62
+ end
63
+
64
+ # store config file path so SIGHUP and SIGUSR2 will reload the config in case it changes
65
+ options[:config_file] = conf_file
66
+
67
+ # parse config
68
+ case conf
69
+ when String
70
+ # config file given was just the commandline options
71
+ ARGV.replace(conf.split)
72
+ opts.parse! ARGV
73
+ when Hash
74
+ conf.symbolize_keys!
75
+ options = options.merge(conf)
76
+ when Array
77
+ # TODO (MT) support multiple servers (or at least specifying which
78
+ # server's configuration to load)
79
+ warn "Your configuration file is setup for multiple servers. This is not a supported feature yet."
80
+ warn "However, we've pulled the first server entry as this server's configuration."
81
+ # an array of server configurations
82
+ # default to the first entry since multiple server configurations isn't
83
+ # precisely worked out yet.
84
+ options = options.merge(conf[0])
85
+ else
86
+ abort "Config file in an unsupported format. Config files must be YAML or the commandline flags"
87
+ end
88
+ else
89
+ abort "Config file failed to load. #{conf_file} was not found. Correct the path and try again."
90
+ end
91
+ end
92
+
93
+ opts.separator ""
94
+ opts.separator "Options:"
95
+
96
+ opts.on("-b", "--background", "process in the background (daemonize)") {$daemonize = true}
97
+
98
+ opts.on("-s", "--server SERVER", "serve using SERVER (default: #{options[:server]})") do |serv|
99
+ options[:server] = serv
100
+ end
101
+
102
+ opts.on("-o", "--host HOST", "listen on HOST (default: #{options[:host]})") do |host|
103
+ options[:host] = host
104
+ end
105
+
106
+ opts.on("-p", "--port PORT", "use PORT (default: #{options[:port]})") do |port|
107
+ options[:port] = port
108
+ end
109
+
110
+ opts.on("-l", "--logfile PATH", "log access to PATH (default: #{options[:log_file]})") do |log_file|
111
+ options[:log_file] = log_file
112
+ end
113
+
114
+ opts.on("-L", "--loglevel LEVEL", "log level (default: #{options[:log_level]})") do |log_file|
115
+ options[:log_level] = log_file
116
+ end
117
+
118
+ opts.on("-P", "--pidfile PATH", "save PID to PATH (default: #{options[:pid_file]})") do |log_file|
119
+ options[:pid_file] = log_file
120
+ end
121
+
122
+ opts.on("-e", "--env ENVIRONMENT", "use ENVIRONMENT for defaults (default: #{options[:environment]})") do |env|
123
+ options[:environment] = env
124
+ end
125
+
126
+ opts.separator ""
127
+
128
+ opts.on_tail("-h", "--help", "Show this message") do
129
+ puts opts
130
+ exit
131
+ end
132
+
133
+ opts.on_tail("-v", "--version", "Show version") do
134
+ puts "Aurora v#{Aurora.version}"
135
+ exit
136
+ end
137
+
138
+ begin
139
+ opts.parse! ARGV
140
+ rescue OptionParser::InvalidOption => e
141
+ abort "You used an unsupported option. Try: aurora -h"
142
+ end
143
+ end
144
+
145
+ abort "Aurora needs an authenticating app to run. Try: aurora -h" if ARGV.empty?
146
+ options[:app] = ARGV.shift
147
+
148
+ #--
149
+ # load app
150
+ #++
151
+
152
+ begin
153
+ # go ahead and try to require since it could be a gem
154
+ require options[:app]
155
+ rescue
156
+ if !File.exists?("#{options[:app]}.rb")
157
+ abort "Aurora did not find the app #{options[:app]}. Check your path and try again."
158
+ end
159
+ end
160
+
161
+ begin
162
+ appname = File.basename(options[:app]).capitalize.gsub(/_([a-z])/){|m|m[1].chr.capitalize}
163
+ app = Object.const_get(appname)
164
+ rescue NameError => e
165
+ abort "Unable to load #{appname}. Please ensure your server is so named."
166
+ end
167
+
168
+ #--
169
+ # prepare server
170
+ #++
171
+ begin
172
+ server = Rack::Handler.const_get(options[:server].capitalize)
173
+ rescue NameError
174
+ servers = {
175
+ 'cgi' => 'CGI',
176
+ 'fastcgi' => 'FastCGI',
177
+ 'lsws' => 'LSWS',
178
+ 'mongrel' => 'Mongrel',
179
+ 'webrick' => 'WEBrick'
180
+ }
181
+ abort "Unsupported server (missing Rack Handler). Did you mean to specify #{options[:server]}?" unless servers.key? options[:server]
182
+ server = Rack::Handler.const_get(servers[options[:server]])
183
+ end
184
+
185
+ #--
186
+ # daemonization
187
+ #++
188
+
189
+ if $daemonize
190
+ fork do
191
+ require 'daemons'
192
+ Daemonize.daemonize
193
+
194
+ #--
195
+ # prepare app environment
196
+ #++
197
+
198
+ case options[:environment]
199
+ when "development"
200
+ app = Rack::Builder.new {
201
+ use Rack::CommonLogger, STDERR unless server.name =~ /CGI/
202
+ use Rack::ShowExceptions
203
+ use Rack::Reloader
204
+ use Rack::Lint
205
+ run app.new(options)
206
+ }.to_app
207
+ when "deployment"
208
+ app = Rack::Builder.new {
209
+ use Rack::CommonLogger, STDERR unless server.name =~ /CGI/
210
+ run app.new(options)
211
+ }.to_app
212
+ else
213
+ app = app.new(options)
214
+ end
215
+
216
+ #--
217
+ # start server
218
+ #++
219
+
220
+ server.run app, :Port => options[:port]
221
+ end
222
+ end
223
+
224
+ #--
225
+ # prepare app environment
226
+ #++
227
+
228
+ case options[:environment]
229
+ when "development"
230
+ app = Rack::Builder.new {
231
+ use Rack::CommonLogger, STDERR unless server.name =~ /CGI/
232
+ use Rack::ShowExceptions
233
+ use Rack::Reloader
234
+ use Rack::Lint
235
+ run app.new(options)
236
+ }.to_app
237
+ when "deployment"
238
+ app = Rack::Builder.new {
239
+ use Rack::CommonLogger, STDERR unless server.name =~ /CGI/
240
+ run app.new(options)
241
+ }.to_app
242
+ else
243
+ app = app.new(options)
244
+ end
245
+
246
+ #--
247
+ # start server
248
+ #++
249
+
250
+ server.run app, :Port => options[:port] unless $daemonize
@@ -1,5 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Created by Matt Todd on 2007-12-14.
4
+ # Copyright (c) 2007. All rights reserved.
5
+ #++
6
+
1
7
  $:.unshift File.dirname(__FILE__)
2
8
 
9
+ #--
10
+ # module
11
+ #++
12
+
3
13
  module Aurora
4
- #
14
+ VERSION = [0,1,10]
15
+ def self.version
16
+ VERSION.join('.')
17
+ end
18
+
19
+ # = Introduction
20
+ #
21
+ # Aurora is a simple authentication server. Built on Halcyon, it is a JSON
22
+ # Web Server Framework intended to be used for fast, small data transactions,
23
+ # like for AJAX-intensive sites or for special services like authentication
24
+ # centralized for numerous web apps in the same cluster.
25
+ #
26
+ # The possibilities are pretty limitless: the goal of Aurora was simply to be
27
+ # lightweight, fast, simple to implement and use, and able to be extended.
28
+ #
29
+ # == Usage
30
+ #
31
+ # For documentation on using Aurora, check out the Aurora::Server and
32
+ # Aurora::Client classes which contain much more usage documentation.
33
+ def introduction
34
+ abort "READ THE DAMNED RDOCS!"
35
+ end
36
+
37
+ autoload :Server, 'aurora/server'
38
+ autoload :Client, 'aurora/client'
39
+
5
40
  end
@@ -1,22 +1,71 @@
1
- $:.unshift File.dirname(__FILE__)
2
-
1
+ #!/usr/bin/env ruby
3
2
  #--
4
- # Created by Matt Todd on 2007-11-10.
5
- # Copyright (c) 2007 The HUB, Clayton State University. All rights reserved.
3
+ # Created by Matt Todd on 2008-01-11.
4
+ # Copyright (c) 2008. All rights reserved.
6
5
  #++
7
6
 
7
+ $:.unshift File.dirname(File.join('..', __FILE__))
8
+ $:.unshift File.dirname(__FILE__)
9
+
8
10
  #--
9
- # Dependencies
11
+ # dependencies
10
12
  #++
11
13
 
12
- require 'rubygems'
13
- require 'uri'
14
- require 'json'
15
- require 'digest/md5'
14
+ %w(rubygems halcyon/client).each {|dep|require dep}
16
15
 
17
16
  #--
18
- # Module
17
+ # module
19
18
  #++
20
19
 
21
- require 'client/base'
22
- require 'client/token'
20
+ module Aurora
21
+
22
+ # = Aurora Client
23
+ #
24
+ # The Aurora Client makes interfacing with the Aurora server very simple and
25
+ # easy, hiding away most of the communication details while still allowing
26
+ # for a great deal of control in creating requests for the server.
27
+ class Client < Halcyon::Client::Base
28
+
29
+ attr_accessor :app
30
+
31
+ def self.version
32
+ VERSION.join('.')
33
+ end
34
+
35
+ # Initialies the Aurora client, expecting the Aurora server to connect to
36
+ # and the application to represent itself as to query permissions and such
37
+ # against. The App ID can also be used to configure default permissions for
38
+ # newly created user accounts (from fresh LDAP auths, for instance).
39
+ def initialize(uri, app)
40
+ @app = app
41
+ super uri
42
+ end
43
+
44
+ # Performs an authentication action against the current Aurora server.
45
+ #
46
+ # Expects a Hash with either a <tt>:username</tt> and <tt>:password</tt>
47
+ # pair or a single <tt>:token</tt> option. The server authentication
48
+ # method is called accordingly.
49
+ def authenticate(options = {})
50
+ user, pass = options[:username], options[:password]
51
+ token = options[:token]
52
+ if user && pass
53
+ post("/user/auth/#{user}", :password => pass)[:body] rescue false
54
+ elsif token
55
+ get("/token/auth/#{token}") rescue false
56
+ else
57
+ false
58
+ end
59
+ end
60
+
61
+ def permit?(user, permission)
62
+ get("/user/#{user}/#{@app}/permit/#{permission}")[:body]
63
+ end
64
+
65
+ def permit!(user, permission, value)
66
+ post("/user/#{user}/#{@app}/permit/#{permission}", :value => value)[:body]
67
+ end
68
+
69
+ end
70
+
71
+ end