You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by bu...@apache.org on 2014/01/21 21:20:49 UTC

svn commit: r895005 - in /websites/production/tapestry/content: assets.html cache/main.pageCache security-faq.html

Author: buildbot
Date: Tue Jan 21 20:20:49 2014
New Revision: 895005

Log:
Production update by buildbot for tapestry

Modified:
    websites/production/tapestry/content/assets.html
    websites/production/tapestry/content/cache/main.pageCache
    websites/production/tapestry/content/security-faq.html

Modified: websites/production/tapestry/content/assets.html
==============================================================================
--- websites/production/tapestry/content/assets.html (original)
+++ websites/production/tapestry/content/assets.html Tue Jan 21 20:20:49 2014
@@ -95,7 +95,7 @@
                     <span class="icon icon-page" title="Page">Page:</span>            </div>
 
             <div class="details">
-                            <a shape="rect" href="configuration.html">Configuration</a>
+                            <a shape="rect" href="layout-component.html">Layout Component</a>
                     
                 
                             </div>
@@ -104,7 +104,7 @@
                     <span class="icon icon-page" title="Page">Page:</span>            </div>
 
             <div class="details">
-                            <a shape="rect" href="layout-component.html">Layout Component</a>
+                            <a shape="rect" href="javascript.html">JavaScript</a>
                     
                 
                             </div>
@@ -113,7 +113,7 @@
                     <span class="icon icon-page" title="Page">Page:</span>            </div>
 
             <div class="details">
-                            <a shape="rect" href="javascript.html">JavaScript</a>
+                            <a shape="rect" href="css.html">CSS</a>
                     
                 
                             </div>
@@ -122,7 +122,7 @@
                     <span class="icon icon-page" title="Page">Page:</span>            </div>
 
             <div class="details">
-                            <a shape="rect" href="css.html">CSS</a>
+                            <a shape="rect" href="configuration.html">Configuration</a>
                     
                 
                             </div>
@@ -160,91 +160,7 @@ private Asset style;
                             <p>The use of the <code>${...</code>} syntax here is a <em>symbol expansion</em> (because it occurs in an annotation in Java code), rather than a <em>template expansion</em> (which occurs only in Tapestry template files).</p>
                     </div>
     </div>
-<p>An override of the skin.root symbol would affect all references to the named asset.</p><h2 id="Assets-LocalizationofAssets">Localization of Assets</h2><p>Main Article: <a shape="rect" href="localization.html">Localization</a></p><p>Assets are localized; Tapestry will search for a variation of the file appropriate to the effective locale for the request. In the previous example, a German user of the application may see a file named <code>edit_de.png</code> (if such a file exists).</p><h2 id="Assets-NewAssetDomains">New Asset Domains</h2><p>If you wish to create new domains for assets, for example to allow assets to be stored on the file system or in a database, you may define a new <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/AssetFactory.html">AssetFactory</a> and contribute it to the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/AssetSour
 ce.html">AssetSource</a> service configuration.</p><h2 id="Assets-AssetURLs">Asset URLs</h2><p>Tapestry creates a new URL for assets (whether context or classpath). The URL is of the form /assets/<strong>version</strong>/<strong>folder</strong>/<strong>path</strong>.</p><ul><li><strong>version</strong>: Application version number, defined by the <code>tapestry.application-version</code> symbol in your application module (normally AppModule.java). The default is a random hex number.</li><li><strong>folder</strong>: Identifies the library containing the asset, or "ctx" for a context asset, or "stack" (used when combining multiple JavaScript files into a single virtual asset).</li><li><strong>path</strong>: The path below the root package of the library to the specific asset file.</li></ul><h2 id="Assets-PerformanceNotes">Performance Notes</h2><p>Assets are expected to be entirely static (not changing while the application is deployed). This allows Tapestry to perform some important pe
 rformance optimizations.</p><p>Tapestry GZIP compresses the content of all assets &#8211; if the asset is compressible, the client supports it, and you don't <a shape="rect" href="configuration.html#Configuration-tapestry.gzipcompressionenabled">explicitly disable it</a>.</p><p>When Tapestry generates a URL for an asset, either on the classpath or from the context, the URL includes the application version number. Further, the asset will get a <em>far future expires header</em>, which will encourage the client browser to cache the asset.</p><p>You should have an explicit application version number for any production application. Client browsers will aggressively cache downloaded assets; they will usually not even send a request to see if the asset has changed once the asset is downloaded the first time. Because of this it is <em>very important</em> that each new deployment of your application has a new <a shape="rect" href="configuration.html#Configuration-tapestry.applicationversion
 ">version number</a>, to force existing clients to re-download all assets.</p><h2 id="Assets-AssetSecurity">Asset Security</h2><p>Because Tapestry directly exposes files on the classpath to the clients, some thought has gone into ensuring that malicious clients are not able to download assets that should not be visible to them.</p><p>First off all, there's a package limitation: classpath assets are only visible if there's a <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/LibraryMapping.html">LibraryMapping</a> for them, and the library mapping substitutes for the initial folders on the classpath. Since the most secure assets, things like <code>hibernate.cfg.xml</code> are located in the unnamed package, they are always off limits.</p><p>But what about other files on the classpath? Imagine this scenario:</p><ul><li>Your Login page exposes a classpath asset, <code>icon.png</code>.</li><li><p>A malicious client copies
  the URL, <code>/assets/1.0.0/app/pages/icon.png</code>,</p>&lt;style type='text/css'&gt;
-.FootnoteMarker, .FootnoteNum a {
-  background: transparent url(/confluence/download/resources/com.adaptavist.confluence.footnoteMacros:footnote/gfx/footnote.png) no-repeat top right;
-  padding: 1px 2px 0px 1px;
-  border-left: 1px solid #8898B8;
-  border-bottom: 1px solid #6B7C9B;
-  margin: 1px;
-  text-decoration: none;
-}
-.FootnoteNum a {
-  margin-top: 2px;
-  margin-right: 0px;
-}
-.FootnoteNum {
-  font-size: x-small;
-  text-align: right;
-  padding-bottom: 4px;
-}
-.footnote-th1 {
-  text-align: right;
-}
-.Footnote {
-  padding-left: 7px;
-  margin-bottom: 4px;
-  border: 1px none #DDDDDD;
-  writingMode: tb-rl;
-}
-.accessibility {
-     display: none;
-     visibility: hidden;
-}
-@media aural,braille,embossed {
-        .FootnoteMarker, .FootnoteNum a {
-         border: 1px solid #000000;
-         background: #ffffff none;
-    }
-    .accessibility {
-         display: run-in;
-         visibility: visible;
-    }
-}
-&lt;/style&gt;
-&lt;script type='text/javascript' language='JavaScript'&gt;
-//&lt;!--\n
-var effectInProgress = {};
-var despamEffect = function (id,effectType,duration) {
-  if ((effectInProgress[id]) || (typeof(Effect)=="undefined") || (typeof(Effect[effectType])=="undefined")) return;
-  new Effect[effectType](id);
-  effectInProgress[id]=true;
-  setTimeout('effectInProgress[\"'+id+'\"]=false;',duration*1000);
-};
-var oldFootnoteId = '';
-var footnoteHighlight = function(id,pulsateNum) {
-  if (oldFootnoteId!='') document.getElementById('Footnote'+oldFootnoteId).style['borderStyle'] = 'none';
-  oldFootnoteId = id;
-  document.getElementById('Footnote'+id).style['borderStyle'] = 'solid';
-  despamEffect('Footnote'+id,'Highlight',1)
-  if (pulsateNum) despamEffect('FootnoteNum'+id,'Pulsate',3)
-}
-var footnoteMarkerHighlight = function(id) {
-  if (oldFootnoteId!='') document.getElementById('Footnote'+oldFootnoteId).style['borderStyle'] = 'none';
-  oldFootnoteId = '';
-  despamEffect('FootnoteMarker'+id,'Pulsate',3)
-}
-//--&gt;
-&lt;/script&gt;
-
-<sup id="FootnoteMarker1">
-    <a shape="rect" class="FootnoteMarker" name="FootnoteMarker1" href="#Footnote1" onclick="footnoteHighlight(&quot;1&quot;,true);" alt="Footnote: Click here to display the footnote" title="Footnote: Click here to display the footnote">
-            1
-    </a>
-</sup>
-<p>and changes the file name to <code>Login.class</code>.</p></li><li><p>The client decompiles the class file and spots your secret emergency password: goodbye security!</p>
-<sup id="FootnoteMarker2">
-    <a shape="rect" class="FootnoteMarker" name="FootnoteMarker2" href="#Footnote2" onclick="footnoteHighlight(&quot;2&quot;,true);" alt="Footnote: Click here to display the footnote" title="Footnote: Click here to display the footnote">
-            2
-    </a>
-</sup>
-</li></ul><p>Fortunately, this can't happen. Files with extension ".class" are secured; they must be accompanied in the URL with a query parameter that is the MD5 hash of the file's contents. If the query parameter is absent, or doesn't match the actual file's content, the request is rejected.</p><p>When your code exposes an Asset, the URL will automatically include the query parameter if the file type is secured. The malicious user is locked out of access to the files</p>
-<sup id="FootnoteMarker3">
-    <a shape="rect" class="FootnoteMarker" name="FootnoteMarker3" href="#Footnote3" onclick="footnoteHighlight(&quot;3&quot;,true);" alt="Footnote: Click here to display the footnote" title="Footnote: Click here to display the footnote">
-            3
-    </a>
-</sup>
-<p>.</p><p>&#160;</p><p>By default, Tapestry secures file extensions ".class', ".tml" and ".properties". The list can be extended by contributing to the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/ResourceDigestGenerator.html">ResourceDigestGenerator</a> service:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>AppModule.java (partial)</b></div><div class="codeContent panelContent pdl">
+<p>An override of the skin.root symbol would affect all references to the named asset.</p><h2 id="Assets-LocalizationofAssets">Localization of Assets</h2><p>Main Article: <a shape="rect" href="localization.html">Localization</a></p><p>Assets are localized; Tapestry will search for a variation of the file appropriate to the effective locale for the request. In the previous example, a German user of the application may see a file named <code>edit_de.png</code> (if such a file exists).</p><h2 id="Assets-NewAssetDomains">New Asset Domains</h2><p>If you wish to create new domains for assets, for example to allow assets to be stored on the file system or in a database, you may define a new <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/AssetFactory.html">AssetFactory</a> and contribute it to the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/AssetSour
 ce.html">AssetSource</a> service configuration.</p><h2 id="Assets-AssetURLs">Asset URLs</h2><p>Tapestry creates a new URL for assets (whether context or classpath). The URL is of the form /assets/<strong>version</strong>/<strong>folder</strong>/<strong>path</strong>.</p><ul><li><strong>version</strong>: Application version number, defined by the <code>tapestry.application-version</code> symbol in your application module (normally AppModule.java). The default is a random hex number.</li><li><strong>folder</strong>: Identifies the library containing the asset, or "ctx" for a context asset, or "stack" (used when combining multiple JavaScript files into a single virtual asset).</li><li><strong>path</strong>: The path below the root package of the library to the specific asset file.</li></ul><h2 id="Assets-PerformanceNotes">Performance Notes</h2><p>Assets are expected to be entirely static (not changing while the application is deployed). This allows Tapestry to perform some important pe
 rformance optimizations.</p><p>Tapestry GZIP compresses the content of all assets &#8211; if the asset is compressible, the client supports it, and you don't <a shape="rect" href="configuration.html#Configuration-tapestry.gzipcompressionenabled">explicitly disable it</a>.</p><p>When Tapestry generates a URL for an asset, either on the classpath or from the context, the URL includes the application version number. Further, the asset will get a <em>far future expires header</em>, which will encourage the client browser to cache the asset.</p><p>You should have an explicit application version number for any production application. Client browsers will aggressively cache downloaded assets; they will usually not even send a request to see if the asset has changed once the asset is downloaded the first time. Because of this it is <em>very important</em> that each new deployment of your application has a new <a shape="rect" href="configuration.html#Configuration-tapestry.applicationversion
 ">version number</a>, to force existing clients to re-download all assets.</p><h2 id="Assets-AssetSecurity">Asset Security</h2><p>Because Tapestry directly exposes files on the classpath to the clients, some thought has gone into ensuring that malicious clients are not able to download assets that should not be visible to them.</p><p>First off all, there's a package limitation: classpath assets are only visible if there's a <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/LibraryMapping.html">LibraryMapping</a> for them, and the library mapping substitutes for the initial folders on the classpath. Since the most secure assets, things like <code>hibernate.cfg.xml</code> are located in the unnamed package, they are always off limits.</p><p>But what about other files on the classpath? Imagine this scenario:</p><ul><li>Your Login page exposes a classpath asset, <code>icon.png</code>.</li><li><p>A malicious client copies
  the URL, <code>/assets/1.0.0/app/pages/icon.png (</code><span style="line-height: 1.4285715;">which would indicate that the Login page is actually inside a library, which is unlikely. More likely, icon.png is a context asset and the malicious user guessed the path for Login.class by looking at the Tapestry source code.)&#160;</span><span style="line-height: 1.4285715;">and changes the file name to </span><code style="line-height: 1.4285715;">Login.class</code><span style="line-height: 1.4285715;">.</span></p></li><li><p>The client decompiles the class file and spots your secret emergency password: goodbye security! (<span style="line-height: 1.4285715;">Never create such back doors, of course!)</span></p></li></ul><p>Fortunately, this can't happen. Files with extension ".class" are secured; they must be accompanied in the URL with a query parameter that is the MD5 hash of the file's contents. If the query parameter is absent, or doesn't match the actual file's content, the request 
 is rejected.</p><p>When your code exposes an Asset, the URL will automatically include the query parameter if the file type is secured. The malicious user is locked out of access to the files. (<span style="line-height: 1.4285715;">Unless they already have the files so that they can generate the MD5 checksum ... to get access to the files they already have.)</span></p><p>By default, Tapestry secures file extensions ".class', ".tml" and ".properties". The list can be extended by contributing to the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/ResourceDigestGenerator.html">ResourceDigestGenerator</a> service:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>AppModule.java (partial)</b></div><div class="codeContent panelContent pdl">
 <script class="theme: Default; brush: java; gutter: false" type="syntaxhighlighter"><![CDATA[public static void contributeResourceDigestGenerator(Configuration&lt;String&gt; configuration)
 {
     configuration.add(&quot;xyz&quot;);
@@ -273,25 +189,7 @@ public static void contributeMinimizers(
     configuration.addInstance(&quot;text/coffeescript&quot;, CoffeeScriptMinimizer.class);
 }
 ]]></script>
-</div></div><p>&#160;</p><p>&#160;</p><table class="Footnotes" style="width: 100%; border:none;" cellspacing="0" cellpadding="0" summary="This table contains one or more notes for references made elsewhere on the page."><caption class="accessibility">Footnotes</caption><thead class="accessibility"><tr class="accessibility"><th colspan="1" rowspan="1" class="accessibility" id="footnote-th1">Reference</th><th colspan="1" rowspan="1" class="accessibility" id="footnote-th2">Notes</th></tr></thead><tbody><tr name="Footnote1"><td colspan="1" rowspan="1" valign="top" class="FootnoteNum" headings="footnote-th1">
-        <a shape="rect" id="FootnoteNum1" href="#FootnoteMarker1" onclick="footnoteMarkerHighlight(&quot;1&quot;);" onmouseover="footnoteHighlight(&quot;1&quot;,false);" alt="Footnote: Click to return to reference in text" title="Footnote: Click to return to reference in text">
-            1
-        </a>
-      </td><td colspan="1" rowspan="1" valign="top" class="Footnote" id="Footnote1" width="100%" headings="footnote-th2">
-          This would indicate that the Login page is actually inside a library, which is unlikely. More likely, <code>icon.png</code> is a context asset and the malicious user guessed the path for <code>Login.class</code> by looking at the Tapestry source code.
-      </td></tr><tr name="Footnote2"><td colspan="1" rowspan="1" valign="top" class="FootnoteNum" headings="footnote-th1">
-        <a shape="rect" id="FootnoteNum2" href="#FootnoteMarker2" onclick="footnoteMarkerHighlight(&quot;2&quot;);" onmouseover="footnoteHighlight(&quot;2&quot;,false);" alt="Footnote: Click to return to reference in text" title="Footnote: Click to return to reference in text">
-            2
-        </a>
-      </td><td colspan="1" rowspan="1" valign="top" class="Footnote" id="Footnote2" width="100%" headings="footnote-th2">
-          Never create such back doors, of course!
-      </td></tr><tr name="Footnote3"><td colspan="1" rowspan="1" valign="top" class="FootnoteNum" headings="footnote-th1">
-        <a shape="rect" id="FootnoteNum3" href="#FootnoteMarker3" onclick="footnoteMarkerHighlight(&quot;3&quot;);" onmouseover="footnoteHighlight(&quot;3&quot;,false);" alt="Footnote: Click to return to reference in text" title="Footnote: Click to return to reference in text">
-            3
-        </a>
-      </td><td colspan="1" rowspan="1" valign="top" class="Footnote" id="Footnote3" width="100%" headings="footnote-th2">
-          Unless they already have the files so that they can generate the MD5 checksum ... to get access to the files they already have.
-      </td></tr></tbody></table></div>
+</div></div><p>&#160;</p><p>&#160;</p><p>&#160;</p></div>
 </div>
 
 <div class="clearer"></div>

Modified: websites/production/tapestry/content/cache/main.pageCache
==============================================================================
Binary files - no diff available.

Modified: websites/production/tapestry/content/security-faq.html
==============================================================================
--- websites/production/tapestry/content/security-faq.html (original)
+++ websites/production/tapestry/content/security-faq.html Tue Jan 21 20:20:49 2014
@@ -77,27 +77,44 @@ table.ScrollbarTable td.ScrollbarParent 
 table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
 table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width: 16px;border: none;}
 
-/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect" href="tapestry-inversion-of-control-faq.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16" height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName" width="33%"><a shape="rect" href="tapestry-inversion-of-control-faq.html">Tapestry Inversion of Control FAQ</a>&#160;</td><td colspan="1" rowspan="1" class="ScrollbarParent" width="33%"><sup><a shape="rect" href="frequently-asked-questions.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8" height="8"></a></sup><a shape="rect" href="frequently-asked-questions.html">Frequently Asked Questions</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName" width="33%">&#160;<a shape="rect" href="integration-with-existing-applications.html">Integration with existi
 ng applications</a></td><td colspan="1" rowspan="1" class="ScrollbarNextIcon"><a shape="rect" href="integration-with-existing-applications.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16" height="16"></a></td></tr></table></div> 
-
-<h2 id="SecurityFAQ-SecurityFAQ">Security FAQ </h2>
-
-<h3 id="SecurityFAQ-Thebuilt-inPageCatalogandServiceStatuspagesarevisibleinmyproductionapplicationandIdon'twantthemtobe,whatcanIdo?">The built-in PageCatalog and ServiceStatus pages are visible in my production application and I don't want them to be, what can I do?</h3>
-
-<p>First off all, don't panic: these pages are marked with the @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/WhitelistAccessOnly.html">WhitelistAccessOnly</a> annotation, which makes them invisible to clients that are not on the whitelist.  Try accessing the page from a different workstation and you may find that the pages are not visible after all.</p>
-
-<p>Sometimes, in production, a firewall or proxy may make it look like the client web browser originates from localhost; in that situation, you may want to disable the logic that puts localhost onto the whitelist.  This determination is made by the contributions to the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/security/ClientWhitelist.html">ClientWhitelist</a> service. Tapestry makes a contribution with id "LocalhostOnly", which one of your modules can override:</p>
-
-<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="theme: Default; brush: java; gutter: false" type="syntaxhighlighter"><![CDATA[
-  @Contribute(ClientWhitelist.class)
+/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect" href="tapestry-inversion-of-control-faq.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16" height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName" width="33%"><a shape="rect" href="tapestry-inversion-of-control-faq.html">Tapestry Inversion of Control FAQ</a>&#160;</td><td colspan="1" rowspan="1" class="ScrollbarParent" width="33%"><sup><a shape="rect" href="frequently-asked-questions.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8" height="8"></a></sup><a shape="rect" href="frequently-asked-questions.html">Frequently Asked Questions</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName" width="33%">&#160;<a shape="rect" href="integration-with-existing-applications.html">Integration with existi
 ng applications</a></td><td colspan="1" rowspan="1" class="ScrollbarNextIcon"><a shape="rect" href="integration-with-existing-applications.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16" height="16"></a></td></tr></table></div><h2 id="SecurityFAQ-SecurityFAQ">Security FAQ</h2><div class="navmenu" style="float:right; background:#eee; margin:3px; padding:3px">
+<h3>Related Articles</h3>
+<ul class="content-by-label"><li>
+            <div>
+                    <span class="icon icon-page" title="Page">Page:</span>            </div>
+
+            <div class="details">
+                            <a shape="rect" href="security.html">Security</a>
+                    
+                
+                            </div>
+        </li><li>
+            <div>
+                    <span class="icon icon-page" title="Page">Page:</span>            </div>
+
+            <div class="details">
+                            <a shape="rect" href="https.html">HTTPS</a>
+                    
+                
+                            </div>
+        </li><li>
+            <div>
+                    <span class="icon icon-page" title="Page">Page:</span>            </div>
+
+            <div class="details">
+                            <a shape="rect" href="security-faq.html">Security FAQ</a>
+                    
+                
+                            </div>
+        </li></ul>
+</div><h3 id="SecurityFAQ-Thebuilt-inPageCatalogandServiceStatuspagesarevisibleinmyproductionapplicationandIdon'twantthemtobe,whatcanIdo?">The built-in PageCatalog and ServiceStatus pages are visible in my production application and I don't want them to be, what can I do?</h3><p>First off all, don't panic: these pages are marked with the @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/WhitelistAccessOnly.html">WhitelistAccessOnly</a> annotation, which makes them invisible to clients that are not on the whitelist. Try accessing the page from a different workstation and you may find that the pages are not visible after all.</p><p>Sometimes, in production, a firewall or proxy may make it look like the client web browser originates from localhost; in that situation, you may want to disable the logic that puts localhost onto the whitelist. This determination is made by the contributions to the <a shape="rect" class=
 "external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/security/ClientWhitelist.html">ClientWhitelist</a> service. Tapestry makes a contribution with id "LocalhostOnly", which one of your modules can override:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<script class="theme: Default; brush: java; gutter: false" type="syntaxhighlighter"><![CDATA[  @Contribute(ClientWhitelist.class)
   public static void turnOffLocalhostInProduction(OrderedConfiguration&lt;WhitelistAnalyzer&gt; configuration, 
                                                  @Symbol(SymbolConstants.PRODUCTION_MODE) boolean productionMode) {
     if (productionMode) { configuration.override(&quot;LocalhostOnly&quot;, null); }
   } 
 ]]></script>
-</div></div>
-
-<style type="text/css">/*<![CDATA[*/
+</div></div><style type="text/css">/*<![CDATA[*/
 table.ScrollbarTable  {border: none;padding: 3px;width: 100%;padding: 3px;margin: 0px;background-color: #f0f0f0}
 table.ScrollbarTable td.ScrollbarPrevIcon {text-align: center;width: 16px;border: none;}
 table.ScrollbarTable td.ScrollbarPrevName {text-align: left;border: none;}
@@ -105,7 +122,7 @@ table.ScrollbarTable td.ScrollbarParent 
 table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
 table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width: 16px;border: none;}
 
-/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect" href="tapestry-inversion-of-control-faq.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16" height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName" width="33%"><a shape="rect" href="tapestry-inversion-of-control-faq.html">Tapestry Inversion of Control FAQ</a>&#160;</td><td colspan="1" rowspan="1" class="ScrollbarParent" width="33%"><sup><a shape="rect" href="frequently-asked-questions.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8" height="8"></a></sup><a shape="rect" href="frequently-asked-questions.html">Frequently Asked Questions</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName" width="33%">&#160;<a shape="rect" href="integration-with-existing-applications.html">Integration with existi
 ng applications</a></td><td colspan="1" rowspan="1" class="ScrollbarNextIcon"><a shape="rect" href="integration-with-existing-applications.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16" height="16"></a></td></tr></table></div> </div>
+/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect" href="tapestry-inversion-of-control-faq.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16" height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName" width="33%"><a shape="rect" href="tapestry-inversion-of-control-faq.html">Tapestry Inversion of Control FAQ</a>&#160;</td><td colspan="1" rowspan="1" class="ScrollbarParent" width="33%"><sup><a shape="rect" href="frequently-asked-questions.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8" height="8"></a></sup><a shape="rect" href="frequently-asked-questions.html">Frequently Asked Questions</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName" width="33%">&#160;<a shape="rect" href="integration-with-existing-applications.html">Integration with existi
 ng applications</a></td><td colspan="1" rowspan="1" class="ScrollbarNextIcon"><a shape="rect" href="integration-with-existing-applications.html"><img align="middle" border="0" src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16" height="16"></a></td></tr></table></div></div>
 </div>
 
 <div class="clearer"></div>