On Thursday, December 14, 2017 at 10:24:10 PM UTC-8, torgeriedel wrote:
>
> Am 14.12.2017 um 21:03 schrieb Ryan Ollos:
>
>
>
> On Thu, Dec 14, 2017 at 9:41 AM, Torge Riedel <torgerie...@gmx.de> wrote:
>
>> Hi,
>>
>> I've set up a trac via https using latest stable trac (1.2.2).
>>
>> I've found a nice tool checking site configuration: 
>> https://observatory.mozilla.org/
>>
>> Checking my trac installation I got a poor "D" rating.
>>
>> Following is the list of tests failed resulting in a negative score:
>>
>> Test                                   Score     Explanation
>> Content Security Policy     -25         Content Security Policy (CSP) 
>> header not implemented
>> Contribute.json                 -10         Contribute.json file cannot 
>> be parsed
>> X-Content-Type-Options    -5           X-Content-Type-Options header not 
>> implemented
>> X-Frame-Options               -20         X-Frame-Options (XFO) header 
>> not implemented
>> X-XSS-Protection               -10         X-XSS-Protection header not 
>> implemented
>>
>> Since other sites hosted on my server get better ratings there must be a 
>> chance to fix this in the code. Another way is to add such headers to the 
>> apache config, but I'm not sure whether I am breaking something in trac and 
>> it's less flexible.
>>
>> Is there a chance to improve the headers trac is sending? Can I help with 
>> whatever is helpful?
>>
>> Regards
>> Torge
>>
>
> Some of all of this may be best addressed through your web server 
> configuration. Are you running Apache?
>
> - Ryan
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Trac Development" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to trac-dev+unsubscr...@googlegroups.com.
> To post to this group, send email to trac-dev@googlegroups.com.
> Visit this group at https://groups.google.com/group/trac-dev.
> For more options, visit https://groups.google.com/d/optout.
>
> Yes, I am running apache. And I have full access to my server. Others 
> might not have full access to the apache config and are able to add headers 
> or mod_headers is not activated.
>
> That's why I think as much as possible of such headers should be sent by 
> trac.
>

Any such headers need to be configurable, but we want to avoid 
configuration option bloat. What we might be able to do is add an 
[http-headers] configuration section to trac.ini. We could specify some 
common configurations to the documentation.

Example configuration:

[http-headers]
X-Frame-Options = DENY
X-XSS-Protection = 1; mode=block

The option names as read by ConfigParser are case-insensitive, but I think 
that may be okay as it looks like the HTTP headers are also 
case-insensitive.

I've done a PoC patch against 1.2-stable, but I'll want to hear what Jun 
has to say before suggesting this is the right solution, since he has much 
more experience with web server internals and configuration.

diff --git a/trac/web/api.py b/trac/web/api.py
index b2e76f948..521cd59ab 100644
--- a/trac/web/api.py
+++ b/trac/web/api.py
@@ -686,6 +686,8 @@ class Request(object):
         self.send_header('Content-Type', content_type + ';charset=utf-8')
         if isinstance(content, basestring):
             self.send_header('Content-Length', len(content))
+        for name, val in getattr(self, 'configurable_headers', []):
+            self.send_header(name, val)
         self.end_headers()

         if self.method != 'HEAD':
diff --git a/trac/web/main.py b/trac/web/main.py
index 56b493d38..1a54dce82 100644
--- a/trac/web/main.py
+++ b/trac/web/main.py
@@ -38,8 +38,9 @@ from genshi.output import DocType
 from genshi.template import TemplateLoader

 from trac import __version__ as TRAC_VERSION
-from trac.config import BoolOption, ChoiceOption, ConfigurationError, \
-                        ExtensionOption, Option, OrderedExtensionsOption
+from trac.config import (
+    BoolOption, ChoiceOption, ConfigSection, ConfigurationError,
+    ExtensionOption, Option, OrderedExtensionsOption)
 from trac.core import *
 from trac.env import open_environment
 from trac.loader import get_plugin_info, match_plugins_to_frames
@@ -164,6 +165,10 @@ class RequestDispatcher(Component):
         """The header to use if `use_xsendfile` is enabled. If Nginx is 
used,
         set `X-Accel-Redirect`. (''since 1.0.6'')""")

+    configurable_headers = ConfigSection('http-headers', """
+        Headers to be added to the HTTP request.
+        """)
+
     # Public API

     def authenticate(self, req):
@@ -317,6 +322,7 @@ class RequestDispatcher(Component):
             'tz': self._get_timezone,
             'use_xsendfile': self._get_use_xsendfile,
             'xsendfile_header': self._get_xsendfile_header,
+            'configurable_headers': self._get_configurable_headers,
         })

     @lazy
@@ -426,6 +432,10 @@ class RequestDispatcher(Component):
                               header)
             return None

+    def _get_configurable_headers(self, req):
+        for name, val in self.configurable_headers.options():
+            yield name, val
+
     def _pre_process_request(self, req, chosen_handler):
         for filter_ in self.filters:
             chosen_handler = filter_.pre_process_request(req, 
chosen_handler)
(pve) ~/Documents/Workspace/trac-dev/teo-rjollos.git$clear
(pve) ~/Documents/Workspace/trac-dev/teo-rjollos.git$git diff
diff --git a/trac/web/api.py b/trac/web/api.py
index b2e76f948..521cd59ab 100644
--- a/trac/web/api.py
+++ b/trac/web/api.py
@@ -686,6 +686,8 @@ class Request(object):
         self.send_header('Content-Type', content_type + ';charset=utf-8')
         if isinstance(content, basestring):
             self.send_header('Content-Length', len(content))
+        for name, val in getattr(self, 'configurable_headers', []):
+            self.send_header(name, val)
         self.end_headers()

         if self.method != 'HEAD':
diff --git a/trac/web/main.py b/trac/web/main.py
index 56b493d38..8f66906e3 100644
--- a/trac/web/main.py
+++ b/trac/web/main.py
@@ -38,8 +38,9 @@ from genshi.output import DocType
 from genshi.template import TemplateLoader

 from trac import __version__ as TRAC_VERSION
-from trac.config import BoolOption, ChoiceOption, ConfigurationError, \
-                        ExtensionOption, Option, OrderedExtensionsOption
+from trac.config import (
+    BoolOption, ChoiceOption, ConfigSection, ConfigurationError,
+    ExtensionOption, Option, OrderedExtensionsOption)
 from trac.core import *
 from trac.env import open_environment
 from trac.loader import get_plugin_info, match_plugins_to_frames
@@ -164,6 +165,10 @@ class RequestDispatcher(Component):
         """The header to use if `use_xsendfile` is enabled. If Nginx is 
used,
         set `X-Accel-Redirect`. (''since 1.0.6'')""")

+    configurable_headers = ConfigSection('http-headers', """
+        Headers to be added to the HTTP request. (''since 1.2.3'')
+        """)
+
     # Public API

     def authenticate(self, req):
@@ -317,6 +322,7 @@ class RequestDispatcher(Component):
             'tz': self._get_timezone,
             'use_xsendfile': self._get_use_xsendfile,
             'xsendfile_header': self._get_xsendfile_header,
+            'configurable_headers': self._get_configurable_headers,
         })

     @lazy
@@ -426,6 +432,10 @@ class RequestDispatcher(Component):
                               header)
             return None

+    def _get_configurable_headers(self, req):
+        for name, val in self.configurable_headers.options():
+            yield name, val
+
     def _pre_process_request(self, req, chosen_handler):
         for filter_ in self.filters:
             chosen_handler = filter_.pre_process_request(req, 
chosen_handler)

- Ryan

-- 
You received this message because you are subscribed to the Google Groups "Trac 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to trac-dev+unsubscr...@googlegroups.com.
To post to this group, send email to trac-dev@googlegroups.com.
Visit this group at https://groups.google.com/group/trac-dev.
For more options, visit https://groups.google.com/d/optout.

Reply via email to