passenger 2.0.6 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data/DEVELOPERS.TXT +10 -4
- data/LICENSE +1 -1
- data/NEWS +0 -0
- data/Rakefile +183 -117
- data/benchmark/dispatcher.rb +5 -9
- data/bin/passenger-install-apache2-module +52 -18
- data/bin/passenger-memory-stats +67 -13
- data/bin/passenger-spawn-server +8 -4
- data/bin/passenger-status +21 -46
- data/bin/passenger-stress-test +5 -5
- data/debian/postinst +1 -1
- data/doc/ApplicationPool algorithm.txt +180 -128
- data/doc/Architectural overview.html +1 -778
- data/doc/Security of user switching support.html +1 -643
- data/doc/Users guide Apache.html +3127 -0
- data/doc/Users guide Nginx.html +1458 -0
- data/doc/Users guide.html +1404 -467
- data/doc/Users guide.txt +843 -105
- data/doc/cxxapi/ApplicationPoolServer_8h-source.html +751 -641
- data/doc/cxxapi/ApplicationPool_8h-source.html +168 -171
- data/doc/cxxapi/Application_8h-source.html +494 -394
- data/doc/cxxapi/Bucket_8h-source.html +21 -15
- data/doc/cxxapi/CachedFileStat_8h-source.html +191 -0
- data/doc/cxxapi/Configuration_8h-source.html +311 -149
- data/doc/cxxapi/DirectoryMapper_8h-source.html +309 -0
- data/doc/cxxapi/DummySpawnManager_8h-source.html +3 -4
- data/doc/cxxapi/Exceptions_8h-source.html +182 -165
- data/doc/cxxapi/FileChecker_8h-source.html +130 -0
- data/doc/cxxapi/Hooks_8h-source.html +2 -3
- data/doc/cxxapi/Logging_8h-source.html +92 -89
- data/doc/cxxapi/MessageChannel_8h-source.html +585 -477
- data/doc/cxxapi/PoolOptions_8h-source.html +305 -0
- data/doc/cxxapi/SpawnManager_8h-source.html +515 -540
- data/doc/cxxapi/StandardApplicationPool_8h-source.html +779 -679
- data/doc/cxxapi/SystemTime_8h-source.html +104 -0
- data/doc/cxxapi/Utils_8h-source.html +331 -227
- data/doc/cxxapi/annotated.html +6 -7
- data/doc/cxxapi/classClient-members.html +1 -2
- data/doc/cxxapi/classClient.html +1 -2
- data/doc/cxxapi/classHooks-members.html +5 -2
- data/doc/cxxapi/classHooks.html +112 -2
- data/doc/cxxapi/classPassenger_1_1Application-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1Application.html +8 -9
- data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +4 -4
- data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +42 -81
- data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +3 -4
- data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +3 -2
- data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +74 -3
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1BusyException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +38 -0
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +256 -0
- data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +2 -3
- data/doc/cxxapi/{classPassenger_1_1Thread-members.html → classPassenger_1_1FileChecker-members.html} +4 -5
- data/doc/cxxapi/classPassenger_1_1FileChecker.html +121 -0
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1IOException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +5 -2
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +155 -5
- data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption-members.html → classPassenger_1_1RuntimeException-members.html} +2 -3
- data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption.html → classPassenger_1_1RuntimeException.html} +10 -8
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +15 -56
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +5 -4
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +20 -81
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1SystemException.html +9 -10
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/{classboost_1_1this__thread_1_1disable__syscall__interruption-members.html → classPassenger_1_1SystemTime-members.html} +5 -3
- data/doc/cxxapi/classPassenger_1_1SystemTime.html +86 -0
- data/doc/cxxapi/classPassenger_1_1TempFile-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1TempFile.html +17 -9
- data/doc/cxxapi/definitions_8h-source.html +1 -2
- data/doc/cxxapi/files.html +6 -3
- data/doc/cxxapi/functions.html +98 -35
- data/doc/cxxapi/functions_func.html +60 -32
- data/doc/cxxapi/functions_type.html +1 -2
- data/doc/cxxapi/functions_vars.html +27 -2
- data/doc/cxxapi/graph_legend.html +1 -2
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Configuration.html +3 -4
- data/doc/cxxapi/group__Configuration.png +0 -0
- data/doc/cxxapi/group__Core.html +3 -4
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +4 -2
- data/doc/cxxapi/group__Hooks.html +1 -6
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +259 -36
- data/doc/cxxapi/hierarchy.html +6 -7
- data/doc/cxxapi/inherit__graph__0.map +1 -1
- data/doc/cxxapi/inherit__graph__0.md5 +1 -1
- data/doc/cxxapi/inherit__graph__0.png +0 -0
- data/doc/cxxapi/inherit__graph__1.map +1 -1
- data/doc/cxxapi/inherit__graph__1.md5 +1 -1
- data/doc/cxxapi/inherit__graph__1.png +0 -0
- data/doc/cxxapi/inherit__graph__10.map +1 -1
- data/doc/cxxapi/inherit__graph__10.md5 +1 -1
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +1 -1
- data/doc/cxxapi/inherit__graph__11.md5 +1 -1
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +2 -1
- data/doc/cxxapi/inherit__graph__12.md5 +1 -1
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +1 -1
- data/doc/cxxapi/inherit__graph__13.md5 +1 -1
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +1 -2
- data/doc/cxxapi/inherit__graph__14.md5 +1 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +1 -1
- data/doc/cxxapi/inherit__graph__15.md5 +1 -1
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +1 -1
- data/doc/cxxapi/inherit__graph__16.md5 +1 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__2.map +1 -1
- data/doc/cxxapi/inherit__graph__2.md5 +1 -1
- data/doc/cxxapi/inherit__graph__2.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +1 -1
- data/doc/cxxapi/inherit__graph__20.md5 +1 -1
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +1 -1
- data/doc/cxxapi/inherit__graph__21.md5 +1 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__3.map +1 -1
- data/doc/cxxapi/inherit__graph__3.md5 +1 -1
- data/doc/cxxapi/inherit__graph__3.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +1 -1
- data/doc/cxxapi/inherit__graph__4.md5 +1 -1
- data/doc/cxxapi/inherit__graph__4.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +2 -1
- data/doc/cxxapi/inherit__graph__5.md5 +1 -1
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +1 -1
- data/doc/cxxapi/inherit__graph__6.md5 +1 -1
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +1 -1
- data/doc/cxxapi/inherit__graph__7.md5 +1 -1
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +1 -1
- data/doc/cxxapi/inherit__graph__8.md5 +1 -1
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +1 -2
- data/doc/cxxapi/inherit__graph__9.md5 +1 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +30 -31
- data/doc/cxxapi/main.html +1 -2
- data/doc/cxxapi/modules.html +1 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString.html +2 -3
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +2 -3
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +49 -0
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +404 -0
- data/doc/cxxapi/tree.html +18 -20
- data/doc/images/conservative_spawning.png +0 -0
- data/doc/images/conservative_spawning.svg +248 -0
- data/doc/images/smart-lv2.png +0 -0
- data/doc/images/smart-lv2.svg +320 -0
- data/doc/rdoc/classes/ConditionVariable.html +68 -34
- data/doc/rdoc/classes/Exception.html +16 -16
- data/doc/rdoc/classes/GC.html +9 -9
- data/doc/rdoc/classes/IO.html +36 -17
- data/doc/rdoc/classes/PhusionPassenger.html +183 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +511 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer.html +285 -242
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerAlreadyStarted.html +3 -3
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerError.html +3 -3
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerNotStarted.html +3 -3
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/UnknownMessage.html +3 -3
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +598 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +140 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +247 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +138 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AppInitError.html +36 -19
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/Application.html +81 -96
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/ConsoleTextTemplate.html +18 -18
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/FrameworkInitError.html +20 -18
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/HTMLTemplate.html +18 -18
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/InitializationError.html +9 -9
- data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/MessageChannel.html +93 -92
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/NativeSupport.html +55 -25
- data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +185 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +182 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz.html +95 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +424 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +98 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +200 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +444 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +98 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +154 -0
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +408 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/UnknownError.html +13 -13
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +687 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/VersionNotFound.html +8 -8
- data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
- data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +188 -0
- data/doc/rdoc/classes/PlatformInfo.html +663 -159
- data/doc/rdoc/classes/RakeExtensions.html +4 -4
- data/doc/rdoc/classes/Signal.html +134 -0
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/DEVELOPERS_TXT.html +15 -10
- data/doc/rdoc/files/README.html +5 -7
- data/doc/rdoc/files/ext/{passenger → phusion_passenger}/native_support_c.html +2 -2
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_request_handler_rb.html +7 -9
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +120 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_server_rb.html +7 -10
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +99 -0
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +92 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/application_rb.html +6 -8
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/console_text_template_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/constants_rb.html +4 -5
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/dependencies_rb.html +6 -8
- data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +116 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/exceptions_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/html_template_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/message_channel_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/platform_info_rb.html +6 -7
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +123 -0
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +117 -0
- data/doc/rdoc/files/lib/{passenger/utils_rb.html → phusion_passenger/railz/application_spawner_rb.html} +24 -17
- data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +139 -0
- data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +118 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/simple_benchmarking_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/spawn_manager_rb.html +40 -24
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +169 -0
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +120 -0
- data/doc/rdoc/files/lib/rake/extensions_rb.html +3 -4
- data/doc/rdoc/fr_class_index.html +37 -19
- data/doc/rdoc/fr_file_index.html +25 -14
- data/doc/rdoc/fr_method_index.html +145 -74
- data/ext/apache2/Application.h +145 -44
- data/ext/apache2/ApplicationPool.h +27 -29
- data/ext/apache2/ApplicationPoolServer.h +183 -72
- data/ext/apache2/ApplicationPoolServerExecutable.cpp +249 -42
- data/ext/apache2/Bucket.cpp +61 -9
- data/ext/apache2/Bucket.h +15 -8
- data/ext/apache2/CachedFileStat.cpp +114 -0
- data/ext/apache2/CachedFileStat.h +169 -0
- data/ext/apache2/Configuration.cpp +213 -22
- data/ext/apache2/Configuration.h +176 -13
- data/ext/apache2/DirectoryMapper.h +287 -0
- data/ext/apache2/Exceptions.h +30 -12
- data/ext/apache2/FileChecker.h +108 -0
- data/ext/apache2/Hooks.cpp +709 -493
- data/ext/apache2/LICENSE-CNRI.TXT +15 -0
- data/ext/apache2/Logging.h +26 -22
- data/ext/apache2/MessageChannel.h +124 -15
- data/ext/apache2/PoolOptions.h +283 -0
- data/ext/apache2/SpawnManager.h +75 -99
- data/ext/apache2/StandardApplicationPool.h +296 -195
- data/ext/apache2/SystemTime.cpp +28 -0
- data/ext/apache2/SystemTime.h +82 -0
- data/ext/apache2/Utils.cpp +172 -18
- data/ext/apache2/Utils.h +124 -19
- data/ext/boost/cstdint.hpp +4 -2
- data/ext/boost/current_function.hpp +67 -0
- data/ext/boost/detail/sp_counted_base.hpp +4 -4
- data/ext/boost/thread/exceptions.hpp +2 -1
- data/ext/boost/thread/pthread/thread.hpp +11 -3
- data/ext/boost/thread/pthread/thread_data.hpp +2 -1
- data/ext/oxt/backtrace.cpp +172 -0
- data/ext/oxt/backtrace.hpp +135 -0
- data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
- data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
- data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
- data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
- data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
- data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
- data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
- data/ext/oxt/macros.hpp +58 -0
- data/ext/oxt/spin_lock.hpp +55 -0
- data/ext/{apache2/System.cpp → oxt/system_calls.cpp} +87 -52
- data/ext/oxt/system_calls.hpp +234 -0
- data/ext/oxt/thread.cpp +32 -0
- data/ext/oxt/thread.hpp +223 -0
- data/ext/oxt/tracable_exception.cpp +87 -0
- data/ext/oxt/tracable_exception.hpp +35 -0
- data/{lib/passenger/constants.rb → ext/phusion_passenger/extconf.rb} +14 -9
- data/ext/{passenger → phusion_passenger}/native_support.c +33 -6
- data/lib/{passenger → phusion_passenger}/abstract_request_handler.rb +209 -93
- data/lib/{passenger → phusion_passenger}/abstract_server.rb +23 -8
- data/lib/phusion_passenger/abstract_server_collection.rb +301 -0
- data/lib/phusion_passenger/admin_tools.rb +25 -0
- data/lib/phusion_passenger/admin_tools/control_process.rb +107 -0
- data/lib/{passenger → phusion_passenger}/application.rb +13 -16
- data/lib/{passenger → phusion_passenger}/console_text_template.rb +2 -2
- data/{ext/passenger/extconf.rb → lib/phusion_passenger/constants.rb} +5 -5
- data/lib/{passenger → phusion_passenger}/dependencies.rb +38 -32
- data/lib/phusion_passenger/events.rb +45 -0
- data/lib/{passenger → phusion_passenger}/exceptions.rb +12 -5
- data/lib/{passenger → phusion_passenger}/html_template.rb +2 -2
- data/lib/{passenger → phusion_passenger}/message_channel.rb +3 -2
- data/lib/phusion_passenger/platform_info.rb +500 -0
- data/lib/{passenger → phusion_passenger}/rack/application_spawner.rb +29 -22
- data/lib/{passenger → phusion_passenger}/rack/request_handler.rb +14 -9
- data/lib/{passenger → phusion_passenger}/railz/application_spawner.rb +94 -74
- data/lib/{passenger → phusion_passenger}/railz/cgi_fixed.rb +2 -2
- data/lib/{passenger → phusion_passenger}/railz/framework_spawner.rb +86 -98
- data/lib/{passenger → phusion_passenger}/railz/request_handler.rb +6 -6
- data/lib/{passenger → phusion_passenger}/simple_benchmarking.rb +0 -0
- data/lib/{passenger → phusion_passenger}/spawn_manager.rb +136 -128
- data/lib/{passenger → phusion_passenger}/templates/apache2_config_snippets.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
- data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
- data/lib/{passenger → phusion_passenger}/templates/app_init_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/database_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/deployment_example.txt.erb +1 -1
- data/lib/{passenger → phusion_passenger}/templates/error_layout.css +0 -0
- data/lib/{passenger → phusion_passenger}/templates/error_layout.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/framework_init_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/general_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/invalid_app_root.html.erb +1 -1
- data/lib/{passenger → phusion_passenger}/templates/load_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/no_write_permission_to_passenger_root.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/run_installer_as_root.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/version_not_found.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/welcome.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/utils.rb +210 -44
- data/lib/{passenger → phusion_passenger}/wsgi/application_spawner.rb +18 -15
- data/lib/{passenger → phusion_passenger}/wsgi/request_handler.py +7 -1
- data/man/passenger-memory-stats.8 +1 -1
- data/misc/render_error_pages.rb +1 -1
- data/test/ApplicationPoolServerTest.cpp +0 -28
- data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +4 -0
- data/test/ApplicationPoolTest.cpp +307 -69
- data/test/CachedFileStatTest.cpp +262 -0
- data/test/FileCheckerTest.cpp +79 -0
- data/test/MessageChannelTest.cpp +3 -3
- data/test/PoolOptionsTest.cpp +37 -0
- data/test/SpawnManagerTest.cpp +4 -4
- data/test/StandardApplicationPoolTest.cpp +4 -0
- data/test/SystemTimeTest.cpp +37 -0
- data/test/UtilsTest.cpp +137 -0
- data/test/integration_tests.rb +270 -23
- data/test/oxt/backtrace_test.cpp +128 -0
- data/test/oxt/oxt_test_main.cpp +25 -0
- data/test/oxt/syscall_interruption_test.cpp +50 -0
- data/test/ruby/abstract_request_handler_spec.rb +83 -0
- data/test/ruby/abstract_server_collection_spec.rb +246 -0
- data/test/ruby/application_spec.rb +3 -3
- data/test/ruby/message_channel_spec.rb +2 -2
- data/test/ruby/rack/application_spawner_spec.rb +3 -5
- data/test/ruby/rails/application_spawner_spec.rb +54 -15
- data/test/ruby/rails/framework_spawner_spec.rb +6 -8
- data/test/ruby/rails/minimal_spawner_spec.rb +29 -0
- data/test/ruby/rails/spawner_error_handling_spec.rb +1 -1
- data/test/ruby/rails/spawner_privilege_lowering_spec.rb +3 -3
- data/test/ruby/spawn_manager_spec.rb +23 -12
- data/test/ruby/utils_spec.rb +36 -2
- data/test/ruby/wsgi/application_spawner_spec.rb +47 -0
- data/test/stub/apache2/httpd.conf.erb +3 -5
- data/test/stub/message_channel.rb +2 -2
- data/test/stub/message_channel_2.rb +2 -2
- data/test/stub/message_channel_3.rb +3 -3
- data/test/stub/minimal-railsapp/README +0 -0
- data/test/stub/minimal-railsapp/config/application.rb +0 -0
- data/test/stub/minimal-railsapp/config/environment.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionmailer/lib/action_mailer.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_controller.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_pack.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_view.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activerecord/lib/active_record.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activeresource/lib/active_resource.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/railties/lib/dispatcher.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/railties/lib/initializer.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/railties/lib/ruby_version_check.rb +0 -0
- data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +8 -0
- data/test/stub/rails_apps/foobar/config/environments/development.rb +1 -2
- data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +21 -1
- data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
- data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
- data/test/stub/railsapp/app/controllers/application.rb +0 -0
- data/test/stub/railsapp/app/controllers/bar_controller_1.rb +0 -0
- data/test/stub/railsapp/app/controllers/bar_controller_2.rb +1 -1
- data/test/stub/railsapp/app/controllers/foo_controller.rb +4 -0
- data/test/stub/railsapp/app/helpers/application_helper.rb +0 -0
- data/test/stub/railsapp/config/boot.rb +0 -0
- data/test/stub/railsapp/config/database.yml +0 -0
- data/test/stub/railsapp/config/environment.rb +0 -0
- data/test/stub/railsapp/config/environments/development.rb +0 -0
- data/test/stub/railsapp/config/environments/production.rb +0 -0
- data/test/stub/railsapp/config/initializers/inflections.rb +0 -0
- data/test/stub/railsapp/config/initializers/mime_types.rb +0 -0
- data/test/stub/railsapp/config/routes.rb +0 -0
- data/test/stub/railsapp/public/useless.txt +0 -0
- data/test/stub/spawn_server.rb +3 -4
- data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
- data/test/support/apache2_controller.rb +57 -7
- data/test/support/tut.h +15 -0
- data/vendor/README +12 -0
- data/vendor/README_FOR_PACKAGERS +1 -0
- data/vendor/rack-0.9.1/AUTHORS +8 -0
- data/vendor/rack-0.9.1/COPYING +18 -0
- data/vendor/rack-0.9.1/ChangeLog +1423 -0
- data/vendor/rack-0.9.1/KNOWN-ISSUES +18 -0
- data/vendor/rack-0.9.1/README +306 -0
- data/vendor/rack-0.9.1/Rakefile +188 -0
- data/vendor/rack-0.9.1/SPEC +129 -0
- data/vendor/rack-0.9.1/lib/rack.rb +86 -0
- data/vendor/rack-0.9.1/lib/rack/adapter/camping.rb +22 -0
- data/vendor/rack-0.9.1/lib/rack/auth/abstract/handler.rb +28 -0
- data/vendor/rack-0.9.1/lib/rack/auth/abstract/request.rb +37 -0
- data/vendor/rack-0.9.1/lib/rack/auth/basic.rb +58 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/md5.rb +124 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/nonce.rb +51 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/params.rb +55 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/request.rb +40 -0
- data/vendor/rack-0.9.1/lib/rack/auth/openid.rb +438 -0
- data/vendor/rack-0.9.1/lib/rack/builder.rb +67 -0
- data/vendor/rack-0.9.1/lib/rack/cascade.rb +36 -0
- data/vendor/rack-0.9.1/lib/rack/commonlogger.rb +61 -0
- data/vendor/rack-0.9.1/lib/rack/conditionalget.rb +43 -0
- data/vendor/rack-0.9.1/lib/rack/content_length.rb +25 -0
- data/vendor/rack-0.9.1/lib/rack/deflater.rb +87 -0
- data/vendor/rack-0.9.1/lib/rack/directory.rb +150 -0
- data/vendor/rack-0.9.1/lib/rack/file.rb +85 -0
- data/vendor/rack-0.9.1/lib/rack/handler.rb +48 -0
- data/vendor/rack-0.9.1/lib/rack/handler/cgi.rb +57 -0
- data/vendor/rack-0.9.1/lib/rack/handler/evented_mongrel.rb +8 -0
- data/vendor/rack-0.9.1/lib/rack/handler/fastcgi.rb +86 -0
- data/vendor/rack-0.9.1/lib/rack/handler/lsws.rb +52 -0
- data/vendor/rack-0.9.1/lib/rack/handler/mongrel.rb +82 -0
- data/vendor/rack-0.9.1/lib/rack/handler/scgi.rb +57 -0
- data/vendor/rack-0.9.1/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
- data/vendor/rack-0.9.1/lib/rack/handler/thin.rb +15 -0
- data/vendor/rack-0.9.1/lib/rack/handler/webrick.rb +61 -0
- data/vendor/rack-0.9.1/lib/rack/head.rb +19 -0
- data/vendor/rack-0.9.1/lib/rack/lint.rb +465 -0
- data/vendor/rack-0.9.1/lib/rack/lobster.rb +65 -0
- data/vendor/rack-0.9.1/lib/rack/methodoverride.rb +27 -0
- data/vendor/rack-0.9.1/lib/rack/mime.rb +204 -0
- data/vendor/rack-0.9.1/lib/rack/mock.rb +160 -0
- data/vendor/rack-0.9.1/lib/rack/recursive.rb +57 -0
- data/vendor/rack-0.9.1/lib/rack/reloader.rb +64 -0
- data/vendor/rack-0.9.1/lib/rack/request.rb +218 -0
- data/vendor/rack-0.9.1/lib/rack/response.rb +171 -0
- data/vendor/rack-0.9.1/lib/rack/session/abstract/id.rb +153 -0
- data/vendor/rack-0.9.1/lib/rack/session/cookie.rb +89 -0
- data/vendor/rack-0.9.1/lib/rack/session/memcache.rb +97 -0
- data/vendor/rack-0.9.1/lib/rack/session/pool.rb +73 -0
- data/vendor/rack-0.9.1/lib/rack/showexceptions.rb +348 -0
- data/vendor/rack-0.9.1/lib/rack/showstatus.rb +106 -0
- data/vendor/rack-0.9.1/lib/rack/static.rb +38 -0
- data/vendor/rack-0.9.1/lib/rack/urlmap.rb +48 -0
- data/vendor/rack-0.9.1/lib/rack/utils.rb +347 -0
- metadata +1197 -1055
- data/doc/cxxapi/System_8h-source.html +0 -251
- data/doc/cxxapi/classDirectoryMapper-members.html +0 -38
- data/doc/cxxapi/classDirectoryMapper.html +0 -203
- data/doc/cxxapi/classPassenger_1_1Thread.html +0 -100
- data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption.html +0 -46
- data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption-members.html +0 -33
- data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption.html +0 -44
- data/doc/cxxapi/namespacePassenger.html +0 -208
- data/doc/cxxapi/namespacePassenger_1_1InterruptableCalls.html +0 -43
- data/doc/cxxapi/namespacemembers.html +0 -70
- data/doc/cxxapi/namespacemembers_func.html +0 -66
- data/doc/cxxapi/namespacemembers_type.html +0 -46
- data/doc/cxxapi/namespaces.html +0 -35
- data/doc/rdoc/classes/Passenger.html +0 -136
- data/doc/rdoc/classes/Passenger/AbstractRequestHandler.html +0 -402
- data/doc/rdoc/classes/Passenger/SpawnManager.html +0 -379
- data/doc/rdoc/classes/Passenger/Utils.html +0 -578
- data/ext/apache2/System.h +0 -228
- data/lib/passenger/platform_info.rb +0 -302
- data/lib/passenger/templates/app_exited_during_initialization.html.erb +0 -19
- data/test/stub/apache2/httpd.conf +0 -75
- data/test/stub/rails_apps/foobar/config/environments/test.rb +0 -22
- data/test/stub/rails_apps/mycook/config/environments/test.rb +0 -22
- data/test/stub/railsapp/config/environments/test.rb +0 -22
- data/test/stub/railsapp2/config/environments/test.rb +0 -22
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
|
3
|
+
module Rack
|
4
|
+
module Auth
|
5
|
+
module Digest
|
6
|
+
# Rack::Auth::Digest::Nonce is the default nonce generator for the
|
7
|
+
# Rack::Auth::Digest::MD5 authentication handler.
|
8
|
+
#
|
9
|
+
# +private_key+ needs to set to a constant string.
|
10
|
+
#
|
11
|
+
# +time_limit+ can be optionally set to an integer (number of seconds),
|
12
|
+
# to limit the validity of the generated nonces.
|
13
|
+
|
14
|
+
class Nonce
|
15
|
+
|
16
|
+
class << self
|
17
|
+
attr_accessor :private_key, :time_limit
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.parse(string)
|
21
|
+
new(*string.unpack("m*").first.split(' ', 2))
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(timestamp = Time.now, given_digest = nil)
|
25
|
+
@timestamp, @given_digest = timestamp.to_i, given_digest
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
[([ @timestamp, digest ] * ' ')].pack("m*").strip
|
30
|
+
end
|
31
|
+
|
32
|
+
def digest
|
33
|
+
::Digest::MD5.hexdigest([ @timestamp, self.class.private_key ] * ':')
|
34
|
+
end
|
35
|
+
|
36
|
+
def valid?
|
37
|
+
digest == @given_digest
|
38
|
+
end
|
39
|
+
|
40
|
+
def stale?
|
41
|
+
!self.class.time_limit.nil? && (@timestamp - Time.now.to_i) < self.class.time_limit
|
42
|
+
end
|
43
|
+
|
44
|
+
def fresh?
|
45
|
+
!stale?
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Rack
|
2
|
+
module Auth
|
3
|
+
module Digest
|
4
|
+
class Params < Hash
|
5
|
+
|
6
|
+
def self.parse(str)
|
7
|
+
split_header_value(str).inject(new) do |header, param|
|
8
|
+
k, v = param.split('=', 2)
|
9
|
+
header[k] = dequote(v)
|
10
|
+
header
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.dequote(str) # From WEBrick::HTTPUtils
|
15
|
+
ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup
|
16
|
+
ret.gsub!(/\\(.)/, "\\1")
|
17
|
+
ret
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.split_header_value(str)
|
21
|
+
str.scan( /(\w+\=(?:"[^\"]+"|[^,]+))/n ).collect{ |v| v[0] }
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
super
|
26
|
+
|
27
|
+
yield self if block_given?
|
28
|
+
end
|
29
|
+
|
30
|
+
def [](k)
|
31
|
+
super k.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
def []=(k, v)
|
35
|
+
super k.to_s, v.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
UNQUOTED = ['qop', 'nc', 'stale']
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
inject([]) do |parts, (k, v)|
|
42
|
+
parts << "#{k}=" + (UNQUOTED.include?(k) ? v.to_s : quote(v))
|
43
|
+
parts
|
44
|
+
end.join(', ')
|
45
|
+
end
|
46
|
+
|
47
|
+
def quote(str) # From WEBrick::HTTPUtils
|
48
|
+
'"' << str.gsub(/[\\\"]/o, "\\\1") << '"'
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rack/auth/abstract/request'
|
2
|
+
require 'rack/auth/digest/params'
|
3
|
+
require 'rack/auth/digest/nonce'
|
4
|
+
|
5
|
+
module Rack
|
6
|
+
module Auth
|
7
|
+
module Digest
|
8
|
+
class Request < Auth::AbstractRequest
|
9
|
+
|
10
|
+
def method
|
11
|
+
@env['REQUEST_METHOD']
|
12
|
+
end
|
13
|
+
|
14
|
+
def digest?
|
15
|
+
:digest == scheme
|
16
|
+
end
|
17
|
+
|
18
|
+
def correct_uri?
|
19
|
+
@env['PATH_INFO'] == uri
|
20
|
+
end
|
21
|
+
|
22
|
+
def nonce
|
23
|
+
@nonce ||= Nonce.parse(params['nonce'])
|
24
|
+
end
|
25
|
+
|
26
|
+
def params
|
27
|
+
@params ||= Params.parse(parts.last)
|
28
|
+
end
|
29
|
+
|
30
|
+
def method_missing(sym)
|
31
|
+
if params.has_key? key = sym.to_s
|
32
|
+
return params[key]
|
33
|
+
end
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,438 @@
|
|
1
|
+
# AUTHOR: blink <blinketje@gmail.com>; blink#ruby-lang@irc.freenode.net
|
2
|
+
|
3
|
+
gem 'ruby-openid', '~> 2' if defined? Gem
|
4
|
+
require 'rack/auth/abstract/handler' #rack
|
5
|
+
require 'uri' #std
|
6
|
+
require 'pp' #std
|
7
|
+
require 'openid' #gem
|
8
|
+
require 'openid/extension' #gem
|
9
|
+
require 'openid/store/memory' #gem
|
10
|
+
|
11
|
+
module Rack
|
12
|
+
module Auth
|
13
|
+
# Rack::Auth::OpenID provides a simple method for permitting
|
14
|
+
# openid based logins. It requires the ruby-openid library from
|
15
|
+
# janrain to operate, as well as a rack method of session management.
|
16
|
+
#
|
17
|
+
# The ruby-openid home page is at http://openidenabled.com/ruby-openid/.
|
18
|
+
#
|
19
|
+
# The OpenID specifications can be found at
|
20
|
+
# http://openid.net/specs/openid-authentication-1_1.html
|
21
|
+
# and
|
22
|
+
# http://openid.net/specs/openid-authentication-2_0.html. Documentation
|
23
|
+
# for published OpenID extensions and related topics can be found at
|
24
|
+
# http://openid.net/developers/specs/.
|
25
|
+
#
|
26
|
+
# It is recommended to read through the OpenID spec, as well as
|
27
|
+
# ruby-openid's documentation, to understand what exactly goes on. However
|
28
|
+
# a setup as simple as the presented examples is enough to provide
|
29
|
+
# functionality.
|
30
|
+
#
|
31
|
+
# This library strongly intends to utilize the OpenID 2.0 features of the
|
32
|
+
# ruby-openid library, while maintaining OpenID 1.0 compatiblity.
|
33
|
+
#
|
34
|
+
# All responses from this rack application will be 303 redirects unless an
|
35
|
+
# error occurs, with the exception of an authentication request requiring
|
36
|
+
# an HTML form submission.
|
37
|
+
#
|
38
|
+
# NOTE: Extensions are not currently supported by this implimentation of
|
39
|
+
# the OpenID rack application due to the complexity of the current
|
40
|
+
# ruby-openid extension handling.
|
41
|
+
#
|
42
|
+
# NOTE: Due to the amount of data that this library stores in the
|
43
|
+
# session, Rack::Session::Cookie may fault.
|
44
|
+
class OpenID < AbstractHandler
|
45
|
+
class NoSession < RuntimeError; end
|
46
|
+
# Required for ruby-openid
|
47
|
+
OIDStore = ::OpenID::Store::Memory.new
|
48
|
+
HTML = '<html><head><title>%s</title></head><body>%s</body></html>'
|
49
|
+
|
50
|
+
# A Hash of options is taken as it's single initializing
|
51
|
+
# argument. For example:
|
52
|
+
#
|
53
|
+
# simple_oid = OpenID.new('http://mysite.com/')
|
54
|
+
#
|
55
|
+
# return_oid = OpenID.new('http://mysite.com/', {
|
56
|
+
# :return_to => 'http://mysite.com/openid'
|
57
|
+
# })
|
58
|
+
#
|
59
|
+
# page_oid = OpenID.new('http://mysite.com/',
|
60
|
+
# :login_good => 'http://mysite.com/auth_good'
|
61
|
+
# )
|
62
|
+
#
|
63
|
+
# complex_oid = OpenID.new('http://mysite.com/',
|
64
|
+
# :return_to => 'http://mysite.com/openid',
|
65
|
+
# :login_good => 'http://mysite.com/user/preferences',
|
66
|
+
# :auth_fail => [500, {'Content-Type'=>'text/plain'},
|
67
|
+
# 'Unable to negotiate with foreign server.'],
|
68
|
+
# :immediate => true,
|
69
|
+
# :extensions => {
|
70
|
+
# ::OpenID::SReg => [['email'],['nickname']]
|
71
|
+
# }
|
72
|
+
# )
|
73
|
+
#
|
74
|
+
# = Arguments
|
75
|
+
#
|
76
|
+
# The first argument is the realm, identifying the site they are trusting
|
77
|
+
# with their identity. This is required.
|
78
|
+
#
|
79
|
+
# NOTE: In OpenID 1.x, the realm or trust_root is optional and the
|
80
|
+
# return_to url is required. As this library strives tward ruby-openid
|
81
|
+
# 2.0, and OpenID 2.0 compatibiliy, the realm is required and return_to
|
82
|
+
# is optional. However, this implimentation is still backwards compatible
|
83
|
+
# with OpenID 1.0 servers.
|
84
|
+
#
|
85
|
+
# The optional second argument is a hash of options.
|
86
|
+
#
|
87
|
+
# == Options
|
88
|
+
#
|
89
|
+
# <tt>:return_to</tt> defines the url to return to after the client
|
90
|
+
# authenticates with the openid service provider. This url should point
|
91
|
+
# to where Rack::Auth::OpenID is mounted. If <tt>:return_to</tt> is not
|
92
|
+
# provided, :return_to will be the current url including all query
|
93
|
+
# parameters.
|
94
|
+
#
|
95
|
+
# <tt>:session_key</tt> defines the key to the session hash in the env.
|
96
|
+
# It defaults to 'rack.session'.
|
97
|
+
#
|
98
|
+
# <tt>:openid_param</tt> defines at what key in the request parameters to
|
99
|
+
# find the identifier to resolve. As per the 2.0 spec, the default is
|
100
|
+
# 'openid_identifier'.
|
101
|
+
#
|
102
|
+
# <tt>:immediate</tt> as true will make immediate type of requests the
|
103
|
+
# default. See OpenID specification documentation.
|
104
|
+
#
|
105
|
+
# === URL options
|
106
|
+
#
|
107
|
+
# <tt>:login_good</tt> is the url to go to after the authentication
|
108
|
+
# process has completed.
|
109
|
+
#
|
110
|
+
# <tt>:login_fail</tt> is the url to go to after the authentication
|
111
|
+
# process has failed.
|
112
|
+
#
|
113
|
+
# <tt>:login_quit</tt> is the url to go to after the authentication
|
114
|
+
# process
|
115
|
+
# has been cancelled.
|
116
|
+
#
|
117
|
+
# === Response options
|
118
|
+
#
|
119
|
+
# <tt>:no_session</tt> should be a rack response to be returned if no or
|
120
|
+
# an incompatible session is found.
|
121
|
+
#
|
122
|
+
# <tt>:auth_fail</tt> should be a rack response to be returned if an
|
123
|
+
# OpenID::DiscoveryFailure occurs. This is typically due to being unable
|
124
|
+
# to access the identity url or identity server.
|
125
|
+
#
|
126
|
+
# <tt>:error</tt> should be a rack response to return if any other
|
127
|
+
# generic error would occur and <tt>options[:catch_errors]</tt> is true.
|
128
|
+
#
|
129
|
+
# === Extensions
|
130
|
+
#
|
131
|
+
# <tt>:extensions</tt> should be a hash of openid extension
|
132
|
+
# implementations. The key should be the extension main module, the value
|
133
|
+
# should be an array of arguments for extension::Request.new
|
134
|
+
#
|
135
|
+
# The hash is iterated over and passed to #add_extension for processing.
|
136
|
+
# Please see #add_extension for further documentation.
|
137
|
+
def initialize(realm, options={})
|
138
|
+
@realm = realm
|
139
|
+
realm = URI(realm)
|
140
|
+
if realm.path.empty?
|
141
|
+
raise ArgumentError, "Invalid realm path: '#{realm.path}'"
|
142
|
+
elsif not realm.absolute?
|
143
|
+
raise ArgumentError, "Realm '#{@realm}' not absolute"
|
144
|
+
end
|
145
|
+
|
146
|
+
[:return_to, :login_good, :login_fail, :login_quit].each do |key|
|
147
|
+
if options.key? key and luri = URI(options[key])
|
148
|
+
if !luri.absolute?
|
149
|
+
raise ArgumentError, ":#{key} is not an absolute uri: '#{luri}'"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
if options[:return_to] and ruri = URI(options[:return_to])
|
155
|
+
if ruri.path.empty?
|
156
|
+
raise ArgumentError, "Invalid return_to path: '#{ruri.path}'"
|
157
|
+
elsif realm.path != ruri.path[0, realm.path.size]
|
158
|
+
raise ArgumentError, 'return_to not within realm.' \
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# TODO: extension support
|
163
|
+
if extensions = options.delete(:extensions)
|
164
|
+
extensions.each do |ext, args|
|
165
|
+
add_extension ext, *args
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
@options = {
|
170
|
+
:session_key => 'rack.session',
|
171
|
+
:openid_param => 'openid_identifier',
|
172
|
+
#:return_to, :login_good, :login_fail, :login_quit
|
173
|
+
#:no_session, :auth_fail, :error
|
174
|
+
:store => OIDStore,
|
175
|
+
:immediate => false,
|
176
|
+
:anonymous => false,
|
177
|
+
:catch_errors => false
|
178
|
+
}.merge(options)
|
179
|
+
@extensions = {}
|
180
|
+
end
|
181
|
+
|
182
|
+
attr_reader :options, :extensions
|
183
|
+
|
184
|
+
# It sets up and uses session data at <tt>:openid</tt> within the
|
185
|
+
# session. It sets up the ::OpenID::Consumer using the store specified by
|
186
|
+
# <tt>options[:store]</tt>.
|
187
|
+
#
|
188
|
+
# If the parameter specified by <tt>options[:openid_param]</tt> is
|
189
|
+
# present, processing is passed to #check and the result is returned.
|
190
|
+
#
|
191
|
+
# If the parameter 'openid.mode' is set, implying a followup from the
|
192
|
+
# openid server, processing is passed to #finish and the result is
|
193
|
+
# returned.
|
194
|
+
#
|
195
|
+
# If neither of these conditions are met, a 400 error is returned.
|
196
|
+
#
|
197
|
+
# If an error is thrown and <tt>options[:catch_errors]</tt> is false, the
|
198
|
+
# exception will be reraised. Otherwise a 500 error is returned.
|
199
|
+
def call(env)
|
200
|
+
env['rack.auth.openid'] = self
|
201
|
+
session = env[@options[:session_key]]
|
202
|
+
unless session and session.is_a? Hash
|
203
|
+
raise(NoSession, 'No compatible session')
|
204
|
+
end
|
205
|
+
# let us work in our own namespace...
|
206
|
+
session = (session[:openid] ||= {})
|
207
|
+
unless session and session.is_a? Hash
|
208
|
+
raise(NoSession, 'Incompatible session')
|
209
|
+
end
|
210
|
+
|
211
|
+
request = Rack::Request.new env
|
212
|
+
consumer = ::OpenID::Consumer.new session, @options[:store]
|
213
|
+
|
214
|
+
if request.params['openid.mode']
|
215
|
+
finish consumer, session, request
|
216
|
+
elsif request.params[@options[:openid_param]]
|
217
|
+
check consumer, session, request
|
218
|
+
else
|
219
|
+
env['rack.errors'].puts "No valid params provided."
|
220
|
+
bad_request
|
221
|
+
end
|
222
|
+
rescue NoSession
|
223
|
+
env['rack.errors'].puts($!.message, *$@)
|
224
|
+
|
225
|
+
@options. ### Missing or incompatible session
|
226
|
+
fetch :no_session, [ 500,
|
227
|
+
{'Content-Type'=>'text/plain'},
|
228
|
+
$!.message ]
|
229
|
+
rescue
|
230
|
+
env['rack.errors'].puts($!.message, *$@)
|
231
|
+
|
232
|
+
if not @options[:catch_error]
|
233
|
+
raise($!)
|
234
|
+
end
|
235
|
+
@options.
|
236
|
+
fetch :error, [ 500,
|
237
|
+
{'Content-Type'=>'text/plain'},
|
238
|
+
'OpenID has encountered an error.' ]
|
239
|
+
end
|
240
|
+
|
241
|
+
# As the first part of OpenID consumer action, #check retrieves the data
|
242
|
+
# required for completion.
|
243
|
+
#
|
244
|
+
# * <tt>session[:openid][:openid_param]</tt> is set to the submitted
|
245
|
+
# identifier to be authenticated.
|
246
|
+
# * <tt>session[:openid][:site_return]</tt> is set as the request's
|
247
|
+
# HTTP_REFERER, unless already set.
|
248
|
+
# * <tt>env['rack.auth.openid.request']</tt> is the openid checkid
|
249
|
+
# request instance.
|
250
|
+
def check(consumer, session, req)
|
251
|
+
session[:openid_param] = req.params[@options[:openid_param]]
|
252
|
+
oid = consumer.begin(session[:openid_param], @options[:anonymous])
|
253
|
+
pp oid if $DEBUG
|
254
|
+
req.env['rack.auth.openid.request'] = oid
|
255
|
+
|
256
|
+
session[:site_return] ||= req.env['HTTP_REFERER']
|
257
|
+
|
258
|
+
# SETUP_NEEDED check!
|
259
|
+
# see OpenID::Consumer::CheckIDRequest docs
|
260
|
+
query_args = [@realm, *@options.values_at(:return_to, :immediate)]
|
261
|
+
query_args[1] ||= req.url
|
262
|
+
query_args[2] = false if session.key? :setup_needed
|
263
|
+
pp query_args if $DEBUG
|
264
|
+
|
265
|
+
## Extension support
|
266
|
+
extensions.each do |ext,args|
|
267
|
+
oid.add_extension ext::Request.new(*args)
|
268
|
+
end
|
269
|
+
|
270
|
+
if oid.send_redirect?(*query_args)
|
271
|
+
redirect = oid.redirect_url(*query_args)
|
272
|
+
if $DEBUG
|
273
|
+
pp redirect
|
274
|
+
pp Rack::Utils.parse_query(URI(redirect).query)
|
275
|
+
end
|
276
|
+
[ 303, {'Location'=>redirect}, [] ]
|
277
|
+
else
|
278
|
+
# check on 'action' option.
|
279
|
+
formbody = oid.form_markup(*query_args)
|
280
|
+
if $DEBUG
|
281
|
+
pp formbody
|
282
|
+
end
|
283
|
+
body = HTML % ['Confirm...', formbody]
|
284
|
+
[ 200, {'Content-Type'=>'text/html'}, body.to_a ]
|
285
|
+
end
|
286
|
+
rescue ::OpenID::DiscoveryFailure => e
|
287
|
+
# thrown from inside OpenID::Consumer#begin by yadis stuff
|
288
|
+
req.env['rack.errors'].puts($!.message, *$@)
|
289
|
+
|
290
|
+
@options. ### Foreign server failed
|
291
|
+
fetch :auth_fail, [ 503,
|
292
|
+
{'Content-Type'=>'text/plain'},
|
293
|
+
'Foreign server failure.' ]
|
294
|
+
end
|
295
|
+
|
296
|
+
# This is the final portion of authentication. Unless any errors outside
|
297
|
+
# of specification occur, a 303 redirect will be returned with Location
|
298
|
+
# determined by the OpenID response type. If none of the response type
|
299
|
+
# :login_* urls are set, the redirect will be set to
|
300
|
+
# <tt>session[:openid][:site_return]</tt>. If
|
301
|
+
# <tt>session[:openid][:site_return]</tt> is unset, the realm will be
|
302
|
+
# used.
|
303
|
+
#
|
304
|
+
# Any messages from OpenID's response are appended to the 303 response
|
305
|
+
# body.
|
306
|
+
#
|
307
|
+
# Data gathered from extensions are stored in session[:openid] with the
|
308
|
+
# extension's namespace uri as the key.
|
309
|
+
#
|
310
|
+
# * <tt>env['rack.auth.openid.response']</tt> is the openid response.
|
311
|
+
#
|
312
|
+
# The four valid possible outcomes are:
|
313
|
+
# * failure: <tt>options[:login_fail]</tt> or
|
314
|
+
# <tt>session[:site_return]</tt> or the realm
|
315
|
+
# * <tt>session[:openid]</tt> is cleared and any messages are send to
|
316
|
+
# rack.errors
|
317
|
+
# * <tt>session[:openid]['authenticated']</tt> is <tt>false</tt>
|
318
|
+
# * success: <tt>options[:login_good]</tt> or
|
319
|
+
# <tt>session[:site_return]</tt> or the realm
|
320
|
+
# * <tt>session[:openid]</tt> is cleared
|
321
|
+
# * <tt>session[:openid]['authenticated']</tt> is <tt>true</tt>
|
322
|
+
# * <tt>session[:openid]['identity']</tt> is the actual identifier
|
323
|
+
# * <tt>session[:openid]['identifier']</tt> is the pretty identifier
|
324
|
+
# * cancel: <tt>options[:login_good]</tt> or
|
325
|
+
# <tt>session[:site_return]</tt> or the realm
|
326
|
+
# * <tt>session[:openid]</tt> is cleared
|
327
|
+
# * <tt>session[:openid]['authenticated']</tt> is <tt>false</tt>
|
328
|
+
# * setup_needed: resubmits the authentication request. A flag is set for
|
329
|
+
# non-immediate handling.
|
330
|
+
# * <tt>session[:openid][:setup_needed]</tt> is set to <tt>true</tt>,
|
331
|
+
# which will prevent immediate style openid authentication.
|
332
|
+
def finish(consumer, session, req)
|
333
|
+
oid = consumer.complete(req.params, req.url)
|
334
|
+
pp oid if $DEBUG
|
335
|
+
req.env['rack.auth.openid.response'] = oid
|
336
|
+
|
337
|
+
goto = session.fetch :site_return, @realm
|
338
|
+
body = []
|
339
|
+
|
340
|
+
case oid.status
|
341
|
+
when ::OpenID::Consumer::FAILURE
|
342
|
+
session.clear
|
343
|
+
session['authenticated'] = false
|
344
|
+
req.env['rack.errors'].puts oid.message
|
345
|
+
|
346
|
+
goto = @options[:login_fail] if @options.key? :login_fail
|
347
|
+
body << "Authentication unsuccessful.\n"
|
348
|
+
when ::OpenID::Consumer::SUCCESS
|
349
|
+
session.clear
|
350
|
+
|
351
|
+
## Extension support
|
352
|
+
extensions.each do |ext, args|
|
353
|
+
session[ext::NS_URI] = ext::Response.
|
354
|
+
from_success_response(oid).
|
355
|
+
get_extension_args
|
356
|
+
end
|
357
|
+
|
358
|
+
session['authenticated'] = true
|
359
|
+
# Value for unique identification and such
|
360
|
+
session['identity'] = oid.identity_url
|
361
|
+
# Value for display and UI labels
|
362
|
+
session['identifier'] = oid.display_identifier
|
363
|
+
|
364
|
+
goto = @options[:login_good] if @options.key? :login_good
|
365
|
+
body << "Authentication successful.\n"
|
366
|
+
when ::OpenID::Consumer::CANCEL
|
367
|
+
session.clear
|
368
|
+
session['authenticated'] = false
|
369
|
+
|
370
|
+
goto = @options[:login_fail] if @options.key? :login_fail
|
371
|
+
body << "Authentication cancelled.\n"
|
372
|
+
when ::OpenID::Consumer::SETUP_NEEDED
|
373
|
+
session[:setup_needed] = true
|
374
|
+
unless o_id = session[:openid_param]
|
375
|
+
raise('Required values missing.')
|
376
|
+
end
|
377
|
+
|
378
|
+
goto = req.script_name+
|
379
|
+
'?'+@options[:openid_param]+
|
380
|
+
'='+o_id
|
381
|
+
body << "Reauthentication required.\n"
|
382
|
+
end
|
383
|
+
body << oid.message if oid.message
|
384
|
+
[ 303, {'Location'=>goto}, body]
|
385
|
+
end
|
386
|
+
|
387
|
+
# The first argument should be the main extension module.
|
388
|
+
# The extension module should contain the constants:
|
389
|
+
# * class Request, with OpenID::Extension as an ancestor
|
390
|
+
# * class Response, with OpenID::Extension as an ancestor
|
391
|
+
# * string NS_URI, which defines the namespace of the extension, should
|
392
|
+
# be an absolute http uri
|
393
|
+
#
|
394
|
+
# All trailing arguments will be passed to extension::Request.new in
|
395
|
+
# #check.
|
396
|
+
# The openid response will be passed to
|
397
|
+
# extension::Response#from_success_response, #get_extension_args will be
|
398
|
+
# called on the result to attain the gathered data.
|
399
|
+
#
|
400
|
+
# This method returns the key at which the response data will be found in
|
401
|
+
# the session, which is the namespace uri by default.
|
402
|
+
def add_extension ext, *args
|
403
|
+
if not ext.is_a? Module
|
404
|
+
raise TypeError, "#{ext.inspect} is not a module"
|
405
|
+
elsif !(m = %w'Request Response NS_URI' -
|
406
|
+
ext.constants.map{ |c| c.to_s }).empty?
|
407
|
+
raise ArgumentError, "#{ext.inspect} missing #{m*', '}"
|
408
|
+
end
|
409
|
+
|
410
|
+
consts = [ext::Request, ext::Response]
|
411
|
+
|
412
|
+
if not consts.all?{|c| c.is_a? Class }
|
413
|
+
raise TypeError, "#{ext.inspect}'s Request or Response is not a class"
|
414
|
+
elsif not consts.all?{|c| ::OpenID::Extension > c }
|
415
|
+
raise ArgumentError, "#{ext.inspect}'s Request or Response not a decendant of OpenID::Extension"
|
416
|
+
end
|
417
|
+
|
418
|
+
if not ext::NS_URI.is_a? String
|
419
|
+
raise TypeError, "#{ext.inspect}'s NS_URI is not a string"
|
420
|
+
elsif not uri = URI(ext::NS_URI)
|
421
|
+
raise ArgumentError, "#{ext.inspect}'s NS_URI is not a valid uri"
|
422
|
+
elsif not uri.scheme =~ /^https?$/
|
423
|
+
raise ArgumentError, "#{ext.inspect}'s NS_URI is not an http uri"
|
424
|
+
elsif not uri.absolute?
|
425
|
+
raise ArgumentError, "#{ext.inspect}'s NS_URI is not and absolute uri"
|
426
|
+
end
|
427
|
+
@extensions[ext] = args
|
428
|
+
return ext::NS_URI
|
429
|
+
end
|
430
|
+
|
431
|
+
# A conveniance method that returns the namespace of all current
|
432
|
+
# extensions used by this instance.
|
433
|
+
def extension_namespaces
|
434
|
+
@extensions.keys.map{|e|e::NS_URI}
|
435
|
+
end
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end
|