From 7cc8a2e93881e34d2695c21c2f302a07f110c5cd Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Mon, 14 Aug 2006 08:40:39 +0000 Subject: [PATCH] Documented new actions that were part of the "minor Privoxy improvements". --- doc/source/user-manual.sgml | 1261 ++++++++++++++++++++++++++++++++--- 1 file changed, 1172 insertions(+), 89 deletions(-) diff --git a/doc/source/user-manual.sgml b/doc/source/user-manual.sgml index 6a28302e..423e6c3b 100644 --- a/doc/source/user-manual.sgml +++ b/doc/source/user-manual.sgml @@ -32,7 +32,7 @@ This file belongs into ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ - $Id: user-manual.sgml,v 1.123.2.43 2005/05/23 09:59:10 hal9 Exp $ + $Id: user-manual.sgml,v 2.11 2006/07/18 14:48:51 david__schmidt Exp $ Copyright (C) 2001- 2003 Privoxy Developers See LICENSE. @@ -58,7 +58,7 @@ -$Id: user-manual.sgml,v 1.123.2.43 2005/05/23 09:59:10 hal9 Exp $ +$Id: user-manual.sgml,v 2.11 2006/07/18 14:48:51 david__schmidt Exp $ + +content-type-overwrite + + + + Typical use: + + Stop useless download menus from popping up, or change the browser's rendering mode + + + + + Effect: + + + Replaces the Content-Type: HTTP server header. + + + + + + Type: + + + Parameterized. + + + + + Parameter: + + + Any string. + + + + + + Notes: + + + The Content-Type: HTTP server header is used by the + browser to decide what to do with the document. The value of this + header can cause the browser to open a download menu instead of + displaying the document by itself, even if the document's format is + supported by the browser. + + + The declared content type can also affect which rendering mode + the browser chooses. If XHTML is delivered as text/html, + many browsers treat it as yet another broken HTML document. + If it is send as application/xml, browsers with + XHTML support will only display it, if the syntax is correct. + + + If you see a web site that proudly uses XHTML buttons, but sets + Content-Type: text/html, you can use Privoxy + to overwrite it with application/xml and validate + the web master's claim inside your XHTML-supporting browser. + If the syntax is incorrect, the browser will complain loudly. + + + You can also go the opposite direction: if your browser prints + error messages instead of rendering a document falsely declared + as XHTML, you can overwrite the content type with + text/html and have it rendered as broken HTML document. + + + By default content-type-overwrite only replaces + Content-Type: headers that look like some kind of text. + If you want to overwrite it unconditionally, you have to combine it with + force-text-mode. + This limitation exists for a reason, think twice before circumventing it. + + + Most of the time it's easier to enable + filter-server-headers + and replace this action with a custom regular expression. It allows you + to activate it for every document of a certain site and it will still + only replace the content types you aimed at. + + + Of course you can apply content-type-overwrite + to a whole site and then make URL based exceptions, but it's a lot + more work to get the same precision. + + + + + + Example usage (sections): + + + # Check if www.example.net/ really uses valid XHTML +{+content-type-overwrite {application/xml}} +www.example.net/ +# but leave the content type unmodified if the URL looks like a style sheet +{-content-type-overwrite} +www.example.net/*.\.css$ +www.example.net/*.style + + + + + + + + + + +crunch-server-header + + + + Typical use: + + Remove a client header Privoxy has no dedicated action for. + + + + + Effect: + + + Deletes every header send by the client that contains the string the user supplied as parameter. + + + + + + Type: + + + Parameterized. + + + + + Parameter: + + + Any string. + + + + + + Notes: + + + This action allows you to block client headers for which no dedicated + Privoxy action exists. + Privoxy will remove every client header that + contains the string you supplied as parameter. + + + Regular expressions are not supported and you can't + use this action to block different headers in the same request, unless + they contain the same string. + + + crunch-client-header is only meant for quick tests. + If you have to block several different headers, or only want to modify + parts of them, you should enable + filter-client-headers + and create your own filter. + + + + Don't block any header without understanding the consequences. + + + + + + + Example usage (section): + + + # Block the non-existent "Privacy-Violation:" client header +{+crunch-client-header {Privacy-Violation:}} +/ + + + + + + + + + + +crunch-if-none-match + + + + Typical use: + + Prevent yet another way to track the user's steps between sessions. + + + + + Effect: + + + Deletes the If-None-Match: HTTP client header. + + + + + + Type: + + + Boolean. + + + + + Parameter: + + + N/A + + + + + + Notes: + + + Removing the If-None-Match: HTTP client header + is useful for filter testing, where you want to force a real + reload instead of getting status code 304 which + would cause the browser to use a cached copy of the page. + + + It is also useful to make sure the header isn't used as a cookie + replacement. + + + Blocking the If-None-Match: header shouldn't cause any + caching problems, as long as the If-Modified-Since: header + isn't blocked as well. + + + It is recommended to use this action together with + hide-if-modified-since + and + overwrite-last-modified. + + + + + + Example usage (section): + + + # Let the browser revalidate cached documents without being tracked across sessions +{+hide-if-modified-since {-1} \ ++overwrite-last-modified {randomize} \ ++crunch-if-none-match} +/ + + + + + + + crunch-incoming-cookies @@ -2296,6 +2569,86 @@ must find a better place for this paragraph + + +crunch-server-header + + + + Typical use: + + Remove a server header Privoxy has no dedicated action for. + + + + + Effect: + + + Deletes every header send by the server that contains the string the user supplied as parameter. + + + + + + Type: + + + Parameterized. + + + + + Parameter: + + + Any string. + + + + + + Notes: + + + This action allows you to block server headers for which no dedicated + Privoxy action exists. Privoxy + will remove every server header that contains the string you supplied as parameter. + + + Regular expressions are not supported and you can't + use this action to block different headers in the same request, unless + they contain the same string. + + + crunch-server-header is only meant for quick tests. + If you have to block several different headers, or only want to modify + parts of them, you should enable + filter-server-headers + and create your own filter. + + + + Don't block any header without understanding the consequences. + + + + + + + Example usage (section): + + + # Crunch server headers that try to prevent caching +{+crunch-server-header {no-cache}} +/ + + + + + + + crunch-outgoing-cookies @@ -2506,7 +2859,7 @@ problem-host.example.com Typical use: - Fool some click-tracking scripts and speed up indirect links + Fool some click-tracking scripts and speed up indirect links. @@ -2514,7 +2867,8 @@ problem-host.example.com Effect: - Cut off all but the last valid URL from requests. + Detects redirection URLs and redirects the browser without contacting + the redirection server first. @@ -2523,16 +2877,27 @@ problem-host.example.com Type: - Boolean. + Parameterized. Parameter: - - N/A - + + + + simple-check to just search for the string http:// + to detect redirection URLs. + + + + + check-decoded-url to decode URLs (if necessary) before searching + for redirection URLs. + + + @@ -2544,31 +2909,62 @@ problem-host.example.com will link to some script on their own servers, giving the destination as a parameter, which will then redirect you to the final target. URLs resulting from this scheme typically look like: - http://some.place/click-tracker.cgi?target=http://some.where.else. + http://www.example.org/click-tracker.cgi?target=http%3a//www.example.net/. Sometimes, there are even multiple consecutive redirects encoded in the URL. These redirections via scripts make your web browsing more traceable, since the server from which you follow such a link can see where you go to. Apart from that, valuable bandwidth and time is wasted, while your - browser ask the server for one redirect after the other. Plus, it feeds + browser asks the server for one redirect after the other. Plus, it feeds the advertisers. This feature is currently not very smart and is scheduled for improvement. - It is likely to break some sites. You should expect to need possibly - many exceptions to this action, if it is enabled by default in - default.action. Some sites just don't work without - it. + If it is enabled by default, you will have to create some exceptions to + this action. It can lead to failures in several ways: - - - + + Not every URLs with other URLs as parameters is evil. + Some sites offer a real service that requires this information to work. + For example a validation service needs to know, which document to validate. + fast-redirects assumes that every URL parameter that + looks like another URL is a redirection target, and will always redirect to + the last one. Most of the time the assumption is correct, but if it isn't, + the user gets redirected anyway. + + + Another failure occurs if the URL contains other parameters after the URL parameter. + The URL: + http://www.example.org/?redirect=http%3a//www.example.net/&foo=bar. + contains the redirection URL http://www.example.net/, + followed by another parameter. fast-redirects doesn't know that + and will cause a redirect to http://www.example.net/&foo=bar. + Depending on the target server configuration, the parameter will be silently ignored + or lead to a page not found error. It is possible to fix these redirected + requests with filter-client-headers + but it requires a little effort. + + + To detect a redirection URL, fast-redirects only + looks for the string http://, either in plain text + (invalid but often used) or encoded as http%3a//. + Some sites use their own URL encoding scheme, encrypt the address + of the target server or replace it with a database id. In theses cases + fast-redirects is fooled and the request reaches the + redirection server where it probably gets logged. + + + + Example usage: - {+fast-redirects} + +fast-redirects{simple-check} + + + +fast-redirects{check-decoded-url} @@ -2752,24 +3148,428 @@ problem-host.example.com +filter{demoronizer} # Fix MS's non-standard use of standard charsets - - +filter{shockwave-flash} # Kill embedded Shockwave Flash objects - + + +filter{shockwave-flash} # Kill embedded Shockwave Flash objects + + + + +filter{quicktime-kioskmode} # Make Quicktime movies saveable + + + + +filter{fun} # Text replacements for subversive browsing fun! + + + + +filter{crude-parental} # Crude parental filtering (demo only) + + + + +filter{ie-exploits} # Disable some known Internet Explorer bug exploits + + + + + + + + + +force-text-mode + + + + Typical use: + + Force Privoxy to treat a document as if it was in some kind of text format. + + + + + Effect: + + + Declares a document as text, even if the Content-Type: isn't detected as such. + + + + + + Type: + + + Boolean. + + + + + Parameter: + + + N/A + + + + + + Notes: + + + As explained above, + Privoxy tries to only filter files that are + in some kind of text format. The same restrictions apply to + content-type-overwrite. + force-text-mode declares a document as text, + without looking at the Content-Type: first. + + + + Think twice before activating this action. Filtering binary data + with regular expressions can cause file damages. + + + + + + + Example usage: + + + ++force-text-mode + + + + + + + + + + +handle-as-empty-document + + + + Typical use: + + Mark URLs that should be replaced by empty documents if they get blocked + + + + + Effect: + + + This action alone doesn't do anything noticeable. It just marks URLs. + If the block action also applies, + the presence or absence of this mark decides whether an HTML blocked + page, or an empty document will be sent to the client as a substitute for the blocked content. + The empty document isn't literally empty, but actually contains a single space. + + + + + + Type: + + + Boolean. + + + + + Parameter: + + + N/A + + + + + + Notes: + + + Some browsers complain about syntax errors if JavaScript documents + are blocked with Privoxy's + default HTML page; this option can be used to silence them. + + + The content type for the empty document can be specified with + content-type-overwrite{}, + but usually this isn't necessary. + + + + + + Example usage: + + + # Block all documents on example.org that end with ".js", +# but send an empty document instead of the usual HTML message. +{+block +handle-as-empty-document} +example.org/.*\.js$ + + + + + + + + + + +handle-as-image + + + + Typical use: + + Mark URLs as belonging to images (so they'll be replaced by imagee if they get blocked) + + + + + Effect: + + + This action alone doesn't do anything noticeable. It just marks URLs as images. + If the block action also applies, + the presence or absence of this mark decides whether an HTML blocked + page, or a replacement image (as determined by the set-image-blocker action) will be sent to the + client as a substitute for the blocked content. + + + + + + Type: + + + Boolean. + + + + + Parameter: + + + N/A + + + + + + Notes: + + + The below generic example section is actually part of default.action. + It marks all URLs with well-known image file name extensions as images and should + be left intact. + + + Users will probably only want to use the handle-as-image action in conjunction with + block, to block sources of banners, whose URLs don't + reflect the file type, like in the second example section. + + + Note that you cannot treat HTML pages as images in most cases. For instance, (in-line) ad + frames require an HTML page to be sent, or they won't display properly. + Forcing handle-as-image in this situation will not replace the + ad frame with an image, but lead to error messages. + + + + + + Example usage (sections): + + + # Generic image extensions: +# +{+handle-as-image} +/.*\.(gif|jpg|jpeg|png|bmp|ico)$ + +# These don't look like images, but they're banners and should be +# blocked as images: +# +{+block +handle-as-image} +some.nasty-banner-server.com/junk.cgi?output=trash + +# Banner source! Who cares if they also have non-image content? +ad.doubleclick.net + + + + + + + + + + +hide-accept-language + + + + Typical use: + + Pretend to use different language settings. + + + + + Effect: + + + Deletes or replaces the Accept-Language: HTTP header in client requests. + + + + + + Type: + + + Parameterized. + + + + + Parameter: + + + Keyword: block, or any user defined value. + + + + + + Notes: + + + Faking the browser's language settings can be useful to make a + foreign User-Agent set with + hide-user-agent + more believable. + + + However some sites with content in different languages check the + Accept-Language: to decide which one to take by default. + Sometimes it isn't possible to later switch to another language without + changing the Accept-Language: header first. + + + Therefore it's a good idea to either only change the + Accept-Language: header to languages you understand, + or to languages that aren't widely spread. + + + Before setting the Accept-Language: header + to a rare language, you should consider that it helps to + make your requests unique and thus easier to trace. + If you don't plan to change this header frequently, + you should stick to a common language. + + + + + + Example usage (section): + + + # Pretend to use Canadian language settings. +{+hide-accept-language{en-ca} \ ++hide-user-agent{Mozilla/5.0 (X11; U; OpenBSD i386; en-CA; rv:1.8.0.4) Gecko/20060628 Firefox/1.5.0.4} \ +} +/ + + + + + + + + + +hide-content-disposition + + + + Typical use: + + Prevent download menus for content you prefer to view inside the browser. + + + + + Effect: + + + Deletes or replaces the Content-Disposition: HTTP header set by some servers. + + + + + + Type: + + + Parameterized. + + + + + Parameter: + + + Keyword: block, or any user defined value. + + + + + + Notes: + - - +filter{quicktime-kioskmode} # Make Quicktime movies saveable + Some servers set the Content-Disposition: HTTP header for + documents they assume you want to safe locally before viewing them. + The Content-Disposition: header contains the file name + the browser is supposed to use by default. - - +filter{fun} # Text replacements for subversive browsing fun! + In most browser that understand this header, it makes it impossible to + just view the document, without downloading it first, + even if it's just a simple text file or an image. - - +filter{crude-parental} # Crude parental filtering (demo only) + Removing the Content-Disposition: header helps + to prevent this annoyance, but some browser additionally check the + Content-Type: header, before they decide if the can + display a document without saving it first. In these cases you have + to change this header as well, before the browser stops displaying + download menus. - - +filter{ie-exploits} # Disable some known Internet Explorer bug exploits + It is also possible to change the server's file name suggestion + to another one, but in most cases it isn't worth the time to set + it up. + + + + + + Example usage: + + + # Disarm the download link in Sourceforge's patch tracker +{-filter\ ++content-type-overwrite {text/plain}\ ++hide-content-disposition {block} } +.sourceforge.net/tracker/download.php @@ -2778,14 +3578,14 @@ problem-host.example.com - -handle-as-image + +hide-if-modified-since Typical use: - Mark URLs as belonging to images (so they'll be replaced by images if they get blocked) + Prevent yet another way to track the user's steps between sessions. @@ -2793,12 +3593,7 @@ problem-host.example.com Effect: - This action alone doesn't do anything noticeable. It just marks URLs as images. - If the block action also applies, - the presence or absence of this mark decides whether an HTML blocked - page, or a replacement image (as determined by the set-image-blocker action) will be sent to the - client as a substitute for the blocked content. + Deletes the If-Modified-Since: HTTP client header or modifies its value. @@ -2807,7 +3602,7 @@ problem-host.example.com Type: - Boolean. + Parameterized. @@ -2815,8 +3610,8 @@ problem-host.example.com Parameter: - N/A - + Keyword: block, or a user defined value that specifies a range of hours. + @@ -2824,42 +3619,43 @@ problem-host.example.com Notes: - The below generic example section is actually part of default.action. - It marks all URLs with well-known image file name extensions as images and should - be left intact. + Removing this header is useful for filter testing, where you want to force a real + reload instead of getting status code 304, which would cause the + browser to use a cached copy of the page. - Users will probably only want to use the handle-as-image action in conjunction with - block, to block sources of banners, whose URLs don't - reflect the file type, like in the second example section. + Instead of removing the header, hide-if-modified-since can + also add or substract a random amount of time to/from the headers value. + You specify a range of hours were the random factor should be chosen from and + Privoxy does the rest. A negative value means + subtracting, a positive value adding. - Note that you cannot treat HTML pages as images in most cases. For instance, (in-line) ad - frames require an HTML page to be sent, or they won't display properly. - Forcing handle-as-image in this situation will not replace the - ad frame with an image, but lead to error messages. + Randomizing the value of the If-Modified-Since: makes + sure it isn't used as a cookie replacement, but you will run into + caching problems if the random range is to high. + + + It is a good idea to only use a small negative value and let + overwrite-last-modified + handle the greater changes. + + + It is also recommended to use this action together with + crunch-if-none-match. - Example usage (sections): + Example usage (section): - - # Generic image extensions: -# -{+handle-as-image} -/.*\.(gif|jpg|jpeg|png|bmp|ico)$ - -# These don't look like images, but they're banners and should be -# blocked as images: -# -{+block +handle-as-image} -some.nasty-banner-server.com/junk.cgi?output=trash - -# Banner source! Who cares if they also have non-image content? -ad.doubleclick.net - + + # Let the browser revalidate without being tracked across sessions +{+hide-if-modified-since {-1}\ ++overwrite-last-modified {randomize}\ ++crunch-if-none-match} +/ @@ -3040,7 +3836,10 @@ ad.doubleclick.net - block to delete the header completely. + conditional-block to delete the header completely if the host has changed. + + + block to delete the header unconditionally. forge to pretend to be coming from the homepage of the server we are talking to. @@ -3056,18 +3855,37 @@ ad.doubleclick.net Notes: - forge is the preferred option here, since some servers will - not send images back otherwise, in an attempt to prevent their valuable - content from being embedded elsewhere (and hence, without being surrounded - by their banners). + conditional-block is the only parameter, + that isn't easily detected in the server's log file. If it blocks the + referrer, the request will look like the visitor used a bookmark or + typed in the address directly. + + + Leaving the referrer unmodified for requests on the same host + allows the server owner to see the visitor's click path, + but in most cases she could also get that information by comparing + other parts of the log file: for example the User-Agent if it isn't + a very common one, or the user's IP address if it doesn't change between + different requests. + + + Always blocking the referrer, or using a custom one, can lead to + failures on servers that check the referrer before they answer any + requests, in an attempt to prevent their valuable content from being + embedded or linked to elsewhere. + + + Both conditional-block and forge + will work with referrer checks, as long as content and valid referring page + are on the same host. Most of the time that's the case. + + + hide-referer is an alternate spelling of + hide-referrer and the two can be can be freely + substituted with each other. (referrer is the + correct English spelling, however the HTTP specification has a bug - it + requires it to be spelled as referer.) - - hide-referer is an alternate spelling of - hide-referrer and the two can be can be freely - substituted with each other. (referrer is the - correct English spelling, however the HTTP specification has a bug - it - requires it to be spelled as referer.) - @@ -3128,11 +3946,14 @@ ad.doubleclick.net - This breaks many web sites that depend on looking at this header in order - to customize their content for different browsers (which, by the - way, is NOT a smart way to do + This can lead to problems on web sites that depend on looking at this header in + order to customize their content for different browsers (which, by the + way, is NOT the right thing to do: good web sites + work browser-independently). + @@ -3269,7 +4090,7 @@ ad.doubleclick.net Typical use: - Prevent abuse of Privoxy as a TCP proxy relay + Prevent abuse of Privoxy as a TCP proxy relay or disable SSL for untrusted sites @@ -3319,8 +4140,12 @@ ad.doubleclick.net abused as TCP relays very easily. - If you don't know what any of this means, there probably is no reason to - change this one, since the default is already very restrictive. + Privoxy relays HTTPS traffic without seeing + the decoded content. Websites can leverage this limitation to circumvent Privoxy's + filters. By specifying an invalid port range you can disable HTTPS entirely. + If you plan to disable SSL by default, consider enabling + treat-forbidden-connects-like-blocks + as well, to be able to quickly create exceptions. @@ -3335,7 +4160,8 @@ ad.doubleclick.net +limit-connect{443} # This is the default and need not be specified. +limit-connect{80,443} # Ports 80 and 443 are OK. +limit-connect{-3, 7, 20-100, 500-} # Ports less than 3, 7, 20 to 100 and above 500 are OK. -+limit-connect{-} # All ports are OK (gaping security hole!) ++limit-connect{-} # All ports are OK ++limit-connect{,} # No HTTPS traffic is allowed @@ -3352,7 +4178,7 @@ ad.doubleclick.net Ensure that servers send the content uncompressed, so it can be - passed through filters + passed through filters. @@ -3361,7 +4187,7 @@ ad.doubleclick.net Effect: - Adds a header to the request that asks for uncompressed transfer. + Removes the Accept-Encoding header which can be used to ask for compressed transfer. @@ -3431,6 +4257,179 @@ www.pclinuxonline.com + + +overwrite-last-modified + + + + Typical use: + + Prevent yet another way to track the user's steps between sessions. + + + + + Effect: + + + Deletes the Last-Modified: HTTP server header or modifies its value. + + + + + + Type: + + + Parameterized. + + + + + Parameter: + + + One of the keywords: block, reset-to-request-time + and randomize + + + + + + Notes: + + + Removing the Last-Modified: header is useful for filter + testing, where you want to force a real reload instead of getting status + code 304, which would cause the browser to reuse the old + version of the page. + + + The randomize option overwrites the value of the + Last-Modified: header with a randomly chosen time + between the original value and the current time. In theory the server + could send each document with a different Last-Modified: + header to track visits without using cookies. Randomize + makes it impossible and the browser can still revalidate cached documents. + + + reset-to-request-time overwrites the value of the + Last-Modified: header with the current time. You could use + this option together with + hided-if-modified-since + to further customize your random range. + + + The preferred parameter here is randomize. It is safe + to use, as long as the time settings are more or less correct. + If the server sets the Last-Modified: header to the time + of the request, the random range becomes zero and the value stays the same. + Therefore you should later randomize it a second time with + hided-if-modified-since, + just to be sure. + + + It is also recommended to use this action together with + crunch-if-none-match. + + + + + + Example usage: + + + # Let the browser revalidate without being tracked across sessions +{+hide-if-modified-since {-1}\ ++overwrite-last-modified {randomize}\ ++crunch-if-none-match} +/ + + + + + + + + + +redirect + + + + Typical use: + + + Redirect requests to other sites. + + + + + + Effect: + + + Convinces the browser that the requested document has been moved + to another location and the browser should get it from there. + + + + + + Type: + + + Parameterized + + + + + Parameter: + + + Any URL. + + + + + + Notes: + + + This action is useful to replace whole documents with your own + ones. For that to work, they have to be available on another server. + + + You can do the same by combining the actions + block, + handle-as-image and + set-image-blocker{URL}. + It doesn't sound right for non-image documents, and that's why this action + was created. + + + This action will be ignored if you use it together with + block. + + + + + + Example usage: + + + # Replace example.com's style sheet with another one +{+redirect{http://localhost/css-replacements/example.com.css}} +example.com/stylesheet.css + + + + + + + + send-vanilla-wafer @@ -3771,6 +4770,86 @@ my-internal-testing-server.void + + +treat-forbidden-connects-like-blocks + + + + Typical use: + + Block forbidden connects with an easy to find error message. + + + + + Effect: + + + If this action is enabled, Privoxy no longer + makes a difference between forbidden connects and ordinary blocks. + + + + + + Type: + + + Boolean + + + + + Parameter: + + N/A + + + + + Notes: + + + By default Privoxy answers + forbidden Connect requests + with a short error message inside the headers. If the browser doesn't display + headers (most don't), you just see an empty page. + + + With this action enabled, Privoxy displays + the message that is used for ordinary blocks instead. If you decide + to make an exception for the page in question, you can do so by + following the See why link. + + + For Connect requests the clients tell + Privoxy which host they are interested + in, but not which document they plan to get later. As a result, the + Go there anyway link becomes rather useless: + it lets the client request the home page of the forbidden host + through unencrypted HTTP, still using the port of the last request. + + + If you previously configured Privoxy to do the + request through a SSL tunnel, everything will work. Most likely you haven't + and the server will responds with an error message because it is expecting + HTTPS. + + + + + + Example usage: + + +treat-forbidden-connects-like-blocks + + + + + + + Summary @@ -6295,6 +7374,10 @@ In file: user.action [ View ] [ Edit ]