Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
Zope
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
Zope
Commits
7ea5fc71
Commit
7ea5fc71
authored
Aug 28, 2016
by
Hanno Schlichting
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move `Products.SiteAccess` into ZServer distribution.
parent
18ef29ca
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
2 additions
and
660 deletions
+2
-660
CHANGES.rst
CHANGES.rst
+2
-0
src/OFS/Application.py
src/OFS/Application.py
+0
-14
src/OFS/tests/testAppInitializer.py
src/OFS/tests/testAppInitializer.py
+0
-9
src/Products/SiteAccess/VirtualHostMonster.py
src/Products/SiteAccess/VirtualHostMonster.py
+0
-266
src/Products/SiteAccess/__init__.py
src/Products/SiteAccess/__init__.py
+0
-10
src/Products/SiteAccess/configure.zcml
src/Products/SiteAccess/configure.zcml
+0
-7
src/Products/SiteAccess/tests/__init__.py
src/Products/SiteAccess/tests/__init__.py
+0
-0
src/Products/SiteAccess/tests/testVirtualHostMonster.py
src/Products/SiteAccess/tests/testVirtualHostMonster.py
+0
-193
src/Products/SiteAccess/www/VirtualHostMonster.dtml
src/Products/SiteAccess/www/VirtualHostMonster.dtml
+0
-115
src/Products/SiteAccess/www/manage_edit.dtml
src/Products/SiteAccess/www/manage_edit.dtml
+0
-46
No files found.
CHANGES.rst
View file @
7ea5fc71
...
@@ -30,6 +30,8 @@ Features Added
...
@@ -30,6 +30,8 @@ Features Added
Restructuring
Restructuring
+++++++++++++
+++++++++++++
- Move `Products.SiteAccess` into ZServer distribution.
- Simplify Page Template and Scripts ZMI screens.
- Simplify Page Template and Scripts ZMI screens.
- Change VHM id to `virtual_hosting` to match AppInitializer.
- Change VHM id to `virtual_hosting` to match AppInitializer.
...
...
src/OFS/Application.py
View file @
7ea5fc71
...
@@ -213,7 +213,6 @@ class AppInitializer:
...
@@ -213,7 +213,6 @@ class AppInitializer:
self
.
install_inituser
()
self
.
install_inituser
()
self
.
install_products
()
self
.
install_products
()
self
.
install_standards
()
self
.
install_standards
()
self
.
install_virtual_hosting
()
def
install_app_manager
(
self
):
def
install_app_manager
(
self
):
global
APP_MANAGER
global
APP_MANAGER
...
@@ -267,19 +266,6 @@ class AppInitializer:
...
@@ -267,19 +266,6 @@ class AppInitializer:
transaction
.
get
().
note
(
'Migrated user folder'
)
transaction
.
get
().
note
(
'Migrated user folder'
)
transaction
.
commit
()
transaction
.
commit
()
def
install_virtual_hosting
(
self
):
app
=
self
.
getApp
()
if
'virtual_hosting'
not
in
app
:
from
Products.SiteAccess.VirtualHostMonster
\
import
VirtualHostMonster
any_vhm
=
[
obj
for
obj
in
app
.
values
()
if
isinstance
(
obj
,
VirtualHostMonster
)]
if
not
any_vhm
:
vhm
=
VirtualHostMonster
()
vhm
.
id
=
'virtual_hosting'
vhm
.
addToContainer
(
app
)
self
.
commit
(
'Added virtual_hosting'
)
def
install_products
(
self
):
def
install_products
(
self
):
return
install_products
()
return
install_products
()
...
...
src/OFS/tests/testAppInitializer.py
View file @
7ea5fc71
...
@@ -86,15 +86,6 @@ class TestInitialization(unittest.TestCase):
...
@@ -86,15 +86,6 @@ class TestInitialization(unittest.TestCase):
app
=
getApp
()
app
=
getApp
()
return
AppInitializer
(
app
)
return
AppInitializer
(
app
)
def
test_install_virtual_hosting
(
self
):
self
.
configure
(
good_cfg
)
i
=
self
.
getOne
()
i
.
install_virtual_hosting
()
app
=
i
.
getApp
()
self
.
assertTrue
(
'virtual_hosting'
in
app
)
self
.
assertEqual
(
app
.
virtual_hosting
.
meta_type
,
'Virtual Host Monster'
)
def
test_install_required_roles
(
self
):
def
test_install_required_roles
(
self
):
self
.
configure
(
good_cfg
)
self
.
configure
(
good_cfg
)
i
=
self
.
getOne
()
i
=
self
.
getOne
()
...
...
src/Products/SiteAccess/VirtualHostMonster.py
deleted
100644 → 0
View file @
18ef29ca
This diff is collapsed.
Click to expand it.
src/Products/SiteAccess/__init__.py
deleted
100644 → 0
View file @
18ef29ca
def
initialize
(
context
):
import
VirtualHostMonster
context
.
registerClass
(
instance_class
=
VirtualHostMonster
.
VirtualHostMonster
,
permission
=
'Add Virtual Host Monsters'
,
constructors
=
VirtualHostMonster
.
constructors
,
)
src/Products/SiteAccess/configure.zcml
deleted
100644 → 0
View file @
18ef29ca
<configure xmlns="http://namespaces.zope.org/zope"
xmlns:five="http://namespaces.zope.org/five">
<five:deprecatedManageAddDelete
class="Products.SiteAccess.VirtualHostMonster.VirtualHostMonster"/>
</configure>
src/Products/SiteAccess/tests/__init__.py
deleted
100644 → 0
View file @
18ef29ca
src/Products/SiteAccess/tests/testVirtualHostMonster.py
deleted
100644 → 0
View file @
18ef29ca
"""Virtual Host Monster regression tests.
These tests mainly verify that OFS.Traversable.absolute_url()
works correctly in a VHM environment.
Also see http://zope.org/Collectors/Zope/809
"""
import
unittest
class
VHMRegressions
(
unittest
.
TestCase
):
def
setUp
(
self
):
import
transaction
from
Testing.makerequest
import
makerequest
from
Testing.ZopeTestCase.ZopeLite
import
app
transaction
.
begin
()
self
.
app
=
makerequest
(
app
())
if
'virtual_hosting'
not
in
self
.
app
.
objectIds
():
# If ZopeLite was imported, we have no default virtual
# host monster
from
Products.SiteAccess.VirtualHostMonster
\
import
manage_addVirtualHostMonster
manage_addVirtualHostMonster
(
self
.
app
,
'virtual_hosting'
)
self
.
app
.
manage_addFolder
(
'folder'
)
self
.
app
.
folder
.
manage_addDTMLMethod
(
'doc'
,
''
)
self
.
app
.
REQUEST
.
set
(
'PARENTS'
,
[
self
.
app
])
self
.
traverse
=
self
.
app
.
REQUEST
.
traverse
def
tearDown
(
self
):
import
transaction
transaction
.
abort
()
self
.
app
.
_p_jar
.
close
()
def
testAbsoluteUrl
(
self
):
m
=
self
.
app
.
folder
.
doc
.
absolute_url
self
.
assertEqual
(
m
(),
'http://nohost/folder/doc'
)
def
testAbsoluteUrlPath
(
self
):
m
=
self
.
app
.
folder
.
doc
.
absolute_url_path
self
.
assertEqual
(
m
(),
'/folder/doc'
)
def
testVirtualUrlPath
(
self
):
m
=
self
.
app
.
folder
.
doc
.
absolute_url
self
.
assertEqual
(
m
(
relative
=
1
),
'folder/doc'
)
m
=
self
.
app
.
folder
.
doc
.
virtual_url_path
self
.
assertEqual
(
m
(),
'folder/doc'
)
def
testPhysicalPath
(
self
):
m
=
self
.
app
.
folder
.
doc
.
getPhysicalPath
self
.
assertEqual
(
m
(),
(
''
,
'folder'
,
'doc'
))
def
test_actual_url_no_VHR_no_doc_w_trailing_slash
(
self
):
self
.
traverse
(
'/VirtualHostBase/http/www.mysite.com:80'
'/folder/'
)
self
.
assertEqual
(
self
.
app
.
REQUEST
[
'ACTUAL_URL'
],
'http://www.mysite.com/folder/'
)
def
test_actual_url_no_VHR_no_doc_no_trailing_slash
(
self
):
self
.
traverse
(
'/VirtualHostBase/http/www.mysite.com:80'
'/folder'
)
self
.
assertEqual
(
self
.
app
.
REQUEST
[
'ACTUAL_URL'
],
'http://www.mysite.com/folder'
)
def
test_actual_url_no_VHR_w_doc_w_trailing_slash
(
self
):
self
.
traverse
(
'/VirtualHostBase/http/www.mysite.com:80'
'/folder/doc/'
)
self
.
assertEqual
(
self
.
app
.
REQUEST
[
'ACTUAL_URL'
],
'http://www.mysite.com/folder/doc/'
)
def
test_actual_url_no_VHR_w_doc_no_trailing_slash
(
self
):
self
.
traverse
(
'/VirtualHostBase/http/www.mysite.com:80'
'/folder/doc'
)
self
.
assertEqual
(
self
.
app
.
REQUEST
[
'ACTUAL_URL'
],
'http://www.mysite.com/folder/doc'
)
def
test_actual_url_w_VHR_w_doc_w_trailing_slash
(
self
):
self
.
traverse
(
'/VirtualHostBase/http/www.mysite.com:80'
'/folder/VirtualHostRoot/doc/'
)
self
.
assertEqual
(
self
.
app
.
REQUEST
[
'ACTUAL_URL'
],
'http://www.mysite.com/doc/'
)
def
test_actual_url_w_VHR_w_doc_no_trailing_slash
(
self
):
self
.
traverse
(
'/VirtualHostBase/http/www.mysite.com:80'
'/folder/VirtualHostRoot/doc'
)
self
.
assertEqual
(
self
.
app
.
REQUEST
[
'ACTUAL_URL'
],
'http://www.mysite.com/doc'
)
def
test_actual_url_w_VHR_no_doc_w_trailing_slash
(
self
):
self
.
traverse
(
'/VirtualHostBase/http/www.mysite.com:80'
'/folder/VirtualHostRoot/'
)
self
.
assertEqual
(
self
.
app
.
REQUEST
[
'ACTUAL_URL'
],
'http://www.mysite.com/'
)
def
test_actual_url_w_VHR_no_doc_no_trailing_slash
(
self
):
self
.
traverse
(
'/VirtualHostBase/http/www.mysite.com:80'
'/folder/VirtualHostRoot'
)
self
.
assertEqual
(
self
.
app
.
REQUEST
[
'ACTUAL_URL'
],
'http://www.mysite.com/'
)
def
gen_cases
():
for
vbase
,
ubase
in
(
(
''
,
'http://nohost'
),
(
'/VirtualHostBase/http/example.com:80'
,
'http://example.com'
)):
yield
vbase
,
''
,
''
,
'folder/doc'
,
ubase
for
vr
,
_vh
,
p
in
(
(
'folder'
,
''
,
'doc'
),
(
'folder'
,
'foo'
,
'doc'
),
(
''
,
'foo'
,
'folder/doc'
)):
vparts
=
[
vbase
,
vr
,
'VirtualHostRoot'
]
if
not
vr
:
del
vparts
[
1
]
if
_vh
:
vparts
.
append
(
'_vh_'
+
_vh
)
yield
'/'
.
join
(
vparts
),
vr
,
_vh
,
p
,
ubase
for
i
,
(
vaddr
,
vr
,
_vh
,
p
,
ubase
)
in
enumerate
(
gen_cases
()):
def
test
(
self
,
vaddr
=
vaddr
,
vr
=
vr
,
_vh
=
_vh
,
p
=
p
,
ubase
=
ubase
):
ob
=
self
.
traverse
(
'%s/%s/'
%
(
vaddr
,
p
))
sl_vh
=
(
_vh
and
(
'/'
+
_vh
))
aup
=
sl_vh
+
(
p
and
(
'/'
+
p
))
self
.
assertEqual
(
ob
.
absolute_url_path
(),
aup
)
self
.
assertEqual
(
self
.
app
.
REQUEST
[
'BASEPATH1'
]
+
'/'
+
p
,
aup
)
self
.
assertEqual
(
ob
.
absolute_url
(),
ubase
+
aup
)
self
.
assertEqual
(
ob
.
absolute_url
(
relative
=
1
),
p
)
self
.
assertEqual
(
ob
.
virtual_url_path
(),
p
)
self
.
assertEqual
(
ob
.
getPhysicalPath
(),
(
''
,
'folder'
,
'doc'
))
app
=
ob
.
aq_parent
.
aq_parent
# The absolute URL doesn't end with a slash
self
.
assertEqual
(
app
.
absolute_url
(),
ubase
+
sl_vh
)
# The absolute URL path always begins with a slash
self
.
assertEqual
(
app
.
absolute_url_path
(),
'/'
+
_vh
)
self
.
assertEqual
(
app
.
absolute_url
(
relative
=
1
),
''
)
self
.
assertEqual
(
app
.
virtual_url_path
(),
''
)
setattr
(
VHMRegressions
,
'testTraverse%s'
%
i
,
test
)
class
VHMAddingTests
(
unittest
.
TestCase
):
def
setUp
(
self
):
from
OFS.Folder
import
Folder
super
(
VHMAddingTests
,
self
).
setUp
()
self
.
root
=
Folder
(
'root'
)
def
_makeOne
(
self
):
from
Products.SiteAccess.VirtualHostMonster
import
VirtualHostMonster
return
VirtualHostMonster
()
def
test_add_with_existing_vhm
(
self
):
from
Products.SiteAccess.VirtualHostMonster
import
\
manage_addVirtualHostMonster
from
zExceptions
import
BadRequest
vhm1
=
self
.
_makeOne
()
vhm1
.
manage_addToContainer
(
self
.
root
)
vhm2
=
self
.
_makeOne
()
self
.
assertRaises
(
BadRequest
,
vhm2
.
manage_addToContainer
,
self
.
root
)
self
.
assertRaises
(
BadRequest
,
manage_addVirtualHostMonster
,
self
.
root
)
def
test_add_id_collision
(
self
):
from
OFS.Folder
import
Folder
from
Products.SiteAccess.VirtualHostMonster
import
\
manage_addVirtualHostMonster
from
zExceptions
import
BadRequest
self
.
root
.
_setObject
(
'virtual_hosting'
,
Folder
(
'virtual_hosting'
))
vhm1
=
self
.
_makeOne
()
self
.
assertRaises
(
BadRequest
,
vhm1
.
manage_addToContainer
,
self
.
root
)
self
.
assertRaises
(
BadRequest
,
manage_addVirtualHostMonster
,
self
.
root
)
def
test_add_addToContainer
(
self
):
from
ZPublisher.BeforeTraverse
import
queryBeforeTraverse
vhm1
=
self
.
_makeOne
()
vhm1
.
manage_addToContainer
(
self
.
root
)
self
.
assertTrue
(
vhm1
.
getId
()
in
self
.
root
.
objectIds
())
self
.
assertTrue
(
queryBeforeTraverse
(
self
.
root
,
vhm1
.
meta_type
))
def
test_add_manage_addVirtualHostMonster
(
self
):
from
Products.SiteAccess.VirtualHostMonster
import
\
manage_addVirtualHostMonster
from
Products.SiteAccess.VirtualHostMonster
import
VirtualHostMonster
from
ZPublisher.BeforeTraverse
import
queryBeforeTraverse
manage_addVirtualHostMonster
(
self
.
root
)
self
.
assertTrue
(
VirtualHostMonster
.
id
in
self
.
root
.
objectIds
())
hook
=
queryBeforeTraverse
(
self
.
root
,
VirtualHostMonster
.
meta_type
)
self
.
assertTrue
(
hook
)
src/Products/SiteAccess/www/VirtualHostMonster.dtml
deleted
100644 → 0
View file @
18ef29ca
<dtml-var manage_page_header>
<dtml-var manage_tabs>
<h3>The Virtual Host Monster supports virtual hosting</h3>
<p class="form-help">
It changes the protocol, host, and/or path of URLs generated by Zope.
Values affected include REQUEST variables starting with URL or BASE
(such as URL1, BASE2, URLPATH0), and the absolute_url() methods of
objects. By changing these, the Virtual Host Monster allows you to
host several different domains in a single Zope.
</p>
<p class="form-help">
The most common sort of virtual hosting setup is one in which you
create a Folder in your Zope root for each domain that you want to
serve. For instance <strong>http://www.buystuff.com</strong> is
served from Folder /buystuff.com while
<strong>http://www.mycause.org</strong> is served from /mycause.org.
</p>
<h3>One is enough</h3>
<p class="form-help">
A single Virtual Host Monster in your Zope root can handle all of your
virtual hosting needs. It doesn't matter what Id you give it, as long
as nothing else in your site has the same Id.
</p>
<h3>You must add special names in the path</h3>
<p class="form-help">
The VHM doesn't do anything unless it sees one
of the following special path elements in a URL:
<em>VirtualHostBase</em> sets the protocol and host, while
<em>VirtualHostRoot</em> sets the path root.</p>
<p class="form-help">
If the URL path of a request begins with
"/VirtualHostBase/http/www.buystuff.com", for instance, then
URLs generated by Zope will start with
<strong>http://www.buystuff.com</strong>.
Since the port number was not specified, it is left unchanged. If
your Zope is running on port 8080, and you want generated URLs not to
include this port number, you must use
"/VirtualHostBase/http/www.buystuff.com:80".
</p>
<p class="form-help">
If the URL contains <em>VirtualHostRoot</em>, then
all path elements up to that point are removed from generated URLs.
For instance, a request with path "/a/b/c/VirtualHostRoot/d"
will traverse "a/b/c/d" and then generate a URL with
path <strong>/d</strong>.
</p>
<h3>You add these names by rewriting incoming URLs</h3>
<p class="form-help">
Visitors to your site don't see these special names, of course.
You insert them into the path using either an external rewriter,
such as an Apache RewriteRule or ProxyPass directive, or by
setting up a mapping on the "Mappings" tab.
</p>
<p class="form-help">
For example, suppose Zope is running on port
8080 behind an Apache running on port 80. You place a Virtual Host
Monster in the Zope root Folder, and use Apache to rewrite "/(.*)"
to <strong>http://localhost:8080/VirtualHostBase/http/www.buystuff.com:80/buystuff.com/VirtualHostRoot/$1</strong>.
</p>
<p class="form-help">
You could get the same effect in a standalone Zope by adding the line
<code>www.buystuff.com/buystuff.com</code> to the "Mappings"
tab. In either case, requests for
<strong>http://www.buystuff.com/anything</strong>
will look for Zope object <strong>/buystuff.com/anything</strong>.
</p>
<p class="form-help">
You should only use the "Mappings" tab for simple virtual
hosting, in a Zope that is serving requests directly. Each mapping
line is a host name followed by a path to a Folder. The VHM checks
the host specified in each incoming request to see if it is in the
list. If it is, then the corresponding path is inserted at the start
of the path, followed by "VirtualHostRoot".
</p>
<p class="form-help">
You can match
multiple subdomains by putting "*." in front of the host
name, as in "*.buystuff.com". If an exact match exists, it
is used instead of a wildcard match.
</p>
<h3>Inside-out hosting</h3>
<p class="form-help">
Another use for virtual hosting is to make Zope appear to be part of a
site controlled by another server. For example, Zope might only serve
the contents of <strong>http://www.mycause.org/dynamic_stuff</strong>.
To accomplish this, you want to add "dynamic_stuff" to the
start of all Zope-generated URLs.
</p>
<p class="form-help">
If you insert <em>VirtualHostRoot</em>, followed by one or more path elements
that start with '_vh_', then these elements will
be ignored during traversal and then added (without the '_vh_') to the
start of generated URLs.
For instance, a request for "/a/VirtualHostRoot/_vh_z/"
will traverse "a" and then generate URLs that start with
<strong>/z</strong>.
</p>
<p class="form-help">
In our example, you would have the main server send requests for
<strong>http://www.mycause.org/dynamic_stuff/anything</strong>
to Zope, rewritten as
<strong>/VirtualHostRoot/_vh_dynamic_stuff/anything</strong>.
</p>
<dtml-var manage_page_footer>
src/Products/SiteAccess/www/manage_edit.dtml
deleted
100644 → 0
View file @
18ef29ca
<dtml-var manage_page_header>
<dtml-var manage_tabs>
<p class="form-help">
You may edit the mappings for this Virtual Host Monster using the form below.
<strong><em>You don't need to use this tab</em></strong> if you are using
Apache or some other front-end server to rewrite requests. This is
only for simple virtual hosting in a bare Zope server. If you place
the hostname that you use to manage your Zope in this list
<strong><em>you are likely to regret it</em></strong>, and will
probably need to manage Zope using its raw IP address to fix things.
</p>
<form action="set_map" method="post">
<table cellpadding="2" cellspacing="0" width="100%" border="0">
<dtml-with keyword_args mapping>
<tr>
<td align="left" valign="top" colspan="2" class="form-help">
Each line represents a path mapping for a single host
(<strong>host/path</strong>),
or a set of hosts (<strong>*.host/path</strong>).
<div style="width: 100%;">
<textarea name="map_text:text" wrap="off" style="width: 100%;"
rows="20"><dtml-in lines>&dtml-sequence-item;
</dtml-in></textarea>
</div>
</td>
</tr>
</dtml-with>
<tr>
<td align="left" valign="top" colspan="2">
<div class="form-element">
<dtml-if wl_isLocked>
<em>Locked</em>
<dtml-else>
<input class="form-element" type="submit" name="SUBMIT" value="Save Changes">
</dtml-if>
</div>
</td>
</tr>
</table>
</form>
<dtml-var manage_page_footer>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment