ixtlan 0.4.0.pre3 → 0.4.0.pre4
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/lib/ixtlan/audit_rack.rb +20 -0
- data/lib/ixtlan/controllers/audits_controller.rb +23 -0
- data/lib/ixtlan/controllers/search_query.rb +7 -4
- data/lib/ixtlan/controllers/users_controller.rb +2 -1
- data/lib/ixtlan/logger_config.rb +8 -1
- data/lib/ixtlan/mailer/new_user.erb +5 -0
- data/lib/ixtlan/mailer.rb +10 -2
- data/lib/ixtlan/models/audit.rb +43 -0
- data/lib/ixtlan/models/configuration.rb +2 -0
- data/lib/ixtlan/models.rb +11 -10
- data/lib/ixtlan/rails/error_handling.rb +1 -1
- data/lib/ixtlan/rails/migrations.rb +4 -0
- data/lib/ixtlan/rails/rescue_module.rb +28 -0
- data/lib/ixtlan/user_logger.rb +7 -1
- data/lib/ixtlan/version.rb +1 -1
- metadata +9 -4
@@ -0,0 +1,20 @@
|
|
1
|
+
module Ixtlan
|
2
|
+
class AuditRack
|
3
|
+
AUDIT = Ixtlan::Models::AUDIT.nil? ? nil : Object.full_const_get(Ixtlan::Models::AUDIT)
|
4
|
+
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
result = @app.call(env)
|
11
|
+
if AUDIT
|
12
|
+
AUDIT.pop_all.each do |audit|
|
13
|
+
audit.save
|
14
|
+
end
|
15
|
+
end
|
16
|
+
result
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Ixtlan
|
2
|
+
module Controllers
|
3
|
+
module AuditsController
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.send(:include, Ixtlan::Controllers::SearchQuery)
|
7
|
+
end
|
8
|
+
|
9
|
+
public
|
10
|
+
|
11
|
+
# GET /audits
|
12
|
+
# GET /audits.xml
|
13
|
+
def index
|
14
|
+
@audits = Audit.all(query(:login, params[:query])) + Audit.all(query(:message, params[:query]))
|
15
|
+
|
16
|
+
respond_to do |format|
|
17
|
+
format.html
|
18
|
+
format.xml { render :xml => @audits }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -5,20 +5,23 @@ module Ixtlan
|
|
5
5
|
private
|
6
6
|
|
7
7
|
def simple_query(search_parameter)
|
8
|
+
query(search_parameter, params[search_parameter])
|
9
|
+
end
|
10
|
+
|
11
|
+
def query(parameter, value)
|
8
12
|
args = {}
|
9
13
|
args[:limit] = params[:limit].to_i + 1 if params[:limit]
|
10
14
|
args[:offset] = params[:offset].to_i if params[:offset]
|
11
15
|
|
12
|
-
if
|
16
|
+
if value
|
13
17
|
if "false" == params[:fuzzy]
|
14
|
-
args[
|
18
|
+
args[parameter] = value
|
15
19
|
else
|
16
|
-
args[
|
20
|
+
args[parameter.like] = "%" + value.to_s + "%"
|
17
21
|
end
|
18
22
|
end
|
19
23
|
args
|
20
24
|
end
|
21
|
-
|
22
25
|
end
|
23
26
|
end
|
24
27
|
end
|
@@ -72,7 +72,8 @@ module Ixtlan
|
|
72
72
|
format.html { redirect_to(user_url(@user.id)) }
|
73
73
|
format.xml { render :xml => @user, :status => :created, :location => user_url(@user.id) + ".xml" }
|
74
74
|
|
75
|
-
Mailer.
|
75
|
+
::Ixtlan::Mailer.deliver_new_user(@user.email, Configuration.instance.password_sender_email, @user.login, Configuration.instance.login_url)
|
76
|
+
::Ixtlan::Mailer.deliver_password(@user.email, Configuration.instance.password_sender_email, @user.password)
|
76
77
|
else
|
77
78
|
format.html { render :action => "new" }
|
78
79
|
format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
|
data/lib/ixtlan/logger_config.rb
CHANGED
@@ -46,12 +46,19 @@ module Ixtlan
|
|
46
46
|
DataMapper.logger = logger([appender,rails_appender], DataMapper)
|
47
47
|
|
48
48
|
#TODO better find out which database !!!
|
49
|
-
DataObjects
|
49
|
+
if DataObjects.const_defined?("Sqlite3")
|
50
|
+
DataObjects::Sqlite3.logger = logger([appender,rails_appender], DataObjects)
|
51
|
+
elsif DataObjects.const_defined?("Mysql")
|
52
|
+
DataObjects::Mysql.logger = logger([appender,rails_appender], DataObjects)
|
53
|
+
elsif DataObjects.const_defined?("Postgres")
|
54
|
+
DataObjects::Postgres.logger = logger([appender,rails_appender], DataObjects)
|
55
|
+
end
|
50
56
|
|
51
57
|
# configure audit logger
|
52
58
|
Ixtlan::AuditConfig.configure(Object.full_const_get(Ixtlan::Models::CONFIGURATION).instance.keep_audit_logs,
|
53
59
|
log_filebase('audit'),
|
54
60
|
[
|
61
|
+
Ixtlan::AuditConfig,
|
55
62
|
Ixtlan::Models::User,
|
56
63
|
Ixtlan::Rails::Audit,
|
57
64
|
Ixtlan::Rails::SessionTimeout,
|
data/lib/ixtlan/mailer.rb
CHANGED
@@ -3,7 +3,6 @@ module Ixtlan
|
|
3
3
|
|
4
4
|
require 'pathname'
|
5
5
|
path = Pathname(__FILE__).parent.dirname.to_s
|
6
|
-
p path
|
7
6
|
view_paths << path unless view_paths.member? path
|
8
7
|
|
9
8
|
def password(email_to, email_from, password)
|
@@ -15,8 +14,17 @@ module Ixtlan
|
|
15
14
|
@headers = {}
|
16
15
|
end
|
17
16
|
|
17
|
+
def new_user(email_to, email_from, login, url)
|
18
|
+
@subject = "details for #{url}"
|
19
|
+
@body = {:username => login, :url => url}
|
20
|
+
@recipients = email_to
|
21
|
+
@from = email_from
|
22
|
+
@sent_on = Time.now
|
23
|
+
@headers = {}
|
24
|
+
end
|
25
|
+
|
18
26
|
def error_notification(email_from, email_to, exception, error_file)
|
19
|
-
@subject = exception.
|
27
|
+
@subject = exception.message
|
20
28
|
@body = {:text => "#{error_file}"}
|
21
29
|
@recipients = email_to
|
22
30
|
@from = email_from
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'dm-serializer'
|
2
|
+
module Ixtlan
|
3
|
+
module Models
|
4
|
+
module Audit
|
5
|
+
def self.included(model)
|
6
|
+
model.send(:include, DataMapper::Resource)
|
7
|
+
|
8
|
+
model.property :id, ::DataMapper::Types::Serial
|
9
|
+
|
10
|
+
model.property :date, DateTime, :required => true
|
11
|
+
|
12
|
+
model.property :login, String, :required => true, :format => /^[a-zA-Z0-9]+$/, :length => 32, :auto_validation => false #required => true does not allow empty string :-( so skip validation
|
13
|
+
|
14
|
+
model.property :message, String, :required => true, :length => 255
|
15
|
+
|
16
|
+
model.class_eval <<-EOS, __FILE__, __LINE__
|
17
|
+
unless const_defined? "CONFIGURATION"
|
18
|
+
CONFIGURATION = Object.full_const_get(Models::CONFIGURATION)
|
19
|
+
end
|
20
|
+
def self.pop_all
|
21
|
+
result = Thread.current[:audit] || []
|
22
|
+
Thread.current[:audit] = nil
|
23
|
+
if(!@last_cleanup.nil? && @last_cleanup < 1.days.ago)
|
24
|
+
@last_cleanup = Date.today
|
25
|
+
begin
|
26
|
+
self.class.all(:date.lt => CONFIGURATION.keep_audit_log.days.ago).destroy!
|
27
|
+
rescue Error
|
28
|
+
# TODO log this !!
|
29
|
+
end
|
30
|
+
end
|
31
|
+
result
|
32
|
+
end
|
33
|
+
EOS
|
34
|
+
end
|
35
|
+
|
36
|
+
def push
|
37
|
+
list = (Thread.current[:audit] ||= [])
|
38
|
+
list << self
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -22,6 +22,8 @@ module Ixtlan
|
|
22
22
|
|
23
23
|
model.property :password_sender_email, String, :format => :email_address, :required => false, :length => 64
|
24
24
|
|
25
|
+
model.property :login_url, String, :required => false, :length => 128
|
26
|
+
|
25
27
|
model.property :notification_sender_email, String, :format => :email_address, :required => false, :length => 64
|
26
28
|
|
27
29
|
model.property :notification_recipient_emails, String, :format => Proc.new { |email| emails = email.split(','); emails.find_all { |e| e =~ DataMapper::Validate::Format::Email::EmailAddress }.size == emails.size}, :required => false, :length => 254 #honour mysql max varchar length
|
data/lib/ixtlan/models.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
module Ixtlan
|
2
2
|
module Models
|
3
|
-
AUTHENTICATION = "::
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
AUTHENTICATION = "::Authentication" unless const_defined? "AUTHENTICATION"
|
4
|
+
AUDIT = "::Audit" unless const_defined? "AUDIT"
|
5
|
+
USER = "::User" unless const_defined? "USER"
|
6
|
+
GROUP = "::Group" unless const_defined? "GROUP"
|
7
|
+
ROLE = "::Role" unless const_defined? "ROLE"
|
8
|
+
PERMISSION = "::Permission" unless const_defined? "PERMISSION"
|
9
|
+
LOCALE = "::Locale" unless const_defined? "LOCALE"
|
10
|
+
DOMAIN = "::Domain" unless const_defined? "DOMAIN"
|
11
|
+
CONFIGURATION = "::Configuration" unless const_defined? "CONFIGURATION"
|
12
|
+
TRANSLATION = "::Translation" unless const_defined? "TRANSLATION"
|
13
|
+
TEXT = "::I18nText" unless const_defined? "TEXT"
|
13
14
|
end
|
14
15
|
end
|
@@ -90,7 +90,7 @@ module Ixtlan
|
|
90
90
|
logger = Logger.new(log_file)
|
91
91
|
|
92
92
|
dump_environment(logger, exception, controller)
|
93
|
-
Ixtlan::Mailer.deliver_error_notification(@email_from, @email_to, exception, log_file) unless (@email_to.blank? || @email_from.blank?)
|
93
|
+
::Ixtlan::Mailer.deliver_error_notification(@email_from, @email_to, exception, log_file) unless (@email_to.blank? || @email_from.blank?)
|
94
94
|
log_file
|
95
95
|
end
|
96
96
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Ixtlan
|
2
|
+
module Rails
|
3
|
+
module RescueModule
|
4
|
+
def self.included(controller)
|
5
|
+
# needs 'optimistic_persistence'
|
6
|
+
controller.rescue_from ::Ixtlan::StaleResourceError, :with => :stale_resource
|
7
|
+
|
8
|
+
# needs 'guard'
|
9
|
+
controller.rescue_from ::Ixtlan::GuardException, :with => :page_not_found
|
10
|
+
controller.rescue_from ::Ixtlan::PermissionDenied, :with => :page_not_found
|
11
|
+
|
12
|
+
# rest is standard rails or datamapper
|
13
|
+
controller.rescue_from ::DataMapper::ObjectNotFoundError, :with => :page_not_found
|
14
|
+
controller.rescue_from ::ActionController::RoutingError, :with => :page_not_found
|
15
|
+
controller.rescue_from ::ActionController::UnknownAction, :with => :page_not_found
|
16
|
+
controller.rescue_from ::ActionController::MethodNotAllowed, :with => :page_not_found
|
17
|
+
controller.rescue_from ::ActionController::NotImplemented, :with => :page_not_found
|
18
|
+
controller.rescue_from ::ActionController::InvalidAuthenticityToken, :with => :stale_resource
|
19
|
+
|
20
|
+
# have nice stacktraces in development mode
|
21
|
+
unless controller.consider_all_requests_local
|
22
|
+
controller.rescue_from ::ActionView::MissingTemplate, :with => :internal_server_error
|
23
|
+
controller.rescue_from ::ActionView::TemplateError, :with => :internal_server_error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/ixtlan/user_logger.rb
CHANGED
@@ -2,6 +2,8 @@ module Ixtlan
|
|
2
2
|
|
3
3
|
class UserLogger
|
4
4
|
|
5
|
+
AUDIT = Ixtlan::Models::AUDIT.nil? ? nil : Object.full_const_get(Ixtlan::Models::AUDIT)
|
6
|
+
|
5
7
|
def initialize(arg)
|
6
8
|
@logger = Slf4r::LoggerFacade.new(arg)
|
7
9
|
end
|
@@ -46,7 +48,11 @@ module Ixtlan
|
|
46
48
|
|
47
49
|
def log_user(user, message = nil, &block)
|
48
50
|
user ||= "???"
|
49
|
-
|
51
|
+
msg = "#{message}#{block.call if block}"
|
52
|
+
if AUDIT
|
53
|
+
AUDIT.new(:date => DateTime.now, :message => msg, :login => user).push
|
54
|
+
end
|
55
|
+
@logger.info {"[#{user}] #{msg}" }
|
50
56
|
end
|
51
57
|
end
|
52
58
|
end
|
data/lib/ixtlan/version.rb
CHANGED
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 0
|
7
7
|
- 4
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.4.0.
|
9
|
+
- pre4
|
10
|
+
version: 0.4.0.pre4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- mkristian
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-07-05 00:00:00 +05:30
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -170,6 +170,7 @@ files:
|
|
170
170
|
- lib/ixtlan/logger_config.rb
|
171
171
|
- lib/ixtlan/models.rb
|
172
172
|
- lib/ixtlan/audit_config.rb
|
173
|
+
- lib/ixtlan/audit_rack.rb
|
173
174
|
- lib/ixtlan/session.rb
|
174
175
|
- lib/ixtlan/optimistic_persistence.rb
|
175
176
|
- lib/ixtlan/mailer.rb
|
@@ -188,6 +189,7 @@ files:
|
|
188
189
|
- lib/ixtlan/models/phrase.rb
|
189
190
|
- lib/ixtlan/models/update_children.rb
|
190
191
|
- lib/ixtlan/models/translation.rb
|
192
|
+
- lib/ixtlan/models/audit.rb
|
191
193
|
- lib/ixtlan/models/user.rb
|
192
194
|
- lib/ixtlan/models/permission.rb
|
193
195
|
- lib/ixtlan/models/locale.rb
|
@@ -206,13 +208,16 @@ files:
|
|
206
208
|
- lib/ixtlan/controllers/texts_controller.rb
|
207
209
|
- lib/ixtlan/controllers/locales_controller.rb
|
208
210
|
- lib/ixtlan/controllers/word_bundles_controller.rb
|
211
|
+
- lib/ixtlan/controllers/audits_controller.rb
|
209
212
|
- lib/ixtlan/controllers/search_query.rb
|
210
213
|
- lib/ixtlan/controllers/authentications_controller.rb
|
211
214
|
- lib/ixtlan/controllers/domains_controller.rb
|
212
215
|
- lib/ixtlan/controllers/users_controller.rb
|
216
|
+
- lib/ixtlan/mailer/new_user.erb
|
213
217
|
- lib/ixtlan/mailer/error_notification.erb
|
214
218
|
- lib/ixtlan/mailer/password.erb
|
215
219
|
- lib/ixtlan/rails/timestamps_modified_by_filter.rb
|
220
|
+
- lib/ixtlan/rails/rescue_module.rb
|
216
221
|
- lib/ixtlan/rails/audit.rb
|
217
222
|
- lib/ixtlan/rails/error_handling.rb
|
218
223
|
- lib/ixtlan/rails/migrations.rb
|
@@ -283,7 +288,7 @@ rubyforge_project:
|
|
283
288
|
rubygems_version: 1.3.6
|
284
289
|
signing_key:
|
285
290
|
specification_version: 3
|
286
|
-
summary:
|
291
|
+
summary: ixtlan plugins for rails and datamapper
|
287
292
|
test_files:
|
288
293
|
- spec/text_collection_spec.rb
|
289
294
|
- spec/optimistic_persistence_spec.rb
|