passenger 6.0.4 → 6.0.5

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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +43 -1
  3. data/CONTRIBUTORS +1 -0
  4. data/bin/passenger-install-nginx-module +1 -1
  5. data/passenger.gemspec +1 -1
  6. data/resources/templates/error_renderer/with_details/src/bootstrap/bootstrap.css +0 -0
  7. data/resources/templates/error_renderer/with_details/src/bootstrap/bootstrap.js +0 -0
  8. data/resources/templates/error_renderer/with_details/src/bootstrap/config.json +0 -0
  9. data/resources/templates/standalone/server.erb +1 -0
  10. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +1 -1
  11. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -0
  12. data/src/agent/Core/ApplicationPool/Options.h +10 -0
  13. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +1 -1
  14. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +1 -1
  15. data/src/agent/Core/Config.h +1 -1
  16. data/src/agent/Core/Controller.h +1 -0
  17. data/src/agent/Core/Controller/Config.h +4 -1
  18. data/src/agent/Core/Controller/ForwardResponse.cpp +13 -0
  19. data/src/agent/Core/Controller/InitRequest.cpp +3 -0
  20. data/src/agent/Core/Controller/InitializationAndShutdown.cpp +1 -0
  21. data/src/agent/Core/OptionParser.h +3 -0
  22. data/src/agent/TempDirToucher/TempDirToucherMain.cpp +2 -0
  23. data/src/agent/Watchdog/Config.h +1 -1
  24. data/src/apache2_module/Hooks.cpp +4 -0
  25. data/src/cxx_supportlib/Constants.h +2 -1
  26. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -10
  27. data/src/helper-scripts/prespawn +1 -0
  28. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +16 -0
  29. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +7 -0
  30. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +12 -0
  31. data/src/nginx_module/Configuration.c +6 -2
  32. data/src/nginx_module/ContentHandler.c +0 -2
  33. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +10 -0
  34. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
  35. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +15 -0
  36. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +3 -0
  37. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +7 -0
  38. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/logger.js +0 -0
  39. data/src/ruby_supportlib/phusion_passenger.rb +7 -7
  40. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +9 -0
  41. data/src/ruby_supportlib/phusion_passenger/constants.rb +1 -0
  42. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +1 -3
  43. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +14 -0
  44. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +1 -1
  45. data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +10 -0
  46. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +6 -0
  47. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
  48. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +1 -1
  49. data/src/ruby_supportlib/phusion_passenger/utils/unseekable_socket.rb +15 -11
  50. metadata +17 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0535dba6247039a28dfae09f32b405ad1adf599
4
- data.tar.gz: 8842d4a2b0ce4faeb6f731bc4c94742c00f376a7
3
+ metadata.gz: d9eb2308824a660b5a5618d35e5a7e21c76a7ba8
4
+ data.tar.gz: 286d69ed238ab96960e25b1b2d583c8b16f338d6
5
5
  SHA512:
6
- metadata.gz: 49f85e5c9e4de3c9a0cc068ac630b943da61c6f617a156856ce12221c919cc4735cb279d6957fea91a35f8fe024ab020171fd086ccc1d9fcdd507108b86b94d9
7
- data.tar.gz: f38614a083fc0e727da69cd758d568b4fe9d58bcedc47ada2513dff23dd412ff4ce34445364f0f7beb441926c9543109512a76d78fd8268b46c18711438b0fd4
6
+ metadata.gz: d395311456ea63da84dc1768f8b2560b327de66445dda623ee72a45ec6c42f03e0045004280dac6b7e5647bcd8924e8e6c02e912a960627eab095c10366d4138
7
+ data.tar.gz: 73db977a9ce34dcd94d653ca1a067bc19c68c22f68b71270ca64322b11cbb09c0a015d07b7ab3e65e33ae38c16ec620e7146675ea3d9666d4e4e9411f2ad72ff
data/CHANGELOG CHANGED
@@ -1,3 +1,45 @@
1
+ Release 6.0.5
2
+ -------------
3
+
4
+ * [Enterprise] Fixed a regression (introduced in 5.0.0) where Flying Passenger could not update the Passenger configuration. Closes GH-1554.
5
+ * Adds Ubuntu 20.04 "Focal" packages, and removes Ubuntu 19.04 "Disco" packages.
6
+ * Adds RHEL / CentOS 8 packages.
7
+ * [Nginx] Converts CentOS 7 packages to provide a dynamic module instead of a full Nginx install.
8
+ * Fixes the encoding name for xml output from the `passenger-status --show=xml` command. Closes GH-2248.
9
+ * Adds the 'etc' gem as an explicit dependency. Closes GH-2124.
10
+ * Adds a user agent to the passenger pre-spawn script. Closes GH-1534.
11
+ * Fixes a compilation issue on FreeBSD. Closes GH-2240.
12
+ * Fixes an issue where rack bodies may not be processed correctly.
13
+ * Improves the database reconnection speed in forked processes. closes GH-2253.
14
+ * [Nginx] Adds a config option `passenger_temp_path` to set the path used for the disk backed response cache. Re-Closes GH-2075.
15
+ * [Apache] Protects the path info and script name passed to the app from modifications done by mod_security. Closes GH-2198.
16
+ * Ensures baseuri is set per request, even if config is loaded from cache. Closes GH-2117.
17
+ * Make temp dir toucher cleanup code more resilient to permissions issues.
18
+ * [Nginx] Bumps the preferred Nginx version to 1.18.0 (previously 1.17.3).
19
+ * [Nginx] The preferred PCRE version is now 8.44 (previously 8.43).
20
+ * Removed deprecated rubyforge gemspec property. Contributed by @olleolleolle.
21
+ * Adds an option for specifying the attributes on the sticky session cookie:
22
+ - Apache: PassengerStickySessionsCookieAttributes "SameSite=Lax; Secure;"
23
+ - Nginx: passenger_sticky_sessions_cookie_attributes "SameSite=Lax; Secure;"
24
+ - Standalone: --sticky-sessions-cookie-attributes "SameSite=Lax; Secure;"
25
+ * Updated various library versions used in precompiled binaries (used for e.g. gem installs):
26
+
27
+ - ccache 3.7.9 (was 3.7.3)
28
+ - Curl 7.69.1 (was 7.66.0)
29
+ - Git 2.26.2 (was 2.23.0)
30
+ - GnuPG 2.2.20 (was 2.2.17)
31
+ - libgpg_error 1.37 (was 1.36)
32
+ - OpenSSL 1.0.2u (was 1.0.2t)
33
+ - PCRE 8.44 (was 8.43)
34
+ - s3cmd 2.1.0 (was 2.0.2)
35
+ - RubyGems 3.0.8 (was 3.0.6)
36
+ - Rubies:
37
+ - 2.4.6 -> 2.4.10
38
+ - 2.5.5 -> 2.5.8
39
+ - 2.6.3 -> 2.6.6
40
+ + 2.7.1
41
+
42
+
1
43
  Release 6.0.4
2
44
  -------------
3
45
 
@@ -7,7 +49,7 @@ Release 6.0.4
7
49
  Release 6.0.3
8
50
  -------------
9
51
 
10
- * Add and option to specify the spawn dir during startup, which is specifically useful for CageFS users. Contributed by @plmnikulin. Closes GH-2145.
52
+ * Add an option to specify the spawn dir during startup, which is specifically useful for CageFS users. Contributed by @plmnikulin. Closes GH-2145.
11
53
 
12
54
  - Apache: `PassengerSpawnDir`
13
55
  - Nginx: `passenger_spawn_dir`
@@ -74,6 +74,7 @@ Nathaniel Bibler
74
74
  Neil Wilson
75
75
  Ninh Bui (Phusion)
76
76
  Oleksiy Shchukin
77
+ Olle Jonsson
77
78
  Pat Downey
78
79
  Paul B
79
80
  Paul Kmiec
@@ -268,7 +268,7 @@ private
268
268
  new_screen
269
269
  puts "<banner>PCRE (required by Nginx) not installed, downloading it...</banner>"
270
270
 
271
- url = "http://downloads.sourceforge.net/project/pcre/pcre/#{PREFERRED_PCRE_VERSION}/pcre-#{PREFERRED_PCRE_VERSION}.tar.gz"
271
+ url = "https://ftp.pcre.org/pub/pcre/pcre-#{PREFERRED_PCRE_VERSION}.tar.gz"
272
272
  dirname = "pcre-#{PREFERRED_PCRE_VERSION}"
273
273
  tarball = "#{@working_dir}/pcre.tar.gz"
274
274
 
@@ -10,12 +10,12 @@ Gem::Specification.new do |s|
10
10
  s.summary = "A fast and robust web server and application server for Ruby, Python and Node.js"
11
11
  s.name = PhusionPassenger::PACKAGE_NAME
12
12
  s.version = PhusionPassenger::VERSION_STRING
13
- s.rubyforge_project = "passenger"
14
13
  s.author = "Phusion - http://www.phusion.nl/"
15
14
  s.email = "software-signing@phusion.nl"
16
15
  s.require_paths = ["src/ruby_supportlib"]
17
16
  s.add_dependency 'rake', '>= 0.8.1'
18
17
  s.add_dependency 'rack'
18
+ s.add_dependency 'etc'
19
19
  s.files = Dir[*PhusionPassenger::Packaging::GLOB] -
20
20
  Dir[*PhusionPassenger::Packaging::EXCLUDE_GLOB]
21
21
  s.executables = PhusionPassenger::Packaging::USER_EXECUTABLES +
@@ -48,6 +48,7 @@ passenger_enabled on;
48
48
  <%= nginx_option(app, :restart_dir) %>
49
49
  <%= nginx_option(app, :sticky_sessions) %>
50
50
  <%= nginx_option(app, :sticky_sessions_cookie_name) %>
51
+ <%= nginx_option(app, :sticky_sessions_cookie_attributes) %>
51
52
  <%= nginx_option(app, :vary_turbocache_by_cookie) %>
52
53
  <%= nginx_option(app, :meteor_app_settings) %>
53
54
  <%= nginx_option(app, :load_shell_envvars) %>
@@ -305,7 +305,7 @@ Group::detachedProcessesCheckerMain(GroupPtr self) {
305
305
  while (true) {
306
306
  assert(detachedProcessesCheckerActive);
307
307
 
308
- if (getLifeStatus() == SHUT_DOWN || this_thread::interruption_requested()) {
308
+ if (getLifeStatus() == SHUT_DOWN || boost::this_thread::interruption_requested()) {
309
309
  UPDATE_TRACE_POINT();
310
310
  P_DEBUG("Stopping detached processes checker");
311
311
  detachedProcessesCheckerActive = false;
@@ -260,6 +260,7 @@ Group::inspectConfigInAdminPanelFormat(Json::Value &result) const {
260
260
  result["abort_websockets_on_process_shutdown"] = VAL(options.abortWebsocketsOnProcessShutdown);
261
261
  result["force_max_concurrent_requests_per_process"] = VAL(options.forceMaxConcurrentRequestsPerProcess, -1);
262
262
  result["restart_dir"] = NON_EMPTY_SVAL(options.restartDir);
263
+ result["sticky_sessions_cookie_attributes"] = SVAL(options.stickySessionsCookieAttributes, DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES);
263
264
 
264
265
  if (!options.environmentVariables.empty()) {
265
266
  DynamicBuffer envvarsData(options.environmentVariables.size() * 3 / 4);
@@ -115,6 +115,8 @@ private:
115
115
  result.push_back(&options.hostName);
116
116
  result.push_back(&options.uri);
117
117
 
118
+ result.push_back(&options.stickySessionsCookieAttributes);
119
+
118
120
  return result;
119
121
  }
120
122
 
@@ -353,6 +355,12 @@ public:
353
355
  */
354
356
  bool abortWebsocketsOnProcessShutdown;
355
357
 
358
+ /**
359
+ * The attributes to use for the sticky session cookie.
360
+ * Values should validate against the regex: ([\w]+(=[\w]+)?; )*
361
+ */
362
+ StaticString stickySessionsCookieAttributes;
363
+
356
364
  /*-----------------*/
357
365
 
358
366
 
@@ -453,6 +461,7 @@ public:
453
461
  maxOutOfBandWorkInstances(1),
454
462
  maxRequestQueueSize(DEFAULT_MAX_REQUEST_QUEUE_SIZE),
455
463
  abortWebsocketsOnProcessShutdown(true),
464
+ stickySessionsCookieAttributes(DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES, sizeof(DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES) - 1),
456
465
 
457
466
  stickySessionId(0),
458
467
  statThrottleRate(DEFAULT_STAT_THROTTLE_RATE),
@@ -582,6 +591,7 @@ public:
582
591
  appendKeyValue3(vec, "max_processes", maxProcesses);
583
592
  appendKeyValue2(vec, "max_preloader_idle_time", maxPreloaderIdleTime);
584
593
  appendKeyValue3(vec, "max_out_of_band_work_instances", maxOutOfBandWorkInstances);
594
+ appendKeyValue (vec, "sticky_sessions_cookie_attributes", stickySessionsCookieAttributes);
585
595
  }
586
596
 
587
597
  /*********************************/
@@ -55,7 +55,7 @@ Pool::garbageCollect(PoolPtr self) {
55
55
  self->garbageCollectionCond.timed_wait(lock,
56
56
  posix_time::seconds(5));
57
57
  }
58
- while (!this_thread::interruption_requested()) {
58
+ while (!boost::this_thread::interruption_requested()) {
59
59
  try {
60
60
  UPDATE_TRACE_POINT();
61
61
  unsigned long long sleepTime = self->realGarbageCollect();
@@ -202,7 +202,7 @@ Pool::toXml(const ToXmlOptions &options, bool lock) const {
202
202
  throw SecurityException("Operation unauthorized");
203
203
  }
204
204
 
205
- result << "<?xml version=\"1.0\" encoding=\"iso8859-1\" ?>\n";
205
+ result << "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
206
206
  result << "<info version=\"3\">";
207
207
 
208
208
  result << "<passenger_version>" << PASSENGER_VERSION << "</passenger_version>";
@@ -162,7 +162,7 @@ using namespace std;
162
162
  * security_update_checker_interval unsigned integer - default(86400)
163
163
  * security_update_checker_proxy_url string - -
164
164
  * security_update_checker_url string - default("https://securitycheck.phusionpassenger.com/v1/check.json")
165
- * server_software string - default("Phusion_Passenger/6.0.4")
165
+ * server_software string - default("Phusion_Passenger/6.0.5")
166
166
  * show_version_in_header boolean - default(true)
167
167
  * single_app_mode_app_root string - default,read_only
168
168
  * single_app_mode_app_start_command string - read_only
@@ -123,6 +123,7 @@ private:
123
123
  HashedStaticString PASSENGER_SHOW_VERSION_IN_HEADER;
124
124
  HashedStaticString PASSENGER_STICKY_SESSIONS;
125
125
  HashedStaticString PASSENGER_STICKY_SESSIONS_COOKIE_NAME;
126
+ HashedStaticString PASSENGER_STICKY_SESSIONS_COOKIE_ATTRIBUTES;
126
127
  HashedStaticString PASSENGER_REQUEST_OOB_WORK;
127
128
  HashedStaticString REMOTE_ADDR;
128
129
  HashedStaticString REMOTE_PORT;
@@ -113,7 +113,7 @@ parseControllerBenchmarkMode(const StaticString &mode) {
113
113
  * multi_app boolean - default(true),read_only
114
114
  * request_freelist_limit unsigned integer - default(1024)
115
115
  * response_buffer_high_watermark unsigned integer - default(134217728)
116
- * server_software string - default("Phusion_Passenger/6.0.4")
116
+ * server_software string - default("Phusion_Passenger/6.0.5")
117
117
  * show_version_in_header boolean - default(true)
118
118
  * start_reading_after_accept boolean - default(true)
119
119
  * stat_throttle_rate unsigned integer - default(10)
@@ -154,6 +154,7 @@ private:
154
154
  add("default_server_port", UINT_TYPE, REQUIRED);
155
155
  add("default_sticky_sessions", BOOL_TYPE, OPTIONAL, false);
156
156
  add("default_sticky_sessions_cookie_name", STRING_TYPE, OPTIONAL, DEFAULT_STICKY_SESSIONS_COOKIE_NAME);
157
+ add("default_sticky_sessions_cookie_attributes", STRING_TYPE, OPTIONAL, DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES);
157
158
  add("server_software", STRING_TYPE, OPTIONAL, SERVER_TOKEN_NAME "/" PASSENGER_VERSION);
158
159
  add("vary_turbocache_by_cookie", STRING_TYPE, OPTIONAL);
159
160
 
@@ -419,6 +420,7 @@ public:
419
420
  StaticString defaultServerPort;
420
421
  StaticString serverSoftware;
421
422
  StaticString defaultStickySessionsCookieName;
423
+ StaticString defaultStickySessionsCookieAttributes;
422
424
  StaticString defaultVaryTurbocacheByCookie;
423
425
 
424
426
  StaticString defaultFriendlyErrorPages;
@@ -451,6 +453,7 @@ public:
451
453
  defaultServerPort(psg_pstrdup(pool, config["default_server_port"].asString())),
452
454
  serverSoftware(psg_pstrdup(pool, config["server_software"].asString())),
453
455
  defaultStickySessionsCookieName(psg_pstrdup(pool, config["default_sticky_sessions_cookie_name"].asString())),
456
+ defaultStickySessionsCookieAttributes(psg_pstrdup(pool, config["default_sticky_sessions_cookie_attributes"].asString())),
454
457
  defaultVaryTurbocacheByCookie(psg_pstrdup(pool, config["vary_turbocache_by_cookie"].asString())),
455
458
 
456
459
  defaultFriendlyErrorPages(psg_pstrdup(pool, config["default_friendly_error_pages"].asString())),
@@ -768,6 +768,19 @@ Controller::constructHeaderBuffersForResponse(Request *req, struct iovec *buffer
768
768
  dataSize += baseURI.size();
769
769
  INC_BUFFER_ITER(i);
770
770
 
771
+
772
+ StaticString stickyAttributes = req->options.stickySessionsCookieAttributes;
773
+ if (stickyAttributes.size() > 0) {
774
+ PUSH_STATIC_BUFFER("; ");
775
+ if (buffers != NULL) {
776
+ BEGIN_PUSH_NEXT_BUFFER();
777
+ buffers[i].iov_base = (void *) stickyAttributes.data();
778
+ buffers[i].iov_len = stickyAttributes.size();
779
+ }
780
+ dataSize += stickyAttributes.size();
781
+ INC_BUFFER_ITER(i);
782
+ }
783
+
771
784
  PUSH_STATIC_BUFFER("\r\n");
772
785
  }
773
786
 
@@ -153,6 +153,7 @@ Controller::initializePoolOptions(Client *client, Request *req, RequestAnalysis
153
153
 
154
154
  if (options != NULL) {
155
155
  req->options = **options;
156
+ fillPoolOption(req, req->options.baseURI, "!~SCRIPT_NAME");
156
157
  } else {
157
158
  createNewPoolOptions(client, req, hAppGroupName);
158
159
  }
@@ -202,6 +203,7 @@ Controller::fillPoolOptionsFromConfigCaches(Options &options,
202
203
  options.loadShellEnvvars = requestConfig->defaultLoadShellEnvvars;
203
204
  options.statThrottleRate = mainConfig.statThrottleRate;
204
205
  options.maxRequests = requestConfig->defaultMaxRequests;
206
+ options.stickySessionsCookieAttributes = requestConfig->defaultStickySessionsCookieAttributes;
205
207
 
206
208
  /******************************/
207
209
  }
@@ -377,6 +379,7 @@ Controller::createNewPoolOptions(Client *client, Request *req,
377
379
  fillPoolOption(req, options.fileDescriptorUlimit, "!~PASSENGER_APP_FILE_DESCRIPTOR_ULIMIT");
378
380
  fillPoolOption(req, options.raiseInternalError, "!~PASSENGER_RAISE_INTERNAL_ERROR");
379
381
  fillPoolOption(req, options.lveMinUid, "!~PASSENGER_LVE_MIN_UID");
382
+ fillPoolOption(req, options.stickySessionsCookieAttributes, "!~PASSENGER_STICKY_SESSIONS_COOKIE_ATTRIBUTES");
380
383
 
381
384
  // maxProcesses is configured per-application by the (Enterprise) maxInstances option (and thus passed
382
385
  // via request headers). In OSS the max processes can also be configured, but on a global level
@@ -70,6 +70,7 @@ Controller::preinitialize() {
70
70
  PASSENGER_SHOW_VERSION_IN_HEADER = "!~PASSENGER_SHOW_VERSION_IN_HEADER";
71
71
  PASSENGER_STICKY_SESSIONS = "!~PASSENGER_STICKY_SESSIONS";
72
72
  PASSENGER_STICKY_SESSIONS_COOKIE_NAME = "!~PASSENGER_STICKY_SESSIONS_COOKIE_NAME";
73
+ PASSENGER_STICKY_SESSIONS_COOKIE_ATTRIBUTES = "!~PASSENGER_STICKY_SESSIONS_COOKIE_ATTRIBUTES";
73
74
  PASSENGER_REQUEST_OOB_WORK = "!~Request-OOB-Work";
74
75
  REMOTE_ADDR = "!~REMOTE_ADDR";
75
76
  REMOTE_PORT = "!~REMOTE_PORT";
@@ -173,6 +173,9 @@ coreUsage() {
173
173
  printf(" --sticky-sessions-cookie-name NAME\n");
174
174
  printf(" Cookie name to use for sticky sessions.\n");
175
175
  printf(" Default: " DEFAULT_STICKY_SESSIONS_COOKIE_NAME "\n");
176
+ printf(" --sticky-sessions-cookie-attributes 'NAME1=VALUE1; NAME2'\n");
177
+ printf(" The attributes to use for the sticky session cookie.\n");
178
+ printf(" Default: " DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES "\n");
176
179
  printf(" --vary-turbocache-by-cookie NAME\n");
177
180
  printf(" Vary the turbocache by the cookie of the given name\n");
178
181
  printf(" --disable-turbocaching\n");
@@ -415,9 +415,11 @@ doSleep(int sec) {
415
415
 
416
416
  static void
417
417
  maybeDeletePidFile() {
418
+ up_privilege();
418
419
  if (pidFile != NULL) {
419
420
  unlink(pidFile);
420
421
  }
422
+ down_privilege();
421
423
  }
422
424
 
423
425
  static void
@@ -151,7 +151,7 @@ using namespace std;
151
151
  * security_update_checker_interval unsigned integer - default(86400)
152
152
  * security_update_checker_proxy_url string - -
153
153
  * security_update_checker_url string - default("https://securitycheck.phusionpassenger.com/v1/check.json")
154
- * server_software string - default("Phusion_Passenger/6.0.4")
154
+ * server_software string - default("Phusion_Passenger/6.0.5")
155
155
  * setsid boolean - default(false)
156
156
  * show_version_in_header boolean - default(true)
157
157
  * single_app_mode_app_root string - default,read_only
@@ -1020,6 +1020,10 @@ private:
1020
1020
  env = (apr_table_entry_t*) env_arr->elts;
1021
1021
 
1022
1022
  for (i = 0; i < env_arr->nelts; ++i) {
1023
+ if ((strcmp(env[i].key, "SCRIPT_NAME") == 0)
1024
+ || (strcmp(env[i].key, "PATH_INFO") == 0)) {
1025
+ continue;
1026
+ }
1023
1027
  envvarsData.append(env[i].key);
1024
1028
  envvarsData.append("\0", 1);
1025
1029
  if (env[i].val != NULL) {
@@ -68,6 +68,7 @@
68
68
  #define DEFAULT_SPAWN_METHOD "smart"
69
69
  #define DEFAULT_START_TIMEOUT 90000
70
70
  #define DEFAULT_STAT_THROTTLE_RATE 10
71
+ #define DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES "SameSite=Lax; Secure;"
71
72
  #define DEFAULT_STICKY_SESSIONS_COOKIE_NAME "_passenger_route"
72
73
  #define DEFAULT_WEB_APP_USER "nobody"
73
74
  #define ENTERPRISE_URL "https://www.phusionpassenger.com/enterprise"
@@ -81,7 +82,7 @@
81
82
  #define PASSENGER_API_VERSION_MAJOR 0
82
83
  #define PASSENGER_API_VERSION_MINOR 3
83
84
  #define PASSENGER_DEFAULT_USER "nobody"
84
- #define PASSENGER_VERSION "6.0.4"
85
+ #define PASSENGER_VERSION "6.0.5"
85
86
  #define POOL_HELPER_THREAD_STACK_SIZE 262144
86
87
  #define PROCESS_SHUTDOWN_TIMEOUT 60
87
88
  #define PROCESS_SHUTDOWN_TIMEOUT_DISPLAY "1 minute"
@@ -132,15 +132,15 @@ shouldSimulateFailure() {
132
132
  _my_errno = errno; \
133
133
  } while ((error_expression) \
134
134
  && _my_errno == EINTR \
135
- && (!this_thread::syscalls_interruptable() \
136
- || !(_intr_requested = this_thread::interruption_requested())) \
135
+ && (!boost::this_thread::syscalls_interruptable() \
136
+ || !(_intr_requested = boost::this_thread::interruption_requested())) \
137
137
  ); \
138
138
  if (OXT_LIKELY(ctx != NULL)) { \
139
139
  ctx->syscall_interruption_lock.lock(); \
140
140
  } \
141
141
  if ((error_expression) \
142
142
  && _my_errno == EINTR \
143
- && this_thread::syscalls_interruptable() \
143
+ && boost::this_thread::syscalls_interruptable() \
144
144
  && _intr_requested) { \
145
145
  throw thread_interrupted(); \
146
146
  } \
@@ -284,8 +284,8 @@ syscalls::close(int fd) {
284
284
  }
285
285
  if (ret == -1
286
286
  && errno == EINTR
287
- && this_thread::syscalls_interruptable()
288
- && this_thread::interruption_requested()) {
287
+ && boost::this_thread::syscalls_interruptable()
288
+ && boost::this_thread::interruption_requested()) {
289
289
  throw thread_interrupted();
290
290
  } else {
291
291
  return ret;
@@ -662,8 +662,8 @@ syscalls::nanosleep(const struct timespec *req, struct timespec *rem) {
662
662
  }
663
663
  } while (ret == -1
664
664
  && e == EINTR
665
- && (!this_thread::syscalls_interruptable()
666
- || !(intr_requested = this_thread::interruption_requested()))
665
+ && (!boost::this_thread::syscalls_interruptable()
666
+ || !(intr_requested = boost::this_thread::interruption_requested()))
667
667
  );
668
668
 
669
669
  if (OXT_UNLIKELY(ctx != NULL)) {
@@ -672,7 +672,7 @@ syscalls::nanosleep(const struct timespec *req, struct timespec *rem) {
672
672
 
673
673
  if (ret == -1
674
674
  && e == EINTR
675
- && this_thread::syscalls_interruptable()
675
+ && boost::this_thread::syscalls_interruptable()
676
676
  && intr_requested) {
677
677
  throw thread_interrupted();
678
678
  }
@@ -748,14 +748,14 @@ syscalls::waitpid(pid_t pid, int *status, int options) {
748
748
  * http://stackoverflow.com/questions/20410943/segmentation-fault-when-accessing-statically-initialized-thread-variable?noredirect=1#comment30483943_20410943
749
749
  * https://bugzilla.redhat.com/show_bug.cgi?id=731228
750
750
  */
751
- __thread int this_thread::_syscalls_interruptable = 1;
751
+ __thread int boost::this_thread::_syscalls_interruptable = 1;
752
752
 
753
753
  bool
754
754
  boost::this_thread::syscalls_interruptable() {
755
755
  return _syscalls_interruptable;
756
756
  }
757
757
  #else
758
- boost::thread_specific_ptr<bool> this_thread::_syscalls_interruptable;
758
+ boost::thread_specific_ptr<bool> boost::this_thread::_syscalls_interruptable;
759
759
 
760
760
  bool
761
761
  boost::this_thread::syscalls_interruptable() {
@@ -107,6 +107,7 @@ class PrespawnLocation
107
107
  def head_request
108
108
  socket.write("HEAD #{request_path} HTTP/1.1\r\n")
109
109
  socket.write("Host: #{request_host}\r\n")
110
+ socket.write("User-Agent: Passenger Prespawn Script\r\n")
110
111
  socket.write("Authorization: Basic " + base64(@uri.userinfo) + "\r\n") if @uri.userinfo
111
112
  socket.write("Connection: close\r\n")
112
113
  socket.write("\r\n")
@@ -542,6 +542,14 @@
542
542
  offsetof(passenger_loc_conf_t, autogenerated.document_root),
543
543
  NULL
544
544
  },
545
+ {
546
+ ngx_string("passenger_temp_path"),
547
+ NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF | NGX_CONF_TAKE1,
548
+ ngx_conf_set_path_slot,
549
+ NGX_HTTP_LOC_CONF_OFFSET,
550
+ offsetof(passenger_loc_conf_t, upstream_config.temp_path),
551
+ NULL
552
+ },
545
553
  {
546
554
  ngx_string("passenger_ignore_headers"),
547
555
  NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF | NGX_CONF_1MORE,
@@ -678,6 +686,14 @@
678
686
  offsetof(passenger_loc_conf_t, autogenerated.sticky_sessions_cookie_name),
679
687
  NULL
680
688
  },
689
+ {
690
+ ngx_string("passenger_sticky_sessions_cookie_attributes"),
691
+ NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF | NGX_CONF_TAKE1,
692
+ passenger_conf_set_sticky_sessions_cookie_attributes,
693
+ NGX_HTTP_LOC_CONF_OFFSET,
694
+ offsetof(passenger_loc_conf_t, autogenerated.sticky_sessions_cookie_attributes),
695
+ NULL
696
+ },
681
697
  {
682
698
  ngx_string("passenger_vary_turbocache_by_cookie"),
683
699
  NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF | NGX_CONF_TAKE1,
@@ -430,5 +430,12 @@ set_manifest_autogenerated_loc_conf_defaults(manifest_gen_ctx_t *ctx, PsgJsonVal
430
430
  "_passenger_route",
431
431
  sizeof("_passenger_route") - 1);
432
432
 
433
+ add_manifest_options_container_static_default_str(ctx,
434
+ options_container,
435
+ "passenger_sticky_sessions_cookie_attributes",
436
+ sizeof("passenger_sticky_sessions_cookie_attributes") - 1,
437
+ "SameSite=Lax; Secure;",
438
+ sizeof("SameSite=Lax; Secure;") - 1);
439
+
433
440
  }
434
441
 
@@ -961,6 +961,18 @@ passenger_conf_set_sticky_sessions_cookie_name(ngx_conf_t *cf, ngx_command_t *cm
961
961
  return ngx_conf_set_str_slot(cf, cmd, conf);
962
962
  }
963
963
 
964
+ static char *
965
+ passenger_conf_set_sticky_sessions_cookie_attributes(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {
966
+ passenger_loc_conf_t *passenger_conf = conf;
967
+
968
+ passenger_conf->autogenerated.sticky_sessions_cookie_attributes_explicitly_set = 1;
969
+ record_loc_conf_source_location(cf, passenger_conf,
970
+ &passenger_conf->autogenerated.sticky_sessions_cookie_attributes_source_file,
971
+ &passenger_conf->autogenerated.sticky_sessions_cookie_attributes_source_line);
972
+
973
+ return ngx_conf_set_str_slot(cf, cmd, conf);
974
+ }
975
+
964
976
  static char *
965
977
  passenger_conf_set_vary_turbocache_by_cookie(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {
966
978
  passenger_loc_conf_t *passenger_conf = conf;
@@ -577,10 +577,14 @@ passenger_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
577
577
  |NGX_HTTP_UPSTREAM_FT_OFF;
578
578
  }
579
579
 
580
- ngx_conf_merge_path_value(cf,
580
+ if (ngx_conf_merge_path_value(cf,
581
581
  &conf->upstream_config.temp_path,
582
582
  prev->upstream_config.temp_path,
583
- &ngx_http_proxy_temp_path);
583
+ &ngx_http_proxy_temp_path)
584
+ != NGX_OK)
585
+ {
586
+ return NGX_CONF_ERROR;
587
+ }
584
588
 
585
589
  #if (NGX_HTTP_CACHE)
586
590
 
@@ -1824,8 +1824,6 @@ passenger_content_handler(ngx_http_request_t *r)
1824
1824
  return NGX_HTTP_INTERNAL_SERVER_ERROR;
1825
1825
  }
1826
1826
 
1827
- //u->pipe->temp_file->path = u->conf->temp_path;
1828
-
1829
1827
  u->pipe->input_filter = ngx_event_pipe_copy_input_filter;
1830
1828
  u->pipe->input_ctx = r;
1831
1829
 
@@ -93,6 +93,8 @@ passenger_create_autogenerated_loc_conf(passenger_autogenerated_loc_conf_t *con
93
93
  conf->sticky_sessions = NGX_CONF_UNSET;
94
94
  conf->sticky_sessions_cookie_name.data = NULL;
95
95
  conf->sticky_sessions_cookie_name.len = 0;
96
+ conf->sticky_sessions_cookie_attributes.data = NULL;
97
+ conf->sticky_sessions_cookie_attributes.len = 0;
96
98
  conf->vary_turbocache_by_cookie.data = NULL;
97
99
  conf->vary_turbocache_by_cookie.len = 0;
98
100
  conf->app_log_file.data = NULL;
@@ -218,6 +220,10 @@ passenger_create_autogenerated_loc_conf(passenger_autogenerated_loc_conf_t *con
218
220
  conf->document_root_source_file.len = 0;
219
221
  conf->document_root_source_line = 0;
220
222
  conf->document_root_explicitly_set = 0;
223
+ conf->upstream_config_temp_path_source_file.data = NULL;
224
+ conf->upstream_config_temp_path_source_file.len = 0;
225
+ conf->upstream_config_temp_path_source_line = 0;
226
+ conf->upstream_config_temp_path_explicitly_set = 0;
221
227
  conf->upstream_config_ignore_headers_source_file.data = NULL;
222
228
  conf->upstream_config_ignore_headers_source_file.len = 0;
223
229
  conf->upstream_config_ignore_headers_source_line = 0;
@@ -286,6 +292,10 @@ passenger_create_autogenerated_loc_conf(passenger_autogenerated_loc_conf_t *con
286
292
  conf->sticky_sessions_cookie_name_source_file.len = 0;
287
293
  conf->sticky_sessions_cookie_name_source_line = 0;
288
294
  conf->sticky_sessions_cookie_name_explicitly_set = 0;
295
+ conf->sticky_sessions_cookie_attributes_source_file.data = NULL;
296
+ conf->sticky_sessions_cookie_attributes_source_file.len = 0;
297
+ conf->sticky_sessions_cookie_attributes_source_line = 0;
298
+ conf->sticky_sessions_cookie_attributes_explicitly_set = 0;
289
299
  conf->vary_turbocache_by_cookie_source_file.data = NULL;
290
300
  conf->vary_turbocache_by_cookie_source_file.len = 0;
291
301
  conf->vary_turbocache_by_cookie_source_line = 0;
@@ -238,6 +238,12 @@ passenger_serialize_autogenerated_loc_conf_to_headers(ngx_conf_t *cf, passenger_
238
238
  len += sizeof("\r\n") - 1;
239
239
  }
240
240
 
241
+ if (conf->autogenerated.sticky_sessions_cookie_attributes.data != NULL) {
242
+ len += sizeof("!~PASSENGER_STICKY_SESSIONS_COOKIE_ATTRIBUTES: ") - 1;
243
+ len += conf->autogenerated.sticky_sessions_cookie_attributes.len;
244
+ len += sizeof("\r\n") - 1;
245
+ }
246
+
241
247
  if (conf->autogenerated.vary_turbocache_by_cookie.data != NULL) {
242
248
  len += sizeof("!~PASSENGER_VARY_TURBOCACHE_BY_COOKIE: ") - 1;
243
249
  len += conf->autogenerated.vary_turbocache_by_cookie.len;
@@ -515,6 +521,15 @@ passenger_serialize_autogenerated_loc_conf_to_headers(ngx_conf_t *cf, passenger_
515
521
  conf->autogenerated.sticky_sessions_cookie_name.len);
516
522
  pos = ngx_copy(pos, (const u_char *) "\r\n", sizeof("\r\n") - 1);
517
523
  }
524
+ if (conf->autogenerated.sticky_sessions_cookie_attributes.data != NULL) {
525
+ pos = ngx_copy(pos,
526
+ "!~PASSENGER_STICKY_SESSIONS_COOKIE_ATTRIBUTES: ",
527
+ sizeof("!~PASSENGER_STICKY_SESSIONS_COOKIE_ATTRIBUTES: ") - 1);
528
+ pos = ngx_copy(pos,
529
+ conf->autogenerated.sticky_sessions_cookie_attributes.data,
530
+ conf->autogenerated.sticky_sessions_cookie_attributes.len);
531
+ pos = ngx_copy(pos, (const u_char *) "\r\n", sizeof("\r\n") - 1);
532
+ }
518
533
  if (conf->autogenerated.vary_turbocache_by_cookie.data != NULL) {
519
534
  pos = ngx_copy(pos,
520
535
  "!~PASSENGER_VARY_TURBOCACHE_BY_COOKIE: ",
@@ -622,6 +622,20 @@ generate_config_manifest_for_autogenerated_loc_conf(manifest_gen_ctx_t *ctx, pas
622
622
  (const char *) plcf->autogenerated.sticky_sessions_cookie_name.data,
623
623
  plcf->autogenerated.sticky_sessions_cookie_name.len);
624
624
  }
625
+ if (plcf->autogenerated.sticky_sessions_cookie_attributes_explicitly_set) {
626
+ find_or_create_manifest_app_and_loc_options_containers(ctx,
627
+ plcf, cscf, clcf, &app_options_container, &loc_options_container);
628
+ option_container = find_or_create_manifest_option_container(ctx,
629
+ loc_options_container,
630
+ "passenger_sticky_sessions_cookie_attributes",
631
+ sizeof("passenger_sticky_sessions_cookie_attributes") - 1);
632
+ hierarchy_member = add_manifest_option_container_hierarchy_member(option_container,
633
+ &plcf->autogenerated.sticky_sessions_cookie_attributes_source_file,
634
+ plcf->autogenerated.sticky_sessions_cookie_attributes_source_line);
635
+ psg_json_value_set_str(hierarchy_member, "value",
636
+ (const char *) plcf->autogenerated.sticky_sessions_cookie_attributes.data,
637
+ plcf->autogenerated.sticky_sessions_cookie_attributes.len);
638
+ }
625
639
  if (plcf->autogenerated.vary_turbocache_by_cookie_explicitly_set) {
626
640
  find_or_create_manifest_app_and_loc_options_containers(ctx,
627
641
  plcf, cscf, clcf, &app_options_container, &loc_options_container);
@@ -653,6 +667,7 @@ generate_config_manifest_for_autogenerated_loc_conf(manifest_gen_ctx_t *ctx, pas
653
667
 
654
668
  /*
655
669
  * No autogenerated code for:
670
+ * passenger_temp_path
656
671
  * passenger_ignore_headers
657
672
  * passenger_buffer_size
658
673
  * passenger_buffers
@@ -157,6 +157,9 @@ passenger_merge_autogenerated_loc_conf(passenger_autogenerated_loc_conf_t *conf,
157
157
  ngx_conf_merge_str_value(conf->sticky_sessions_cookie_name,
158
158
  prev->sticky_sessions_cookie_name,
159
159
  "_passenger_route");
160
+ ngx_conf_merge_str_value(conf->sticky_sessions_cookie_attributes,
161
+ prev->sticky_sessions_cookie_attributes,
162
+ "SameSite=Lax; Secure;");
160
163
  ngx_conf_merge_str_value(conf->vary_turbocache_by_cookie,
161
164
  prev->vary_turbocache_by_cookie,
162
165
  NULL);
@@ -75,6 +75,7 @@ typedef struct {
75
75
  ngx_str_t ruby;
76
76
  ngx_str_t spawn_method;
77
77
  ngx_str_t startup_file;
78
+ ngx_str_t sticky_sessions_cookie_attributes;
78
79
  ngx_str_t sticky_sessions_cookie_name;
79
80
  ngx_str_t user;
80
81
  ngx_str_t vary_turbocache_by_cookie;
@@ -115,6 +116,7 @@ typedef struct {
115
116
  ngx_str_t start_timeout_source_file;
116
117
  ngx_str_t startup_file_source_file;
117
118
  ngx_str_t sticky_sessions_source_file;
119
+ ngx_str_t sticky_sessions_cookie_attributes_source_file;
118
120
  ngx_str_t sticky_sessions_cookie_name_source_file;
119
121
  ngx_str_t upstream_config_buffer_size_source_file;
120
122
  ngx_str_t upstream_config_buffering_source_file;
@@ -126,6 +128,7 @@ typedef struct {
126
128
  ngx_str_t upstream_config_pass_headers_source_file;
127
129
  ngx_str_t upstream_config_read_timeout_source_file;
128
130
  ngx_str_t upstream_config_request_buffering_source_file;
131
+ ngx_str_t upstream_config_temp_path_source_file;
129
132
  ngx_str_t user_source_file;
130
133
  ngx_str_t vary_turbocache_by_cookie_source_file;
131
134
 
@@ -165,6 +168,7 @@ typedef struct {
165
168
  ngx_uint_t start_timeout_source_line;
166
169
  ngx_uint_t startup_file_source_line;
167
170
  ngx_uint_t sticky_sessions_source_line;
171
+ ngx_uint_t sticky_sessions_cookie_attributes_source_line;
168
172
  ngx_uint_t sticky_sessions_cookie_name_source_line;
169
173
  ngx_uint_t upstream_config_buffer_size_source_line;
170
174
  ngx_uint_t upstream_config_buffering_source_line;
@@ -176,6 +180,7 @@ typedef struct {
176
180
  ngx_uint_t upstream_config_pass_headers_source_line;
177
181
  ngx_uint_t upstream_config_read_timeout_source_line;
178
182
  ngx_uint_t upstream_config_request_buffering_source_line;
183
+ ngx_uint_t upstream_config_temp_path_source_line;
179
184
  ngx_uint_t user_source_line;
180
185
  ngx_uint_t vary_turbocache_by_cookie_source_line;
181
186
 
@@ -215,6 +220,7 @@ typedef struct {
215
220
  ngx_int_t start_timeout_explicitly_set;
216
221
  ngx_int_t startup_file_explicitly_set;
217
222
  ngx_int_t sticky_sessions_explicitly_set;
223
+ ngx_int_t sticky_sessions_cookie_attributes_explicitly_set;
218
224
  ngx_int_t sticky_sessions_cookie_name_explicitly_set;
219
225
  ngx_int_t upstream_config_buffer_size_explicitly_set;
220
226
  ngx_int_t upstream_config_buffering_explicitly_set;
@@ -226,6 +232,7 @@ typedef struct {
226
232
  ngx_int_t upstream_config_pass_headers_explicitly_set;
227
233
  ngx_int_t upstream_config_read_timeout_explicitly_set;
228
234
  ngx_int_t upstream_config_request_buffering_explicitly_set;
235
+ ngx_int_t upstream_config_temp_path_explicitly_set;
229
236
  ngx_int_t user_explicitly_set;
230
237
  ngx_int_t vary_turbocache_by_cookie_explicitly_set;
231
238
  } passenger_autogenerated_loc_conf_t;
@@ -31,20 +31,20 @@ module PhusionPassenger
31
31
 
32
32
  PACKAGE_NAME = 'passenger'
33
33
  # Run 'rake src/cxx_supportlib/Constants.h configkit_schemas_inline_comments' after changing this number.
34
- VERSION_STRING = '6.0.4'
34
+ VERSION_STRING = '6.0.5'
35
35
 
36
36
  # Tip: find the SHA-256 with ./dev/nginx_version_sha2 <VERSION>
37
- PREFERRED_NGINX_VERSION = '1.17.3'
38
- NGINX_SHA256_CHECKSUM = '3b84fe1c2cf9ca22fde370e486a9ab16b6427df1b6ea62cdb61978c9f34d0f3c'
37
+ PREFERRED_NGINX_VERSION = '1.18.0'
38
+ NGINX_SHA256_CHECKSUM = '4c373e7ab5bf91d34a4f11a0c9496561061ba5eee6020db272a17a7228d35f99'
39
39
 
40
40
  # Packaging may be locked to an older version due to the specific module configuration being
41
41
  # incompatible with the version we prefer (latest stable).
42
- PACKAGING_PREFERRED_NGINX_VERSION = '1.17.3'
43
- PACKAGING_NGINX_SHA256_CHECKSUM = '3b84fe1c2cf9ca22fde370e486a9ab16b6427df1b6ea62cdb61978c9f34d0f3c'
42
+ PACKAGING_PREFERRED_NGINX_VERSION = '1.18.0'
43
+ PACKAGING_NGINX_SHA256_CHECKSUM = '4c373e7ab5bf91d34a4f11a0c9496561061ba5eee6020db272a17a7228d35f99'
44
44
 
45
45
  # sha256sum of the .tar.gz
46
- PREFERRED_PCRE_VERSION = '8.43'
47
- PCRE_SHA256_CHECKSUM = '0b8e7465dc5e98c757cc3650a20a7843ee4c3edf50aaf60bb33fd879690d2c73'
46
+ PREFERRED_PCRE_VERSION = '8.44'
47
+ PCRE_SHA256_CHECKSUM = 'aecafd4af3bd0f3935721af77b889d9024b2e01d96b58471bd91a3063fb47728'
48
48
 
49
49
  STANDALONE_INTERFACE_VERSION = 1
50
50
 
@@ -547,6 +547,15 @@ APACHE2_CONFIGURATION_OPTIONS = [
547
547
  :default_expr => 'DEFAULT_STICKY_SESSIONS_COOKIE_NAME',
548
548
  :desc => 'The cookie name to use for sticky sessions.'
549
549
  },
550
+ {
551
+ :name => 'PassengerStickySessionsCookieAttributes',
552
+ :type => :string,
553
+ :context => :location,
554
+ :htaccess_context => ['OR_ALL'],
555
+ :default => DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES,
556
+ :default_expr => 'DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES',
557
+ :desc => 'The attributes to use for the sticky session cookie.'
558
+ },
550
559
  {
551
560
  :name => 'PassengerBufferResponse',
552
561
  :type => :flag,
@@ -62,6 +62,7 @@ module PhusionPassenger
62
62
  PASSENGER_DEFAULT_USER = "nobody"
63
63
  DEFAULT_CONCURRENCY_MODEL = "process"
64
64
  DEFAULT_STICKY_SESSIONS_COOKIE_NAME = "_passenger_route"
65
+ DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES = "SameSite=Lax; Secure;"
65
66
  DEFAULT_APP_THREAD_COUNT = 1
66
67
  DEFAULT_RESPONSE_BUFFER_HIGH_WATERMARK = 1024 * 1024 * 128
67
68
  DEFAULT_MAX_REQUEST_QUEUE_SIZE = 100
@@ -316,10 +316,8 @@ module PhusionPassenger
316
316
  ActiveRecord::Base.clear_all_connections!
317
317
  elsif ActiveRecord::Base.respond_to?(:clear_active_connections!)
318
318
  ActiveRecord::Base.clear_active_connections!
319
- elsif ActiveRecord::Base.respond_to?(:connected?) &&
320
- ActiveRecord::Base.connected?
321
- ActiveRecord::Base.establish_connection
322
319
  end
320
+ ActiveRecord::Base.establish_connection
323
321
  end
324
322
 
325
323
  # Fire off events.
@@ -556,6 +556,14 @@ NGINX_CONFIGURATION_OPTIONS = [
556
556
  :type => :string,
557
557
  :header => nil
558
558
  },
559
+ {
560
+ :name => 'passenger_temp_path',
561
+ :scope => :location,
562
+ :type => :string,
563
+ :function => 'ngx_conf_set_path_slot',
564
+ :field => 'upstream_config.temp_path',
565
+ :auto_generate_nginx_tracking_code => false
566
+ },
559
567
  {
560
568
  :name => 'passenger_ignore_headers',
561
569
  :scope => :location,
@@ -681,6 +689,12 @@ NGINX_CONFIGURATION_OPTIONS = [
681
689
  :type => :string,
682
690
  :default => DEFAULT_STICKY_SESSIONS_COOKIE_NAME
683
691
  },
692
+ {
693
+ :name => 'passenger_sticky_sessions_cookie_attributes',
694
+ :scope => :location,
695
+ :type => :string,
696
+ :default => DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES
697
+ },
684
698
  {
685
699
  :name => 'passenger_vary_turbocache_by_cookie',
686
700
  :scope => :location,
@@ -279,7 +279,7 @@ module PhusionPassenger
279
279
  "-c '#{filename}' -o '#{filename}.o'",
280
280
  flags)
281
281
  result = run_compiler(description, command, filename, source, true)
282
- result = result && result[:result] && result[:output] !~ /unknown warning option/i
282
+ result = result && result[:result] && result[:output] !~ /unknown warning option|unrecognized command line option/i
283
283
  end
284
284
  return false if !result
285
285
 
@@ -25,6 +25,16 @@
25
25
 
26
26
  PhusionPassenger.require_passenger_lib 'utils/tee_input'
27
27
 
28
+ if defined?(::Rack::BodyProxy) && !::Rack::BodyProxy.new("").respond_to?(:each)
29
+ module ::Rack
30
+ class BodyProxy
31
+ def each
32
+ @body.each { |body| yield body }
33
+ end
34
+ end
35
+ end
36
+ end
37
+
28
38
  module PhusionPassenger
29
39
  module Rack
30
40
 
@@ -436,6 +436,12 @@ module PhusionPassenger
436
436
  :desc => "Cookie name to use for sticky sessions.\n" \
437
437
  "Default: #{DEFAULT_STICKY_SESSIONS_COOKIE_NAME}"
438
438
  },
439
+ {
440
+ :name => :sticky_sessions_cookie_attributes,
441
+ :type_desc => "'NAME1=VALUE1; NAME2'",
442
+ :desc => "The attributes to use for the sticky session cookie.\n" \
443
+ "Default: #{DEFAULT_STICKY_SESSIONS_COOKIE_ATTRIBUTES}"
444
+ },
439
445
  {
440
446
  :name => :vary_turbocache_by_cookie,
441
447
  :type_desc => 'NAME',
@@ -175,6 +175,7 @@ module PhusionPassenger
175
175
  add_flag_param(command, :sticky_sessions, "--sticky-sessions")
176
176
  add_param(command, :vary_turbocache_by_cookie, "--vary-turbocache-by-cookie")
177
177
  add_param(command, :sticky_sessions_cookie_name, "--sticky-sessions-cookie-name")
178
+ add_param(command, :sticky_sessions_cookie_attributes, "--sticky-sessions-cookie-attributes")
178
179
  add_param(command, :ruby, "--ruby")
179
180
  add_param(command, :python, "--python")
180
181
  add_param(command, :nodejs, "--nodejs")
@@ -286,7 +286,7 @@ module PhusionPassenger
286
286
  if fix_existing_indenting
287
287
  # Remove extraneous indenting by 'if' blocks
288
288
  # and collapse multiple empty newlines
289
- result.gsub!(/;[\n ]+/, ";\n")
289
+ result.gsub!(/;[\n ]+$/, ";\n")
290
290
  end
291
291
 
292
292
  # Set indenting
@@ -24,6 +24,10 @@
24
24
 
25
25
  PhusionPassenger.require_passenger_lib 'utils' # So that we can know whether #writev is supported.
26
26
 
27
+ # https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/
28
+ def ruby2_keywords(*)
29
+ end if RUBY_VERSION < "2.7"
30
+
27
31
  module PhusionPassenger
28
32
  module Utils
29
33
 
@@ -117,7 +121,7 @@ module PhusionPassenger
117
121
  raise annotate(e)
118
122
  end
119
123
 
120
- def write_nonblock(string, *args)
124
+ ruby2_keywords def write_nonblock(string, *args)
121
125
  @socket.write_nonblock(string, *args)
122
126
  rescue => e
123
127
  raise annotate(e)
@@ -141,25 +145,25 @@ module PhusionPassenger
141
145
  raise annotate(e)
142
146
  end if IO.method_defined?(:writev3)
143
147
 
144
- def send(*args)
148
+ ruby2_keywords def send(*args)
145
149
  @socket.send(*args)
146
150
  rescue => e
147
151
  raise annotate(e)
148
152
  end
149
153
 
150
- def sendmsg(*args)
154
+ ruby2_keywords def sendmsg(*args)
151
155
  @socket.sendmsg(*args)
152
156
  rescue => e
153
157
  raise annotate(e)
154
158
  end
155
159
 
156
- def sendmsg_nonblock(*args)
160
+ ruby2_keywords def sendmsg_nonblock(*args)
157
161
  @socket.sendmsg_nonblock(*args)
158
162
  rescue => e
159
163
  raise annotate(e)
160
164
  end
161
165
 
162
- def puts(*args)
166
+ ruby2_keywords def puts(*args)
163
167
  @socket.puts(*args)
164
168
  rescue => e
165
169
  raise annotate(e)
@@ -172,7 +176,7 @@ module PhusionPassenger
172
176
  raise annotate(e)
173
177
  end
174
178
 
175
- def read(*args)
179
+ ruby2_keywords def read(*args)
176
180
  if @simulate_eof
177
181
  length, buffer = args
178
182
  if buffer
@@ -191,14 +195,14 @@ module PhusionPassenger
191
195
  raise annotate(e)
192
196
  end
193
197
 
194
- def read_nonblock(*args)
198
+ ruby2_keywords def read_nonblock(*args)
195
199
  raise EOFError, "end of file reached" if @simulate_eof
196
200
  @socket.read_nonblock(*args)
197
201
  rescue => e
198
202
  raise annotate(e)
199
203
  end
200
204
 
201
- def readpartial(*args)
205
+ ruby2_keywords def readpartial(*args)
202
206
  raise EOFError, "end of file reached" if @simulate_eof
203
207
  @socket.readpartial(*args)
204
208
  rescue => e
@@ -212,21 +216,21 @@ module PhusionPassenger
212
216
  raise annotate(e)
213
217
  end
214
218
 
215
- def recv(*args)
219
+ ruby2_keywords def recv(*args)
216
220
  raise EOFError, "end of file reached" if @simulate_eof
217
221
  @socket.recv(*args)
218
222
  rescue => e
219
223
  raise annotate(e)
220
224
  end
221
225
 
222
- def recvfrom(*args)
226
+ ruby2_keywords def recvfrom(*args)
223
227
  raise EOFError, "end of file reached" if @simulate_eof
224
228
  @socket.recvfrom(*args)
225
229
  rescue => e
226
230
  raise annotate(e)
227
231
  end
228
232
 
229
- def recvfrom_nonblock(*args)
233
+ ruby2_keywords def recvfrom_nonblock(*args)
230
234
  raise EOFError, "end of file reached" if @simulate_eof
231
235
  @socket.recvfrom_nonblock(*args)
232
236
  rescue => e
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: passenger
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.4
4
+ version: 6.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phusion - http://www.phusion.nl/
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-18 00:00:00.000000000 Z
11
+ date: 2020-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: etc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: A modern web server and application server for Ruby, Python and Node.js,
42
56
  optimized for performance, low memory usage and ease of use.
43
57
  email: software-signing@phusion.nl
@@ -4459,7 +4473,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
4459
4473
  - !ruby/object:Gem::Version
4460
4474
  version: '0'
4461
4475
  requirements: []
4462
- rubyforge_project: passenger
4476
+ rubyforge_project:
4463
4477
  rubygems_version: 2.6.11
4464
4478
  signing_key:
4465
4479
  specification_version: 4