Compare commits
16 Commits
es_rev9851
...
es_rev9879
| Author | SHA1 | Date | |
|---|---|---|---|
| 167ac563aa | |||
| f4ac4be684 | |||
| 12a3898487 | |||
| 0e3419fea0 | |||
| 816f0eb820 | |||
| bd3fe63976 | |||
| 0c7d8af9d7 | |||
| f80268c1ac | |||
| 77e2c28d18 | |||
| af137629e0 | |||
| a7f1f14b8a | |||
| fbda2c9eb2 | |||
| ff58593bff | |||
| c65f5765d6 | |||
| 19565b9c98 | |||
| 6716cb5575 |
@@ -25,6 +25,7 @@
|
|||||||
<library name="cms_basic_auth_module" location="..\..\modules\basic_auth\basic_auth-safe.ecf" readonly="false"/>
|
<library name="cms_basic_auth_module" location="..\..\modules\basic_auth\basic_auth-safe.ecf" readonly="false"/>
|
||||||
<library name="cms_blog_module" location="..\..\modules\blog\cms_blog_module-safe.ecf" readonly="false"/>
|
<library name="cms_blog_module" location="..\..\modules\blog\cms_blog_module-safe.ecf" readonly="false"/>
|
||||||
<library name="cms_contact_module" location="..\..\modules\contact\contact-safe.ecf" readonly="false"/>
|
<library name="cms_contact_module" location="..\..\modules\contact\contact-safe.ecf" readonly="false"/>
|
||||||
|
<library name="cms_custom_block_module" location="..\..\modules\custom_block\custom_block-safe.ecf" readonly="false"/>
|
||||||
<library name="cms_demo_module" location="modules\demo\cms_demo_module-safe.ecf" readonly="false"/>
|
<library name="cms_demo_module" location="modules\demo\cms_demo_module-safe.ecf" readonly="false"/>
|
||||||
<library name="cms_email_service" location="..\..\library\email\email-safe.ecf" readonly="false"/>
|
<library name="cms_email_service" location="..\..\library\email\email-safe.ecf" readonly="false"/>
|
||||||
<library name="cms_feed_aggregator_module" location="..\..\modules\feed_aggregator\feed_aggregator-safe.ecf" readonly="false"/>
|
<library name="cms_feed_aggregator_module" location="..\..\modules\feed_aggregator\feed_aggregator-safe.ecf" readonly="false"/>
|
||||||
|
|||||||
@@ -18,3 +18,4 @@ set ROC_CMS_DIR=%~dp0
|
|||||||
%ROC_CMD% install --module ..\..\modules\session_auth --dir %ROC_CMS_DIR%
|
%ROC_CMD% install --module ..\..\modules\session_auth --dir %ROC_CMS_DIR%
|
||||||
%ROC_CMD% install --module ..\..\modules\taxonomy --dir %ROC_CMS_DIR%
|
%ROC_CMD% install --module ..\..\modules\taxonomy --dir %ROC_CMS_DIR%
|
||||||
%ROC_CMD% install --module ..\..\modules\files --dir %ROC_CMS_DIR%
|
%ROC_CMD% install --module ..\..\modules\files --dir %ROC_CMS_DIR%
|
||||||
|
%ROC_CMD% install --module ..\..\modules\custom_block --dir %ROC_CMS_DIR%
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
#navigation.region=sidebar_first
|
#navigation.region=sidebar_first
|
||||||
#navigation.condition=is_front
|
#navigation.condition=is_front
|
||||||
management.conditions[]=path:admin*
|
#management.conditions[]=path:admin*
|
||||||
management.conditions[]=is_front
|
#management.conditions[]=is_front
|
||||||
|
|
||||||
#Feeds
|
#Feeds
|
||||||
feed.news.weight=3
|
feed.news.weight=3
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ root-dir=site/www
|
|||||||
[site]
|
[site]
|
||||||
# General token that could be use for cookies, and related.
|
# General token that could be use for cookies, and related.
|
||||||
id=_EIFFEL_CMS_
|
id=_EIFFEL_CMS_
|
||||||
|
#debug=true
|
||||||
|
|
||||||
# Name of the site, for the title, and eventual message.
|
# Name of the site, for the title, and eventual message.
|
||||||
name=Eiffel CMS
|
name=Eiffel CMS
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
{
|
{
|
||||||
"subject": "Thank you for contacting us",
|
"subject": "Thank you for contacting us",
|
||||||
|
"forms": {
|
||||||
|
"registration": {
|
||||||
|
"application_description": "Present yourself in a few lines, otherwise your application is likely to be rejected."
|
||||||
|
}
|
||||||
|
},
|
||||||
"recaptcha": {
|
"recaptcha": {
|
||||||
"site_key":"6Lex9RMTAAAAAKleC4x6TaRlFcpLbEWgH_U7MSiD",
|
"site_key":"6Lex9RMTAAAAAKleC4x6TaRlFcpLbEWgH_U7MSiD",
|
||||||
"secret_key":"6Lex9RMTAAAAAAkBczvX5DUiyg_xoM_EthVVgRRx"
|
"secret_key":"6Lex9RMTAAAAAAkBczvX5DUiyg_xoM_EthVVgRRx"
|
||||||
|
|||||||
@@ -1,39 +1,38 @@
|
|||||||
<div>
|
<div>
|
||||||
<form action="{$site_url/}account/roc-register" method="post">
|
<form action="{$site_url/}account/roc-register" method="post">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Registration</legend>
|
<legend>Registration</legend>
|
||||||
<div>
|
<div>
|
||||||
<input type="text" id="name" name="name" value="{$name/}" required autofocus />
|
<input type="text" id="name" name="name" value="{$name/}" required autofocus />
|
||||||
<label for="name">Name</label>
|
<label for="name">Name</label>
|
||||||
{if isset="$error_name"}
|
{if isset="$error_name"}
|
||||||
<span><i>{$error_name/}</i></span> <br>
|
<span><i>{$error_name/}</i></span> <br>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<input type="password" id="password" name="password" value="" required/>
|
<input type="password" id="password" name="password" value="" required/>
|
||||||
<label for="password">Password</label>
|
<label for="password">Password</label>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<input type="email" id="email" name="email" value="{$email/}" required/>
|
<input type="email" id="email" name="email" value="{$email/}" required/>
|
||||||
<label for="email">Email</label>
|
<label for="email">Email</label>
|
||||||
{if isset="$error_email"}
|
{if isset="$error_email"}
|
||||||
<span><i>{$error_email/}</i></span> <br>
|
<span><i>{$error_email/}</i></span> <br/>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<textarea rows="4" cols="50" name="personal_information" id="personal_information" required>
|
<textarea rows="4" cols="50" name="personal_information" id="personal_information" required>{$personal_information/}</textarea>
|
||||||
{$personal_information/}
|
<label for="personal_information">Tell us why you want to register an account</label>
|
||||||
</textarea>
|
{if isset="$error_application"}
|
||||||
<label for="personal_information">Tell us why you want to register an account</label>
|
<span><i>{$error_application/}</i></span><br/>
|
||||||
{if isset="$error_application"}
|
{/if}
|
||||||
<span><i>{$error_application/}</i></span> <br>
|
{if isset="$application_description"}
|
||||||
{/if}
|
<br/>
|
||||||
</div>
|
<p class="description">{$application_description/}</p>
|
||||||
{unless isempty="$recaptcha_site_key"}
|
{/if}
|
||||||
<div class="g-recaptcha" data-sitekey="{$recaptcha_site_key/}"></div>
|
</div>
|
||||||
<br/>
|
{unless isempty="$recaptcha_site_key"}<div class="g-recaptcha" data-sitekey="{$recaptcha_site_key/}"></div><br/>{/unless}
|
||||||
{/unless}
|
<button type="submit">Register</button>
|
||||||
<button type="submit">Register</button>
|
</fieldset>
|
||||||
</fieldset>
|
</form>
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{unless isset="$user"}
|
{unless isset="$user"}
|
||||||
<div class="login-box">
|
<div class="login-box">
|
||||||
<div class="description">The "Basic Auth" relies on the HTTP basic acces authentication.<br/>(see also: <a href="https://en.wikipedia.org/wiki/Basic_access_authentication">https://en.wikipedia.org/wiki/Basic_access_authentication</a> )</div>
|
<div class="description">The "Basic Auth" relies on the HTTP basic access authentication.<br/>(see also: <a href="https://en.wikipedia.org/wiki/Basic_access_authentication">https://en.wikipedia.org/wiki/Basic_access_authentication</a> )</div>
|
||||||
<h3>Login or <a href="{$site_url/}account/roc-register">Register</a></h3>
|
<h3>Login or <a href="{$site_url/}account/roc-register">Register</a></h3>
|
||||||
<div>
|
<div>
|
||||||
<form name="cms_basic_auth" action="{$site_url/}roc-basic-login" method="POST">
|
<form name="cms_basic_auth" action="{$site_url/}roc-basic-login" method="POST">
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"blocks": {
|
||||||
|
"test": {
|
||||||
|
"title": "Custom block test",
|
||||||
|
"region": "footer",
|
||||||
|
"weight": 100,
|
||||||
|
"conditions": ["path:demo/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<div>
|
||||||
|
This is a nice custom block test for site {$sitename/}.
|
||||||
|
</div>
|
||||||
@@ -77,6 +77,7 @@ feature -- CMS modules
|
|||||||
|
|
||||||
-- Miscellanious
|
-- Miscellanious
|
||||||
a_setup.register_module (create {GOOGLE_CUSTOM_SEARCH_MODULE}.make)
|
a_setup.register_module (create {GOOGLE_CUSTOM_SEARCH_MODULE}.make)
|
||||||
|
a_setup.register_module (create {CMS_CUSTOM_BLOCK_MODULE}.make)
|
||||||
a_setup.register_module (create {CMS_DEBUG_MODULE}.make)
|
a_setup.register_module (create {CMS_DEBUG_MODULE}.make)
|
||||||
a_setup.register_module (create {CMS_DEMO_MODULE}.make)
|
a_setup.register_module (create {CMS_DEMO_MODULE}.make)
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ feature -- Query
|
|||||||
end
|
end
|
||||||
|
|
||||||
resolved_text_list_item (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
resolved_text_list_item (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
||||||
-- List of String item associated with key `k',
|
-- List of String items associated with key `k',
|
||||||
-- and expanded values to resolved variables ${varname}.
|
-- and expanded values to resolved variables ${varname}.
|
||||||
do
|
do
|
||||||
if attached text_list_item (k) as lst then
|
if attached text_list_item (k) as lst then
|
||||||
@@ -50,7 +50,7 @@ feature -- Query
|
|||||||
end
|
end
|
||||||
|
|
||||||
resolved_text_table_item (k: READABLE_STRING_GENERAL): detachable STRING_TABLE [READABLE_STRING_32]
|
resolved_text_table_item (k: READABLE_STRING_GENERAL): detachable STRING_TABLE [READABLE_STRING_32]
|
||||||
-- Table of String item associated with key `k',
|
-- Table of String items associated with key `k',
|
||||||
-- and expanded values to resolved variables ${varname}.
|
-- and expanded values to resolved variables ${varname}.
|
||||||
do
|
do
|
||||||
if attached text_table_item (k) as tb then
|
if attached text_table_item (k) as tb then
|
||||||
@@ -71,12 +71,17 @@ feature -- Query
|
|||||||
end
|
end
|
||||||
|
|
||||||
text_list_item (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
text_list_item (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
||||||
-- List of String item associated with key `k'.
|
-- List of String items associated with key `k'.
|
||||||
deferred
|
deferred
|
||||||
end
|
end
|
||||||
|
|
||||||
text_table_item (k: READABLE_STRING_GENERAL): detachable STRING_TABLE [READABLE_STRING_32]
|
text_table_item (k: READABLE_STRING_GENERAL): detachable STRING_TABLE [READABLE_STRING_32]
|
||||||
-- Table of String item associated with key `k'.
|
-- Table of String items associated with key `k'.
|
||||||
|
deferred
|
||||||
|
end
|
||||||
|
|
||||||
|
table_keys (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
||||||
|
-- Keys of table associated with key `k'.
|
||||||
deferred
|
deferred
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -163,6 +163,20 @@ feature -- Access: Config Reader
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
table_keys (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
||||||
|
-- <Precursor>
|
||||||
|
do
|
||||||
|
if attached {STRING_TABLE [like item]} item (k) as l_list then
|
||||||
|
create {ARRAYED_LIST [READABLE_STRING_32]} Result.make (l_list.count)
|
||||||
|
Result.compare_objects
|
||||||
|
across
|
||||||
|
l_list as ic
|
||||||
|
loop
|
||||||
|
Result.force (ic.key.as_string_32)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
integer_item (k: READABLE_STRING_GENERAL): INTEGER
|
integer_item (k: READABLE_STRING_GENERAL): INTEGER
|
||||||
-- Integer item associated with key `k'.
|
-- Integer item associated with key `k'.
|
||||||
do
|
do
|
||||||
@@ -442,12 +456,12 @@ feature {NONE} -- Implementation
|
|||||||
j := k.index_of (']', i + 1)
|
j := k.index_of (']', i + 1)
|
||||||
if j = i + 1 then -- ends_with "[]"
|
if j = i + 1 then -- ends_with "[]"
|
||||||
k.keep_head (i - 1)
|
k.keep_head (i - 1)
|
||||||
if
|
if
|
||||||
a_section_prefix /= Void and then
|
a_section_prefix /= Void and then
|
||||||
attached {LIST [STRING_8]} items.item (a_section_prefix + {STRING_32} "." + k) as l_list
|
attached {LIST [STRING_8]} items.item (a_section_prefix + {STRING_32} "." + k) as l_list
|
||||||
then
|
then
|
||||||
lst := l_list
|
lst := l_list
|
||||||
elseif
|
elseif
|
||||||
attached last_section_name as l_section_prefix and then
|
attached last_section_name as l_section_prefix and then
|
||||||
attached {LIST [STRING_8]} items.item (l_section_prefix + {STRING_32} "." + k) as l_list
|
attached {LIST [STRING_8]} items.item (l_section_prefix + {STRING_32} "." + k) as l_list
|
||||||
then
|
then
|
||||||
@@ -466,12 +480,12 @@ feature {NONE} -- Implementation
|
|||||||
sk.left_adjust
|
sk.left_adjust
|
||||||
sk.right_adjust
|
sk.right_adjust
|
||||||
k.keep_head (i - 1)
|
k.keep_head (i - 1)
|
||||||
if
|
if
|
||||||
a_section_prefix /= Void and then
|
a_section_prefix /= Void and then
|
||||||
attached {STRING_TABLE [STRING_8]} items.item (a_section_prefix + {STRING_32} "." + k) as l_table
|
attached {STRING_TABLE [STRING_8]} items.item (a_section_prefix + {STRING_32} "." + k) as l_table
|
||||||
then
|
then
|
||||||
tb := l_table
|
tb := l_table
|
||||||
elseif
|
elseif
|
||||||
attached last_section_name as l_section_prefix and then
|
attached last_section_name as l_section_prefix and then
|
||||||
attached {STRING_TABLE [STRING_8]} items.item (l_section_prefix + {STRING_32} "." + k) as l_table
|
attached {STRING_TABLE [STRING_8]} items.item (l_section_prefix + {STRING_32} "." + k) as l_table
|
||||||
then
|
then
|
||||||
@@ -522,7 +536,7 @@ feature {NONE} -- Implementation
|
|||||||
invariant
|
invariant
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Jocelyn Fiat, Eiffel Software and others"
|
copyright: "2011-2016, Jocelyn Fiat, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
source: "[
|
source: "[
|
||||||
Eiffel Software
|
Eiffel Software
|
||||||
|
|||||||
@@ -105,6 +105,20 @@ feature -- Access: Config Reader
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
table_keys (k: READABLE_STRING_GENERAL): detachable LIST [READABLE_STRING_32]
|
||||||
|
-- <Precursor>
|
||||||
|
do
|
||||||
|
if attached {JSON_OBJECT} item (k) as obj then
|
||||||
|
create {ARRAYED_LIST [READABLE_STRING_32]} Result.make (obj.count)
|
||||||
|
Result.compare_objects
|
||||||
|
across
|
||||||
|
obj as ic
|
||||||
|
loop
|
||||||
|
Result.force (ic.key.item)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
integer_item (k: READABLE_STRING_GENERAL): INTEGER
|
integer_item (k: READABLE_STRING_GENERAL): INTEGER
|
||||||
-- Integer item associated with key `k'.
|
-- Integer item associated with key `k'.
|
||||||
|
|||||||
@@ -75,13 +75,21 @@ feature -- Test
|
|||||||
lst.has ("a") and lst.has ("b") and lst.has ("c") and lst.has ("1") and lst.has ("2") and lst.has ("3")
|
lst.has ("a") and lst.has ("b") and lst.has ("c") and lst.has ("1") and lst.has ("2") and lst.has ("3")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
assert ("has_item (table)", cfg.has_item ("table"))
|
assert ("has_item (table)", cfg.has_item ("table"))
|
||||||
assert ("item (table)", attached cfg.text_table_item ("table") as tb and then (
|
assert ("item (table)", attached cfg.text_table_item ("table") as tb and then (
|
||||||
tb.item ("a") ~ {STRING_32} "1" and
|
tb.item ("a") ~ {STRING_32} "1" and
|
||||||
tb.item ("b") ~ {STRING_32} "2" and
|
tb.item ("b") ~ {STRING_32} "2" and
|
||||||
tb.item ("c") ~ {STRING_32} "3" and
|
tb.item ("c") ~ {STRING_32} "3" and
|
||||||
tb.item ("d") ~ {STRING_32} "test"
|
tb.item ("d") ~ {STRING_32} "test"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
assert ("keys of (table)", attached cfg.table_keys ("table") as tb and then (
|
||||||
|
tb.i_th (1) ~ {STRING_32} "a" and
|
||||||
|
tb.i_th (2) ~ {STRING_32} "b" and
|
||||||
|
tb.i_th (3) ~ {STRING_32} "c" and
|
||||||
|
tb.i_th (4) ~ {STRING_32} "d"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -198,13 +206,21 @@ feature -- Test
|
|||||||
lst.has ("a") and lst.has ("b") and lst.has ("c") and lst.has ("1") and lst.has ("2") and lst.has ("3")
|
lst.has ("a") and lst.has ("b") and lst.has ("c") and lst.has ("1") and lst.has ("2") and lst.has ("3")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
assert ("has_item (table)", cfg.has_item ("table"))
|
assert ("has_item (table)", cfg.has_item ("table"))
|
||||||
assert ("item (table)", attached cfg.text_table_item ("table") as tb and then (
|
assert ("item (table)", attached cfg.text_table_item ("table") as tb and then (
|
||||||
tb.item ("a") ~ {STRING_32} "1" and
|
tb.item ("a") ~ {STRING_32} "1" and
|
||||||
tb.item ("b") ~ {STRING_32} "2" and
|
tb.item ("b") ~ {STRING_32} "2" and
|
||||||
tb.item ("c") ~ {STRING_32} "3" and
|
tb.item ("c") ~ {STRING_32} "3" and
|
||||||
tb.item ("d") ~ {STRING_32} "test"
|
tb.item ("d") ~ {STRING_32} "test"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
assert ("keys of (table)", attached cfg.table_keys ("table") as tb and then (
|
||||||
|
tb.i_th (1) ~ {STRING_32} "a" and
|
||||||
|
tb.i_th (2) ~ {STRING_32} "b" and
|
||||||
|
tb.i_th (3) ~ {STRING_32} "c" and
|
||||||
|
tb.i_th (4) ~ {STRING_32} "d"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -163,6 +163,22 @@ feature -- Security
|
|||||||
|
|
||||||
feature -- Element change
|
feature -- Element change
|
||||||
|
|
||||||
|
set_title (a_title: detachable READABLE_STRING_GENERAL)
|
||||||
|
-- Set `title' to `a_title' or `location'.
|
||||||
|
do
|
||||||
|
if a_title /= Void then
|
||||||
|
title := a_title.as_string_32
|
||||||
|
else
|
||||||
|
title := location.as_string_32
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
set_location (a_loc: READABLE_STRING_8)
|
||||||
|
-- Set `location' to `a_loc'.
|
||||||
|
do
|
||||||
|
location := a_loc
|
||||||
|
end
|
||||||
|
|
||||||
set_weight (a_weight: INTEGER)
|
set_weight (a_weight: INTEGER)
|
||||||
-- Set `weight' to `a_weight'.
|
-- Set `weight' to `a_weight'.
|
||||||
do
|
do
|
||||||
|
|||||||
@@ -18,13 +18,82 @@ feature -- Access
|
|||||||
deferred
|
deferred
|
||||||
end
|
end
|
||||||
|
|
||||||
feature -- Element change
|
item_by_title (a_title: READABLE_STRING_GENERAL): detachable CMS_LINK
|
||||||
|
-- First link with title `a_title' if any.
|
||||||
|
do
|
||||||
|
if attached items as l_items then
|
||||||
|
across
|
||||||
|
l_items as ic
|
||||||
|
until
|
||||||
|
Result /= Void
|
||||||
|
loop
|
||||||
|
Result := ic.item
|
||||||
|
if not a_title.is_case_insensitive_equal (Result.title) then
|
||||||
|
Result := Void
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ensure
|
||||||
|
coherent_result: Result /= Void implies Result.title.is_case_insensitive_equal_general (a_title)
|
||||||
|
end
|
||||||
|
|
||||||
|
item_by_location (a_loc: READABLE_STRING_8): detachable CMS_LINK
|
||||||
|
-- First link with location `a_loc' if any.
|
||||||
|
do
|
||||||
|
if attached items as l_items then
|
||||||
|
across
|
||||||
|
l_items as ic
|
||||||
|
until
|
||||||
|
Result /= Void
|
||||||
|
loop
|
||||||
|
Result := ic.item
|
||||||
|
if not a_loc.same_string (Result.location) then
|
||||||
|
Result := Void
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ensure
|
||||||
|
coherent_result: Result /= Void implies Result.location.same_string (a_loc)
|
||||||
|
end
|
||||||
|
|
||||||
|
new_composite_item (a_title: detachable READABLE_STRING_GENERAL; a_location: READABLE_STRING_8): CMS_LINK_COMPOSITE
|
||||||
|
-- If exists, item with location `a_location' or title `a_title',
|
||||||
|
-- otherwise create new local link and extend to Current.
|
||||||
|
local
|
||||||
|
lnk: CMS_LOCAL_LINK
|
||||||
|
do
|
||||||
|
if attached {CMS_LINK_COMPOSITE} item_by_location (a_location) as l_parent then
|
||||||
|
Result := l_parent
|
||||||
|
elseif a_title /= Void and then attached {CMS_LINK_COMPOSITE} item_by_title (a_title) as l_parent then
|
||||||
|
Result := l_parent
|
||||||
|
else
|
||||||
|
create lnk.make (a_title, a_location)
|
||||||
|
extend (lnk)
|
||||||
|
Result := lnk
|
||||||
|
end
|
||||||
|
if attached {CMS_LOCAL_LINK} Result as l_local_lnk and then not l_local_lnk.is_expanded then
|
||||||
|
l_local_lnk.set_expandable (True)
|
||||||
|
l_local_lnk.set_collapsed (True)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- Element change
|
||||||
|
|
||||||
extend (lnk: CMS_LINK)
|
extend (lnk: CMS_LINK)
|
||||||
-- Add `lnk' as a sub link.
|
-- Add `lnk' as a sub link.
|
||||||
deferred
|
deferred
|
||||||
end
|
end
|
||||||
|
|
||||||
|
extend_into (lnk: CMS_LINK; a_parent_title: detachable READABLE_STRING_GENERAL; a_parent_location: READABLE_STRING_8)
|
||||||
|
-- Extend `lnk' into local link with location `a_parent_location'.
|
||||||
|
-- If the parent is not found, create it with title `a_parent_title'.
|
||||||
|
local
|
||||||
|
l_parent: CMS_LINK_COMPOSITE
|
||||||
|
do
|
||||||
|
l_parent := new_composite_item (a_parent_title, a_parent_location)
|
||||||
|
l_parent.extend (lnk)
|
||||||
|
end
|
||||||
|
|
||||||
remove (lnk: CMS_LINK)
|
remove (lnk: CMS_LINK)
|
||||||
-- Remove link `lnk' from Current container.
|
-- Remove link `lnk' from Current container.
|
||||||
deferred
|
deferred
|
||||||
@@ -68,6 +137,6 @@ feature -- status report
|
|||||||
end
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
|
copyright: "2011-2016, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -79,16 +79,6 @@ feature -- Security
|
|||||||
|
|
||||||
feature -- Element change
|
feature -- Element change
|
||||||
|
|
||||||
set_title (a_title: detachable READABLE_STRING_GENERAL)
|
|
||||||
-- Set `title' to `a_title' or `location'.
|
|
||||||
do
|
|
||||||
if a_title /= Void then
|
|
||||||
title := a_title.as_string_32
|
|
||||||
else
|
|
||||||
title := location.as_string_32
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
add_link (lnk: CMS_LINK)
|
add_link (lnk: CMS_LINK)
|
||||||
-- <Precursor>
|
-- <Precursor>
|
||||||
local
|
local
|
||||||
@@ -194,6 +184,6 @@ feature {NONE} -- Implementation
|
|||||||
invariant
|
invariant
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
|
copyright: "2011-2016, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ feature -- Status report
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
feature -- Element change
|
feature -- Element change
|
||||||
|
|
||||||
extend (lnk: CMS_LINK)
|
extend (lnk: CMS_LINK)
|
||||||
-- <Precursor>
|
-- <Precursor>
|
||||||
@@ -104,6 +104,6 @@ feature -- Access
|
|||||||
invariant
|
invariant
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
|
copyright: "2011-2016, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ feature {NONE} -- Initialization
|
|||||||
|
|
||||||
feature -- Access
|
feature -- Access
|
||||||
|
|
||||||
id: INTEGER
|
id: INTEGER_64
|
||||||
-- Unique identifier of Current.
|
-- Unique identifier of Current.
|
||||||
|
|
||||||
category: READABLE_STRING_8
|
category: READABLE_STRING_8
|
||||||
@@ -124,4 +124,7 @@ feature -- Constants
|
|||||||
level_info: INTEGER = 7
|
level_info: INTEGER = 7
|
||||||
level_debug: INTEGER = 8
|
level_debug: INTEGER = 8
|
||||||
|
|
||||||
|
note
|
||||||
|
copyright: "2011-2016, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
|
||||||
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ feature -- Access: router
|
|||||||
|
|
||||||
l_user_handler: CMS_USER_HANDLER
|
l_user_handler: CMS_USER_HANDLER
|
||||||
l_role_handler: CMS_ROLE_HANDLER
|
l_role_handler: CMS_ROLE_HANDLER
|
||||||
|
l_admin_logs_handler: CMS_LOGS_HANDLER
|
||||||
|
|
||||||
l_admin_cache_handler: CMS_ADMIN_CACHE_HANDLER
|
l_admin_cache_handler: CMS_ADMIN_CACHE_HANDLER
|
||||||
l_admin_export_handler: CMS_ADMIN_EXPORT_HANDLER
|
l_admin_export_handler: CMS_ADMIN_EXPORT_HANDLER
|
||||||
@@ -76,6 +77,11 @@ feature -- Access: router
|
|||||||
create l_uri_mapping.make_trailing_slash_ignored ("/admin/roles", l_roles_handler)
|
create l_uri_mapping.make_trailing_slash_ignored ("/admin/roles", l_roles_handler)
|
||||||
a_router.map (l_uri_mapping, a_router.methods_get_post)
|
a_router.map (l_uri_mapping, a_router.methods_get_post)
|
||||||
|
|
||||||
|
create l_admin_logs_handler.make (a_api)
|
||||||
|
create l_uri_mapping.make_trailing_slash_ignored ("/admin/logs", l_admin_logs_handler)
|
||||||
|
a_router.map (l_uri_mapping, a_router.methods_get)
|
||||||
|
|
||||||
|
|
||||||
create l_admin_cache_handler.make (a_api)
|
create l_admin_cache_handler.make (a_api)
|
||||||
create l_uri_mapping.make_trailing_slash_ignored ("/admin/cache", l_admin_cache_handler)
|
create l_uri_mapping.make_trailing_slash_ignored ("/admin/cache", l_admin_cache_handler)
|
||||||
a_router.map (l_uri_mapping, a_router.methods_get_post)
|
a_router.map (l_uri_mapping, a_router.methods_get_post)
|
||||||
@@ -103,11 +109,12 @@ feature -- Security
|
|||||||
-- List of permission ids, used by this module, and declared.
|
-- List of permission ids, used by this module, and declared.
|
||||||
do
|
do
|
||||||
Result := Precursor
|
Result := Precursor
|
||||||
Result.force ("manage admin")
|
Result.force ("access admin")
|
||||||
Result.force ("admin users")
|
Result.force ("admin users")
|
||||||
Result.force ("admin roles")
|
Result.force ("admin roles")
|
||||||
Result.force ("admin modules")
|
Result.force ("admin modules")
|
||||||
Result.force ("install modules")
|
Result.force ("install modules")
|
||||||
|
Result.force ("view logs")
|
||||||
Result.force ("admin core caches")
|
Result.force ("admin core caches")
|
||||||
Result.force ("clear blocks cache")
|
Result.force ("clear blocks cache")
|
||||||
Result.force ("admin export")
|
Result.force ("admin export")
|
||||||
@@ -132,28 +139,23 @@ feature -- Hooks
|
|||||||
menu_system_alter (a_menu_system: CMS_MENU_SYSTEM; a_response: CMS_RESPONSE)
|
menu_system_alter (a_menu_system: CMS_MENU_SYSTEM; a_response: CMS_RESPONSE)
|
||||||
local
|
local
|
||||||
lnk: CMS_LOCAL_LINK
|
lnk: CMS_LOCAL_LINK
|
||||||
|
admin_lnk: CMS_LINK_COMPOSITE
|
||||||
do
|
do
|
||||||
if
|
if a_response.api.user_is_authenticated then
|
||||||
a_response.has_permission ("manage " + {CMS_ADMIN_MODULE}.name) -- Note: admin user has all permissions enabled by default.
|
admin_lnk := a_menu_system.management_menu.new_composite_item ("Admin", "admin")
|
||||||
then
|
|
||||||
-- TODO: we should probably use more side menu and less primary_menu.
|
|
||||||
create lnk.make ("Admin", "admin")
|
|
||||||
lnk.set_permission_arguments (<<"manage " + {CMS_ADMIN_MODULE}.name>>)
|
|
||||||
a_menu_system.management_menu.extend (lnk)
|
|
||||||
|
|
||||||
|
create lnk.make ("Module", "admin/modules")
|
||||||
|
lnk.set_permission_arguments (<<"manage module">>)
|
||||||
|
admin_lnk.extend (lnk)
|
||||||
|
|
||||||
|
-- Per module cache permission!
|
||||||
|
create lnk.make ("Cache", "admin/cache")
|
||||||
|
admin_lnk.extend (lnk)
|
||||||
|
|
||||||
|
-- Per module export permission!
|
||||||
|
create lnk.make ("Export", "admin/export")
|
||||||
|
admin_lnk.extend (lnk)
|
||||||
end
|
end
|
||||||
|
|
||||||
create lnk.make ("Module", "admin/modules")
|
|
||||||
lnk.set_permission_arguments (<<"manage module">>)
|
|
||||||
a_menu_system.management_menu.extend (lnk)
|
|
||||||
|
|
||||||
-- Per module cache permission!
|
|
||||||
create lnk.make ("Cache", "admin/cache")
|
|
||||||
a_menu_system.management_menu.extend (lnk)
|
|
||||||
|
|
||||||
-- Per module export permission!
|
|
||||||
create lnk.make ("Export", "admin/export")
|
|
||||||
a_menu_system.management_menu.extend (lnk)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
|
|||||||
@@ -17,22 +17,59 @@ feature -- Process
|
|||||||
process
|
process
|
||||||
local
|
local
|
||||||
b: STRING
|
b: STRING
|
||||||
|
l_admin_links: ARRAYED_LIST [TUPLE [package: READABLE_STRING_8; permissions: ARRAY [READABLE_STRING_GENERAL]; link: CMS_LINK; help: READABLE_STRING_GENERAL]]
|
||||||
|
lst: detachable ARRAYED_LIST [TUPLE [permissions: ARRAY [READABLE_STRING_GENERAL]; link: CMS_LINK; help: READABLE_STRING_GENERAL]]
|
||||||
|
categories: STRING_TABLE [ARRAYED_LIST [TUPLE [permissions: ARRAY [READABLE_STRING_GENERAL]; link: CMS_LINK; help: READABLE_STRING_GENERAL]]]
|
||||||
|
l_package: READABLE_STRING_8
|
||||||
do
|
do
|
||||||
|
create l_admin_links.make (5)
|
||||||
|
l_admin_links.force (["core", <<"admin users">>, local_link ("Users", "admin/users"), "View/Edit/Add Users"])
|
||||||
|
l_admin_links.force (["core", <<"admin roles">>, local_link ("Roles", "admin/roles"), "View/Edit/Add Roles"])
|
||||||
|
l_admin_links.force (["core", <<"admin modules">>, local_link ("Modules", "admin/modules"), "(un)Install modules"])
|
||||||
|
l_admin_links.force (["core", <<"view logs">>, local_link ("Logs", "admin/logs"), "View logs"])
|
||||||
|
l_admin_links.force (["support", <<"admin cache">>, local_link ("Cache", "admin/cache"), "Clear caches"])
|
||||||
|
l_admin_links.force (["support", <<"admin export">>, local_link ("Export", "admin/export"), "Export CMS contents, and modules contents."])
|
||||||
|
create categories.make_caseless (3)
|
||||||
|
across
|
||||||
|
l_admin_links as ic
|
||||||
|
loop
|
||||||
|
l_package := ic.item.package
|
||||||
|
lst := categories.item (l_package)
|
||||||
|
if lst = Void then
|
||||||
|
create lst.make (1)
|
||||||
|
categories.force (lst, l_package)
|
||||||
|
end
|
||||||
|
lst.force ([ic.item.permissions, ic.item.link, ic.item.help])
|
||||||
|
end
|
||||||
|
|
||||||
create b.make_empty
|
create b.make_empty
|
||||||
set_title (translation ("Admin Page", Void))
|
set_title (translation ("Admin Page", Void))
|
||||||
b.append ("<ul id=%"content-types%">")
|
|
||||||
fixme ("Check how to make it configurable")
|
fixme ("Check how to make it configurable")
|
||||||
if has_permissions (<< "admin users">>) then
|
across
|
||||||
b.append ("<li>" + link ("Users", "admin/users", Void))
|
categories as cats_ic
|
||||||
b.append ("<div class=%"description%">View/Edit/Add Users</div>")
|
loop
|
||||||
b.append ("</li>")
|
lst := cats_ic.item
|
||||||
|
b.append ("<h3>")
|
||||||
|
b.append (html_encoded (cats_ic.key))
|
||||||
|
b.append ("</h3>")
|
||||||
|
b.append ("<ul>")
|
||||||
|
across
|
||||||
|
lst as ic
|
||||||
|
loop
|
||||||
|
if has_permissions (ic.item.permissions) then
|
||||||
|
b.append ("<li>")
|
||||||
|
if attached ic.item.link as lnk then
|
||||||
|
b.append (link (lnk.title, lnk.location, Void))
|
||||||
|
end
|
||||||
|
b.append ("<div class=%"description%">")
|
||||||
|
b.append (html_encoded (ic.item.help))
|
||||||
|
b.append ("</div>")
|
||||||
|
b.append ("</li>")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
b.append ("</ul>")
|
||||||
end
|
end
|
||||||
if has_permissions (<< "admin roles">>) then
|
|
||||||
b.append ("<li>" + link ("Roles", "admin/roles", Void))
|
|
||||||
b.append ("<div class=%"description%">View/Edit/Add Roles</div>")
|
|
||||||
b.append ("</li>")
|
|
||||||
end
|
|
||||||
b.append ("</ul>")
|
|
||||||
set_main_content (b)
|
set_main_content (b)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
114
modules/admin/handler/logs/cms_logs_handler.e
Normal file
114
modules/admin/handler/logs/cms_logs_handler.e
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
note
|
||||||
|
description: "[
|
||||||
|
Handler for a CMS logs in the CMS interface.
|
||||||
|
]"
|
||||||
|
date: "$Date$"
|
||||||
|
revision: "$Revision$"
|
||||||
|
|
||||||
|
class
|
||||||
|
CMS_LOGS_HANDLER
|
||||||
|
|
||||||
|
inherit
|
||||||
|
CMS_HANDLER
|
||||||
|
|
||||||
|
WSF_URI_HANDLER
|
||||||
|
rename
|
||||||
|
execute as uri_execute,
|
||||||
|
new_mapping as new_uri_mapping
|
||||||
|
end
|
||||||
|
|
||||||
|
WSF_URI_TEMPLATE_HANDLER
|
||||||
|
rename
|
||||||
|
execute as uri_template_execute,
|
||||||
|
new_mapping as new_uri_template_mapping
|
||||||
|
select
|
||||||
|
new_uri_template_mapping
|
||||||
|
end
|
||||||
|
|
||||||
|
WSF_RESOURCE_HANDLER_HELPER
|
||||||
|
redefine
|
||||||
|
do_get
|
||||||
|
end
|
||||||
|
|
||||||
|
REFACTORING_HELPER
|
||||||
|
|
||||||
|
create
|
||||||
|
make
|
||||||
|
|
||||||
|
feature -- execute
|
||||||
|
|
||||||
|
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||||
|
-- Execute request handler
|
||||||
|
do
|
||||||
|
execute_methods (req, res)
|
||||||
|
end
|
||||||
|
|
||||||
|
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||||
|
-- Execute request handler
|
||||||
|
do
|
||||||
|
execute (req, res)
|
||||||
|
end
|
||||||
|
|
||||||
|
uri_template_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||||
|
-- Execute request handler
|
||||||
|
do
|
||||||
|
execute (req, res)
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- HTTP Methods
|
||||||
|
|
||||||
|
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||||
|
-- <Precursor>
|
||||||
|
local
|
||||||
|
l_logs: LIST [CMS_LOG]
|
||||||
|
l_log: CMS_LOG
|
||||||
|
r: CMS_RESPONSE
|
||||||
|
l_cat: detachable READABLE_STRING_8
|
||||||
|
l_lower: INTEGER
|
||||||
|
l_count: INTEGER
|
||||||
|
b: STRING
|
||||||
|
do
|
||||||
|
if api.has_permission ("view logs") then
|
||||||
|
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
||||||
|
if attached {WSF_STRING} req.query_parameter ("category") as p_cat then
|
||||||
|
l_cat := p_cat.value
|
||||||
|
end
|
||||||
|
if attached {WSF_STRING} req.query_parameter ("lower") as p_lower and then p_lower.is_integer then
|
||||||
|
l_lower := p_lower.integer_value
|
||||||
|
end
|
||||||
|
if attached {WSF_STRING} req.query_parameter ("count") as p_count and then p_count.is_integer then
|
||||||
|
l_count := p_count.integer_value
|
||||||
|
end
|
||||||
|
|
||||||
|
l_logs := api.logs (l_cat, l_lower, l_count)
|
||||||
|
create b.make (100)
|
||||||
|
b.append ("<ul class=%"logs%">%N")
|
||||||
|
across
|
||||||
|
l_logs as ic
|
||||||
|
loop
|
||||||
|
l_log := ic.item
|
||||||
|
b.append ("<li class=%"log-level-"+ l_log.level.out +"%">")
|
||||||
|
b.append ("[" + l_log.category + "] ")
|
||||||
|
b.append (l_log.message)
|
||||||
|
b.append ("%N<p>(date: " + l_log.date.out + ")")
|
||||||
|
if attached l_log.link as lnk then
|
||||||
|
b.append (" <a href=%"" + req.script_url (lnk.location) + "%">" + html_encoded (lnk.title) + "</a>")
|
||||||
|
end
|
||||||
|
b.append ("</p>%N")
|
||||||
|
if attached l_log.info as l_info then
|
||||||
|
b.append ("<pre>" + l_info + "</pre>%N")
|
||||||
|
end
|
||||||
|
b.append ("</li>%N")
|
||||||
|
end
|
||||||
|
b.append ("</ul>%N")
|
||||||
|
r.set_main_content (b)
|
||||||
|
r.set_page_title ("Logs ...")
|
||||||
|
r.set_title ("Logs")
|
||||||
|
else
|
||||||
|
create {FORBIDDEN_ERROR_CMS_RESPONSE} r.make (req, res, api)
|
||||||
|
end
|
||||||
|
r.execute
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -108,6 +108,16 @@ feature -- HTTP Methods
|
|||||||
s.append ("%">")
|
s.append ("%">")
|
||||||
s.append (html_encoded (u.name))
|
s.append (html_encoded (u.name))
|
||||||
s.append ("</a>")
|
s.append ("</a>")
|
||||||
|
if attached user_api.user_roles (u) as l_roles and then not l_roles.is_empty then
|
||||||
|
s.append (" <span class=%"cms_roles%">(")
|
||||||
|
across
|
||||||
|
l_roles as ic_roles
|
||||||
|
loop
|
||||||
|
s.append (html_encoded (ic_roles.item.name))
|
||||||
|
s.append (" ")
|
||||||
|
end
|
||||||
|
s.append (")</span>")
|
||||||
|
end
|
||||||
s.append ("</li>%N")
|
s.append ("</li>%N")
|
||||||
end
|
end
|
||||||
s.append ("</ul>%N")
|
s.append ("</ul>%N")
|
||||||
|
|||||||
@@ -386,6 +386,9 @@ feature -- Form
|
|||||||
-- Update node `a_node' with form_data `a_form_data' for the given content type `a_content_type'.
|
-- Update node `a_node' with form_data `a_form_data' for the given content type `a_content_type'.
|
||||||
local
|
local
|
||||||
l_uroles: LIST [CMS_USER_ROLE]
|
l_uroles: LIST [CMS_USER_ROLE]
|
||||||
|
l_new_roles: ARRAYED_LIST [CMS_USER_ROLE]
|
||||||
|
r: detachable CMS_USER_ROLE
|
||||||
|
rid: INTEGER
|
||||||
do
|
do
|
||||||
if attached a_form_data.string_item ("op") as f_op then
|
if attached a_form_data.string_item ("op") as f_op then
|
||||||
if f_op.is_case_insensitive_equal_general ("Update user role") then
|
if f_op.is_case_insensitive_equal_general ("Update user role") then
|
||||||
@@ -394,23 +397,53 @@ feature -- Form
|
|||||||
then
|
then
|
||||||
l_uroles := api.user_api.user_roles (l_user)
|
l_uroles := api.user_api.user_roles (l_user)
|
||||||
l_uroles.compare_objects
|
l_uroles.compare_objects
|
||||||
if attached {WSF_STRING} a_form_data.item ("cms_roles") as l_role then
|
|
||||||
if attached api.user_api.user_role_by_id (l_role.integer_value) as role then
|
if attached {WSF_STRING} a_form_data.item ("cms_roles") as p_role_id then
|
||||||
if not l_uroles.has (role) then
|
rid := p_role_id.integer_value
|
||||||
api.user_api.assign_role_to_user (role, a_user)
|
r := api.user_api.user_role_by_id (rid)
|
||||||
|
if r /= Void then
|
||||||
|
create l_new_roles.make (0)
|
||||||
|
l_new_roles.force (r)
|
||||||
|
end
|
||||||
|
elseif attached {WSF_MULTIPLE_STRING} a_form_data.item ("cms_roles") as p_roles_ids then
|
||||||
|
create l_new_roles.make (p_roles_ids.values.count)
|
||||||
|
across
|
||||||
|
p_roles_ids as ic
|
||||||
|
loop
|
||||||
|
rid := ic.item.integer_value
|
||||||
|
r := api.user_api.user_role_by_id (rid)
|
||||||
|
if r /= Void then
|
||||||
|
l_new_roles.force (r)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif attached {WSF_MULTIPLE_STRING} a_form_data.item ("cms_roles") as l_roles then
|
end
|
||||||
across l_roles as ic loop
|
if l_new_roles = Void or else l_new_roles.is_empty then
|
||||||
if attached api.user_api.user_role_by_id (ic.item.integer_value) as role then
|
across
|
||||||
if not l_uroles.has (role) then
|
l_uroles as ic
|
||||||
api.user_api.assign_role_to_user (role, a_user)
|
loop
|
||||||
end
|
r := ic.item
|
||||||
end
|
api.user_api.unassign_role_from_user (r, a_user)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
across api.user_api.roles as ic loop
|
across
|
||||||
api.user_api.unassign_role_from_user (ic.item, a_user)
|
l_new_roles as ic
|
||||||
|
loop
|
||||||
|
r := ic.item
|
||||||
|
if l_uroles.has (r) then
|
||||||
|
-- Already assigned to that role.
|
||||||
|
else
|
||||||
|
api.user_api.assign_role_to_user (ic.item, a_user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Remove other roles for `a_user'.
|
||||||
|
l_new_roles.compare_objects
|
||||||
|
across
|
||||||
|
l_uroles as ic
|
||||||
|
loop
|
||||||
|
r := ic.item
|
||||||
|
if not l_new_roles.has (r) then
|
||||||
|
api.user_api.unassign_role_from_user (r, a_user)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
add_success_message ("Roles updated")
|
add_success_message ("Roles updated")
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ inherit
|
|||||||
|
|
||||||
CMS_HOOK_MENU_SYSTEM_ALTER
|
CMS_HOOK_MENU_SYSTEM_ALTER
|
||||||
|
|
||||||
|
CMS_HOOK_BLOCK_HELPER
|
||||||
|
|
||||||
SHARED_LOGGER
|
SHARED_LOGGER
|
||||||
|
|
||||||
feature {NONE} -- Initialization
|
feature {NONE} -- Initialization
|
||||||
@@ -67,8 +69,8 @@ feature -- Hooks
|
|||||||
lnk: CMS_LOCAL_LINK
|
lnk: CMS_LOCAL_LINK
|
||||||
l_destination: READABLE_STRING_8
|
l_destination: READABLE_STRING_8
|
||||||
do
|
do
|
||||||
if attached {WSF_STRING} a_response.request.query_parameter ("destination") as p_destination then
|
if attached {WSF_STRING} a_response.request.item ("destination") as p_destination then
|
||||||
l_destination := p_destination.value
|
l_destination := p_destination.url_encoded_value
|
||||||
else
|
else
|
||||||
l_destination := a_response.location
|
l_destination := a_response.location
|
||||||
end
|
end
|
||||||
@@ -86,21 +88,21 @@ feature -- Hooks
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
feature {NONE} -- Helpers
|
feature {NONE} -- Template
|
||||||
|
|
||||||
template_block (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE): detachable CMS_SMARTY_TEMPLATE_BLOCK
|
smarty_template_login_block (a_request: WSF_REQUEST; a_module: CMS_MODULE; a_block_id: READABLE_STRING_8; a_cms_api: CMS_API): like smarty_template_block
|
||||||
-- Smarty content block for `a_block_id'
|
|
||||||
local
|
local
|
||||||
p: detachable PATH
|
l_destination: detachable READABLE_STRING_32
|
||||||
do
|
do
|
||||||
create p.make_from_string ("templates")
|
Result := smarty_template_block (a_module, a_block_id, a_cms_api)
|
||||||
p := p.extended ("block_").appended (a_block_id).appended_with_extension ("tpl")
|
if Result /= Void then
|
||||||
p := a_response.api.module_theme_resource_location (Current, p)
|
if attached {WSF_STRING} a_request.query_parameter ("destination") as p_destination then
|
||||||
if p /= Void then
|
l_destination := p_destination.value
|
||||||
if attached p.entry as e then
|
elseif attached {WSF_STRING} a_request.form_parameter ("destination") as p_destination then
|
||||||
create Result.make (a_block_id, Void, p.parent, e)
|
l_destination := p_destination.value
|
||||||
else
|
end
|
||||||
create Result.make (a_block_id, Void, p.parent, p)
|
if l_destination /= Void then
|
||||||
|
Result.set_value (l_destination, "site_destination")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
note
|
note
|
||||||
description: "Module Auth"
|
description: "Module Auth"
|
||||||
date: "$Date$"
|
date: "$Date: 2016-04-13 10:59:18 +0200 (mer., 13 avr. 2016) $"
|
||||||
revision: "$Revision$"
|
revision: "$Revision: 98616 $"
|
||||||
|
|
||||||
class
|
class
|
||||||
CMS_AUTHENTICATION_MODULE
|
CMS_AUTHENTICATION_MODULE
|
||||||
@@ -21,6 +21,8 @@ inherit
|
|||||||
|
|
||||||
CMS_HOOK_BLOCK
|
CMS_HOOK_BLOCK
|
||||||
|
|
||||||
|
CMS_HOOK_BLOCK_HELPER
|
||||||
|
|
||||||
CMS_HOOK_MENU_SYSTEM_ALTER
|
CMS_HOOK_MENU_SYSTEM_ALTER
|
||||||
|
|
||||||
SHARED_EXECUTION_ENVIRONMENT
|
SHARED_EXECUTION_ENVIRONMENT
|
||||||
@@ -137,7 +139,7 @@ feature -- Hooks configuration
|
|||||||
l_url: STRING
|
l_url: STRING
|
||||||
l_url_name: READABLE_STRING_GENERAL
|
l_url_name: READABLE_STRING_GENERAL
|
||||||
do
|
do
|
||||||
if attached {WSF_STRING} a_response.request.query_parameter ("destination") as p_destination then
|
if attached {WSF_STRING} a_response.request.item ("destination") as p_destination then
|
||||||
l_destination := p_destination.value
|
l_destination := p_destination.value
|
||||||
else
|
else
|
||||||
l_destination := a_response.location
|
l_destination := a_response.location
|
||||||
@@ -157,7 +159,7 @@ feature -- Hooks configuration
|
|||||||
l_url_name := "site_sign_in_url"
|
l_url_name := "site_sign_in_url"
|
||||||
l_url := a_response.url (roc_login_location, Void)
|
l_url := a_response.url (roc_login_location, Void)
|
||||||
end
|
end
|
||||||
if l_destination /= Void then
|
if l_destination /= Void and then not l_url.has_substring ("?destination") then
|
||||||
l_url.append ("?destination=" + percent_encoded (l_destination))
|
l_url.append ("?destination=" + percent_encoded (l_destination))
|
||||||
end
|
end
|
||||||
a_value.force (l_url, l_url_name)
|
a_value.force (l_url, l_url_name)
|
||||||
@@ -192,7 +194,7 @@ feature -- Hooks configuration
|
|||||||
-- Add the link to the taxonomy to the main menu
|
-- Add the link to the taxonomy to the main menu
|
||||||
if a_response.has_permission ("admin registration") then
|
if a_response.has_permission ("admin registration") then
|
||||||
create lnk.make ("Registration", "admin/pending-registrations/")
|
create lnk.make ("Registration", "admin/pending-registrations/")
|
||||||
a_menu_system.management_menu.extend (lnk)
|
a_menu_system.management_menu.extend_into (lnk, "Admin", "admin")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -208,7 +210,7 @@ feature -- Handler
|
|||||||
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
||||||
create b.make_empty
|
create b.make_empty
|
||||||
l_user := r.user
|
l_user := r.user
|
||||||
if attached template_block ("account_info", r) as l_tpl_block then
|
if attached smarty_template_block (Current, "account_info", api) as l_tpl_block then
|
||||||
l_tpl_block.set_weight (-10)
|
l_tpl_block.set_weight (-10)
|
||||||
r.add_block (l_tpl_block, "content")
|
r.add_block (l_tpl_block, "content")
|
||||||
else
|
else
|
||||||
@@ -246,7 +248,7 @@ feature -- Handler
|
|||||||
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
||||||
create b.make_empty
|
create b.make_empty
|
||||||
l_user := r.user
|
l_user := r.user
|
||||||
if attached template_block ("account_edit", r) as l_tpl_block then
|
if attached smarty_template_block (Current, "account_edit", api) as l_tpl_block then
|
||||||
l_tpl_block.set_weight (-10)
|
l_tpl_block.set_weight (-10)
|
||||||
r.add_block (l_tpl_block, "content")
|
r.add_block (l_tpl_block, "content")
|
||||||
else
|
else
|
||||||
@@ -287,7 +289,7 @@ feature -- Handler
|
|||||||
elseif attached api.module_by_name ("session_auth") then
|
elseif attached api.module_by_name ("session_auth") then
|
||||||
-- FIXME: find better solution to support a default login system.
|
-- FIXME: find better solution to support a default login system.
|
||||||
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
||||||
if attached {WSF_STRING} req.query_parameter ("destination") as l_destination then
|
if attached {WSF_STRING} req.item ("destination") as l_destination then
|
||||||
r.set_redirection ("account/auth/roc-session-login?destination=" + l_destination.url_encoded_value)
|
r.set_redirection ("account/auth/roc-session-login?destination=" + l_destination.url_encoded_value)
|
||||||
else
|
else
|
||||||
r.set_redirection ("account/auth/roc-session-login")
|
r.set_redirection ("account/auth/roc-session-login")
|
||||||
@@ -298,7 +300,7 @@ feature -- Handler
|
|||||||
elseif attached api.module_by_name ("basic_auth") then
|
elseif attached api.module_by_name ("basic_auth") then
|
||||||
-- FIXME: find better solution to support a default login system.
|
-- FIXME: find better solution to support a default login system.
|
||||||
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
||||||
if attached {WSF_STRING} req.query_parameter ("destination") as l_destination then
|
if attached {WSF_STRING} req.item ("destination") as l_destination then
|
||||||
r.set_redirection ("account/auth/roc-basic-login?destination=" + l_destination.url_encoded_value)
|
r.set_redirection ("account/auth/roc-basic-login?destination=" + l_destination.url_encoded_value)
|
||||||
else
|
else
|
||||||
r.set_redirection ("account/auth/roc-basic-login")
|
r.set_redirection ("account/auth/roc-basic-login")
|
||||||
@@ -322,10 +324,10 @@ feature -- Handler
|
|||||||
else
|
else
|
||||||
loc := ""
|
loc := ""
|
||||||
end
|
end
|
||||||
|
-- Do not try to redirect to previous page or destination!
|
||||||
if attached {WSF_STRING} req.query_parameter ("destination") as l_destination then
|
-- if attached {WSF_STRING} req.query_parameter ("destination") as l_destination then
|
||||||
loc.append ("?destination=" + l_destination.url_encoded_value)
|
-- loc.append ("?destination=" + l_destination.url_encoded_value)
|
||||||
end
|
-- end
|
||||||
r.set_redirection (loc)
|
r.set_redirection (loc)
|
||||||
r.execute
|
r.execute
|
||||||
end
|
end
|
||||||
@@ -831,7 +833,7 @@ feature -- Handler
|
|||||||
|
|
||||||
block_list: ITERABLE [like {CMS_BLOCK}.name]
|
block_list: ITERABLE [like {CMS_BLOCK}.name]
|
||||||
do
|
do
|
||||||
Result := <<"register", "reactivate", "new_password", "reset_password", "registration">>
|
Result := <<"register", "reactivate", "new_password", "reset_password">>
|
||||||
end
|
end
|
||||||
|
|
||||||
get_block_view (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
get_block_view (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
||||||
@@ -847,8 +849,6 @@ feature -- Handler
|
|||||||
get_block_view_new_password (a_block_id, a_response)
|
get_block_view_new_password (a_block_id, a_response)
|
||||||
elseif a_block_id.is_case_insensitive_equal_general ("reset_password") and then loc.starts_with ("account/reset-password") then
|
elseif a_block_id.is_case_insensitive_equal_general ("reset_password") and then loc.starts_with ("account/reset-password") then
|
||||||
get_block_view_reset_password (a_block_id, a_response)
|
get_block_view_reset_password (a_block_id, a_response)
|
||||||
elseif a_block_id.is_case_insensitive_equal_general ("registration") and then loc.starts_with ("admin/pending-registrations") then
|
|
||||||
get_block_view_registration (a_block_id, a_response)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -923,32 +923,24 @@ feature {NONE} -- Token Generation
|
|||||||
Result := l_token
|
Result := l_token
|
||||||
end
|
end
|
||||||
|
|
||||||
feature {NONE} -- Helpers
|
|
||||||
|
|
||||||
template_block (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE): detachable CMS_SMARTY_TEMPLATE_BLOCK
|
|
||||||
-- Smarty content block for `a_block_id'
|
|
||||||
local
|
|
||||||
p: detachable PATH
|
|
||||||
do
|
|
||||||
create p.make_from_string ("templates")
|
|
||||||
p := p.extended ("block_").appended (a_block_id).appended_with_extension ("tpl")
|
|
||||||
p := a_response.api.module_theme_resource_location (Current, p)
|
|
||||||
if p /= Void then
|
|
||||||
if attached p.entry as e then
|
|
||||||
create Result.make (a_block_id, Void, p.parent, e)
|
|
||||||
else
|
|
||||||
create Result.make (a_block_id, Void, p.parent, p)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
feature {NONE} -- Block views
|
feature {NONE} -- Block views
|
||||||
|
|
||||||
get_block_view_register (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
get_block_view_register (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
||||||
do
|
do
|
||||||
if a_response.has_permission ("account register") then
|
if a_response.has_permission ("account register") then
|
||||||
if a_response.request.is_get_request_method then
|
if
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
a_response.request.is_get_request_method
|
||||||
|
or else (
|
||||||
|
a_response.values.has ("error_name")
|
||||||
|
or else a_response.values.has ("error_email")
|
||||||
|
)
|
||||||
|
then
|
||||||
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
|
-- l_tpl_block.set_value (a_response.values.item ("error_name"), "error_name")
|
||||||
|
-- l_tpl_block.set_value (a_response.values.item ("error_email"), "error_email")
|
||||||
|
-- l_tpl_block.set_value (a_response.values.item ("email"), "email")
|
||||||
|
-- l_tpl_block.set_value (a_response.values.item ("name"), "name")
|
||||||
|
l_tpl_block.set_value (form_registration_application_description (a_response.api), "application_description")
|
||||||
if attached recaptcha_site_key (a_response.api) as l_recaptcha_site_key then
|
if attached recaptcha_site_key (a_response.api) as l_recaptcha_site_key then
|
||||||
l_tpl_block.set_value (l_recaptcha_site_key, "recaptcha_site_key")
|
l_tpl_block.set_value (l_recaptcha_site_key, "recaptcha_site_key")
|
||||||
end
|
end
|
||||||
@@ -959,28 +951,11 @@ feature {NONE} -- Block views
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif a_response.request.is_post_request_method then
|
elseif a_response.request.is_post_request_method then
|
||||||
if a_response.values.has ("error_name") or else a_response.values.has ("error_email") then
|
if attached smarty_template_block (Current, "post_register", a_response.api) as l_tpl_block then
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
a_response.add_block (l_tpl_block, "content")
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("error_name"), "error_name")
|
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("error_email"), "error_email")
|
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("email"), "email")
|
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("name"), "name")
|
|
||||||
if attached recaptcha_site_key (a_response.api) as l_recaptcha_site_key then
|
|
||||||
l_tpl_block.set_value (l_recaptcha_site_key, "recaptcha_site_key")
|
|
||||||
end
|
|
||||||
a_response.add_block (l_tpl_block, "content")
|
|
||||||
else
|
|
||||||
debug ("cms")
|
|
||||||
a_response.add_warning_message ("Error with block [" + a_block_id + "]")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
if attached template_block ("post_register", a_response) as l_tpl_block then
|
debug ("cms")
|
||||||
a_response.add_block (l_tpl_block, "content")
|
a_response.add_warning_message ("Error with block [" + a_block_id + "]")
|
||||||
else
|
|
||||||
debug ("cms")
|
|
||||||
a_response.add_warning_message ("Error with block [" + a_block_id + "]")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -990,7 +965,7 @@ feature {NONE} -- Block views
|
|||||||
get_block_view_reactivate (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
get_block_view_reactivate (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
||||||
do
|
do
|
||||||
if a_response.request.is_get_request_method then
|
if a_response.request.is_get_request_method then
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
a_response.add_block (l_tpl_block, "content")
|
a_response.add_block (l_tpl_block, "content")
|
||||||
else
|
else
|
||||||
debug ("cms")
|
debug ("cms")
|
||||||
@@ -999,7 +974,7 @@ feature {NONE} -- Block views
|
|||||||
end
|
end
|
||||||
elseif a_response.request.is_post_request_method then
|
elseif a_response.request.is_post_request_method then
|
||||||
if a_response.values.has ("error_email") or else a_response.values.has ("is_active") then
|
if a_response.values.has ("error_email") or else a_response.values.has ("is_active") then
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("error_email"), "error_email")
|
-- l_tpl_block.set_value (a_response.values.item ("error_email"), "error_email")
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("email"), "email")
|
-- l_tpl_block.set_value (a_response.values.item ("email"), "email")
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("is_active"), "is_active")
|
-- l_tpl_block.set_value (a_response.values.item ("is_active"), "is_active")
|
||||||
@@ -1010,7 +985,7 @@ feature {NONE} -- Block views
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if attached template_block ("post_reactivate", a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, "post_reactivate", a_response.api) as l_tpl_block then
|
||||||
a_response.add_block (l_tpl_block, "content")
|
a_response.add_block (l_tpl_block, "content")
|
||||||
else
|
else
|
||||||
debug ("cms")
|
debug ("cms")
|
||||||
@@ -1024,7 +999,7 @@ feature {NONE} -- Block views
|
|||||||
get_block_view_new_password (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
get_block_view_new_password (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
||||||
do
|
do
|
||||||
if a_response.request.is_get_request_method then
|
if a_response.request.is_get_request_method then
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
a_response.add_block (l_tpl_block, "content")
|
a_response.add_block (l_tpl_block, "content")
|
||||||
else
|
else
|
||||||
debug ("cms")
|
debug ("cms")
|
||||||
@@ -1033,7 +1008,7 @@ feature {NONE} -- Block views
|
|||||||
end
|
end
|
||||||
elseif a_response.request.is_post_request_method then
|
elseif a_response.request.is_post_request_method then
|
||||||
if a_response.values.has ("error_email") or else a_response.values.has ("error_username") then
|
if a_response.values.has ("error_email") or else a_response.values.has ("error_username") then
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("error_email"), "error_email")
|
-- l_tpl_block.set_value (a_response.values.item ("error_email"), "error_email")
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("email"), "email")
|
-- l_tpl_block.set_value (a_response.values.item ("email"), "email")
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("error_username"), "error_username")
|
-- l_tpl_block.set_value (a_response.values.item ("error_username"), "error_username")
|
||||||
@@ -1045,7 +1020,7 @@ feature {NONE} -- Block views
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if attached template_block ("post_password", a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, "post_password", a_response.api) as l_tpl_block then
|
||||||
a_response.add_block (l_tpl_block, "content")
|
a_response.add_block (l_tpl_block, "content")
|
||||||
else
|
else
|
||||||
debug ("cms")
|
debug ("cms")
|
||||||
@@ -1059,7 +1034,7 @@ feature {NONE} -- Block views
|
|||||||
get_block_view_reset_password (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
get_block_view_reset_password (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
||||||
do
|
do
|
||||||
if a_response.request.is_get_request_method then
|
if a_response.request.is_get_request_method then
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("token"), "token")
|
-- l_tpl_block.set_value (a_response.values.item ("token"), "token")
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("error_token"), "error_token")
|
-- l_tpl_block.set_value (a_response.values.item ("error_token"), "error_token")
|
||||||
a_response.add_block (l_tpl_block, "content")
|
a_response.add_block (l_tpl_block, "content")
|
||||||
@@ -1070,7 +1045,7 @@ feature {NONE} -- Block views
|
|||||||
end
|
end
|
||||||
elseif a_response.request.is_post_request_method then
|
elseif a_response.request.is_post_request_method then
|
||||||
if a_response.values.has ("error_token") or else a_response.values.has ("error_password") then
|
if a_response.values.has ("error_token") or else a_response.values.has ("error_password") then
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("error_token"), "error_token")
|
-- l_tpl_block.set_value (a_response.values.item ("error_token"), "error_token")
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("error_password"), "error_password")
|
-- l_tpl_block.set_value (a_response.values.item ("error_password"), "error_password")
|
||||||
-- l_tpl_block.set_value (a_response.values.item ("token"), "token")
|
-- l_tpl_block.set_value (a_response.values.item ("token"), "token")
|
||||||
@@ -1081,7 +1056,7 @@ feature {NONE} -- Block views
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if attached template_block ("post_reset", a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, "post_reset", a_response.api) as l_tpl_block then
|
||||||
a_response.add_block (l_tpl_block, "content")
|
a_response.add_block (l_tpl_block, "content")
|
||||||
else
|
else
|
||||||
debug ("cms")
|
debug ("cms")
|
||||||
@@ -1092,11 +1067,19 @@ feature {NONE} -- Block views
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
get_block_view_registration (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
feature -- Access: configuration
|
||||||
do
|
|
||||||
end
|
|
||||||
|
|
||||||
feature -- Recaptcha
|
form_registration_application_description (api: CMS_API): detachable READABLE_STRING_8
|
||||||
|
-- Get recaptcha security key.
|
||||||
|
local
|
||||||
|
utf: UTF_CONVERTER
|
||||||
|
do
|
||||||
|
if attached api.module_configuration (Current, Void) as cfg then
|
||||||
|
if attached cfg.text_item ("forms.registration.application_description") as l_desc and then not l_desc.is_whitespace then
|
||||||
|
Result := utf.utf_32_string_to_utf_8_string_8 (l_desc)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
recaptcha_secret_key (api: CMS_API): detachable READABLE_STRING_8
|
recaptcha_secret_key (api: CMS_API): detachable READABLE_STRING_8
|
||||||
-- Get recaptcha security key.
|
-- Get recaptcha security key.
|
||||||
@@ -1129,6 +1112,7 @@ feature -- Response Alter
|
|||||||
a_response.add_javascript_url ("https://www.google.com/recaptcha/api.js")
|
a_response.add_javascript_url ("https://www.google.com/recaptcha/api.js")
|
||||||
a_response.add_style (a_response.url ("/module/" + name + "/files/css/auth.css", Void), Void)
|
a_response.add_style (a_response.url ("/module/" + name + "/files/css/auth.css", Void), Void)
|
||||||
end
|
end
|
||||||
|
|
||||||
feature {NONE} -- Implementation
|
feature {NONE} -- Implementation
|
||||||
|
|
||||||
is_captcha_verified (a_secret, a_response: READABLE_STRING_8): BOOLEAN
|
is_captcha_verified (a_secret, a_response: READABLE_STRING_8): BOOLEAN
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"email": "webmaster@example.com",
|
|
||||||
"subjet_register": "Thank you for regitering with us, activate account",
|
|
||||||
"subjet_activate": "New account ativation token",
|
|
||||||
"subjet_password": "Password Recovery!!!",
|
|
||||||
"subjet_oauth": "Welcome",
|
|
||||||
"smtp": "127.0.0.1"
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
{
|
{
|
||||||
"subject": "Thank you for contacting us",
|
"subject": "Thank you for contacting us",
|
||||||
|
"forms": {
|
||||||
|
"registration": {
|
||||||
|
"application_description": "Present yourself in a few lines, otherwise your application is likely to be rejected."
|
||||||
|
}
|
||||||
|
},
|
||||||
"recaptcha": {
|
"recaptcha": {
|
||||||
"site_key":"6Lex9RMTAAAAAKleC4x6TaRlFcpLbEWgH_U7MSiD",
|
"site_key":"6Lex9RMTAAAAAKleC4x6TaRlFcpLbEWgH_U7MSiD",
|
||||||
"secret_key":"6Lex9RMTAAAAAAkBczvX5DUiyg_xoM_EthVVgRRx"
|
"secret_key":"6Lex9RMTAAAAAAkBczvX5DUiyg_xoM_EthVVgRRx"
|
||||||
|
|||||||
@@ -1,39 +1,38 @@
|
|||||||
<div>
|
<div>
|
||||||
<form action="{$site_url/}account/roc-register" method="post">
|
<form action="{$site_url/}account/roc-register" method="post">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Registration</legend>
|
<legend>Registration</legend>
|
||||||
<div>
|
<div>
|
||||||
<input type="text" id="name" name="name" value="{$name/}" required autofocus />
|
<input type="text" id="name" name="name" value="{$name/}" required autofocus />
|
||||||
<label for="name">Name</label>
|
<label for="name">Name</label>
|
||||||
{if isset="$error_name"}
|
{if isset="$error_name"}
|
||||||
<span><i>{$error_name/}</i></span> <br>
|
<span><i>{$error_name/}</i></span> <br>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<input type="password" id="password" name="password" value="" required/>
|
<input type="password" id="password" name="password" value="" required/>
|
||||||
<label for="password">Password</label>
|
<label for="password">Password</label>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<input type="email" id="email" name="email" value="{$email/}" required/>
|
<input type="email" id="email" name="email" value="{$email/}" required/>
|
||||||
<label for="email">Email</label>
|
<label for="email">Email</label>
|
||||||
{if isset="$error_email"}
|
{if isset="$error_email"}
|
||||||
<span><i>{$error_email/}</i></span> <br>
|
<span><i>{$error_email/}</i></span> <br/>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<textarea rows="4" cols="50" name="personal_information" id="personal_information" required>
|
<textarea rows="4" cols="50" name="personal_information" id="personal_information" required>{$personal_information/}</textarea>
|
||||||
{$personal_information/}
|
<label for="personal_information">Tell us why you want to register an account</label>
|
||||||
</textarea>
|
{if isset="$error_application"}
|
||||||
<label for="personal_information">Tell us why you want to register an account</label>
|
<span><i>{$error_application/}</i></span><br/>
|
||||||
{if isset="$error_application"}
|
{/if}
|
||||||
<span><i>{$error_application/}</i></span> <br>
|
{if isset="$application_description"}
|
||||||
{/if}
|
<br/>
|
||||||
</div>
|
<p class="description">{$application_description/}</p>
|
||||||
{unless isempty="$recaptcha_site_key"}
|
{/if}
|
||||||
<div class="g-recaptcha" data-sitekey="{$recaptcha_site_key/}"></div>
|
</div>
|
||||||
<br/>
|
{unless isempty="$recaptcha_site_key"}<div class="g-recaptcha" data-sitekey="{$recaptcha_site_key/}"></div><br/>{/unless}
|
||||||
{/unless}
|
<button type="submit">Register</button>
|
||||||
<button type="submit">Register</button>
|
</fieldset>
|
||||||
</fieldset>
|
</form>
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ feature {NONE} -- Implementation: routes
|
|||||||
r.add_error_message ("You are already signed in!")
|
r.add_error_message ("You are already signed in!")
|
||||||
r.set_main_content (r.link ("Logout", "account/roc-logout", Void))
|
r.set_main_content (r.link ("Logout", "account/roc-logout", Void))
|
||||||
else
|
else
|
||||||
if attached template_block ("login", r) as l_tpl_block then
|
if attached smarty_template_login_block (req, Current, "login", api) as l_tpl_block then
|
||||||
r.add_javascript_url (r.url ("module/" + name + "/files/js/roc_basic_auth.js", Void))
|
r.add_javascript_url (r.url ("module/" + name + "/files/js/roc_basic_auth.js", Void))
|
||||||
|
|
||||||
create vals.make (1)
|
create vals.make (1)
|
||||||
@@ -170,7 +170,7 @@ feature {NONE} -- Block views
|
|||||||
local
|
local
|
||||||
vals: CMS_VALUE_TABLE
|
vals: CMS_VALUE_TABLE
|
||||||
do
|
do
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_login_block (a_response.request, Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
create vals.make (1)
|
create vals.make (1)
|
||||||
-- add the variable to the block
|
-- add the variable to the block
|
||||||
a_response.api.hooks.invoke_value_table_alter (vals, a_response)
|
a_response.api.hooks.invoke_value_table_alter (vals, a_response)
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
{unless isset="$user"}
|
{unless isset="$user"}
|
||||||
<div class="login-box">
|
<div class="login-box">
|
||||||
<div class="description">The "Basic Auth" relies on the HTTP basic acces authentication.<br/>(see also: <a href="https://en.wikipedia.org/wiki/Basic_access_authentication">https://en.wikipedia.org/wiki/Basic_access_authentication</a> )</div>
|
<div class="description">The "Basic Auth" relies on the HTTP basic access authentication.<br/>(see also: <a href="https://en.wikipedia.org/wiki/Basic_access_authentication">https://en.wikipedia.org/wiki/Basic_access_authentication</a> )</div>
|
||||||
<h3>Login or <a href="{$site_url/}account/roc-register">Register</a></h3>
|
<h3>Login or <a href="{$site_url/}account/roc-register">Register</a></h3>
|
||||||
<div>
|
<div>
|
||||||
<form name="cms_basic_auth" action="{$site_url/}roc-basic-login" method="POST">
|
<form name="cms_basic_auth" action="{$site_url/}roc-basic-login" method="POST">
|
||||||
|
{unless isempty="$site_destination"}<input type="hidden" name="destination" value="{$site_destination/}">{/unless}
|
||||||
<input type="hidden" name="host" id="host" value="{$site_url/}">
|
<input type="hidden" name="host" id="host" value="{$site_url/}">
|
||||||
<div>
|
<div>
|
||||||
<input type="text" name="username" id="username" required>
|
<input type="text" name="username" id="username" required>
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ feature -- Hooks
|
|||||||
if a_block_id.is_case_insensitive_equal_general ("contact") then
|
if a_block_id.is_case_insensitive_equal_general ("contact") then
|
||||||
-- "contact", "post_contact"
|
-- "contact", "post_contact"
|
||||||
if a_response.request.is_get_request_method then
|
if a_response.request.is_get_request_method then
|
||||||
if attached template_block (Current, a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
if attached recaptcha_site_key (a_response.api) as l_recaptcha_site_key then
|
if attached recaptcha_site_key (a_response.api) as l_recaptcha_site_key then
|
||||||
l_tpl_block.set_value (l_recaptcha_site_key, "recaptcha_site_key")
|
l_tpl_block.set_value (l_recaptcha_site_key, "recaptcha_site_key")
|
||||||
end
|
end
|
||||||
@@ -201,7 +201,7 @@ feature -- Hooks
|
|||||||
f: CMS_FORM
|
f: CMS_FORM
|
||||||
do
|
do
|
||||||
a_response.add_style (a_response.url ("/module/" + name + "/files/css/contact.css", Void), Void)
|
a_response.add_style (a_response.url ("/module/" + name + "/files/css/contact.css", Void), Void)
|
||||||
if attached template_block (Current, "contact", a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, "contact", api) as l_tpl_block then
|
||||||
if attached recaptcha_site_key (api) as l_recaptcha_site_key then
|
if attached recaptcha_site_key (api) as l_recaptcha_site_key then
|
||||||
l_tpl_block.set_value (l_recaptcha_site_key, "recaptcha_site_key")
|
l_tpl_block.set_value (l_recaptcha_site_key, "recaptcha_site_key")
|
||||||
end
|
end
|
||||||
@@ -339,7 +339,7 @@ feature -- Hooks
|
|||||||
r.values.force (True, "has_error")
|
r.values.force (True, "has_error")
|
||||||
vars.put ("True", "has_error")
|
vars.put ("True", "has_error")
|
||||||
end
|
end
|
||||||
if attached template_block_with_values (Current, "post_contact", r, vars) as l_tpl_block then
|
if attached smarty_template_block_with_values (Current, "post_contact", api, vars) as l_tpl_block then
|
||||||
across
|
across
|
||||||
r.values as tb
|
r.values as tb
|
||||||
loop
|
loop
|
||||||
@@ -354,7 +354,7 @@ feature -- Hooks
|
|||||||
-- send a bad request status code and redisplay the form with the previous data loaded.
|
-- send a bad request status code and redisplay the form with the previous data loaded.
|
||||||
r.set_value (False, "error")
|
r.set_value (False, "error")
|
||||||
r.set_status_code ({HTTP_STATUS_CODE}.bad_request)
|
r.set_status_code ({HTTP_STATUS_CODE}.bad_request)
|
||||||
if attached template_block_with_values (Current, "contact", r, vars) as l_tpl_block then
|
if attached smarty_template_block_with_values (Current, "contact", api, vars) as l_tpl_block then
|
||||||
across
|
across
|
||||||
r.values as tb
|
r.values as tb
|
||||||
loop
|
loop
|
||||||
@@ -377,7 +377,7 @@ feature -- Hooks
|
|||||||
write_error_log (generator + ".handle_post_contact: Internal Server error")
|
write_error_log (generator + ".handle_post_contact: Internal Server error")
|
||||||
r.values.force (True, "has_error")
|
r.values.force (True, "has_error")
|
||||||
r.set_status_code ({HTTP_CONSTANTS}.internal_server_error)
|
r.set_status_code ({HTTP_CONSTANTS}.internal_server_error)
|
||||||
if attached template_block_with_values (Current, "post_contact", r, vars) as l_tpl_block then
|
if attached smarty_template_block_with_values (Current, "post_contact", api, vars) as l_tpl_block then
|
||||||
across
|
across
|
||||||
r.values as tb
|
r.values as tb
|
||||||
loop
|
loop
|
||||||
@@ -422,18 +422,6 @@ feature {NONE} -- Helpers
|
|||||||
|
|
||||||
feature {NONE} -- Contact Message
|
feature {NONE} -- Contact Message
|
||||||
|
|
||||||
template_block_with_values (a_module: CMS_MODULE; a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE; a_values: STRING_TABLE [ANY]): like template_block
|
|
||||||
do
|
|
||||||
Result := template_block (a_module, a_block_id, a_response)
|
|
||||||
if Result /= Void then
|
|
||||||
across
|
|
||||||
a_values as ic
|
|
||||||
loop
|
|
||||||
Result.set_value (ic.item, ic.key)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
email_html_message (a_message_id: READABLE_STRING_8; a_response: CMS_RESPONSE; a_html_encoded_values: STRING_TABLE [READABLE_STRING_8]): STRING
|
email_html_message (a_message_id: READABLE_STRING_8; a_response: CMS_RESPONSE; a_html_encoded_values: STRING_TABLE [READABLE_STRING_8]): STRING
|
||||||
-- html message related to `a_message_id'.
|
-- html message related to `a_message_id'.
|
||||||
local
|
local
|
||||||
|
|||||||
170
modules/custom_block/cms_custom_block_module.e
Normal file
170
modules/custom_block/cms_custom_block_module.e
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
note
|
||||||
|
description: "[
|
||||||
|
Module that provide custom block factory.
|
||||||
|
]"
|
||||||
|
author: "$Author: jfiat $"
|
||||||
|
date: "$Date: 2016-01-08 22:43:12 +0100 (ven., 08 janv. 2016) $"
|
||||||
|
revision: "$Revision: 98369 $"
|
||||||
|
|
||||||
|
class
|
||||||
|
CMS_CUSTOM_BLOCK_MODULE
|
||||||
|
|
||||||
|
inherit
|
||||||
|
CMS_MODULE
|
||||||
|
rename
|
||||||
|
module_api as custom_block_api
|
||||||
|
redefine
|
||||||
|
initialize,
|
||||||
|
setup_hooks,
|
||||||
|
custom_block_api
|
||||||
|
end
|
||||||
|
|
||||||
|
CMS_HOOK_RESPONSE_BLOCK
|
||||||
|
|
||||||
|
CMS_HOOK_BLOCK_HELPER
|
||||||
|
|
||||||
|
CMS_HOOK_AUTO_REGISTER
|
||||||
|
|
||||||
|
SHARED_EXECUTION_ENVIRONMENT
|
||||||
|
export
|
||||||
|
{NONE} all
|
||||||
|
end
|
||||||
|
|
||||||
|
REFACTORING_HELPER
|
||||||
|
|
||||||
|
create
|
||||||
|
make
|
||||||
|
|
||||||
|
feature {NONE} -- Initialization
|
||||||
|
|
||||||
|
make
|
||||||
|
-- Create current module
|
||||||
|
do
|
||||||
|
version := "1.0"
|
||||||
|
description := "Custom Block"
|
||||||
|
package := "layout"
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- Access
|
||||||
|
|
||||||
|
name: STRING = "custom_block"
|
||||||
|
-- <Precursor>
|
||||||
|
|
||||||
|
feature {CMS_API} -- Module Initialization
|
||||||
|
|
||||||
|
initialize (api: CMS_API)
|
||||||
|
-- Initialize Current module with `api'.
|
||||||
|
do
|
||||||
|
create custom_block_api.make (api)
|
||||||
|
Precursor (api)
|
||||||
|
end
|
||||||
|
|
||||||
|
custom_block_api: detachable CMS_MODULE_API
|
||||||
|
-- <Precursor>.
|
||||||
|
|
||||||
|
feature -- Router
|
||||||
|
|
||||||
|
setup_router (a_router: WSF_ROUTER; a_api: CMS_API)
|
||||||
|
-- Router configuration.
|
||||||
|
do
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- Hooks configuration
|
||||||
|
|
||||||
|
setup_hooks (a_hooks: CMS_HOOK_CORE_MANAGER)
|
||||||
|
-- Module hooks configuration.
|
||||||
|
do
|
||||||
|
auto_subscribe_to_hooks (a_hooks)
|
||||||
|
a_hooks.subscribe_to_block_hook (Current)
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- Hooks
|
||||||
|
|
||||||
|
block_identifiers (a_response: detachable CMS_RESPONSE): detachable ARRAYED_LIST [READABLE_STRING_8]
|
||||||
|
-- <Precursor>
|
||||||
|
local
|
||||||
|
api: CMS_API
|
||||||
|
l_name: READABLE_STRING_32
|
||||||
|
l_block_id: READABLE_STRING_8
|
||||||
|
l_conds: detachable ARRAYED_LIST [CMS_BLOCK_CONDITION]
|
||||||
|
do
|
||||||
|
if attached custom_block_api as l_mod_api then
|
||||||
|
api := l_mod_api.cms_api
|
||||||
|
if
|
||||||
|
attached api.module_configuration (Current, name) as cfg and then
|
||||||
|
attached cfg.table_keys ("blocks") as lst
|
||||||
|
then
|
||||||
|
create Result.make (0)
|
||||||
|
across
|
||||||
|
lst as ic
|
||||||
|
loop
|
||||||
|
l_name := ic.item
|
||||||
|
if l_name.is_valid_as_string_8 then
|
||||||
|
l_block_id := l_name.to_string_8
|
||||||
|
if a_response /= Void then
|
||||||
|
if attached cfg.text_list_item ("blocks." + l_block_id + ".conditions") as l_cond_expressions then
|
||||||
|
if l_conds = Void then
|
||||||
|
create l_conds.make (l_cond_expressions.count)
|
||||||
|
end
|
||||||
|
across
|
||||||
|
l_cond_expressions as exp_ic
|
||||||
|
loop
|
||||||
|
l_conds.force (create {CMS_BLOCK_EXPRESSION_CONDITION}.make (exp_ic.item))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if l_conds = Void or else l_conds.is_empty then
|
||||||
|
Result.force ("?" + l_block_id)
|
||||||
|
elseif are_conditions_satisfied (l_conds, a_response) then
|
||||||
|
Result.force (l_block_id)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result.force ("?" + l_block_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
are_conditions_satisfied (a_conditions: LIST [CMS_BLOCK_CONDITION]; a_response: CMS_RESPONSE): BOOLEAN
|
||||||
|
-- Are `a_conditions' satisfied for `a_response'?
|
||||||
|
do
|
||||||
|
Result := across a_conditions as ic some ic.item.satisfied_for_response (a_response) end
|
||||||
|
end
|
||||||
|
|
||||||
|
get_block_view (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
||||||
|
local
|
||||||
|
l_region: detachable READABLE_STRING_8
|
||||||
|
l_cond: CMS_BLOCK_EXPRESSION_CONDITION
|
||||||
|
l_block_pref: STRING
|
||||||
|
do
|
||||||
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as bk then
|
||||||
|
if attached a_response.api.module_configuration (Current, name) as cfg then
|
||||||
|
l_block_pref := "blocks." + a_block_id
|
||||||
|
if
|
||||||
|
attached cfg.text_item (l_block_pref + ".region") as s and then
|
||||||
|
s.is_valid_as_string_8
|
||||||
|
then
|
||||||
|
l_region := s.to_string_8
|
||||||
|
end
|
||||||
|
bk.set_weight (cfg.integer_item (l_block_pref + ".weight"))
|
||||||
|
bk.set_title (cfg.text_item (l_block_pref + ".title"))
|
||||||
|
if attached cfg.text_item (l_block_pref + ".is_raw") as l_is_raw then
|
||||||
|
bk.set_is_raw (l_is_raw.is_case_insensitive_equal ("yes"))
|
||||||
|
end
|
||||||
|
if attached cfg.text_list_item (l_block_pref + ".conditions") as l_cond_exp_list then
|
||||||
|
across
|
||||||
|
l_cond_exp_list as ic
|
||||||
|
loop
|
||||||
|
create l_cond.make (ic.item)
|
||||||
|
bk.add_condition (l_cond)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
a_response.add_block (bk, l_region)
|
||||||
|
else
|
||||||
|
a_response.add_debug_message ("Missing template for custom block %"" + a_block_id + "%"!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
21
modules/custom_block/custom_block-safe.ecf
Normal file
21
modules/custom_block/custom_block-safe.ecf
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="custom_block_module" uuid="F9B7C390-04F2-4E59-9040-00DD68A5BDBC" library_target="custom_block_module">
|
||||||
|
<target name="custom_block_module">
|
||||||
|
<root all_classes="true" />
|
||||||
|
<file_rule>
|
||||||
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
|
</file_rule>
|
||||||
|
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all" syntax="standard"/>
|
||||||
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
|
<library name="cms" location="..\..\cms-safe.ecf"/>
|
||||||
|
<library name="cms_model" location="..\..\library\model\cms_model-safe.ecf"/>
|
||||||
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
|
<library name="json" location="$ISE_LIBRARY\contrib\library\text\parser\json\library\json-safe.ecf"/>
|
||||||
|
<library name="time" location="$ISE_LIBRARY\library\time\time-safe.ecf"/>
|
||||||
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
|
<library name="wsf_encoder" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\text\encoder\encoder-safe.ecf"/>
|
||||||
|
<cluster name="src" location=".\" recursive="true"/>
|
||||||
|
</target>
|
||||||
|
</system>
|
||||||
22
modules/custom_block/custom_block.ecf
Normal file
22
modules/custom_block/custom_block.ecf
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="custom_block_module" uuid="F9B7C390-04F2-4E59-9040-00DD68A5BDBC" library_target="custom_block_module">
|
||||||
|
<target name="custom_block_module">
|
||||||
|
<root all_classes="true"/>
|
||||||
|
<file_rule>
|
||||||
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
|
</file_rule>
|
||||||
|
<option warning="true" full_class_checking="true" void_safety="none" syntax="standard">
|
||||||
|
</option>
|
||||||
|
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
|
||||||
|
<library name="cms" location="..\..\cms.ecf"/>
|
||||||
|
<library name="cms_model" location="..\..\library\model\cms_model.ecf"/>
|
||||||
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http.ecf"/>
|
||||||
|
<library name="json" location="$ISE_LIBRARY\contrib\library\text\parser\json\library\json.ecf"/>
|
||||||
|
<library name="time" location="$ISE_LIBRARY\library\time\time.ecf"/>
|
||||||
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf.ecf"/>
|
||||||
|
<library name="wsf_encoder" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\text\encoder\encoder.ecf"/>
|
||||||
|
<cluster name="src" location=".\" recursive="true"/>
|
||||||
|
</target>
|
||||||
|
</system>
|
||||||
11
modules/custom_block/site/config/custom_block.json.example
Normal file
11
modules/custom_block/site/config/custom_block.json.example
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"blocks": {
|
||||||
|
"test": {
|
||||||
|
"title": "Custom block test",
|
||||||
|
"is_raw": "yes",
|
||||||
|
"region": "footer",
|
||||||
|
"weight": 100,
|
||||||
|
"conditions": ["path:demo/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<div>
|
||||||
|
This is a nice custom block test for site {$sitename/}.
|
||||||
|
</div>
|
||||||
@@ -346,9 +346,11 @@ feature -- Hook
|
|||||||
-- Hook execution on collection of menu contained by `a_menu_system'
|
-- Hook execution on collection of menu contained by `a_menu_system'
|
||||||
-- for related response `a_response'.
|
-- for related response `a_response'.
|
||||||
do
|
do
|
||||||
a_menu_system.navigation_menu.extend (create {CMS_LOCAL_LINK}.make ("Feeds", "feed_aggregation/"))
|
if a_response.is_authenticated then
|
||||||
if a_response.has_permission (permission__manage_feed_aggregator) then
|
a_menu_system.navigation_menu.extend (create {CMS_LOCAL_LINK}.make ("Feeds", "feed_aggregation/"))
|
||||||
a_menu_system.management_menu.extend (create {CMS_LOCAL_LINK}.make ("Feeds (admin)", "admin/feed_aggregator/"))
|
if a_response.has_permission (permission__manage_feed_aggregator) then
|
||||||
|
a_menu_system.management_menu.extend_into (create {CMS_LOCAL_LINK}.make ("Feeds (admin)", "admin/feed_aggregator/"), "Admin", "admin")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ feature -- Handler
|
|||||||
attached l_search.last_result as l_result and then
|
attached l_search.last_result as l_result and then
|
||||||
l_result.status = 200
|
l_result.status = 200
|
||||||
then
|
then
|
||||||
if attached template_block (Current, "search", r) as l_tpl_block then
|
if attached smarty_template_block (Current, "search", api) as l_tpl_block then
|
||||||
l_tpl_block.set_value (l_result, "result")
|
l_tpl_block.set_value (l_result, "result")
|
||||||
r.add_block (l_tpl_block, "content")
|
r.add_block (l_tpl_block, "content")
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ feature -- Hooks
|
|||||||
a_response.location.same_string ("account")
|
a_response.location.same_string ("account")
|
||||||
then
|
then
|
||||||
if
|
if
|
||||||
attached template_block ("account_info", a_response) as l_tpl_block and then
|
attached smarty_template_block (Current, "account_info", a_response.api) as l_tpl_block and then
|
||||||
attached a_response.user as l_user
|
attached a_response.user as l_user
|
||||||
then
|
then
|
||||||
associate_account (l_user, a_response.values)
|
associate_account (l_user, a_response.values)
|
||||||
@@ -323,7 +323,7 @@ feature {NONE} -- Block views
|
|||||||
local
|
local
|
||||||
vals: CMS_VALUE_TABLE
|
vals: CMS_VALUE_TABLE
|
||||||
do
|
do
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
create vals.make (1)
|
create vals.make (1)
|
||||||
-- add the variable to the block
|
-- add the variable to the block
|
||||||
a_response.api.hooks.invoke_value_table_alter (vals, a_response)
|
a_response.api.hooks.invoke_value_table_alter (vals, a_response)
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ feature {NONE} -- Block views
|
|||||||
local
|
local
|
||||||
vals: CMS_VALUE_TABLE
|
vals: CMS_VALUE_TABLE
|
||||||
do
|
do
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_block (Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
create vals.make (1)
|
create vals.make (1)
|
||||||
-- add the variable to the block
|
-- add the variable to the block
|
||||||
a_response.api.hooks.invoke_value_table_alter (vals, a_response)
|
a_response.api.hooks.invoke_value_table_alter (vals, a_response)
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ note
|
|||||||
This module allows the use Session Based Authentication using Cookies to restrict access
|
This module allows the use Session Based Authentication using Cookies to restrict access
|
||||||
by looking up users in the given providers.
|
by looking up users in the given providers.
|
||||||
]"
|
]"
|
||||||
date: "$Date$"
|
date: "$Date: 2016-04-27 16:04:18 +0200 (mer., 27 avr. 2016) $"
|
||||||
revision: "$Revision$"
|
revision: "$Revision: 98643 $"
|
||||||
|
|
||||||
class
|
class
|
||||||
CMS_SESSION_AUTH_MODULE
|
CMS_SESSION_AUTH_MODULE
|
||||||
@@ -115,7 +115,7 @@ feature -- Access: router
|
|||||||
if attached session_api as l_session_api then
|
if attached session_api as l_session_api then
|
||||||
a_router.handle ("/" + login_location, create {WSF_URI_AGENT_HANDLER}.make (agent handle_login (a_api, ?, ?)), a_router.methods_head_get)
|
a_router.handle ("/" + login_location, create {WSF_URI_AGENT_HANDLER}.make (agent handle_login (a_api, ?, ?)), a_router.methods_head_get)
|
||||||
a_router.handle ("/" + logout_location, create {WSF_URI_AGENT_HANDLER}.make (agent handle_logout (a_api, l_session_api, ?, ?)), a_router.methods_get_post)
|
a_router.handle ("/" + logout_location, create {WSF_URI_AGENT_HANDLER}.make (agent handle_logout (a_api, l_session_api, ?, ?)), a_router.methods_get_post)
|
||||||
a_router.handle ("/account/auth/roc-session-login", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent handle_login_with_session (a_api,session_api, ?, ?)), a_router.methods_get_post)
|
a_router.handle ("/" + login_location, create {WSF_URI_AGENT_HANDLER}.make (agent handle_login_with_session (a_api,session_api, ?, ?)), a_router.methods_post)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ feature {NONE} -- Implementation: routes
|
|||||||
if api.user_is_authenticated then
|
if api.user_is_authenticated then
|
||||||
r.add_error_message ("You are already signed in!")
|
r.add_error_message ("You are already signed in!")
|
||||||
else
|
else
|
||||||
if attached template_block ("login", r) as l_tpl_block then
|
if attached smarty_template_login_block (req, Current, "login", api) as l_tpl_block then
|
||||||
create vals.make (1)
|
create vals.make (1)
|
||||||
-- add the variable to the block
|
-- add the variable to the block
|
||||||
l_tpl_block.set_value (api.user, "user")
|
l_tpl_block.set_value (api.user, "user")
|
||||||
@@ -216,14 +216,18 @@ feature {NONE} -- Implementation: routes
|
|||||||
api.record_user_login (l_user)
|
api.record_user_login (l_user)
|
||||||
|
|
||||||
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
||||||
if attached {WSF_STRING} req.query_parameter ("destination") as p_destination then
|
if
|
||||||
r.set_redirection (p_destination.url_encoded_value)
|
attached {WSF_STRING} req.item ("destination") as p_destination and then
|
||||||
|
attached p_destination.value as v and then
|
||||||
|
v.is_valid_as_string_8
|
||||||
|
then
|
||||||
|
r.set_redirection (v.to_string_8)
|
||||||
else
|
else
|
||||||
r.set_redirection ("")
|
r.set_redirection ("")
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
||||||
if attached template_block ("login", r) as l_tpl_block then
|
if attached smarty_template_login_block (req, Current, "login", api) as l_tpl_block then
|
||||||
l_tpl_block.set_value (l_username.value, "username")
|
l_tpl_block.set_value (l_username.value, "username")
|
||||||
l_tpl_block.set_value ("Wrong: Username or password ", "error")
|
l_tpl_block.set_value ("Wrong: Username or password ", "error")
|
||||||
r.add_block (l_tpl_block, "content")
|
r.add_block (l_tpl_block, "content")
|
||||||
@@ -232,7 +236,7 @@ feature {NONE} -- Implementation: routes
|
|||||||
r.execute
|
r.execute
|
||||||
else
|
else
|
||||||
create {BAD_REQUEST_ERROR_CMS_RESPONSE} r.make (req, res, api)
|
create {BAD_REQUEST_ERROR_CMS_RESPONSE} r.make (req, res, api)
|
||||||
if attached template_block ("login", r) as l_tpl_block then
|
if attached smarty_template_login_block (req, Current, "login", api) as l_tpl_block then
|
||||||
if attached {WSF_STRING} req.form_parameter ("username") as l_username then
|
if attached {WSF_STRING} req.form_parameter ("username") as l_username then
|
||||||
l_tpl_block.set_value (l_username.value, "username")
|
l_tpl_block.set_value (l_username.value, "username")
|
||||||
end
|
end
|
||||||
@@ -272,7 +276,7 @@ feature {NONE} -- Block views
|
|||||||
local
|
local
|
||||||
vals: CMS_VALUE_TABLE
|
vals: CMS_VALUE_TABLE
|
||||||
do
|
do
|
||||||
if attached template_block (a_block_id, a_response) as l_tpl_block then
|
if attached smarty_template_login_block (a_response.request, Current, a_block_id, a_response.api) as l_tpl_block then
|
||||||
create vals.make (1)
|
create vals.make (1)
|
||||||
-- add the variable to the block
|
-- add the variable to the block
|
||||||
a_response.api.hooks.invoke_value_table_alter (vals, a_response)
|
a_response.api.hooks.invoke_value_table_alter (vals, a_response)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
<h3>Login or <a href="{$site_url/}account/roc-register">Register</a></h3>
|
<h3>Login or <a href="{$site_url/}account/roc-register">Register</a></h3>
|
||||||
<div>
|
<div>
|
||||||
<form name="cms_session_auth" action="{$site_url/}account/auth/roc-session-login" method="POST">
|
<form name="cms_session_auth" action="{$site_url/}account/auth/roc-session-login" method="POST">
|
||||||
|
{unless isempty="$site_destination"}<input type="hidden" name="destination" value="{$site_destination/}">{/unless}
|
||||||
<div>
|
<div>
|
||||||
<input type="text" name="username" id="username" required value="{$username/}">
|
<input type="text" name="username" id="username" required value="{$username/}">
|
||||||
<label>Username</label>
|
<label>Username</label>
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ feature -- Hooks
|
|||||||
-- Add the link to the taxonomy to the main menu
|
-- Add the link to the taxonomy to the main menu
|
||||||
if a_response.has_permission ("admin taxonomy") then
|
if a_response.has_permission ("admin taxonomy") then
|
||||||
create lnk.make ("Taxonomy", "admin/taxonomy/")
|
create lnk.make ("Taxonomy", "admin/taxonomy/")
|
||||||
a_menu_system.management_menu.extend (lnk)
|
a_menu_system.management_menu.extend_into (lnk, "Admin", "admin")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ feature {NONE} -- Initialization
|
|||||||
do
|
do
|
||||||
site_location := environment.path
|
site_location := environment.path
|
||||||
|
|
||||||
|
-- Debug mode.
|
||||||
|
is_debug := attached string_8_item ("site.debug") as l_debug and then l_debug.is_case_insensitive_equal_general ("yes")
|
||||||
|
|
||||||
--| Site id, used to identified a site, this could be set to a uuid, or else
|
--| Site id, used to identified a site, this could be set to a uuid, or else
|
||||||
site_id := string_8_item_or_default ("site.id", "_ROC_CMS_NO_ID_")
|
site_id := string_8_item_or_default ("site.id", "_ROC_CMS_NO_ID_")
|
||||||
|
|
||||||
@@ -259,6 +262,11 @@ feature -- Access: Site
|
|||||||
-- Optional path defining the front page.
|
-- Optional path defining the front page.
|
||||||
-- By default "" or "/".
|
-- By default "" or "/".
|
||||||
|
|
||||||
|
feature -- Settings
|
||||||
|
|
||||||
|
is_debug: BOOLEAN
|
||||||
|
-- Is debug mode enabled?
|
||||||
|
|
||||||
feature -- Query
|
feature -- Query
|
||||||
|
|
||||||
text_item (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32
|
text_item (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
note
|
note
|
||||||
description: "[
|
description: "[
|
||||||
Hook providing a way to alter a block.
|
Hook providing a way to provide blocks.
|
||||||
]"
|
]"
|
||||||
date: "$Date: 2014-11-19 20:00:19 +0100 (mer., 19 nov. 2014) $"
|
date: "$Date: 2014-11-19 20:00:19 +0100 (mer., 19 nov. 2014) $"
|
||||||
revision: "$Revision: 96123 $"
|
revision: "$Revision: 96123 $"
|
||||||
@@ -13,19 +13,27 @@ inherit
|
|||||||
|
|
||||||
feature -- Hook
|
feature -- Hook
|
||||||
|
|
||||||
block_list: ITERABLE [like {CMS_BLOCK}.name]
|
block_list: detachable ITERABLE [like {CMS_BLOCK}.name]
|
||||||
-- List of block names, managed by current object.
|
-- List of block names, managed by current object.
|
||||||
-- If prefixed by "?", condition will be check
|
-- If prefixed by "?", condition will be checked
|
||||||
-- to determine if it should be displayed (and computed) or not.
|
-- to determine if it should be displayed (and computed) or not.
|
||||||
deferred
|
deferred
|
||||||
end
|
end
|
||||||
|
|
||||||
|
block_identifiers (a_response: detachable CMS_RESPONSE): detachable ITERABLE [like {CMS_BLOCK}.name]
|
||||||
|
-- List of block names, managed by current object, in the context of `a_response' if set.
|
||||||
|
-- If prefixed by "?", condition will be checked
|
||||||
|
-- to determine if it should be displayed (and computed) or not.
|
||||||
|
do
|
||||||
|
Result := block_list
|
||||||
|
end
|
||||||
|
|
||||||
get_block_view (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
get_block_view (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE)
|
||||||
-- Get block object identified by `a_block_id' and associate with `a_response'.
|
-- Get block object identified by `a_block_id' and associate with `a_response'.
|
||||||
deferred
|
deferred
|
||||||
end
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,17 +6,17 @@ note
|
|||||||
deferred class
|
deferred class
|
||||||
CMS_HOOK_BLOCK_HELPER
|
CMS_HOOK_BLOCK_HELPER
|
||||||
|
|
||||||
feature -- Factory
|
feature {NONE} -- Factory
|
||||||
|
|
||||||
template_block (a_module: CMS_MODULE; a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE): detachable CMS_SMARTY_TEMPLATE_BLOCK
|
smarty_template_block (a_module: CMS_MODULE; a_block_id: READABLE_STRING_8; a_cms_api: CMS_API): detachable CMS_SMARTY_TEMPLATE_BLOCK
|
||||||
-- Smarty content block for `a_block_id' in the context of `a_module' and `a_response'.
|
-- Smarty content block for `a_block_id' in the context of `a_module' and `a_cms_api'.
|
||||||
local
|
local
|
||||||
res: PATH
|
res: PATH
|
||||||
p: detachable PATH
|
p: detachable PATH
|
||||||
do
|
do
|
||||||
create res.make_from_string ("templates")
|
create res.make_from_string ("templates")
|
||||||
res := res.extended ("block_").appended (a_block_id).appended_with_extension ("tpl")
|
res := res.extended ("block_").appended (a_block_id).appended_with_extension ("tpl")
|
||||||
p := a_response.api.module_theme_resource_location (a_module, res)
|
p := a_cms_api.module_theme_resource_location (a_module, res)
|
||||||
if p /= Void then
|
if p /= Void then
|
||||||
if attached p.entry as e then
|
if attached p.entry as e then
|
||||||
create Result.make (a_block_id, Void, p.parent, e)
|
create Result.make (a_block_id, Void, p.parent, e)
|
||||||
@@ -26,6 +26,39 @@ feature -- Factory
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
smarty_template_block_with_values (a_module: CMS_MODULE; a_block_id: READABLE_STRING_8; a_cms_api: CMS_API; a_values: STRING_TABLE [ANY]): like smarty_template_block
|
||||||
|
-- Smarty content block for `a_block_id' in the context of `a_module' and `a_cms_api',
|
||||||
|
-- With additional `a_values'.
|
||||||
|
do
|
||||||
|
Result := smarty_template_block (a_module, a_block_id, a_cms_api)
|
||||||
|
if Result /= Void then
|
||||||
|
across
|
||||||
|
a_values as ic
|
||||||
|
loop
|
||||||
|
Result.set_value (ic.item, ic.key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
feature {NONE} -- Factory: obsolete
|
||||||
|
|
||||||
|
template_block (a_module: CMS_MODULE; a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE): detachable CMS_SMARTY_TEMPLATE_BLOCK
|
||||||
|
-- Smarty content block for `a_block_id' in the context of `a_module' and `a_response'.
|
||||||
|
obsolete
|
||||||
|
"Use smarty_template_block [Feb/2016]"
|
||||||
|
do
|
||||||
|
Result := smarty_template_block (a_module, a_block_id, a_response.api)
|
||||||
|
end
|
||||||
|
|
||||||
|
template_block_with_values (a_module: CMS_MODULE; a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE; a_values: STRING_TABLE [ANY]): like smarty_template_block
|
||||||
|
-- Smarty content block for `a_block_id' in the context of `a_module' and `a_response',
|
||||||
|
-- With additional `a_values'.
|
||||||
|
obsolete
|
||||||
|
"Use smarty_template_block_with_values [Feb/2016]"
|
||||||
|
do
|
||||||
|
Result := smarty_template_block_with_values (a_module, a_block_id, a_response.api, a_values)
|
||||||
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
|
|||||||
@@ -150,9 +150,12 @@ feature -- Hook: block
|
|||||||
across
|
across
|
||||||
lst as c
|
lst as c
|
||||||
loop
|
loop
|
||||||
if attached {CMS_HOOK_BLOCK} c.item as h then
|
if
|
||||||
|
attached {CMS_HOOK_BLOCK} c.item as h and then
|
||||||
|
attached h.block_identifiers (a_response) as l_names
|
||||||
|
then
|
||||||
across
|
across
|
||||||
h.block_list as blst
|
l_names as blst
|
||||||
loop
|
loop
|
||||||
bl := blst.item
|
bl := blst.item
|
||||||
bl_optional := bl.count > 0 and bl[1] = '?'
|
bl_optional := bl.count > 0 and bl[1] = '?'
|
||||||
@@ -252,6 +255,6 @@ feature -- Hook: export
|
|||||||
end
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
45
src/hooks/cms_hook_response_block.e
Normal file
45
src/hooks/cms_hook_response_block.e
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
note
|
||||||
|
description: "[
|
||||||
|
Hook providing a way to provide blocks,
|
||||||
|
within the context of a response.
|
||||||
|
]"
|
||||||
|
date: "$Date$"
|
||||||
|
revision: "$Revision$"
|
||||||
|
|
||||||
|
deferred class
|
||||||
|
CMS_HOOK_RESPONSE_BLOCK
|
||||||
|
|
||||||
|
inherit
|
||||||
|
CMS_HOOK_BLOCK
|
||||||
|
rename
|
||||||
|
block_identifiers as old_block_identifiers
|
||||||
|
redefine
|
||||||
|
old_block_identifiers
|
||||||
|
end
|
||||||
|
|
||||||
|
feature -- Hook
|
||||||
|
|
||||||
|
frozen block_list: detachable ITERABLE [like {CMS_BLOCK}.name]
|
||||||
|
-- List of block names, managed by current object.
|
||||||
|
-- If prefixed by "?", condition will be checked
|
||||||
|
-- to determine if it should be displayed (and computed) or not.
|
||||||
|
do
|
||||||
|
Result := block_identifiers (Void)
|
||||||
|
end
|
||||||
|
|
||||||
|
frozen old_block_identifiers (a_response: detachable CMS_RESPONSE): detachable ITERABLE [like {CMS_BLOCK}.name]
|
||||||
|
do
|
||||||
|
Result := block_identifiers (a_response)
|
||||||
|
end
|
||||||
|
|
||||||
|
block_identifiers (a_response: detachable CMS_RESPONSE): detachable ITERABLE [like {CMS_BLOCK}.name]
|
||||||
|
-- List of block names, managed by current object, in the context of `a_response' if set.
|
||||||
|
-- If prefixed by "?", condition will be checked
|
||||||
|
-- to determine if it should be displayed (and computed) or not.
|
||||||
|
deferred
|
||||||
|
end
|
||||||
|
|
||||||
|
note
|
||||||
|
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
|
end
|
||||||
@@ -15,7 +15,7 @@ create
|
|||||||
|
|
||||||
feature {NONE} -- Initialization
|
feature {NONE} -- Initialization
|
||||||
|
|
||||||
make (a_exp: READABLE_STRING_8)
|
make (a_exp: READABLE_STRING_GENERAL)
|
||||||
do
|
do
|
||||||
expression := a_exp
|
expression := a_exp
|
||||||
end
|
end
|
||||||
@@ -30,18 +30,18 @@ feature -- Access
|
|||||||
description: STRING_32
|
description: STRING_32
|
||||||
do
|
do
|
||||||
create Result.make_from_string_general ("Expression: %"")
|
create Result.make_from_string_general ("Expression: %"")
|
||||||
Result.append_string_general (expression)
|
Result.append_string_general (expression.as_string_32)
|
||||||
Result.append_character ('%"')
|
Result.append_character ('%"')
|
||||||
end
|
end
|
||||||
|
|
||||||
expression: STRING
|
expression: READABLE_STRING_GENERAL
|
||||||
|
|
||||||
feature -- Evaluation
|
feature -- Evaluation
|
||||||
|
|
||||||
satisfied_for_response (res: CMS_RESPONSE): BOOLEAN
|
satisfied_for_response (res: CMS_RESPONSE): BOOLEAN
|
||||||
local
|
local
|
||||||
exp: like expression
|
exp: like expression
|
||||||
l_path: READABLE_STRING_8
|
l_path: READABLE_STRING_GENERAL
|
||||||
kmp: KMP_WILD
|
kmp: KMP_WILD
|
||||||
do
|
do
|
||||||
exp := expression
|
exp := expression
|
||||||
@@ -61,12 +61,12 @@ feature -- Evaluation
|
|||||||
Result := kmp.pattern_matches
|
Result := kmp.pattern_matches
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
Result := res.location.same_string (l_path)
|
Result := l_path.same_string (res.location)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -93,6 +93,14 @@ feature -- Logs
|
|||||||
do
|
do
|
||||||
end
|
end
|
||||||
|
|
||||||
|
logs (a_category: detachable READABLE_STRING_GENERAL; a_lower: INTEGER; a_count: INTEGER): LIST [CMS_LOG]
|
||||||
|
-- List of recent logs from `a_lower' to `a_lower+a_count'.
|
||||||
|
-- If `a_category' is set, filter to return only associated logs.
|
||||||
|
-- If `a_count' <= 0 then, return all logs.
|
||||||
|
do
|
||||||
|
create {ARRAYED_LIST [CMS_LOG]} Result.make (0)
|
||||||
|
end
|
||||||
|
|
||||||
feature -- Custom
|
feature -- Custom
|
||||||
|
|
||||||
set_custom_value (a_name: READABLE_STRING_8; a_value: attached like custom_value; a_type: detachable READABLE_STRING_8)
|
set_custom_value (a_name: READABLE_STRING_8; a_value: attached like custom_value; a_type: detachable READABLE_STRING_8)
|
||||||
@@ -128,6 +136,6 @@ feature -- Custom
|
|||||||
end
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -59,6 +59,13 @@ feature -- Logs
|
|||||||
deferred
|
deferred
|
||||||
end
|
end
|
||||||
|
|
||||||
|
logs (a_category: detachable READABLE_STRING_GENERAL; a_lower: INTEGER; a_count: INTEGER): LIST [CMS_LOG]
|
||||||
|
-- List of recent logs from `a_lower' to `a_lower+a_count'.
|
||||||
|
-- If `a_category' is set, filter to return only associated logs.
|
||||||
|
-- If `a_count' <= 0 then, return all logs.
|
||||||
|
deferred
|
||||||
|
end
|
||||||
|
|
||||||
feature -- Misc
|
feature -- Misc
|
||||||
|
|
||||||
set_custom_value (a_name: READABLE_STRING_8; a_value: attached like custom_value; a_type: detachable READABLE_STRING_8)
|
set_custom_value (a_name: READABLE_STRING_8; a_value: attached like custom_value; a_type: detachable READABLE_STRING_8)
|
||||||
@@ -82,6 +89,6 @@ feature -- Misc
|
|||||||
end
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -206,9 +206,94 @@ feature -- Logs
|
|||||||
sql_finalize
|
sql_finalize
|
||||||
end
|
end
|
||||||
|
|
||||||
|
logs (a_category: detachable READABLE_STRING_GENERAL; a_lower: INTEGER; a_count: INTEGER): ARRAYED_LIST [CMS_LOG]
|
||||||
|
-- <Precursor>.
|
||||||
|
local
|
||||||
|
l_parameters: detachable STRING_TABLE [detachable ANY]
|
||||||
|
l_sql: READABLE_STRING_8
|
||||||
|
do
|
||||||
|
error_handler.reset
|
||||||
|
create l_parameters.make (3)
|
||||||
|
if a_category /= Void then
|
||||||
|
l_parameters.put (a_category, "category")
|
||||||
|
l_sql := sql_select_categorized_logs
|
||||||
|
else
|
||||||
|
l_sql := sql_select_logs
|
||||||
|
end
|
||||||
|
if a_count > 0 then
|
||||||
|
l_parameters.put (a_lower, "offset")
|
||||||
|
l_parameters.put (a_count, "size")
|
||||||
|
check l_sql.ends_with_general (";") end
|
||||||
|
l_sql := l_sql.substring (1, l_sql.count - 1) -- Remove ';'
|
||||||
|
+ "LIMIT :size OFFSET :offset ;"
|
||||||
|
end
|
||||||
|
|
||||||
|
from
|
||||||
|
if a_count > 0 then
|
||||||
|
create Result.make (a_count)
|
||||||
|
else
|
||||||
|
create Result.make (10)
|
||||||
|
end
|
||||||
|
if l_parameters.is_empty then
|
||||||
|
l_parameters := Void
|
||||||
|
end
|
||||||
|
sql_query (l_sql, l_parameters)
|
||||||
|
sql_start
|
||||||
|
until
|
||||||
|
sql_after
|
||||||
|
loop
|
||||||
|
if attached fetch_log as l_log then
|
||||||
|
Result.force (l_log)
|
||||||
|
end
|
||||||
|
sql_forth
|
||||||
|
end
|
||||||
|
sql_finalize
|
||||||
|
end
|
||||||
|
|
||||||
|
fetch_log: detachable CMS_LOG
|
||||||
|
-- SQL: 1:id, 2:category, 3:level, 4:uid, 5:message, 6:info, 7:link, 8:date
|
||||||
|
local
|
||||||
|
l_cat: detachable READABLE_STRING_8
|
||||||
|
l_mesg: detachable READABLE_STRING_8
|
||||||
|
l_level: INTEGER
|
||||||
|
l_date: detachable DATE_TIME
|
||||||
|
i: INTEGER
|
||||||
|
lnk: CMS_LOCAL_LINK
|
||||||
|
do
|
||||||
|
l_cat := sql_read_string (2)
|
||||||
|
l_mesg := sql_read_string (5)
|
||||||
|
l_level := sql_read_integer_32 (3)
|
||||||
|
l_date := sql_read_date_time (8)
|
||||||
|
|
||||||
|
if l_cat = Void then
|
||||||
|
l_cat := "unknown"
|
||||||
|
end
|
||||||
|
if l_mesg = Void then
|
||||||
|
l_mesg := ""
|
||||||
|
end
|
||||||
|
|
||||||
|
create Result.make (l_cat, l_mesg, l_level, l_date)
|
||||||
|
Result.set_id (sql_read_integer_64 (1))
|
||||||
|
Result.set_info (sql_read_string (6))
|
||||||
|
if attached sql_read_string_32 (7) as l_link_text then
|
||||||
|
-- Format: "[title](location)"
|
||||||
|
i := l_link_text.index_of ('(', 1)
|
||||||
|
if i > 0 then
|
||||||
|
create lnk.make (l_link_text.substring (2, i - 2), l_link_text.substring (i + 1, l_link_text.count - 1))
|
||||||
|
Result.set_link (lnk)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
sql_insert_log: STRING = "INSERT INTO logs (category, level, uid, message, info, link, date) VALUES (:category, :level, :uid, :message, :info, :link, :date);"
|
sql_insert_log: STRING = "INSERT INTO logs (category, level, uid, message, info, link, date) VALUES (:category, :level, :uid, :message, :info, :link, :date);"
|
||||||
-- SQL Insert to add a new node.
|
-- SQL Insert to add a new node.
|
||||||
|
|
||||||
|
sql_select_logs: STRING = "SELECT id, category, level, uid, message, info, link, date FROM logs ORDER by date DESC;"
|
||||||
|
-- SQL Insert to add a new node.
|
||||||
|
|
||||||
|
sql_select_categorized_logs: STRING = "SELECT id, category, level, uid, message, info, link, date FROM logs WHERE category=:category ORDER by date DESC;"
|
||||||
|
-- SQL Insert to add a new node.
|
||||||
|
|
||||||
feature -- Misc
|
feature -- Misc
|
||||||
|
|
||||||
set_custom_value (a_name: READABLE_STRING_8; a_value: attached like custom_value; a_type: detachable READABLE_STRING_8)
|
set_custom_value (a_name: READABLE_STRING_8; a_value: attached like custom_value; a_type: detachable READABLE_STRING_8)
|
||||||
@@ -326,6 +411,6 @@ feature -- Misc
|
|||||||
|
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -170,6 +170,14 @@ feature -- Access
|
|||||||
storage: CMS_STORAGE
|
storage: CMS_STORAGE
|
||||||
-- Default persistence storage.
|
-- Default persistence storage.
|
||||||
|
|
||||||
|
feature -- Settings
|
||||||
|
|
||||||
|
is_debug: BOOLEAN
|
||||||
|
-- Is debug mode enabled?
|
||||||
|
do
|
||||||
|
Result := setup.is_debug
|
||||||
|
end
|
||||||
|
|
||||||
feature {NONE} -- Access: request
|
feature {NONE} -- Access: request
|
||||||
|
|
||||||
request: WSF_REQUEST
|
request: WSF_REQUEST
|
||||||
@@ -261,6 +269,14 @@ feature -- Status Report
|
|||||||
|
|
||||||
feature -- Logging
|
feature -- Logging
|
||||||
|
|
||||||
|
logs (a_category: detachable READABLE_STRING_8; a_lower: INTEGER; a_count: INTEGER): LIST [CMS_LOG]
|
||||||
|
-- List of recent logs from `a_lower' to `a_lower+a_count'.
|
||||||
|
-- If `a_category' is set, filter to return only associated logs.
|
||||||
|
-- If `a_count' <= 0 then, return all logs.
|
||||||
|
do
|
||||||
|
Result := storage.logs (a_category, a_lower, a_count)
|
||||||
|
end
|
||||||
|
|
||||||
log (a_category: READABLE_STRING_8; a_message: READABLE_STRING_8; a_level: INTEGER; a_link: detachable CMS_LINK)
|
log (a_category: READABLE_STRING_8; a_message: READABLE_STRING_8; a_level: INTEGER; a_link: detachable CMS_LINK)
|
||||||
local
|
local
|
||||||
l_log: CMS_LOG
|
l_log: CMS_LOG
|
||||||
@@ -674,11 +690,16 @@ feature -- Environment/ module
|
|||||||
create {INI_CONFIG} Result.make_from_file (l_path)
|
create {INI_CONFIG} Result.make_from_file (l_path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if Result = Void and a_name /= Void then
|
if Result = Void then
|
||||||
-- Use sub config from default?
|
if
|
||||||
if attached {CONFIG_READER} module_configuration_by_name_in_location (a_module_name, a_dir, Void) as cfg then
|
a_name /= Void and then
|
||||||
|
attached {CONFIG_READER} module_configuration_by_name_in_location (a_module_name, a_dir, Void) as cfg
|
||||||
|
then
|
||||||
|
-- Use sub config from default.
|
||||||
Result := cfg.sub_config (a_name)
|
Result := cfg.sub_config (a_name)
|
||||||
end
|
end
|
||||||
|
elseif Result.has_error then
|
||||||
|
log ("modules", "module configuration has error %"" + p.utf_8_name + "%"", {CMS_LOG}.level_error, Void)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,12 @@ note
|
|||||||
date: "$Date: 2015-02-13 14:54:27 +0100 (ven., 13 févr. 2015) $"
|
date: "$Date: 2015-02-13 14:54:27 +0100 (ven., 13 févr. 2015) $"
|
||||||
revision: "$Revision: 96620 $"
|
revision: "$Revision: 96620 $"
|
||||||
|
|
||||||
deferred class
|
class
|
||||||
CMS_MODULE_API
|
CMS_MODULE_API
|
||||||
|
|
||||||
|
create
|
||||||
|
make
|
||||||
|
|
||||||
feature {NONE} -- Initialization
|
feature {NONE} -- Initialization
|
||||||
|
|
||||||
make (a_api: CMS_API)
|
make (a_api: CMS_API)
|
||||||
@@ -67,6 +70,6 @@ feature -- Bridge to CMS API
|
|||||||
end
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -992,6 +992,13 @@ feature -- Message
|
|||||||
m.append (a_msg + "</li>")
|
m.append (a_msg + "</li>")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
add_debug_message (a_msg: READABLE_STRING_8)
|
||||||
|
do
|
||||||
|
if api.is_debug then
|
||||||
|
add_message (a_msg, "debug")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
add_notice_message (a_msg: READABLE_STRING_8)
|
add_notice_message (a_msg: READABLE_STRING_8)
|
||||||
do
|
do
|
||||||
add_message (a_msg, "notice")
|
add_message (a_msg, "notice")
|
||||||
|
|||||||
Reference in New Issue
Block a user