zena 0.15.2 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +20 -0
- data/CREDITS +27 -0
- data/Capfile +3 -0
- data/DEVELOPERS +46 -0
- data/History.txt +15 -0
- data/MIT-LICENSE +19 -0
- data/Rakefile +44 -0
- data/TODO +24 -0
- data/TODO_ZENA_1_0 +23 -0
- data/app/controllers/application_controller.rb +3 -0
- data/app/controllers/documents_controller.rb +22 -56
- data/app/controllers/nodes_controller.rb +42 -27
- data/app/controllers/pings_controller.rb +19 -0
- data/app/controllers/relations_controller.rb +5 -1
- data/app/controllers/sites_controller.rb +1 -46
- data/app/controllers/user_sessions_controller.rb +47 -0
- data/app/controllers/users_controller.rb +1 -0
- data/app/controllers/versions_controller.rb +25 -7
- data/app/controllers/virtual_classes_controller.rb +1 -1
- data/app/helpers/application_helper.rb +1 -1
- data/app/models/comment.rb +2 -1
- data/app/models/contact_content.rb +2 -2
- data/app/models/data_entry.rb +5 -6
- data/app/models/document.rb +14 -10
- data/app/models/document_content.rb +4 -6
- data/app/models/iformat.rb +2 -2
- data/app/models/image_content.rb +6 -9
- data/app/models/node.rb +106 -164
- data/app/models/page.rb +0 -20
- data/app/models/site.rb +42 -12
- data/app/models/template.rb +3 -8
- data/app/models/template_content.rb +2 -0
- data/app/models/text_document.rb +13 -8
- data/app/models/user.rb +47 -100
- data/app/models/user_session.rb +4 -0
- data/app/models/version.rb +1 -1
- data/app/views/comments/create.rjs +3 -3
- data/app/views/comments/edit.rjs +1 -1
- data/app/views/comments/update.rjs +1 -1
- data/app/views/nodes/_import_results.rhtml +1 -1
- data/app/views/nodes/create.rjs +3 -3
- data/app/views/templates/document_create_tabs/_file.rhtml +1 -2
- data/app/views/templates/document_create_tabs/_import.rhtml +7 -2
- data/app/views/templates/edit_tabs/_document.rhtml +1 -3
- data/app/views/templates/edit_tabs/_image.rhtml +1 -3
- data/app/views/versions/_tr.rhtml +1 -1
- data/app/views/versions/edit.rhtml +2 -26
- data/bin/zena +6 -1
- data/bricks/delayed_job/README +18 -0
- data/bricks/delayed_job/migrate/20091104191643_create_delayed_jobs_table.rb +19 -0
- data/bricks/delayed_job/misc/init.rb +8 -0
- data/bricks/delayed_job/misc/tasks.rb +2 -0
- data/bricks/math/patch/application_helper.rb +1 -1
- data/bricks/sphinx/MIT-LICENSE +19 -0
- data/bricks/sphinx/README +19 -0
- data/bricks/sphinx/lib/use_sphinx.rb +78 -0
- data/bricks/sphinx/migrate/20091102171258_add_delta_for_sphinx.rb +9 -0
- data/bricks/sphinx/misc/deploy.rb +20 -0
- data/bricks/sphinx/misc/sphinx.yml +12 -0
- data/bricks/sphinx/misc/tasks.rb +21 -0
- data/bricks/sphinx/patch/node.rb +8 -0
- data/bricks/tags/lib/has_tags.rb +5 -3
- data/bricks/tags/test/zafu/tags.yml +13 -1
- data/config/bricks.yml +35 -0
- data/config/deploy.rb +8 -1
- data/config/environment.rb +1 -1
- data/config/environments/production.rb +1 -1
- data/config/gems.yml +28 -5
- data/config/sphinx.yml +12 -0
- data/db/init/base/skins/default/Node-+popupLayout.zafu +1 -16
- data/db/migrate/20091026161708_add_persistence_token.rb +13 -0
- data/db/migrate/20091101184952_add_session_table.rb +16 -0
- data/db/migrate/20091123175137_add_single_access_token.rb +9 -0
- data/db/migrate/20091124161608_rebuild_fullpath.rb +11 -0
- data/db/schema.rb +21 -8
- data/doc/README_FOR_APP +24 -0
- data/doc/fixtures.graffle +19568 -0
- data/doc/fixtures.pdf +0 -0
- data/doc/template/LICENSE +184 -0
- data/doc/template/README +37 -0
- data/doc/template/allison.css +283 -0
- data/doc/template/allison.js +307 -0
- data/doc/template/allison.rb +260 -0
- data/doc/template/cache/BODY +588 -0
- data/doc/template/cache/CLASS_INDEX +4 -0
- data/doc/template/cache/CLASS_PAGE +1 -0
- data/doc/template/cache/FILE_INDEX +4 -0
- data/doc/template/cache/FILE_PAGE +1 -0
- data/doc/template/cache/FONTS +1 -0
- data/doc/template/cache/FR_INDEX_BODY +1 -0
- data/doc/template/cache/IMGPATH +1 -0
- data/doc/template/cache/INDEX +1 -0
- data/doc/template/cache/JAVASCRIPT +307 -0
- data/doc/template/cache/METHOD_INDEX +4 -0
- data/doc/template/cache/METHOD_LIST +1 -0
- data/doc/template/cache/SRC_PAGE +1 -0
- data/doc/template/cache/STYLE +283 -0
- data/doc/template/cache/URL +1 -0
- data/doc/zafu_changes.yml +29 -0
- data/lib/base_additions.rb +1 -1
- data/lib/bricks.rb +9 -0
- data/lib/bricks/loader.rb +86 -0
- data/lib/bricks/requirements_validation.rb +71 -0
- data/lib/tasks/zena.rake +42 -4
- data/lib/zafu/action.rb +285 -0
- data/lib/zafu/ajax.rb +93 -0
- data/lib/zafu/attributes.rb +117 -0
- data/lib/zafu/calendar.rb +159 -0
- data/lib/zafu/context.rb +330 -0
- data/lib/zafu/core/html.rb +102 -0
- data/lib/zafu/core/move_to_parser.rb +167 -0
- data/lib/zafu/dates.rb +58 -0
- data/lib/zafu/display.rb +502 -0
- data/lib/zafu/eval.rb +66 -0
- data/lib/zafu/experimental.rb +66 -0
- data/lib/zafu/i18n.rb +64 -0
- data/lib/zafu/meta.rb +25 -0
- data/lib/zafu/refactor.rb +73 -0
- data/lib/zafu/support/context.rb +265 -0
- data/lib/zafu/support/dom.rb +145 -0
- data/lib/zafu/support/erb.rb +62 -0
- data/lib/zafu/support/flow.rb +401 -0
- data/lib/zafu/support/forms.rb +461 -0
- data/lib/zafu/support/links.rb +306 -0
- data/lib/zafu_parser.rb +26 -2
- data/lib/zena.rb +34 -15
- data/lib/zena/acts/multiversion.rb +2 -2
- data/lib/zena/acts/secure.rb +41 -30
- data/lib/zena/app.rb +7 -10
- data/lib/zena/controller/test_case.rb +12 -7
- data/lib/zena/crypto_provider/initial.rb +15 -0
- data/lib/zena/db.rb +6 -1
- data/lib/zena/deploy.rb +34 -6
- data/lib/zena/deploy/logrotate_app.rhtml +9 -0
- data/lib/zena/deploy/logrotate_host.rhtml +34 -0
- data/lib/zena/deploy/template.rb +1 -9
- data/lib/zena/foxy_parser.rb +1 -1
- data/lib/zena/info.rb +3 -1
- data/lib/zena/migrator.rb +1 -1
- data/lib/zena/parser.rb +12 -4
- data/lib/zena/parser/zazen_rules.rb +6 -6
- data/lib/zena/parser/zena_rules.rb +1 -7
- data/lib/zena/routes.rb +5 -5
- data/lib/zena/test_controller.rb +7 -2
- data/lib/zena/unit/test_case.rb +6 -8
- data/lib/zena/use/ajax.rb +10 -10
- data/lib/zena/use/authlogic.rb +93 -0
- data/lib/zena/use/dyn_attributes.rb +5 -0
- data/lib/zena/use/html_tags.rb +16 -34
- data/lib/zena/use/i18n.rb +4 -1
- data/lib/zena/use/node_query_finders.rb +8 -4
- data/lib/zena/use/refactor.rb +8 -20
- data/lib/zena/use/relations.rb +1 -0
- data/lib/zena/use/rendering.rb +4 -2
- data/lib/zena/use/search.rb +52 -0
- data/lib/zena/use/test_helper.rb +27 -28
- data/lib/zena/use/upload.rb +188 -0
- data/lib/zena/use/urls.rb +16 -14
- data/lib/zena/use/zafu.rb +16 -63
- data/lib/zena/use/zazen.rb +8 -8
- data/lib/zena/view/test_case.rb +8 -4
- data/locale/en/LC_MESSAGES/zena.mo +0 -0
- data/locale/en/zena.po +3 -3
- data/public/.htaccess +40 -0
- data/public/javascripts/upload-progress.js +17 -8
- data/public/javascripts/zena.js +8 -2
- data/public/stylesheets/popup.css +1 -0
- data/script/about +3 -0
- data/script/apache_logging +25 -0
- data/script/breakpointer +3 -0
- data/script/console +3 -0
- data/script/dbconsole +3 -0
- data/script/destroy +3 -0
- data/script/generate +3 -0
- data/script/performance/benchmarker +3 -0
- data/script/performance/profiler +3 -0
- data/script/plugin +3 -0
- data/script/process/inspector +3 -0
- data/script/process/reaper +3 -0
- data/script/process/spawner +3 -0
- data/script/runner +3 -0
- data/script/server +3 -0
- data/script/set_revision +29 -0
- data/spec/controllers/versions_controller_spec.rb +11 -0
- data/test/fixtures/files/Node-test.zafu +1 -1
- data/test/functional/nodes_controller_test.rb +25 -0
- data/test/functional/pings_controller_test.rb +8 -0
- data/test/functional/user_sessions_controller_test.rb +59 -0
- data/test/functional/users_controller_test.rb +81 -19
- data/test/helpers/node_query/filters.yml +5 -0
- data/test/helpers/node_query_test.rb +3 -3
- data/test/integration/multiple_hosts_test.rb +1 -1
- data/test/integration/navigation_test.rb +1 -1
- data/test/sites/complex/users.yml +1 -1
- data/test/sites/ocean/users.yml +3 -3
- data/test/sites/zena/users.yml +5 -4
- data/test/test_zena.rb +38 -38
- data/test/unit/cached_page_test.rb +2 -2
- data/test/unit/comment_test.rb +0 -1
- data/test/unit/document_test.rb +23 -11
- data/test/unit/helpers/ping_helper_test.rb +4 -0
- data/test/unit/multiversion_test.rb +24 -16
- data/test/unit/node_test.rb +32 -93
- data/test/unit/note_test.rb +9 -0
- data/test/unit/page_test.rb +2 -2
- data/test/unit/secure_test.rb +2 -12
- data/test/unit/site_test.rb +43 -24
- data/test/unit/template_test.rb +45 -3
- data/test/unit/text_document_test.rb +4 -3
- data/test/unit/user_test.rb +13 -33
- data/test/unit/zena/db_test.rb +8 -0
- data/test/unit/zena/parser/zazen.yml +4 -4
- data/test/unit/zena/use/dates_view_methods_test.rb +2 -1
- data/test/unit/zena/use/html_tags_test.rb +12 -4
- data/test/unit/zena/use/refactor_test.rb +4 -3
- data/test/unit/zena/use/rendering_test.rb +1 -0
- data/test/unit/zena/use/upload_test.rb +76 -0
- data/test/unit/zena/use/urls_test.rb +4 -0
- data/test/unit/zena/use/zafu_test.rb +8 -0
- data/test/unit/zena/workflow/status_version_test.rb +6 -0
- data/test/unit/zena/zena_tags/ajax.yml +4 -4
- data/test/unit/zena/zena_tags/basic.yml +21 -10
- data/test/unit/zena/zena_tags/relations.yml +0 -6
- data/test/unit/zena/zena_tags/rubyless.yml +35 -0
- data/test/unit/zena/zena_tags/zazen.yml +4 -4
- data/test/unit/zena/zena_tags_test.rb +36 -4
- data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +1 -1
- data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +2 -3
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +102 -58
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
- data/vendor/TextMate/Zena.tmbundle/info.plist +2 -0
- data/zena.gemspec +2085 -0
- metadata +265 -90
- data/app/controllers/sessions_controller.rb +0 -41
- data/app/views/sites/zena_up.html.erb +0 -11
- data/config/database.yml +0 -40
- data/db/production.sqlite3 +0 -0
- data/lib/bricks/patcher.rb +0 -68
- data/lib/zena/parser/zena_tags.rb +0 -3562
- data/lib/zena/use/authentification.rb +0 -120
- data/public/images/ext/contact_pv.png +0 -0
- data/public/images/ext/other_pv.png +0 -0
- data/public/images/ext/page_pv.png +0 -0
- data/public/images/ext/page_tiny.png +0 -0
- data/public/images/ext/pdf_pv.png +0 -0
- data/public/images/ext/post_pv.png +0 -0
- data/public/images/ext/post_tiny.png +0 -0
- data/public/images/ext/project_pv.png +0 -0
- data/public/images/ext/project_tiny.png +0 -0
- data/public/images/ext/tag_pv.png +0 -0
- data/public/images/ext/zip_pv.png +0 -0
- data/tasks/ann.rake +0 -80
- data/tasks/bones.rake +0 -20
- data/tasks/gem.rake +0 -201
- data/tasks/git.rake +0 -40
- data/tasks/notes.rake +0 -27
- data/tasks/post_load.rake +0 -34
- data/tasks/rdoc.rake +0 -51
- data/tasks/rubyforge.rake +0 -55
- data/tasks/setup.rb +0 -292
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -47
- data/tasks/test.rake +0 -40
- data/tasks/zentest.rake +0 -36
- data/test/fixtures/comments.yml +0 -126
- data/test/fixtures/contact_contents.yml +0 -132
- data/test/fixtures/data_entries.yml +0 -65
- data/test/fixtures/discussions.yml +0 -48
- data/test/fixtures/document_contents.yml +0 -108
- data/test/fixtures/dyn_attributes.yml +0 -66
- data/test/fixtures/groups.yml +0 -86
- data/test/fixtures/groups_users.yml +0 -81
- data/test/fixtures/iformats.yml +0 -29
- data/test/fixtures/links.yml +0 -313
- data/test/fixtures/nodes.yml +0 -2592
- data/test/fixtures/relations.yml +0 -126
- data/test/fixtures/sites.yml +0 -58
- data/test/fixtures/template_contents.yml +0 -172
- data/test/fixtures/users.yml +0 -167
- data/test/fixtures/versions.yml +0 -1911
- data/test/fixtures/virtual_classes.yml +0 -87
- data/test/fixtures/zips.yml +0 -15
- data/test/functional/sessions_controller_test.rb +0 -73
@@ -189,7 +189,7 @@ module Zena
|
|
189
189
|
|
190
190
|
# VERSION
|
191
191
|
def version=(v)
|
192
|
-
if v.kind_of?(Version)
|
192
|
+
if v.kind_of?(Version) && !v.frozen? # TODO: remove !v.frozen? and find why this is loaded during template destroy
|
193
193
|
v.node = self
|
194
194
|
@version = v
|
195
195
|
end
|
@@ -676,7 +676,7 @@ module Zena
|
|
676
676
|
redaction_error(meth.to_s[0..-2], "could not be set (no redaction)")
|
677
677
|
return
|
678
678
|
end
|
679
|
-
|
679
|
+
|
680
680
|
case target
|
681
681
|
when 'c_'
|
682
682
|
if recipient.content_class && recipient = recipient.redaction_content
|
data/lib/zena/acts/secure.rb
CHANGED
@@ -104,7 +104,8 @@ Just doing the above will filter all result according to the logged in user.
|
|
104
104
|
# we move all before_validation on update and create here so that it is triggered before multiversion's before_validation
|
105
105
|
before_validation :secure_before_validation
|
106
106
|
|
107
|
-
validate
|
107
|
+
validate :record_must_be_secured
|
108
|
+
#validate {|r| r.errors.add(:base, 'record not secured') unless r.instance_variable_get(:@visitor)}
|
108
109
|
validate_on_update {|r| r.errors.add('site_id', 'cannot change') if r.site_id_changed? }
|
109
110
|
|
110
111
|
validate_on_create :secure_on_create
|
@@ -121,6 +122,10 @@ Just doing the above will filter all result according to the logged in user.
|
|
121
122
|
|
122
123
|
module InstanceMethods
|
123
124
|
|
125
|
+
def record_must_be_secured
|
126
|
+
errors.add(:base, 'record not secured') unless @visitor == Thread.current[:visitor]
|
127
|
+
end
|
128
|
+
|
124
129
|
# Store visitor to produce scope when needed and to retrieve correct editions.
|
125
130
|
def visitor=(visitor)
|
126
131
|
@visitor = visitor
|
@@ -276,6 +281,7 @@ Just doing the above will filter all result according to the logged in user.
|
|
276
281
|
else
|
277
282
|
errors.add(:inherit, "bad inheritance mode")
|
278
283
|
end
|
284
|
+
|
279
285
|
end
|
280
286
|
|
281
287
|
# 1. if dgroup changed from old, make sure user could do this and new group is valid
|
@@ -553,7 +559,7 @@ Just doing the above will filter all result according to the logged in user.
|
|
553
559
|
|
554
560
|
# Set current visitor
|
555
561
|
def visitor=(visitor)
|
556
|
-
|
562
|
+
Thread.current[:visitor] = visitor
|
557
563
|
end
|
558
564
|
|
559
565
|
# Secure scope for read access
|
@@ -571,17 +577,16 @@ Just doing the above will filter all result according to the logged in user.
|
|
571
577
|
end
|
572
578
|
|
573
579
|
def secure_write_scope
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
"site_id = #{visitor.site.id} AND wgroup_id IN (#{visitor.group_ids.join(',')})"
|
578
|
-
end
|
580
|
+
scope = {:nodes => {:site_id => visitor.site[:id]}}
|
581
|
+
scope[:nodes] = {:wgroup_id => visitor.group_ids} unless visitor.is_su?
|
582
|
+
scope
|
579
583
|
end
|
580
584
|
|
581
585
|
# these methods are not actions that can be called from the web !!
|
582
586
|
protected
|
583
587
|
# secure find with scope (for read/write or publish access).
|
584
588
|
def secure_with_scope(klass, node_find_scope)
|
589
|
+
|
585
590
|
if ((klass.send(:scoped_methods)[0] || {})[:create] || {})[:visitor]
|
586
591
|
# we are already in secure scope: this scope is the new 'exclusive' scope.
|
587
592
|
last_scope = klass.send(:scoped_methods).shift
|
@@ -591,21 +596,20 @@ Just doing the above will filter all result according to the logged in user.
|
|
591
596
|
find = scope[:find] ||= {}
|
592
597
|
if klass.ancestors.include?(Zena::Acts::SecureNode::InstanceMethods)
|
593
598
|
find[:conditions] = node_find_scope
|
594
|
-
elsif klass.ancestors.include?(Version)
|
595
|
-
ntbl = Node.table_name
|
596
|
-
find[:joins] =
|
599
|
+
elsif klass.ancestors.include?(::Version)
|
600
|
+
ntbl = ::Node.table_name
|
601
|
+
find[:joins] = :node
|
597
602
|
find[:readonly] = false
|
598
603
|
if node_find_scope =~ /publish_from/
|
599
604
|
# read, we need to rewrite with node's table name
|
600
605
|
find[:conditions] = secure_scope(ntbl)
|
601
606
|
else
|
602
|
-
|
603
|
-
find[:conditions] = node_find_scope.sub('site_id', "#{ntbl}.site_id")
|
607
|
+
find[:conditions] = node_find_scope
|
604
608
|
end
|
605
609
|
elsif klass.column_names.include?('site_id')
|
606
|
-
find[:conditions] =
|
607
|
-
elsif klass.ancestors.include?(Site)
|
608
|
-
find[:conditions] =
|
610
|
+
find[:conditions] = {klass.table_name => {:site_id => visitor.site[:id]}}
|
611
|
+
elsif klass.ancestors.include?(::Site)
|
612
|
+
find[:conditions] = {klass.table_name => {:id => visitor.site[:id]}}
|
609
613
|
end
|
610
614
|
|
611
615
|
# FIXME: 'with_scope' is protected now. Can we live with something cleaner like this ?
|
@@ -627,7 +631,7 @@ Just doing the above will filter all result according to the logged in user.
|
|
627
631
|
def secure_result(klass,result)
|
628
632
|
if result && result != []
|
629
633
|
if result.kind_of?(Array)
|
630
|
-
if result.first.kind_of?(Node)
|
634
|
+
if result.first.kind_of?(::Node)
|
631
635
|
id_map, ids = construct_id_map(result)
|
632
636
|
::Version.find(ids).each do |v|
|
633
637
|
if r = id_map[v.id]
|
@@ -635,7 +639,7 @@ Just doing the above will filter all result according to the logged in user.
|
|
635
639
|
end
|
636
640
|
end
|
637
641
|
end
|
638
|
-
elsif result.kind_of?(Node)
|
642
|
+
elsif result.kind_of?(::Node)
|
639
643
|
visitor.visit(result)
|
640
644
|
end
|
641
645
|
result
|
@@ -696,7 +700,9 @@ Just doing the above will filter all result according to the logged in user.
|
|
696
700
|
# * owner
|
697
701
|
# * members of +write_group+ if node is published and the current date is greater or equal to the publication date
|
698
702
|
def secure_write(obj, &block)
|
699
|
-
|
703
|
+
scope = {:nodes => {:site_id => visitor.site[:id]}}
|
704
|
+
scope[:nodes] = {:wgroup_id => visitor.group_ids} unless visitor.is_su?
|
705
|
+
secure_with_scope(obj, scope, &block)
|
700
706
|
rescue ActiveRecord::RecordNotFound
|
701
707
|
# Rails generated exceptions
|
702
708
|
# TODO: monitor how often this happens and replace the finders concerned
|
@@ -722,11 +728,13 @@ Just doing the above will filter all result according to the logged in user.
|
|
722
728
|
# * owner if +max_status+ <= red
|
723
729
|
# * owner if private
|
724
730
|
def secure_drive(obj, &block)
|
725
|
-
scope = if visitor.is_su? # super user
|
726
|
-
|
727
|
-
else
|
728
|
-
|
729
|
-
end
|
731
|
+
# scope = if visitor.is_su? # super user
|
732
|
+
# "site_id = #{visitor.site.id}"
|
733
|
+
# else
|
734
|
+
# "site_id = #{visitor.site.id} AND dgroup_id IN (#{visitor.group_ids.join(',')})"
|
735
|
+
# end
|
736
|
+
scope = { :nodes => {:site_id => visitor.site.id } }
|
737
|
+
scope[:nodes][:dgroup_id] = visitor.group_ids unless visitor.is_su?
|
730
738
|
secure_with_scope(obj, scope, &block)
|
731
739
|
rescue ActiveRecord::RecordNotFound
|
732
740
|
# Rails generated exceptions
|
@@ -742,6 +750,10 @@ Just doing the above will filter all result according to the logged in user.
|
|
742
750
|
raise ActiveRecord::RecordNotFound
|
743
751
|
end
|
744
752
|
end
|
753
|
+
|
754
|
+
def driveable?
|
755
|
+
respond_to?(:dgroup_id)
|
756
|
+
end
|
745
757
|
end
|
746
758
|
end
|
747
759
|
# This exception handles all flagrant access violations or tentatives (like suppression of _su_ user)
|
@@ -758,17 +770,16 @@ Just doing the above will filter all result according to the logged in user.
|
|
758
770
|
end
|
759
771
|
|
760
772
|
### ============== GLOBAL METHODS ACCESSIBLE TO ALL OBJECTS ============== ######
|
761
|
-
# Return the current visitor. Raise an error if the visitor is not set.
|
762
|
-
# For controllers, this method must be redefined in Application
|
763
|
-
def visitor
|
764
|
-
Thread.current.visitor
|
765
|
-
rescue NoMethodError
|
766
|
-
raise Zena::RecordNotSecured.new("Visitor not set, record not secured.")
|
767
|
-
end
|
768
773
|
|
769
774
|
# Return the current site. Raise an error if the visitor is not set.
|
770
775
|
def current_site
|
771
776
|
visitor.site
|
772
777
|
end
|
773
778
|
|
779
|
+
# Return the current visitor. Raise an error if the visitor is not set.
|
780
|
+
# For controllers, this method must be redefined in Application
|
781
|
+
def visitor
|
782
|
+
Thread.current[:visitor] || Zena::RecordNotSecured.new("Visitor not set, record not secured.")
|
783
|
+
end
|
784
|
+
|
774
785
|
|
data/lib/zena/app.rb
CHANGED
@@ -4,22 +4,17 @@ module Zena
|
|
4
4
|
def self.included(base)
|
5
5
|
base.prepend_view_path SITES_ROOT
|
6
6
|
base.class_eval do
|
7
|
-
include Zena::Use::
|
7
|
+
include Zena::Use::Authlogic::ControllerMethods
|
8
8
|
include Zena::Use::Dates::ControllerMethods
|
9
9
|
include Zena::Use::ErrorRendering::ControllerMethods
|
10
10
|
include Zena::Use::I18n::ControllerMethods
|
11
11
|
include Zena::Use::Refactor::ControllerMethods
|
12
12
|
include Zena::Use::Rendering::ControllerMethods
|
13
|
+
include Zena::Use::Upload::ControllerMethods
|
13
14
|
include Zena::Use::Urls::ControllerMethods
|
14
15
|
include Zena::Use::Zafu::ControllerMethods
|
15
16
|
|
16
|
-
|
17
|
-
before_filter :set_lang
|
18
|
-
before_filter :authorize
|
19
|
-
before_filter :check_lang
|
20
|
-
after_filter :set_encoding
|
21
|
-
layout false
|
22
|
-
|
17
|
+
helper Zena::Use::Authlogic::ViewMethods
|
23
18
|
helper Zena::Acts::Secure
|
24
19
|
helper Zena::Use::Ajax::ViewMethods
|
25
20
|
helper Zena::Use::Calendar::ViewMethods
|
@@ -30,12 +25,14 @@ module Zena
|
|
30
25
|
helper Zena::Use::NestedAttributesAlias::ViewMethods
|
31
26
|
helper Zena::Use::Refactor::ViewMethods
|
32
27
|
helper Zena::Use::Rendering::ViewMethods
|
28
|
+
helper Zena::Use::Upload::ViewMethods
|
33
29
|
helper Zena::Use::Urls::ViewMethods
|
34
30
|
helper Zena::Use::Zafu::ViewMethods
|
35
31
|
helper Zena::Use::Zazen::ViewMethods
|
32
|
+
helper_method :render_to_string
|
36
33
|
end
|
37
|
-
Bricks
|
38
|
-
Bricks
|
34
|
+
Bricks.apply_patches('application_controller.rb')
|
35
|
+
Bricks.apply_patches('application_helper.rb')
|
39
36
|
end
|
40
37
|
end
|
41
38
|
end
|
@@ -4,16 +4,21 @@ module Zena
|
|
4
4
|
include Zena::Use::Fixtures
|
5
5
|
include Zena::Use::TestHelper
|
6
6
|
include Zena::Acts::Secure
|
7
|
+
include ::Authlogic::TestCase
|
7
8
|
|
8
|
-
def
|
9
|
-
|
9
|
+
def setup
|
10
|
+
activate_authlogic
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
def login(fixture)
|
14
|
+
super
|
15
|
+
if defined?(@controller)
|
16
|
+
@controller.class_eval do
|
17
|
+
def set_visitor
|
18
|
+
# do nothing
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
17
22
|
end
|
18
23
|
|
19
24
|
def assert_css(match)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Zena
|
2
|
+
module CryptoProvider
|
3
|
+
class Initial
|
4
|
+
def self.encrypt(*tokens)
|
5
|
+
# encrypt password (old bad method: SHA1, no stretching, no per-password salt)
|
6
|
+
Digest::SHA1.hexdigest((tokens.flatten.shift || '') + PASSWORD_SALT)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.matches?(crypted_password, *tokens)
|
10
|
+
# return true if the tokens match the crypted_password
|
11
|
+
encrypt(*tokens) == crypted_password
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/zena/db.rb
CHANGED
@@ -133,9 +133,14 @@ module Zena
|
|
133
133
|
|
134
134
|
def fetch_ids(sql, attr_name='id')
|
135
135
|
connection.select_all(sql, "#{name} Load").map! do |record|
|
136
|
-
record[attr_name]
|
136
|
+
record[attr_name].to_i
|
137
137
|
end
|
138
138
|
end
|
139
|
+
|
140
|
+
def fetch_attributes(attributes, table_name, sql)
|
141
|
+
sql = "SELECT #{attributes.map{|a| connection.quote_column_name(a)}.join(',')} FROM #{table_name} WHERE #{sql}"
|
142
|
+
connection.select_all(sql)
|
143
|
+
end
|
139
144
|
|
140
145
|
def fetch_attribute(attribute, sql)
|
141
146
|
unless sql =~ /SELECT/i
|
data/lib/zena/deploy.rb
CHANGED
@@ -23,8 +23,10 @@ And yes, 'pass' is not as intuitive as 'password' but we cannot use the latter b
|
|
23
23
|
|
24
24
|
=end
|
25
25
|
require 'erb'
|
26
|
-
|
26
|
+
require File.join(File.dirname(__FILE__), 'info')
|
27
|
+
require File.join(File.dirname(__FILE__), '..', 'bricks')
|
27
28
|
|
29
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
28
30
|
set :templates, File.join(File.dirname(__FILE__), 'deploy')
|
29
31
|
self[:app_type] ||= :mongrel
|
30
32
|
self[:app_root] ||= '/var/zena/current'
|
@@ -57,7 +59,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
57
59
|
|
58
60
|
desc "set permissions to www-data"
|
59
61
|
task :set_permissions, :roles => :app do
|
60
|
-
run "chown -R www-data:www-data #{deploy_to}/current/public #{deploy_to}/current/log"
|
62
|
+
run "chown -R www-data:www-data #{deploy_to}/current/public #{deploy_to}/current/log #{deploy_to}/current/tmp"
|
61
63
|
end
|
62
64
|
|
63
65
|
"Update the currently released version of the software directly via an SCM update operation"
|
@@ -111,6 +113,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
111
113
|
run "#{in_current} rake zena:mksite HOST='#{self[:host]}' PASSWORD='#{self[:pass]}' RAILS_ENV='production' LANG='#{self[:lang] || 'en'}'"
|
112
114
|
create_vhost
|
113
115
|
create_awstats
|
116
|
+
logrotate
|
114
117
|
run "chown -R www-data:www-data #{sites_root}/#{self[:host]}"
|
115
118
|
end
|
116
119
|
|
@@ -198,7 +201,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
198
201
|
desc "Update awstats configuration file"
|
199
202
|
task :create_awstats, :roles => :web do
|
200
203
|
unless debian_host
|
201
|
-
puts "skipping debian specific
|
204
|
+
puts "skipping 'create_awstats' (debian specific)"
|
202
205
|
else
|
203
206
|
unless self[:host] && self[:pass]
|
204
207
|
puts "host or password not set (use -s host=... -s pass=...)"
|
@@ -224,6 +227,8 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
224
227
|
# create .htpasswd file
|
225
228
|
run "test ! -e #{sites_root}/#{self[:host]}/log/.awstatspw || rm #{sites_root}/#{self[:host]}/log/.awstatspw"
|
226
229
|
run "htpasswd -c -b #{sites_root}/#{self[:host]}/log/.awstatspw 'admin' '#{self[:pass]}'"
|
230
|
+
run "chmod 600 #{sites_root}/#{self[:host]}/log/.awstatspw"
|
231
|
+
run "chown www-data:www-data #{sites_root}/#{self[:host]}/log/.awstatspw"
|
227
232
|
|
228
233
|
# reload apache
|
229
234
|
apache2_reload_cmd
|
@@ -231,12 +236,27 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
231
236
|
end
|
232
237
|
end
|
233
238
|
|
234
|
-
desc "
|
235
|
-
task :
|
239
|
+
desc "Setup log rotation for a given host"
|
240
|
+
task :logrotate, :roles => :web do
|
241
|
+
unless debian_host
|
242
|
+
puts "skipping 'logrotate' (debian specific)"
|
243
|
+
else
|
244
|
+
unless self[:host]
|
245
|
+
puts "host not set (use -s host=...)"
|
246
|
+
else
|
247
|
+
# create logrotate config file
|
248
|
+
logrotate_conf = render("#{templates}/logrotate_host.rhtml", :config => self )
|
249
|
+
put(logrotate_conf, "/etc/logrotate.d/#{self[:host]}")
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
desc "Rename a site and update vhost/awstats/etc"
|
255
|
+
task :rename_site, :roles => :web do
|
236
256
|
unless self[:host] && self[:old_host] && self[:pass]
|
237
257
|
puts "host or old_host not set (use -s host=... -s pass=... -s old_host=...)"
|
238
258
|
else
|
239
|
-
run "#{in_current} rake zena:
|
259
|
+
run "#{in_current} rake zena:rename_site OLD_HOST='#{self[:old_host]}' HOST='#{self[:host]}' RAILS_ENV='production'"
|
240
260
|
old_vhosts = ["#{self[:old_host]}",
|
241
261
|
"stats.#{self[:old_host]}",
|
242
262
|
"www.#{self[:old_host]}"]
|
@@ -249,8 +269,12 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
249
269
|
awstat_conf = "/etc/awstats/awstats.#{self[:old_host]}.conf"
|
250
270
|
run "test -e#{awstat_conf} && rm #{awstat_conf} || true"
|
251
271
|
|
272
|
+
logrotate_conf = "/etc/logrotate.d/#{self[:old_host]}"
|
273
|
+
run "test -e #{logrotate_conf} && rm #{logrotate_conf} || true"
|
274
|
+
|
252
275
|
create_vhost
|
253
276
|
create_awstats
|
277
|
+
logrotate
|
254
278
|
clear_zafu
|
255
279
|
clear_cache
|
256
280
|
set_permissions
|
@@ -261,8 +285,10 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
261
285
|
task :apache2_setup, :roles => :web do
|
262
286
|
self[:ports] = (mongrel_port.to_i...(mongrel_port.to_i + mongrel_count.to_i)).to_a
|
263
287
|
httpd_conf = render("#{templates}/httpd.rhtml", :config => self)
|
288
|
+
log_rotate = render("#{templates}/logrotate_app.rhtml", :config => self)
|
264
289
|
if debian_host
|
265
290
|
put(httpd_conf, "/etc/apache2/conf.d/#{db_name}")
|
291
|
+
put(log_rotate, "/etc/logrotate.d/#{db_name}")
|
266
292
|
else
|
267
293
|
put(httpd_conf, "/etc/apache2/conf.d/#{db_name}")
|
268
294
|
end
|
@@ -374,4 +400,6 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
374
400
|
run "#{in_current} tar czf #{db_name}_data.tgz #{db_name}.sql.tgz sites_data.tgz zena_version.txt"
|
375
401
|
get_backup
|
376
402
|
end
|
403
|
+
|
404
|
+
Bricks.load_misc('deploy')
|
377
405
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<%= config[:sites_root] %>/<%= config[:host] %>/log/apache2.access.log {
|
2
|
+
weekly
|
3
|
+
missingok
|
4
|
+
rotate 52
|
5
|
+
compress
|
6
|
+
delaycompress
|
7
|
+
notifempty
|
8
|
+
create 640 www-data www-data
|
9
|
+
sharedscripts
|
10
|
+
prerotate
|
11
|
+
/usr/lib/cgi-bin/awstats.pl -update -config=<%= config[:host] %>
|
12
|
+
endscript
|
13
|
+
postrotate
|
14
|
+
if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
|
15
|
+
/etc/init.d/apache2 reload > /dev/null
|
16
|
+
fi
|
17
|
+
endscript
|
18
|
+
}
|
19
|
+
|
20
|
+
<%= config[:sites_root] %>/<%= config[:host] %>/log/apache2.error.log {
|
21
|
+
weekly
|
22
|
+
missingok
|
23
|
+
rotate 52
|
24
|
+
compress
|
25
|
+
delaycompress
|
26
|
+
notifempty
|
27
|
+
create 640 www-data www-data
|
28
|
+
sharedscripts
|
29
|
+
postrotate
|
30
|
+
if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
|
31
|
+
/etc/init.d/apache2 reload > /dev/null
|
32
|
+
fi
|
33
|
+
endscript
|
34
|
+
}
|
data/lib/zena/deploy/template.rb
CHANGED
@@ -33,12 +33,4 @@ inside('app/controllers') do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
rake 'zena:assets'
|
36
|
-
|
37
|
-
rake 'zena:migrate'
|
38
|
-
rake "zena:mksite HOST='localhost' PASSWORD='admin' LANG='en'"
|
39
|
-
inside('.') do
|
40
|
-
run 'rake zena:migrate RAILS_ENV=production'
|
41
|
-
run "rake zena:mksite HOST='localhost' PASSWORD='admin' LANG='en' RAILS_ENV=production"
|
42
|
-
run "#{Gem.win_platform? ? 'start' : 'open'} #{File.join(Zena::ROOT, 'lib/zena/deploy/start.html')}"
|
43
|
-
exec "script/server -e production -p 3211"
|
44
|
-
end
|
36
|
+
|