Moved the cms component to https://github.com/EiffelWebFramework/cms
This is now out of EWF repository.
This commit is contained in:
@@ -59,10 +59,6 @@ An alternative to the last 2 instructions is to use the script from tools folder
|
||||
### text
|
||||
* __encoder__: Various simpler encoders: base64, url-encoder, xml entities, html entities [read more](library/text/encoder)
|
||||
|
||||
### crypto
|
||||
* eel
|
||||
* eapml
|
||||
|
||||
### Others
|
||||
* error: very simple/basic library to handle error
|
||||
|
||||
|
||||
1
draft/application/cms/.gitignore
vendored
1
draft/application/cms/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
_storage_
|
||||
@@ -1,2 +1,2 @@
|
||||
Experimental a simple CMS using EWF.
|
||||
Inspired by Drupal
|
||||
The "cms" component moved.
|
||||
Please visit https://github.com/EiffelWebFramework/cms to follow the project.
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="cms" uuid="0D24AE3C-61DA-4E81-8DCF-90C2E65FB669" library_target="cms">
|
||||
<target name="cms">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/CVS$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="false" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||
</option>
|
||||
<setting name="exception_trace" value="true"/>
|
||||
<setting name="concurrency" value="thread"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="encoder" location="..\..\..\library\text\encoder\encoder-safe.ecf" readonly="false"/>
|
||||
<library name="http" location="..\..\..\library\network\protocol\http\http-safe.ecf" readonly="false"/>
|
||||
<library name="notification_email" location="..\..\..\library\runtime\process\notification_email\notification_email-safe.ecf"/>
|
||||
<library name="openid" location="..\..\..\library\security\openid\consumer\openid-safe.ecf" readonly="false"/>
|
||||
<library name="process" location="$ISE_LIBRARY\library\process\process-safe.ecf"/>
|
||||
<library name="time" location="$ISE_LIBRARY\library\time\time-safe.ecf"/>
|
||||
<library name="uri_template" location="..\..\..\library\text\parser\uri_template\uri_template-safe.ecf"/>
|
||||
<library name="uuid" location="$ISE_LIBRARY\library\uuid\uuid-safe.ecf"/>
|
||||
<library name="wsf" location="..\..\..\library\server\wsf\wsf-safe.ecf" readonly="false"/>
|
||||
<library name="wsf_html" location="..\..\..\library\server\wsf_html\wsf_html-safe.ecf" readonly="false"/>
|
||||
<library name="wsf_session" location="..\..\..\library\server\wsf\wsf_session-safe.ecf" readonly="false"/>
|
||||
<cluster name="src" location=".\src\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="cms" library_target="cms" uuid="0D24AE3C-61DA-4E81-8DCF-90C2E65FB669">
|
||||
<target name="cms">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/CVS$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" syntax="transitional">
|
||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||
</option>
|
||||
<setting name="concurrency" value="thread"/>
|
||||
<setting name="exception_trace" value="true"/>
|
||||
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
|
||||
<library name="encoder" location="..\..\..\library\text\encoder\encoder.ecf" readonly="false"/>
|
||||
<library name="wsf_html" location="..\..\..\library\server\wsf_html\wsf_html.ecf" readonly="false"/>
|
||||
<library name="http" location="..\..\..\library\network\protocol\http\http.ecf" readonly="false"/>
|
||||
<library name="openid" location="..\..\..\library\security\openid\consumer\openid.ecf" />
|
||||
<library name="process" location="$ISE_LIBRARY\library\process\process.ecf"/>
|
||||
<library name="time" location="$ISE_LIBRARY\library\time\time.ecf"/>
|
||||
<library name="uuid" location="$ISE_LIBRARY\library\uuid\uuid.ecf"/>
|
||||
<library name="uri_template" location="..\..\..\library\text\parser\uri_template\uri_template.ecf"/>
|
||||
<library name="wsf" location="..\..\..\library\server\wsf\wsf.ecf" readonly="false"/>
|
||||
<library name="wsf_session" location="..\..\..\library\server\wsf\wsf_session.ecf" readonly="false"/>
|
||||
<library name="notification_email" location="..\..\..\library\runtime\process\notification_email\notification_email.ecf"/>
|
||||
<cluster name="src" location=".\src\" recursive="true">
|
||||
</cluster>
|
||||
</target>
|
||||
</system>
|
||||
@@ -1,8 +0,0 @@
|
||||
site.name=EWF Web CMS
|
||||
#site.base_url=/demo
|
||||
site.email=your@email.com
|
||||
root-dir=../www
|
||||
var-dir=var
|
||||
files-dir=files
|
||||
themes-dir=${root-dir}/themes
|
||||
#theme=test
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="demo" uuid="402ED70E-9A85-4501-8730-7B211EB32E6B" library_target="demo">
|
||||
<target name="demo">
|
||||
<root class="WEB_CMS" feature="make_and_launch"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all" syntax="standard">
|
||||
</option>
|
||||
<setting name="concurrency" value="none"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="cms" location="..\cms-safe.ecf" readonly="false"/>
|
||||
<library name="default_nino" location="..\..\..\..\library\server\wsf\default\nino-safe.ecf"/>
|
||||
<library name="http" location="..\..\..\..\library\network\protocol\http\http-safe.ecf" readonly="false"/>
|
||||
<library name="nino" location="..\..\..\..\library\server\ewsgi\connectors\nino\nino-safe.ecf"/>
|
||||
<library name="time" location="$ISE_LIBRARY\library\time\time-safe.ecf"/>
|
||||
<library name="wsf_html" location="..\..\..\..\library\server\wsf_html\wsf_html-safe.ecf" readonly="false"/>
|
||||
<library name="wsf" location="..\..\..\..\library\server\wsf\wsf-safe.ecf" readonly="false"/>
|
||||
<cluster name="src" location=".\src\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
@@ -1,6 +0,0 @@
|
||||
#include <windows.h>
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
1 "This Program was made using EiffelStudio using Visual Studio C++"
|
||||
END
|
||||
@@ -1,4 +0,0 @@
|
||||
# For nino connector, use port 9999
|
||||
port=9090
|
||||
|
||||
#verbose=true
|
||||
@@ -1,82 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_MODULE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
DEMO_MODULE
|
||||
|
||||
inherit
|
||||
CMS_MODULE
|
||||
redefine
|
||||
links
|
||||
end
|
||||
|
||||
CMS_HOOK_MENU_ALTER
|
||||
|
||||
CMS_HOOK_AUTO_REGISTER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
name := "demo"
|
||||
version := "1.0"
|
||||
description := "demo"
|
||||
package := "misc"
|
||||
end
|
||||
|
||||
feature {CMS_SERVICE} -- Registration
|
||||
|
||||
service: detachable CMS_SERVICE
|
||||
|
||||
register (a_service: CMS_SERVICE)
|
||||
do
|
||||
service := a_service
|
||||
a_service.map_uri_template ("/demo/widget{/args}", agent handle_widget_demo (a_service, ?, ?))
|
||||
a_service.map_uri_template ("/demo/date/{arg}", agent handle_date_time_demo (a_service, ?, ?))
|
||||
a_service.map_uri_template ("/demo/format/{arg}", agent handle_format_demo (a_service, ?, ?))
|
||||
end
|
||||
|
||||
menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_execution: CMS_EXECUTION)
|
||||
local
|
||||
lnk: CMS_LOCAL_LINK
|
||||
-- opts: CMS_API_OPTIONS
|
||||
do
|
||||
create lnk.make ("Demo::widget", "/demo/widget/")
|
||||
a_menu_system.management_menu.extend (lnk)
|
||||
end
|
||||
|
||||
feature -- Hooks
|
||||
|
||||
links: HASH_TABLE [CMS_MODULE_LINK, STRING]
|
||||
-- Link indexed by path
|
||||
local
|
||||
lnk: CMS_MODULE_LINK
|
||||
do
|
||||
Result := Precursor
|
||||
create lnk.make ("Date/time demo")
|
||||
-- lnk.set_callback (agent process_date_time_demo, <<"arg">>)
|
||||
-- Result["/demo/date/{arg}"] := lnk
|
||||
end
|
||||
|
||||
handle_date_time_demo (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {ANY_CMS_EXECUTION}.make_with_text (req, res, cms, "<h1>Demo::date/time</h1>")).execute
|
||||
end
|
||||
|
||||
handle_format_demo (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {ANY_CMS_EXECUTION}.make_with_text (req, res, cms, "<h1>Demo::format</h1>")).execute
|
||||
end
|
||||
|
||||
handle_widget_demo (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {DEMO_WIDGET_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,97 +0,0 @@
|
||||
note
|
||||
description : "Objects that ..."
|
||||
author : "$Author$"
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
|
||||
class
|
||||
DEMO_WIDGET_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
local
|
||||
args: like arguments
|
||||
l_table: like new_table
|
||||
s: STRING
|
||||
do
|
||||
args := arguments
|
||||
if args.is_empty then
|
||||
set_title ("Widgets")
|
||||
set_main_content ("...")
|
||||
else
|
||||
|
||||
end
|
||||
l_table := new_table
|
||||
|
||||
create s.make_empty
|
||||
l_table.append_to_html (theme, s)
|
||||
set_main_content (s)
|
||||
end
|
||||
|
||||
new_table: WSF_WIDGET_AGENT_TABLE [READABLE_STRING_8]
|
||||
local
|
||||
l_table: WSF_WIDGET_AGENT_TABLE [READABLE_STRING_8]
|
||||
do
|
||||
create l_table.make
|
||||
l_table.add_css_style ("width: 85%%; border: solid 1px #999; padding: 2px;")
|
||||
|
||||
l_table.set_column_count (3)
|
||||
l_table.column (1).set_title ("First")
|
||||
l_table.column (2).set_title ("Second")
|
||||
l_table.column (3).set_title ("Third")
|
||||
|
||||
l_table.column (1).add_css_style ("width: 20%%")
|
||||
l_table.column (2).add_css_style ("width: 40px")
|
||||
l_table.column (3).add_css_style ("width: 40px")
|
||||
|
||||
l_table.set_data (<<"foo", "bar", "foobar">>)
|
||||
l_table.set_foot_data (<<"abc", "def">>)
|
||||
l_table.set_compute_item_function (agent (d: READABLE_STRING_8): WSF_WIDGET_TABLE_ROW
|
||||
local
|
||||
i: INTEGER
|
||||
w: WSF_WIDGET_TABLE_ITEM
|
||||
do
|
||||
create Result.make (d.count)
|
||||
if d.is_case_insensitive_equal ("bar") then
|
||||
Result.add_css_style ("background-color: #ccf;")
|
||||
end
|
||||
across
|
||||
d as c
|
||||
loop
|
||||
i := i + 1
|
||||
create w.make_with_text (c.item.out)
|
||||
if i = 1 then
|
||||
w.add_css_style ("background-color: #333; color: white; font-weight: bold;")
|
||||
elseif i > 3 then
|
||||
w.add_css_style ("color: red; border: solid 1px red; padding: 3px;")
|
||||
end
|
||||
Result.force (w)
|
||||
end
|
||||
end)
|
||||
|
||||
Result := l_table
|
||||
end
|
||||
|
||||
arguments: ARRAY [READABLE_STRING_32]
|
||||
-- Path parameters arguments related to {/vars}
|
||||
do
|
||||
if
|
||||
attached {WSF_TABLE} request.path_parameter ("args") as lst and then
|
||||
attached lst.as_array_of_string as arr
|
||||
then
|
||||
Result := arr
|
||||
else
|
||||
create Result.make_empty
|
||||
end
|
||||
|
||||
Result.rebase (1)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,33 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {SHUTDOWN_CMS_EXECUTION}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
SHUTDOWN_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
local
|
||||
b: STRING
|
||||
do
|
||||
create b.make_empty
|
||||
set_title ("Shutting down the service ...")
|
||||
if has_permission ("admin shutdown") then
|
||||
if attached {WGI_NINO_CONNECTOR} request.wgi_connector as nino then
|
||||
nino.server.shutdown_server
|
||||
end
|
||||
else
|
||||
b.append ("Access denied")
|
||||
end
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,69 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {SHUTDOWN_MODULE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
SHUTDOWN_MODULE
|
||||
|
||||
inherit
|
||||
CMS_MODULE
|
||||
redefine
|
||||
permissions
|
||||
end
|
||||
|
||||
CMS_HOOK_MENU_ALTER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
name := "shutdown"
|
||||
version := "1.0"
|
||||
description := "Shutdown the service if this is EWF Nino or FCGI"
|
||||
package := "server"
|
||||
end
|
||||
|
||||
feature {CMS_SERVICE} -- Registration
|
||||
|
||||
service: detachable CMS_SERVICE
|
||||
|
||||
register (a_service: CMS_SERVICE)
|
||||
do
|
||||
a_service.map_uri ("/admin/shutdown/", agent handle_shutdown)
|
||||
|
||||
a_service.add_menu_alter_hook (Current)
|
||||
service := a_service
|
||||
end
|
||||
|
||||
feature -- Hooks
|
||||
|
||||
permissions (a_service: CMS_SERVICE): LIST [CMS_PERMISSION]
|
||||
do
|
||||
Result := Precursor (a_service)
|
||||
Result.extend ("shutdown")
|
||||
end
|
||||
|
||||
menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_execution: CMS_EXECUTION)
|
||||
local
|
||||
lnk: CMS_LOCAL_LINK
|
||||
do
|
||||
create lnk.make ("Shutdown", "/admin/shutdown/")
|
||||
lnk.set_permission_arguments (<<"shutdown">>)
|
||||
a_menu_system.management_menu.extend (lnk)
|
||||
end
|
||||
|
||||
handle_shutdown (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
if attached service as l_service then
|
||||
(create {SHUTDOWN_CMS_EXECUTION}.make (req, res, l_service)).execute ;
|
||||
else
|
||||
res.set_status_code ({HTTP_STATUS_CODE}.expectation_failed)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,135 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
This class implements the Demo of WEB CMS service
|
||||
|
||||
]"
|
||||
|
||||
class
|
||||
WEB_CMS
|
||||
|
||||
inherit
|
||||
WSF_DEFAULT_SERVICE
|
||||
redefine
|
||||
initialize
|
||||
end
|
||||
|
||||
create
|
||||
make_and_launch
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
initialize
|
||||
local
|
||||
args: ARGUMENTS_32
|
||||
cfg: detachable READABLE_STRING_32
|
||||
i,n: INTEGER
|
||||
do
|
||||
--| Arguments
|
||||
create args
|
||||
from
|
||||
i := 1
|
||||
n := args.argument_count
|
||||
until
|
||||
i > n or cfg /= Void
|
||||
loop
|
||||
if attached args.argument (i) as s then
|
||||
if s.same_string_general ("--config") or s.same_string_general ("-c") then
|
||||
if i < n then
|
||||
cfg := args.argument (i + 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
i := i + 1
|
||||
end
|
||||
if cfg = Void then
|
||||
if file_exists ("cms.ini") then
|
||||
cfg := {STRING_32} "cms.ini"
|
||||
end
|
||||
end
|
||||
|
||||
--| EWF settings
|
||||
service_options := create {WSF_SERVICE_LAUNCHER_OPTIONS_FROM_INI}.make_from_file ("ewf.ini")
|
||||
Precursor
|
||||
|
||||
--| CMS initialization
|
||||
launch_cms (cms_setup (cfg))
|
||||
end
|
||||
|
||||
cms_setup (a_cfg_fn: detachable READABLE_STRING_GENERAL): CMS_CUSTOM_SETUP
|
||||
do
|
||||
if a_cfg_fn /= Void then
|
||||
create Result.make_from_file (a_cfg_fn)
|
||||
else
|
||||
create Result -- Default
|
||||
end
|
||||
setup_modules (Result)
|
||||
setup_storage (Result)
|
||||
end
|
||||
|
||||
launch_cms (a_setup: CMS_SETUP)
|
||||
local
|
||||
cms: CMS_SERVICE
|
||||
do
|
||||
create cms.make (a_setup)
|
||||
on_launched (cms)
|
||||
cms_service := cms
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
cms_service: CMS_SERVICE
|
||||
|
||||
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
cms_service.execute (req, res)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
setup_modules (a_setup: CMS_SETUP)
|
||||
local
|
||||
m: CMS_MODULE
|
||||
do
|
||||
create {DEMO_MODULE} m.make
|
||||
m.enable
|
||||
a_setup.add_module (m)
|
||||
|
||||
create {SHUTDOWN_MODULE} m.make
|
||||
m.enable
|
||||
a_setup.add_module (m)
|
||||
|
||||
create {DEBUG_MODULE} m.make
|
||||
m.enable
|
||||
a_setup.add_module (m)
|
||||
|
||||
create {OPENID_MODULE} m.make
|
||||
m.enable
|
||||
a_setup.add_module (m)
|
||||
end
|
||||
|
||||
setup_storage (a_setup: CMS_SETUP)
|
||||
do
|
||||
|
||||
end
|
||||
|
||||
feature -- Event
|
||||
|
||||
on_launched (cms: CMS_SERVICE)
|
||||
local
|
||||
e: CMS_EMAIL
|
||||
do
|
||||
create e.make (cms.site_email, cms.site_email, "[" + cms.site_name + "] launched...", "The site [" + cms.site_name + "] was launched at " + (create {DATE_TIME}.make_now_utc).out + " UTC.")
|
||||
cms.mailer.safe_process_email (e)
|
||||
end
|
||||
|
||||
feature -- Helper
|
||||
|
||||
file_exists (fn: READABLE_STRING_GENERAL): BOOLEAN
|
||||
local
|
||||
f: RAW_FILE
|
||||
do
|
||||
create f.make_with_name (fn)
|
||||
Result := f.exists and then f.is_readable
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,311 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_CONFIGURATION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_CONFIGURATION
|
||||
|
||||
inherit
|
||||
ANY
|
||||
|
||||
SHARED_EXECUTION_ENVIRONMENT
|
||||
export
|
||||
{NONE} all
|
||||
end
|
||||
|
||||
create
|
||||
make,
|
||||
make_from_file
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
create options.make_equal (10)
|
||||
analyze
|
||||
end
|
||||
|
||||
make_from_file (a_filename: READABLE_STRING_GENERAL)
|
||||
-- Initialize `Current'.
|
||||
local
|
||||
p: PATH
|
||||
do
|
||||
make
|
||||
create p.make_from_string (a_filename)
|
||||
configuration_location := p
|
||||
import_from_path (p)
|
||||
analyze
|
||||
end
|
||||
|
||||
analyze
|
||||
do
|
||||
get_root_location
|
||||
get_var_location
|
||||
get_themes_location
|
||||
get_files_location
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
configuration_location: detachable PATH
|
||||
|
||||
option (a_name: READABLE_STRING_GENERAL): detachable ANY
|
||||
do
|
||||
Result := options.item (a_name)
|
||||
end
|
||||
|
||||
options: STRING_TABLE [STRING_32]
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
append_to_string (s: STRING)
|
||||
local
|
||||
utf: UTF_CONVERTER
|
||||
do
|
||||
s.append ("Options:%N")
|
||||
across
|
||||
options as c
|
||||
loop
|
||||
s.append (c.key.to_string_8)
|
||||
s.append_character ('=')
|
||||
utf.string_32_into_utf_8_string_8 (c.item, s)
|
||||
s.append_character ('%N')
|
||||
end
|
||||
|
||||
s.append ("Specific:%N")
|
||||
s.append ("root_location=" + root_location.utf_8_name + "%N")
|
||||
s.append ("var_location=" + var_location.utf_8_name + "%N")
|
||||
s.append ("files_location=" + files_location.utf_8_name + "%N")
|
||||
s.append ("themes_location=" + themes_location.utf_8_name + "%N")
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_option (a_name: READABLE_STRING_GENERAL; a_value: STRING_32)
|
||||
do
|
||||
options.force (a_value, a_name.as_string_8)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
var_location: PATH
|
||||
|
||||
root_location: PATH
|
||||
|
||||
files_location: PATH
|
||||
|
||||
themes_location: PATH
|
||||
|
||||
theme_name (dft: detachable like theme_name): READABLE_STRING_8
|
||||
do
|
||||
if attached options.item ("theme") as s then
|
||||
Result := s
|
||||
elseif dft /= Void then
|
||||
Result := dft
|
||||
else
|
||||
Result := "default"
|
||||
end
|
||||
end
|
||||
|
||||
site_id: READABLE_STRING_8
|
||||
do
|
||||
if attached options.item ("site.id") as s then
|
||||
Result := s
|
||||
else
|
||||
Result := "_EWF_CMS_NO_ID_"
|
||||
end
|
||||
end
|
||||
|
||||
site_name (dft: like site_name): READABLE_STRING_8
|
||||
do
|
||||
if attached options.item ("site.name") as s then
|
||||
Result := s
|
||||
else
|
||||
Result := dft
|
||||
end
|
||||
end
|
||||
|
||||
site_url (dft: like site_url): READABLE_STRING_8
|
||||
do
|
||||
if attached options.item ("site.url") as s then
|
||||
Result := s
|
||||
else
|
||||
Result := dft
|
||||
end
|
||||
if Result /= Void then
|
||||
if Result.is_empty then
|
||||
-- ok
|
||||
elseif not Result.ends_with ("/") then
|
||||
Result := Result + "/"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
site_script_url (dft: like site_script_url): detachable READABLE_STRING_8
|
||||
do
|
||||
if attached options.item ("site.script_url") as s then
|
||||
Result := s
|
||||
else
|
||||
Result := dft
|
||||
end
|
||||
if Result /= Void then
|
||||
if Result.is_empty then
|
||||
elseif not Result.ends_with ("/") then
|
||||
Result := Result + "/"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
site_email (dft: like site_email): READABLE_STRING_8
|
||||
do
|
||||
if attached options.item ("site.email") as s then
|
||||
Result := s
|
||||
else
|
||||
Result := dft
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Change
|
||||
|
||||
get_var_location
|
||||
local
|
||||
utf: UTF_CONVERTER
|
||||
do
|
||||
if attached options.item ("var-dir") as s then
|
||||
create var_location.make_from_string (utf.utf_8_string_8_to_escaped_string_32 (s))
|
||||
else
|
||||
var_location := execution_environment.current_working_path
|
||||
end
|
||||
end
|
||||
|
||||
get_root_location
|
||||
local
|
||||
utf: UTF_CONVERTER
|
||||
do
|
||||
if attached options.item ("root-dir") as s then
|
||||
create root_location.make_from_string (utf.utf_8_string_8_to_escaped_string_32 (s))
|
||||
else
|
||||
root_location := execution_environment.current_working_path
|
||||
end
|
||||
end
|
||||
|
||||
get_files_location
|
||||
local
|
||||
utf: UTF_CONVERTER
|
||||
do
|
||||
if attached options.item ("files-dir") as s then
|
||||
create files_location.make_from_string (utf.utf_8_string_8_to_escaped_string_32 (s))
|
||||
else
|
||||
create files_location.make_from_string ("files")
|
||||
end
|
||||
end
|
||||
|
||||
get_themes_location
|
||||
local
|
||||
utf: UTF_CONVERTER
|
||||
do
|
||||
if attached options.item ("themes-dir") as s then
|
||||
create themes_location.make_from_string (utf.utf_8_string_8_to_escaped_string_32 (s))
|
||||
else
|
||||
themes_location := root_location.extended ("themes")
|
||||
end
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
import_from_file (fn: READABLE_STRING_GENERAL)
|
||||
do
|
||||
import_from_path (create {PATH}.make_from_string (fn))
|
||||
end
|
||||
|
||||
import_from_path (a_filename: PATH)
|
||||
-- Import ini file content
|
||||
local
|
||||
f: PLAIN_TEXT_FILE
|
||||
l,v: STRING_8
|
||||
p: INTEGER
|
||||
do
|
||||
create f.make_with_path (a_filename)
|
||||
if f.exists and f.is_readable then
|
||||
f.open_read
|
||||
from
|
||||
f.read_line
|
||||
until
|
||||
f.exhausted
|
||||
loop
|
||||
l := f.last_string
|
||||
l.left_adjust
|
||||
if not l.is_empty then
|
||||
if l[1] = '#' then
|
||||
-- commented line
|
||||
else
|
||||
p := l.index_of ('=', 1)
|
||||
if p > 1 then
|
||||
v := l.substring (p + 1, l.count)
|
||||
l.keep_head (p - 1)
|
||||
v.left_adjust
|
||||
v.right_adjust
|
||||
l.right_adjust
|
||||
|
||||
if l.is_case_insensitive_equal ("@include") then
|
||||
import_from_file (resolved_string (v))
|
||||
else
|
||||
set_option (l.as_lower, resolved_string (v))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
f.read_line
|
||||
end
|
||||
f.close
|
||||
end
|
||||
end
|
||||
|
||||
feature {NONE} -- Environment
|
||||
|
||||
resolved_string (s: READABLE_STRING_8): STRING_32
|
||||
-- Resolved `s' using `options' or else environment variables.
|
||||
local
|
||||
i,n,b,e: INTEGER
|
||||
k: detachable READABLE_STRING_8
|
||||
do
|
||||
from
|
||||
i := 1
|
||||
n := s.count
|
||||
create Result.make (s.count)
|
||||
until
|
||||
i > n
|
||||
loop
|
||||
if i + 1 < n and then s[i] = '$' and then s[i+1] = '{' then
|
||||
b := i + 2
|
||||
e := s.index_of ('}', b) - 1
|
||||
if e > 0 then
|
||||
k := s.substring (b, e)
|
||||
if attached option (k) as v then
|
||||
if attached {READABLE_STRING_32} v as s32 then
|
||||
Result.append (s32)
|
||||
else
|
||||
Result.append (v.out)
|
||||
end
|
||||
i := e + 1
|
||||
elseif attached execution_environment.item (k) as v then
|
||||
Result.append (v)
|
||||
i := e + 1
|
||||
else
|
||||
Result.extend (s[i])
|
||||
end
|
||||
else
|
||||
Result.extend (s[i])
|
||||
end
|
||||
else
|
||||
Result.extend (s[i])
|
||||
end
|
||||
i := i + 1
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
end
|
||||
@@ -1,18 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_CUSTOM_SETUP}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_CUSTOM_SETUP
|
||||
|
||||
inherit
|
||||
CMS_DEFAULT_SETUP
|
||||
|
||||
create
|
||||
default_create,
|
||||
make,
|
||||
make_from_file
|
||||
|
||||
end
|
||||
@@ -1,132 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_DEFAULT_SETUP}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_DEFAULT_SETUP
|
||||
|
||||
inherit
|
||||
CMS_SETUP
|
||||
redefine
|
||||
default_create
|
||||
end
|
||||
|
||||
create
|
||||
default_create,
|
||||
make,
|
||||
make_from_file
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_cfg: CMS_CONFIGURATION)
|
||||
do
|
||||
configuration := a_cfg
|
||||
default_create
|
||||
end
|
||||
|
||||
make_from_file (fn: READABLE_STRING_GENERAL)
|
||||
local
|
||||
cfg: CMS_CONFIGURATION
|
||||
do
|
||||
create cfg.make_from_file (fn)
|
||||
make (cfg)
|
||||
end
|
||||
|
||||
default_create
|
||||
do
|
||||
Precursor
|
||||
build_modules
|
||||
build_storage
|
||||
build_session_manager
|
||||
build_auth_engine
|
||||
build_mailer
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
modules: ARRAYED_LIST [CMS_MODULE]
|
||||
|
||||
storage: CMS_STORAGE
|
||||
-- CMS persistent layer
|
||||
|
||||
session_manager: WSF_SESSION_MANAGER
|
||||
-- CMS Session manager
|
||||
|
||||
auth_engine: CMS_AUTH_ENGINE
|
||||
-- CMS Authentication engine
|
||||
|
||||
mailer: NOTIFICATION_MAILER
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
build_modules
|
||||
local
|
||||
m: CMS_MODULE
|
||||
do
|
||||
create modules.make (3)
|
||||
|
||||
-- Core
|
||||
create {USER_MODULE} m.make
|
||||
m.enable
|
||||
modules.extend (m)
|
||||
|
||||
create {ADMIN_MODULE} m.make
|
||||
m.enable
|
||||
modules.extend (m)
|
||||
|
||||
create {NODE_MODULE} m.make
|
||||
m.enable
|
||||
modules.extend (m)
|
||||
end
|
||||
|
||||
build_storage
|
||||
local
|
||||
dn: PATH
|
||||
do
|
||||
if attached configuration as cfg and then attached cfg.var_location as l_site_var_dir then
|
||||
dn := l_site_var_dir
|
||||
else
|
||||
create dn.make_current
|
||||
end
|
||||
create {CMS_SED_STORAGE} storage.make (dn.extended ("_storage_").name)
|
||||
end
|
||||
|
||||
build_session_manager
|
||||
local
|
||||
dn: PATH
|
||||
do
|
||||
if attached configuration as cfg and then attached cfg.var_location as l_site_var_dir then
|
||||
dn := l_site_var_dir
|
||||
else
|
||||
create dn.make_empty
|
||||
end
|
||||
dn := dn.extended ("_storage_").extended ("_sessions_")
|
||||
create {WSF_FS_SESSION_MANAGER} session_manager.make_with_folder (dn.name)
|
||||
end
|
||||
|
||||
build_auth_engine
|
||||
do
|
||||
create {CMS_STORAGE_AUTH_ENGINE} auth_engine.make (storage)
|
||||
end
|
||||
|
||||
build_mailer
|
||||
local
|
||||
ch_mailer: NOTIFICATION_CHAIN_MAILER
|
||||
st_mailer: CMS_STORAGE_MAILER
|
||||
do
|
||||
create st_mailer.make (storage)
|
||||
create ch_mailer.make (st_mailer)
|
||||
ch_mailer.set_next (create {NOTIFICATION_SENDMAIL_MAILER})
|
||||
mailer := ch_mailer
|
||||
end
|
||||
|
||||
feature -- Change
|
||||
|
||||
add_module (m: CMS_MODULE)
|
||||
do
|
||||
modules.force (m)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,715 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
This is the execution of the cms handler request
|
||||
It builds the content to get process to render the output
|
||||
]"
|
||||
|
||||
deferred class
|
||||
CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_COMMON_API
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (req: WSF_REQUEST; res: WSF_RESPONSE; a_service: like service)
|
||||
do
|
||||
status_code := {HTTP_STATUS_CODE}.ok
|
||||
service := a_service
|
||||
request := req
|
||||
response := res
|
||||
create header.make
|
||||
initialize
|
||||
end
|
||||
|
||||
initialize
|
||||
do
|
||||
is_front := service.is_front_page (request)
|
||||
has_js := True -- by default it is true, check cookie to see if this is not supported.
|
||||
if attached request.cookie ("has_js") as c_has_js then
|
||||
has_js := c_has_js.same_string ("0")
|
||||
end
|
||||
get_theme
|
||||
controller := service.session_controller (request)
|
||||
create menu_system.make
|
||||
create blocks.make (3)
|
||||
|
||||
if attached {like message} session_item (pending_messages_session_item_name) as m then
|
||||
message := m
|
||||
end
|
||||
remove_session_item (pending_messages_session_item_name)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
service: CMS_SERVICE
|
||||
request: WSF_REQUEST
|
||||
|
||||
feature {CMS_SESSION_CONTROLER} -- Access: restricted
|
||||
|
||||
response: WSF_RESPONSE
|
||||
|
||||
controller: CMS_SESSION_CONTROLER
|
||||
|
||||
pending_messages_session_item_name: STRING = "cms.pending_messages"
|
||||
-- Session item name to get the pending messages.
|
||||
|
||||
feature -- Access: CMS
|
||||
|
||||
site_name: STRING_32
|
||||
do
|
||||
Result := service.site_name
|
||||
end
|
||||
|
||||
front_page_url: READABLE_STRING_8
|
||||
do
|
||||
Result := url ("/", Void)
|
||||
end
|
||||
|
||||
feature -- Permission
|
||||
|
||||
frozen has_permissions (lst: detachable ITERABLE [READABLE_STRING_8]): BOOLEAN
|
||||
do
|
||||
if lst = Void then
|
||||
Result := True
|
||||
else
|
||||
Result := across lst as c all has_permission (c.item) end
|
||||
end
|
||||
end
|
||||
|
||||
frozen has_permission (s: detachable READABLE_STRING_8): BOOLEAN
|
||||
-- Anonymous or Current `user' has permission for `s'
|
||||
--| `s' could be "create page",
|
||||
local
|
||||
u: detachable CMS_USER
|
||||
do
|
||||
if s = Void then
|
||||
Result := True
|
||||
else
|
||||
if s.same_string ("authenticated") then
|
||||
Result := authenticated
|
||||
else
|
||||
u := user
|
||||
if u /= Void and then u.is_admin then
|
||||
Result := True
|
||||
else
|
||||
Result := service.user_has_permission (u, s)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Status
|
||||
|
||||
is_front: BOOLEAN
|
||||
|
||||
has_js: BOOLEAN
|
||||
-- Client has javascript enabled?
|
||||
-- FIXME: not yet implemented
|
||||
|
||||
is_mobile: BOOLEAN
|
||||
-- Is Client on mobile device?
|
||||
-- FIXME: not yet implemented
|
||||
|
||||
feature -- Theme
|
||||
|
||||
theme: CMS_THEME
|
||||
|
||||
get_theme
|
||||
do
|
||||
create {DEFAULT_CMS_THEME} theme.make (service)
|
||||
end
|
||||
|
||||
feature -- Access: User
|
||||
|
||||
authenticated: BOOLEAN
|
||||
do
|
||||
Result := user /= Void
|
||||
end
|
||||
|
||||
user: detachable CMS_USER
|
||||
do
|
||||
if attached {CMS_USER} session_item ("user") as u then
|
||||
Result := u
|
||||
end
|
||||
end
|
||||
|
||||
last_user_access_date: detachable DATE_TIME
|
||||
do
|
||||
if attached {DATE_TIME} session_item ("last_access") as dt then
|
||||
Result := dt
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Element change: user
|
||||
|
||||
login (u: attached like user; req: WSF_REQUEST)
|
||||
do
|
||||
controller.start_session (req)
|
||||
u.set_last_login_date_now
|
||||
storage.save_user (u)
|
||||
set_user (u)
|
||||
init_last_user_access_date
|
||||
log ("user", "user %"" + u.name + "%" signed in.", 0, user_local_link (u))
|
||||
end
|
||||
|
||||
logout (req: WSF_REQUEST)
|
||||
require
|
||||
authenticated
|
||||
do
|
||||
if attached user as u then
|
||||
log ("user", "user %"" + u.name + "%" signed out.", 0, user_local_link (u))
|
||||
end
|
||||
set_user (Void)
|
||||
controller.start_session (req)
|
||||
end
|
||||
|
||||
feature -- Logging
|
||||
|
||||
log (a_category: READABLE_STRING_8; a_message: READABLE_STRING_8; a_level: INTEGER; a_link: detachable CMS_LINK)
|
||||
local
|
||||
l_log: CMS_LOG
|
||||
do
|
||||
create l_log.make (a_category, a_message, a_level, Void)
|
||||
if a_link /= Void then
|
||||
l_log.set_link (a_link)
|
||||
end
|
||||
l_log.set_info (request.http_user_agent)
|
||||
service.storage.save_log (l_log)
|
||||
end
|
||||
|
||||
feature -- Menu
|
||||
|
||||
menu_system: CMS_MENU_SYSTEM
|
||||
|
||||
main_menu: CMS_MENU
|
||||
do
|
||||
Result := menu_system.main_menu
|
||||
end
|
||||
|
||||
management_menu: CMS_MENU
|
||||
do
|
||||
Result := menu_system.management_menu
|
||||
end
|
||||
|
||||
navigation_menu: CMS_MENU
|
||||
do
|
||||
Result := menu_system.navigation_menu
|
||||
end
|
||||
|
||||
user_menu: CMS_MENU
|
||||
do
|
||||
Result := menu_system.user_menu
|
||||
end
|
||||
|
||||
primary_tabs: CMS_MENU
|
||||
do
|
||||
Result := menu_system.primary_tabs
|
||||
end
|
||||
|
||||
feature -- Menu: change
|
||||
|
||||
add_to_main_menu (lnk: CMS_LINK)
|
||||
do
|
||||
if attached {CMS_LOCAL_LINK} lnk as l_local then
|
||||
l_local.get_is_active (request)
|
||||
end
|
||||
main_menu.extend (lnk)
|
||||
end
|
||||
|
||||
add_to_menu (lnk: CMS_LINK; m: CMS_MENU)
|
||||
do
|
||||
if attached {CMS_LOCAL_LINK} lnk as l_local then
|
||||
l_local.get_is_active (request)
|
||||
end
|
||||
m.extend (lnk)
|
||||
end
|
||||
|
||||
feature -- Message
|
||||
|
||||
add_message (a_msg: READABLE_STRING_8; a_category: detachable READABLE_STRING_8)
|
||||
local
|
||||
m: like message
|
||||
do
|
||||
m := message
|
||||
if m = Void then
|
||||
create m.make (a_msg.count + 9)
|
||||
message := m
|
||||
end
|
||||
if a_category /= Void then
|
||||
m.append ("<li class=%""+ a_category +"%">")
|
||||
else
|
||||
m.append ("<li>")
|
||||
end
|
||||
m.append (a_msg + "</li>")
|
||||
end
|
||||
|
||||
add_notice_message (a_msg: READABLE_STRING_8)
|
||||
do
|
||||
add_message (a_msg, "notice")
|
||||
end
|
||||
|
||||
add_warning_message (a_msg: READABLE_STRING_8)
|
||||
do
|
||||
add_message (a_msg, "warning")
|
||||
end
|
||||
|
||||
add_error_message (a_msg: READABLE_STRING_8)
|
||||
do
|
||||
add_message (a_msg, "error")
|
||||
end
|
||||
|
||||
add_success_message (a_msg: READABLE_STRING_8)
|
||||
do
|
||||
add_message (a_msg, "success")
|
||||
end
|
||||
|
||||
report_form_errors (fd: WSF_FORM_DATA)
|
||||
require
|
||||
has_error: not fd.is_valid
|
||||
do
|
||||
if attached fd.errors as errs then
|
||||
across
|
||||
errs as err
|
||||
loop
|
||||
if attached err.item as e then
|
||||
if attached e.field as l_field then
|
||||
if attached e.message as e_msg then
|
||||
add_error_message (e_msg) --"Field [" + l_field.name + "] is invalid. " + e_msg)
|
||||
else
|
||||
add_error_message ("Field [" + l_field.name + "] is invalid.")
|
||||
end
|
||||
elseif attached e.message as e_msg then
|
||||
add_error_message (e_msg)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
message: detachable STRING_8
|
||||
|
||||
feature -- Blocks
|
||||
|
||||
formats: CMS_FORMATS
|
||||
once
|
||||
create Result
|
||||
end
|
||||
|
||||
blocks: ARRAYED_LIST [TUPLE [block: CMS_BLOCK; name: READABLE_STRING_8; region: READABLE_STRING_8]]
|
||||
|
||||
add_block (b: CMS_BLOCK; a_region: detachable READABLE_STRING_8)
|
||||
do
|
||||
if a_region /= Void then
|
||||
blocks.extend ([b, b.name, a_region])
|
||||
elseif attached block_region (b) as l_region then
|
||||
blocks.extend ([b, b.name, l_region])
|
||||
end
|
||||
end
|
||||
|
||||
block_region (b: CMS_BLOCK): detachable READABLE_STRING_8
|
||||
local
|
||||
l_name: READABLE_STRING_8
|
||||
do
|
||||
l_name := b.name
|
||||
if l_name.starts_with ("footer") then
|
||||
Result := "footer"
|
||||
elseif l_name.starts_with ("management") then
|
||||
Result := "first_sidebar"
|
||||
elseif l_name.starts_with ("navigation") then
|
||||
Result := "first_sidebar"
|
||||
elseif l_name.starts_with ("user") then
|
||||
Result := "first_sidebar"
|
||||
else
|
||||
Result := "first_sidebar"
|
||||
end
|
||||
-- FIXME: let the user choose ...
|
||||
end
|
||||
|
||||
get_blocks
|
||||
local
|
||||
b: CMS_CONTENT_BLOCK
|
||||
s: STRING_8
|
||||
m: CMS_MENU
|
||||
do
|
||||
m := management_menu
|
||||
if not m.is_empty then
|
||||
add_block (create {CMS_MENU_BLOCK}.make (m), Void)
|
||||
end
|
||||
|
||||
m := navigation_menu
|
||||
if not m.is_empty then
|
||||
add_block (create {CMS_MENU_BLOCK}.make (m), Void)
|
||||
end
|
||||
|
||||
m := user_menu
|
||||
if not m.is_empty then
|
||||
add_block (create {CMS_MENU_BLOCK}.make (m), Void)
|
||||
end
|
||||
|
||||
-- create s.make_empty
|
||||
-- s.append ("This site demonstrates a first implementation of CMS using EWF.%N")
|
||||
-- create b.make ("about", "About", s, formats.plain_text)
|
||||
-- add_block (b, "second_sidebar")
|
||||
|
||||
create s.make_empty
|
||||
s.append ("Made with <a href=%"http://www.eiffel.com/%">EWF</a>")
|
||||
create b.make ("made_with", Void, s, formats.full_html)
|
||||
add_block (b, "footer")
|
||||
|
||||
service.hook_block_view (Current)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
status_code: INTEGER
|
||||
|
||||
header: WSF_HEADER
|
||||
|
||||
title: detachable READABLE_STRING_32
|
||||
-- HTML>head>title value
|
||||
|
||||
page_title: detachable READABLE_STRING_32
|
||||
-- Page title
|
||||
|
||||
additional_page_head_lines: detachable LIST [READABLE_STRING_8]
|
||||
-- HTML>head>...extra lines
|
||||
|
||||
main_content: detachable STRING_8
|
||||
|
||||
redirection: detachable READABLE_STRING_8
|
||||
|
||||
feature -- Generation
|
||||
|
||||
prepare_menu_system (a_menu_system: CMS_MENU_SYSTEM)
|
||||
do
|
||||
across
|
||||
a_menu_system as c
|
||||
loop
|
||||
prepare_links (c.item)
|
||||
end
|
||||
end
|
||||
|
||||
prepare_links (a_menu: CMS_LINK_COMPOSITE)
|
||||
local
|
||||
to_remove: ARRAYED_LIST [CMS_LINK]
|
||||
do
|
||||
create to_remove.make (0)
|
||||
across
|
||||
a_menu as c
|
||||
loop
|
||||
if attached {CMS_LOCAL_LINK} c.item as lm then
|
||||
if attached lm.permission_arguments as perms and then not has_permissions (perms) then
|
||||
to_remove.force (lm)
|
||||
else
|
||||
-- if lm.permission_arguments is Void , this is permitted
|
||||
lm.get_is_active (request)
|
||||
if attached {CMS_LINK_COMPOSITE} lm as comp then
|
||||
prepare_links (comp)
|
||||
end
|
||||
end
|
||||
elseif attached {CMS_LINK_COMPOSITE} c.item as comp then
|
||||
prepare_links (comp)
|
||||
end
|
||||
end
|
||||
across
|
||||
to_remove as c
|
||||
loop
|
||||
a_menu.remove (c.item)
|
||||
end
|
||||
end
|
||||
|
||||
prepare (page: CMS_HTML_PAGE)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
if attached additional_page_head_lines as l_head_lines then
|
||||
across
|
||||
l_head_lines as hl
|
||||
loop
|
||||
page.head_lines.force (hl.item)
|
||||
end
|
||||
end
|
||||
|
||||
add_to_main_menu (create {CMS_LOCAL_LINK}.make ("Home", "/"))
|
||||
|
||||
service.call_menu_alter_hooks (menu_system, Current)
|
||||
prepare_menu_system (menu_system)
|
||||
|
||||
get_blocks
|
||||
|
||||
if attached title as l_title then
|
||||
page.set_title (l_title)
|
||||
else
|
||||
page.set_title ("CMS::" + request.path_info)
|
||||
end
|
||||
|
||||
page.add_to_header_region (top_header_region)
|
||||
page.add_to_header_region (header_region)
|
||||
if attached message as m and then not m.is_empty then
|
||||
page.add_to_content_region ("<div id=%"message%">" + m + "</div>")
|
||||
end
|
||||
page.add_to_content_region ("<a id=%"main-content%"></a>%N")
|
||||
if attached page_title as l_page_title then
|
||||
page.add_to_content_region ("<h1 id=%"page-title%" class=%"title%">"+ l_page_title +"</h1>%N")
|
||||
end
|
||||
if attached primary_tabs as tabs_menu and then not tabs_menu.is_empty then
|
||||
page.add_to_content_region (theme.menu_html (tabs_menu, True))
|
||||
end
|
||||
page.add_to_content_region (content_region)
|
||||
|
||||
-- blocks
|
||||
across
|
||||
blocks as c
|
||||
loop
|
||||
if attached c.item as b_info then
|
||||
create s.make_from_string ("<div class=%"block%" id=%"" + b_info.name + "%">")
|
||||
if attached b_info.block.title as l_title then
|
||||
s.append ("<div class=%"title%">" + html_encoded (l_title) + "</div>")
|
||||
end
|
||||
s.append ("<div class=%"inside%">")
|
||||
s.append (b_info.block.to_html (theme))
|
||||
s.append ("</div>")
|
||||
s.append ("</div>")
|
||||
page.add_to_region (s, b_info.region)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
logo_location: STRING
|
||||
do
|
||||
Result := url ("/theme/logo.png", Void)
|
||||
end
|
||||
|
||||
top_header_region: STRING_8
|
||||
do
|
||||
Result := "<a href=%""+ url ("/", Void) +"%"><img id=%"logo%" src=%"" + logo_location + "%"/></a><div id=%"title%">" + html_encoded (site_name) + "</div>"
|
||||
Result.append ("<div id=%"menu-bar%">")
|
||||
Result.append (theme.menu_html (main_menu, True))
|
||||
Result.append ("</div>")
|
||||
end
|
||||
|
||||
header_region: STRING_8
|
||||
do
|
||||
Result := ""
|
||||
end
|
||||
|
||||
content_region: STRING_8
|
||||
do
|
||||
if attached main_content as l_content then
|
||||
Result := l_content
|
||||
else
|
||||
Result := ""
|
||||
debug
|
||||
Result := "No Content"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Head customization
|
||||
|
||||
add_additional_head_line (s: READABLE_STRING_8; a_allow_duplication: BOOLEAN)
|
||||
local
|
||||
lst: like additional_page_head_lines
|
||||
do
|
||||
lst := additional_page_head_lines
|
||||
if lst = Void then
|
||||
create {ARRAYED_LIST [like additional_page_head_lines.item]} lst.make (1)
|
||||
additional_page_head_lines := lst
|
||||
end
|
||||
if a_allow_duplication or else across lst as c all not c.item.same_string (s) end then
|
||||
lst.extend (s)
|
||||
end
|
||||
end
|
||||
|
||||
add_style (a_href: STRING; a_media: detachable STRING)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
s := "<link rel=%"stylesheet%" href=%""+ a_href + "%" type=%"text/css%""
|
||||
if a_media /= Void then
|
||||
s.append (" media=%""+ a_media + "%"")
|
||||
end
|
||||
s.append ("/>")
|
||||
add_additional_head_line (s, False)
|
||||
end
|
||||
|
||||
add_javascript_url (a_src: STRING)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
s := "<script type=%"text/javascript%" src=%"" + a_src + "%"></script>"
|
||||
add_additional_head_line (s, False)
|
||||
end
|
||||
|
||||
add_javascript_content (a_script: STRING)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
s := "<script type=%"text/javascript%">%N" + a_script + "%N</script>"
|
||||
add_additional_head_line (s, True)
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_title (t: like title)
|
||||
do
|
||||
title := t
|
||||
set_page_title (t)
|
||||
end
|
||||
|
||||
set_page_title (t: like page_title)
|
||||
do
|
||||
page_title := t
|
||||
end
|
||||
|
||||
set_main_content (s: like main_content)
|
||||
do
|
||||
main_content := s
|
||||
end
|
||||
|
||||
set_redirection (a_url: like redirection)
|
||||
do
|
||||
if a_url /= Void and then a_url.same_string (request.path_info) and request.is_get_request_method then
|
||||
redirection := Void
|
||||
else
|
||||
redirection := a_url
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute
|
||||
do
|
||||
begin
|
||||
process
|
||||
terminate
|
||||
end
|
||||
|
||||
feature {NONE} -- Execution
|
||||
|
||||
begin
|
||||
do
|
||||
end
|
||||
|
||||
process
|
||||
deferred
|
||||
end
|
||||
|
||||
frozen terminate
|
||||
local
|
||||
cms_page: CMS_HTML_PAGE
|
||||
page: CMS_HTML_PAGE_RESPONSE
|
||||
do
|
||||
create cms_page.make
|
||||
prepare (cms_page)
|
||||
|
||||
create page.make (theme.page_html (cms_page))
|
||||
if attached redirection as l_redirection then
|
||||
if attached message as m then
|
||||
set_session_item ("cms.pending_messages", m)
|
||||
end
|
||||
page.set_status_code ({HTTP_STATUS_CODE}.found)
|
||||
page.header.put_location (l_redirection)
|
||||
else
|
||||
page.set_status_code (status_code)
|
||||
end
|
||||
|
||||
controller.session_commit (page, Current)
|
||||
response.send (page)
|
||||
on_terminated
|
||||
end
|
||||
|
||||
on_terminated
|
||||
do
|
||||
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
set_user (u: like user)
|
||||
do
|
||||
set_session_item ("user", u)
|
||||
end
|
||||
|
||||
init_last_user_access_date
|
||||
do
|
||||
set_session_item ("last_access", (create {DATE_TIME}.make_now_utc))
|
||||
end
|
||||
|
||||
feature -- Access: Session
|
||||
|
||||
session_item (k: READABLE_STRING_GENERAL): detachable ANY
|
||||
do
|
||||
Result := controller.session.item (k)
|
||||
end
|
||||
|
||||
set_session_item (k: READABLE_STRING_GENERAL; v: detachable ANY)
|
||||
do
|
||||
controller.session.remember (v, k)
|
||||
end
|
||||
|
||||
remove_session_item (k: READABLE_STRING_GENERAL)
|
||||
do
|
||||
controller.session.forget (k)
|
||||
end
|
||||
|
||||
feature -- Storage
|
||||
|
||||
storage: CMS_STORAGE
|
||||
do
|
||||
Result := service.storage
|
||||
end
|
||||
|
||||
feature -- Helper: output
|
||||
|
||||
user_local_link (u: CMS_USER): CMS_LINK
|
||||
do
|
||||
create {CMS_LOCAL_LINK} Result.make (u.name, user_url (u))
|
||||
end
|
||||
|
||||
node_local_link (n: CMS_NODE): CMS_LINK
|
||||
do
|
||||
create {CMS_LOCAL_LINK} Result.make (n.title, node_url (n))
|
||||
end
|
||||
|
||||
truncated_string (s: READABLE_STRING_8; nb: INTEGER; a_ellipsis: detachable READABLE_STRING_8): STRING_8
|
||||
-- Truncated string `s' to `nb' character
|
||||
require
|
||||
a_ellipsis /= Void implies a_ellipsis.count < nb
|
||||
local
|
||||
f: CMS_NO_HTML_FILTER
|
||||
do
|
||||
if s.count <= nb then
|
||||
Result := s.string
|
||||
else
|
||||
create f
|
||||
create Result.make_from_string (s)
|
||||
f.filter (Result)
|
||||
if Result.count > nb then
|
||||
if a_ellipsis /= Void and then not a_ellipsis.is_empty then
|
||||
Result.keep_head (nb - a_ellipsis.count)
|
||||
Result.append (a_ellipsis)
|
||||
else
|
||||
Result.keep_head (nb - 3)
|
||||
Result.append ("...")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Helper: request
|
||||
|
||||
non_empty_string_path_parameter (a_name: READABLE_STRING_GENERAL): detachable STRING
|
||||
do
|
||||
if
|
||||
attached {WSF_STRING} request.path_parameter (a_name) as p and then
|
||||
not p.is_empty
|
||||
then
|
||||
Result := p.value
|
||||
end
|
||||
end
|
||||
|
||||
invariant
|
||||
|
||||
end
|
||||
@@ -1,77 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HTML_PAGE_RESPONSE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_HTML_PAGE_RESPONSE
|
||||
|
||||
inherit
|
||||
WSF_RESPONSE_MESSAGE
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_html: like html)
|
||||
do
|
||||
html := a_html
|
||||
status_code := {HTTP_STATUS_CODE}.ok
|
||||
create header.make
|
||||
header.put_content_type_text_html
|
||||
end
|
||||
|
||||
feature -- Status
|
||||
|
||||
status_code: INTEGER
|
||||
|
||||
feature -- Header
|
||||
|
||||
header: HTTP_HEADER
|
||||
|
||||
feature -- Html access
|
||||
|
||||
html: STRING
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_status_code (c: like status_code)
|
||||
do
|
||||
status_code := c
|
||||
end
|
||||
|
||||
feature {WSF_RESPONSE} -- Output
|
||||
|
||||
send_to (res: WSF_RESPONSE)
|
||||
local
|
||||
h: like header
|
||||
s: STRING_8
|
||||
do
|
||||
h := header
|
||||
res.set_status_code (status_code)
|
||||
s := html
|
||||
|
||||
if not h.has_content_length then
|
||||
h.put_content_length (s.count)
|
||||
end
|
||||
if not h.has_content_type then
|
||||
h.put_content_type_text_html
|
||||
end
|
||||
res.put_header_text (h.string)
|
||||
res.put_string (s)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2012, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
|
||||
@@ -1,442 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
This class implements the CMS service
|
||||
|
||||
It could be used to implement the main EWF service, or
|
||||
even for a specific handler.
|
||||
]"
|
||||
|
||||
class
|
||||
CMS_SERVICE
|
||||
|
||||
inherit
|
||||
WSF_SERVICE
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_setup: CMS_SETUP)
|
||||
local
|
||||
cfg: detachable CMS_CONFIGURATION
|
||||
do
|
||||
cfg := a_setup.configuration
|
||||
if cfg = Void then
|
||||
create cfg.make
|
||||
end
|
||||
|
||||
configuration := cfg
|
||||
base_url := a_setup.base_url
|
||||
|
||||
site_id := cfg.site_id
|
||||
site_url := cfg.site_url ("")
|
||||
site_name := cfg.site_name ("EWF::CMS")
|
||||
site_email := cfg.site_email ("webmaster")
|
||||
site_dir := cfg.root_location
|
||||
site_var_dir := cfg.var_location
|
||||
files_location := cfg.files_location
|
||||
themes_location := cfg.themes_location
|
||||
theme_name := cfg.theme_name ("default")
|
||||
|
||||
set_script_url (cfg.site_script_url (Void)) -- Temporary value
|
||||
|
||||
compute_theme_resource_location
|
||||
|
||||
create content_types.make (3)
|
||||
|
||||
modules := a_setup.modules
|
||||
storage := a_setup.storage
|
||||
session_manager := a_setup.session_manager
|
||||
auth_engine := a_setup.auth_engine
|
||||
mailer := a_setup.mailer
|
||||
|
||||
initialize_storage
|
||||
initialize_auth_engine
|
||||
initialize_session_manager
|
||||
initialize_mailer
|
||||
initialize_router
|
||||
initialize_modules
|
||||
end
|
||||
|
||||
initialize_session_manager
|
||||
-- local
|
||||
-- dn: DIRECTORY_NAME
|
||||
do
|
||||
-- create dn.make_from_string (site_var_dir)
|
||||
-- dn.extend ("_storage_")
|
||||
-- dn.extend ("_sessions_")
|
||||
-- create {WSF_FS_SESSION_MANAGER} session_manager.make_with_folder (dn.string)
|
||||
end
|
||||
|
||||
initialize_storage
|
||||
do
|
||||
if not storage.has_user then
|
||||
initialize_users
|
||||
end
|
||||
end
|
||||
|
||||
initialize_users
|
||||
require
|
||||
has_no_user: not storage.has_user
|
||||
local
|
||||
u: CMS_USER
|
||||
ur: CMS_USER_ROLE
|
||||
do
|
||||
create u.make_new ("admin")
|
||||
u.set_password ("istrator")
|
||||
storage.save_user (u)
|
||||
|
||||
create ur.make_with_id (1, "anonymous")
|
||||
storage.save_user_role (ur)
|
||||
create ur.make_with_id (2, "authenticated")
|
||||
ur.add_permission ("create page")
|
||||
ur.add_permission ("edit page")
|
||||
storage.save_user_role (ur)
|
||||
end
|
||||
|
||||
initialize_mailer
|
||||
local
|
||||
-- ch_mailer: CMS_CHAIN_MAILER
|
||||
-- st_mailer: CMS_STORAGE_MAILER
|
||||
do
|
||||
-- create st_mailer.make (storage)
|
||||
-- create ch_mailer.make (st_mailer)
|
||||
-- ch_mailer.set_next (create {CMS_SENDMAIL_MAILER})
|
||||
-- mailer := ch_mailer
|
||||
end
|
||||
|
||||
initialize_router
|
||||
local
|
||||
-- h: CMS_HANDLER
|
||||
file_hdl: CMS_FILE_SYSTEM_HANDLER
|
||||
do
|
||||
create router.make (10)
|
||||
router.set_base_url (base_url)
|
||||
|
||||
router.map (create {WSF_URI_MAPPING}.make ("/", create {CMS_HANDLER}.make (agent handle_home)))
|
||||
router.map (create {WSF_URI_MAPPING}.make ("/favicon.ico", create {CMS_HANDLER}.make (agent handle_favicon)))
|
||||
|
||||
create file_hdl.make_with_path (files_location)
|
||||
file_hdl.disable_index
|
||||
file_hdl.set_max_age (8*60*60)
|
||||
router.map (create {WSF_STARTS_WITH_MAPPING}.make ("/files/", file_hdl))
|
||||
|
||||
create file_hdl.make_with_path (theme_resource_location)
|
||||
file_hdl.set_max_age (8*60*60)
|
||||
router.map (create {WSF_STARTS_WITH_MAPPING}.make ("/theme/", file_hdl))
|
||||
end
|
||||
|
||||
initialize_modules
|
||||
do
|
||||
across
|
||||
modules as m
|
||||
loop
|
||||
if m.item.is_enabled then
|
||||
m.item.register (Current)
|
||||
if attached {CMS_HOOK_AUTO_REGISTER} m.item as h_auto then
|
||||
h_auto.hook_auto_register (Current)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
initialize_auth_engine
|
||||
do
|
||||
-- create {CMS_STORAGE_AUTH_ENGINE} auth_engine.make (storage)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
configuration: CMS_CONFIGURATION
|
||||
|
||||
auth_engine: CMS_AUTH_ENGINE
|
||||
|
||||
modules: LIST [CMS_MODULE]
|
||||
|
||||
feature -- Hook: menu_alter
|
||||
|
||||
add_menu_alter_hook (h: like menu_alter_hooks.item)
|
||||
local
|
||||
lst: like menu_alter_hooks
|
||||
do
|
||||
lst := menu_alter_hooks
|
||||
if lst = Void then
|
||||
create lst.make (1)
|
||||
menu_alter_hooks := lst
|
||||
end
|
||||
if not lst.has (h) then
|
||||
lst.force (h)
|
||||
end
|
||||
end
|
||||
|
||||
menu_alter_hooks: detachable ARRAYED_LIST [CMS_HOOK_MENU_ALTER]
|
||||
|
||||
call_menu_alter_hooks (m: CMS_MENU_SYSTEM; a_execution: CMS_EXECUTION)
|
||||
do
|
||||
if attached menu_alter_hooks as lst then
|
||||
across
|
||||
lst as c
|
||||
loop
|
||||
c.item.menu_alter (m, a_execution)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Hook: form_alter
|
||||
|
||||
add_form_alter_hook (h: like form_alter_hooks.item)
|
||||
local
|
||||
lst: like form_alter_hooks
|
||||
do
|
||||
lst := form_alter_hooks
|
||||
if lst = Void then
|
||||
create lst.make (1)
|
||||
form_alter_hooks := lst
|
||||
end
|
||||
if not lst.has (h) then
|
||||
lst.force (h)
|
||||
end
|
||||
end
|
||||
|
||||
form_alter_hooks: detachable ARRAYED_LIST [CMS_HOOK_FORM_ALTER]
|
||||
|
||||
call_form_alter_hooks (f: CMS_FORM; a_form_data: detachable WSF_FORM_DATA; a_execution: CMS_EXECUTION)
|
||||
do
|
||||
if attached form_alter_hooks as lst then
|
||||
across
|
||||
lst as c
|
||||
loop
|
||||
c.item.form_alter (f, a_form_data, a_execution)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Hook: block
|
||||
|
||||
add_block_hook (h: like block_hooks.item)
|
||||
local
|
||||
lst: like block_hooks
|
||||
do
|
||||
lst := block_hooks
|
||||
if lst = Void then
|
||||
create lst.make (1)
|
||||
block_hooks := lst
|
||||
end
|
||||
if not lst.has (h) then
|
||||
lst.force (h)
|
||||
end
|
||||
end
|
||||
|
||||
block_hooks: detachable ARRAYED_LIST [CMS_HOOK_BLOCK]
|
||||
|
||||
hook_block_view (a_execution: CMS_EXECUTION)
|
||||
do
|
||||
if attached block_hooks as lst then
|
||||
across
|
||||
lst as c
|
||||
loop
|
||||
across
|
||||
c.item.block_list as blst
|
||||
loop
|
||||
c.item.get_block_view (blst.item, a_execution)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Router
|
||||
|
||||
site_id: READABLE_STRING_8
|
||||
|
||||
site_name: READABLE_STRING_32
|
||||
|
||||
site_email: READABLE_STRING_8
|
||||
|
||||
site_url: READABLE_STRING_8
|
||||
|
||||
site_dir: PATH
|
||||
|
||||
site_var_dir: PATH
|
||||
|
||||
files_location: PATH
|
||||
|
||||
themes_location: PATH
|
||||
|
||||
compute_theme_resource_location
|
||||
do
|
||||
theme_resource_location := themes_location.extended (theme_name).extended ("res")
|
||||
end
|
||||
|
||||
theme_resource_location: PATH
|
||||
|
||||
theme_name: READABLE_STRING_32
|
||||
|
||||
router: WSF_ROUTER
|
||||
|
||||
map_uri_template (tpl: STRING; proc: PROCEDURE [ANY, TUPLE [req: WSF_REQUEST; res: WSF_RESPONSE]])
|
||||
do
|
||||
router.map (create {WSF_URI_TEMPLATE_MAPPING}.make_from_template (tpl, create {CMS_HANDLER}.make (proc)))
|
||||
end
|
||||
|
||||
map_uri (a_uri: STRING; proc: PROCEDURE [ANY, TUPLE [req: WSF_REQUEST; res: WSF_RESPONSE]])
|
||||
do
|
||||
router.map (create {WSF_URI_MAPPING}.make (a_uri, create {CMS_HANDLER}.make (proc)))
|
||||
end
|
||||
|
||||
feature -- URL related
|
||||
|
||||
front_path: STRING
|
||||
do
|
||||
if attached base_url as l_base_url then
|
||||
Result := l_base_url + "/"
|
||||
else
|
||||
Result := "/"
|
||||
end
|
||||
end
|
||||
|
||||
urls_set: BOOLEAN
|
||||
|
||||
initialize_urls (req: WSF_REQUEST)
|
||||
local
|
||||
u: like base_url
|
||||
do
|
||||
if not urls_set then
|
||||
u := base_url
|
||||
if u = Void then
|
||||
u := ""
|
||||
end
|
||||
urls_set := True
|
||||
if site_url.is_empty then
|
||||
site_url := req.absolute_script_url (u)
|
||||
end
|
||||
set_script_url (req.script_url (u))
|
||||
end
|
||||
end
|
||||
|
||||
base_url: detachable READABLE_STRING_8
|
||||
-- Base url (related to the script path).
|
||||
|
||||
script_url: detachable READABLE_STRING_8
|
||||
|
||||
set_script_url (a_url: like script_url)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
if a_url = Void then
|
||||
script_url := Void
|
||||
elseif not a_url.is_empty then
|
||||
if a_url.ends_with ("/") then
|
||||
create s.make_from_string (a_url)
|
||||
else
|
||||
create s.make (a_url.count + 1)
|
||||
s.append (a_url)
|
||||
s.append_character ('/')
|
||||
end
|
||||
script_url := s
|
||||
end
|
||||
ensure
|
||||
attached script_url as l_url implies l_url.ends_with ("/")
|
||||
end
|
||||
|
||||
feature -- Report
|
||||
|
||||
is_front_page (req: WSF_REQUEST): BOOLEAN
|
||||
do
|
||||
Result := req.path_info.same_string (front_path)
|
||||
end
|
||||
|
||||
feature {CMS_EXECUTION, CMS_MODULE} -- Security report
|
||||
|
||||
user_has_permission (u: detachable CMS_USER; s: detachable READABLE_STRING_8): BOOLEAN
|
||||
-- Anonymous or user `u' has permission for `s' ?
|
||||
--| `s' could be "create page",
|
||||
do
|
||||
Result := storage.user_has_permission (u, s)
|
||||
end
|
||||
|
||||
feature -- Storage
|
||||
|
||||
session_controller (req: WSF_REQUEST): CMS_SESSION_CONTROLER
|
||||
-- New session controller for request `req'
|
||||
do
|
||||
create Result.make (req, session_manager, site_id)
|
||||
end
|
||||
|
||||
session_manager: WSF_SESSION_MANAGER
|
||||
-- CMS Session manager
|
||||
|
||||
storage: CMS_STORAGE
|
||||
|
||||
feature -- Logging
|
||||
|
||||
log (a_category: READABLE_STRING_8; a_message: READABLE_STRING_8; a_level: INTEGER; a_link: detachable CMS_LINK)
|
||||
local
|
||||
l_log: CMS_LOG
|
||||
do
|
||||
create l_log.make (a_category, a_message, a_level, Void)
|
||||
if a_link /= Void then
|
||||
l_log.set_link (a_link)
|
||||
end
|
||||
storage.save_log (l_log)
|
||||
end
|
||||
|
||||
feature -- Content type
|
||||
|
||||
content_types: ARRAYED_LIST [CMS_CONTENT_TYPE]
|
||||
-- Available content types
|
||||
|
||||
add_content_type (a_type: CMS_CONTENT_TYPE)
|
||||
do
|
||||
content_types.force (a_type)
|
||||
end
|
||||
|
||||
content_type (a_name: READABLE_STRING_8): detachable CMS_CONTENT_TYPE
|
||||
do
|
||||
across
|
||||
content_types as t
|
||||
until
|
||||
Result /= Void
|
||||
loop
|
||||
if t.item.name.same_string (a_name) then
|
||||
Result := t.item
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Notification
|
||||
|
||||
mailer: NOTIFICATION_MAILER
|
||||
|
||||
feature -- Core Execution
|
||||
|
||||
handle_favicon (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
local
|
||||
fres: WSF_FILE_RESPONSE
|
||||
do
|
||||
create fres.make_with_path (theme_resource_location.extended ("favicon.ico"))
|
||||
fres.set_expires_in_seconds (7 * 24 * 60 * 60) -- 7 jours
|
||||
res.send (fres)
|
||||
end
|
||||
|
||||
handle_home (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {HOME_CMS_EXECUTION}.make (req, res, Current)).execute
|
||||
end
|
||||
|
||||
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
-- Default request handler if no other are relevant
|
||||
local
|
||||
e: CMS_EXECUTION
|
||||
sess: WSF_ROUTER_SESSION
|
||||
do
|
||||
initialize_urls (req)
|
||||
create sess
|
||||
router.dispatch (req, res, sess)
|
||||
if not sess.dispatched then
|
||||
create {NOT_FOUND_CMS_EXECUTION} e.make (req, res, Current)
|
||||
e.execute
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,33 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {WSF_SESSION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_SESSION
|
||||
|
||||
inherit
|
||||
WSF_COOKIE_SESSION
|
||||
|
||||
create
|
||||
make,
|
||||
make_new
|
||||
|
||||
feature -- Access
|
||||
|
||||
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
|
||||
end
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_SETUP}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_SETUP
|
||||
|
||||
feature -- Access
|
||||
|
||||
configuration: detachable CMS_CONFIGURATION
|
||||
|
||||
base_url: detachable READABLE_STRING_8
|
||||
|
||||
modules: LIST [CMS_MODULE]
|
||||
deferred
|
||||
end
|
||||
|
||||
storage: CMS_STORAGE
|
||||
-- CMS persistent layer
|
||||
deferred
|
||||
end
|
||||
|
||||
session_manager: WSF_SESSION_MANAGER
|
||||
-- CMS Session manager
|
||||
deferred
|
||||
end
|
||||
|
||||
auth_engine: CMS_AUTH_ENGINE
|
||||
-- CMS Authentication engine
|
||||
deferred
|
||||
end
|
||||
|
||||
mailer: NOTIFICATION_MAILER
|
||||
-- CMS email engine
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- Change
|
||||
|
||||
set_base_url (a_base_url: like base_url)
|
||||
do
|
||||
if a_base_url /= Void and then not a_base_url.is_empty then
|
||||
base_url := a_base_url
|
||||
else
|
||||
base_url := Void
|
||||
end
|
||||
end
|
||||
|
||||
add_module (m: CMS_MODULE)
|
||||
deferred
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,81 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HTML_TEMPLATE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
DEFAULT_CMS_HTML_TEMPLATE
|
||||
|
||||
inherit
|
||||
CMS_HTML_TEMPLATE
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (t: DEFAULT_CMS_THEME)
|
||||
do
|
||||
theme := t
|
||||
create variables.make (0)
|
||||
end
|
||||
|
||||
variables: HASH_TABLE [detachable ANY, STRING]
|
||||
|
||||
feature -- Access
|
||||
|
||||
register (v: STRING_8; k: STRING_8)
|
||||
do
|
||||
variables.force (v, k)
|
||||
end
|
||||
|
||||
theme: DEFAULT_CMS_THEME
|
||||
|
||||
prepare (page: CMS_HTML_PAGE)
|
||||
do
|
||||
variables.make (10)
|
||||
if attached page.title as l_title then
|
||||
variables.force (l_title, "title")
|
||||
variables.force (l_title, "head_title")
|
||||
else
|
||||
variables.force ("", "title")
|
||||
variables.force ("", "head_title")
|
||||
end
|
||||
|
||||
variables.force (page.language, "language")
|
||||
variables.force (page.head_lines_to_string, "head_lines")
|
||||
end
|
||||
|
||||
to_html (page: CMS_HTML_PAGE): STRING
|
||||
do
|
||||
-- Process html generation
|
||||
create Result.make_from_string (template)
|
||||
apply_template_engine (Result)
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
template: STRING
|
||||
once
|
||||
Result := "[
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="$language" lang="$language" version="XHTML+RDFa 1.0" dir="ltr">
|
||||
<head>
|
||||
$head
|
||||
<title>$head_title</title>
|
||||
$styles
|
||||
$scripts
|
||||
$head_lines
|
||||
</head>
|
||||
<body class="$body_classes" $body_attributes>
|
||||
$page_top
|
||||
$page
|
||||
$page_bottom
|
||||
</body>
|
||||
</html>
|
||||
]"
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@@ -1,84 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_PAGE_TEMPLATE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
DEFAULT_CMS_PAGE_TEMPLATE
|
||||
|
||||
inherit
|
||||
CMS_PAGE_TEMPLATE
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (t: DEFAULT_CMS_THEME)
|
||||
do
|
||||
theme := t
|
||||
create variables.make (0)
|
||||
end
|
||||
|
||||
variables: HASH_TABLE [detachable ANY, STRING]
|
||||
|
||||
feature -- Access
|
||||
|
||||
theme: DEFAULT_CMS_THEME
|
||||
|
||||
prepare (page: CMS_HTML_PAGE)
|
||||
do
|
||||
variables.make (10)
|
||||
|
||||
if attached page.title as l_title then
|
||||
variables.force (l_title, "title")
|
||||
else
|
||||
variables.force ("", "title")
|
||||
end
|
||||
across
|
||||
theme.regions as r
|
||||
loop
|
||||
variables.force (page.region (r.item), r.item)
|
||||
end
|
||||
end
|
||||
|
||||
to_html (page: CMS_HTML_PAGE): STRING
|
||||
do
|
||||
-- Process html generation
|
||||
create Result.make_from_string (template)
|
||||
apply_template_engine (Result)
|
||||
end
|
||||
|
||||
feature -- Registration
|
||||
|
||||
register (v: STRING_8; k: STRING_8)
|
||||
do
|
||||
variables.force (v, k)
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
template: STRING
|
||||
once
|
||||
Result := "[
|
||||
<div id="page-wrapper">
|
||||
<div id="page">
|
||||
<div id="header">
|
||||
$header
|
||||
</div>
|
||||
<div id="main-wrapper">
|
||||
<div id="main">
|
||||
<div id="first_sidebar" class="sidebar $first_sidebar_css_class">$first_sidebar</div>
|
||||
<div id="content" class="$content_css_class">$content</div>
|
||||
<div id="second_sidebar" class="sidebar $second_sidebar_css_class">$second_sidebar</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">$footer</div>
|
||||
</div>
|
||||
</div>
|
||||
]"
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@@ -1,85 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_THEME}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
DEFAULT_CMS_THEME
|
||||
|
||||
inherit
|
||||
CMS_THEME
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_service: like service)
|
||||
do
|
||||
service := a_service
|
||||
end
|
||||
|
||||
service: CMS_SERVICE
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING = "CMS"
|
||||
|
||||
regions: ARRAY [STRING]
|
||||
once
|
||||
Result := <<"header", "content", "footer", "first_sidebar", "second_sidebar">>
|
||||
end
|
||||
|
||||
html_template: DEFAULT_CMS_HTML_TEMPLATE
|
||||
local
|
||||
tpl: like internal_html_template
|
||||
do
|
||||
tpl := internal_html_template
|
||||
if tpl = Void then
|
||||
create tpl.make (Current)
|
||||
internal_html_template := tpl
|
||||
end
|
||||
Result := tpl
|
||||
end
|
||||
|
||||
page_template: DEFAULT_CMS_PAGE_TEMPLATE
|
||||
local
|
||||
tpl: like internal_page_template
|
||||
do
|
||||
tpl := internal_page_template
|
||||
if tpl = Void then
|
||||
create tpl.make (Current)
|
||||
internal_page_template := tpl
|
||||
end
|
||||
Result := tpl
|
||||
end
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
prepare (page: CMS_HTML_PAGE)
|
||||
do
|
||||
page.add_style (url ("/theme/style.css", Void), Void)
|
||||
end
|
||||
|
||||
page_html (page: CMS_HTML_PAGE): STRING_8
|
||||
local
|
||||
l_content: STRING_8
|
||||
do
|
||||
prepare (page)
|
||||
page_template.prepare (page)
|
||||
l_content := page_template.to_html (page)
|
||||
html_template.prepare (page)
|
||||
html_template.register (l_content, "page")
|
||||
Result := html_template.to_html (page)
|
||||
end
|
||||
|
||||
feature {NONE} -- Internal
|
||||
|
||||
internal_page_template: detachable like page_template
|
||||
|
||||
internal_html_template: detachable like html_template
|
||||
|
||||
invariant
|
||||
attached internal_page_template as inv_p implies inv_p.theme = Current
|
||||
end
|
||||
@@ -1,43 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_FORM}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_FORM
|
||||
|
||||
inherit
|
||||
WSF_FORM
|
||||
rename
|
||||
process as process_form
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Basic operation
|
||||
|
||||
prepare (a_execution: CMS_EXECUTION)
|
||||
do
|
||||
a_execution.service.call_form_alter_hooks (Current, Void, a_execution)
|
||||
end
|
||||
|
||||
process (a_execution: CMS_EXECUTION)
|
||||
do
|
||||
process_form (a_execution.request, agent on_prepared (a_execution, ?), agent on_processed (a_execution, ?))
|
||||
end
|
||||
|
||||
on_prepared (a_execution: CMS_EXECUTION; fd: WSF_FORM_DATA)
|
||||
do
|
||||
a_execution.service.call_form_alter_hooks (Current, fd, a_execution)
|
||||
end
|
||||
|
||||
on_processed (a_execution: CMS_EXECUTION; fd: WSF_FORM_DATA)
|
||||
do
|
||||
if not fd.is_valid or fd.has_error then
|
||||
a_execution.report_form_errors (fd)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,61 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
This class implements the web service
|
||||
|
||||
It inherits from WSF_DEFAULT_SERVICE to get default EWF connector ready
|
||||
And from WSF_URI_TEMPLATE_ROUTED_SERVICE to use the router service
|
||||
|
||||
`initialize' can be redefine to provide custom options if needed.
|
||||
]"
|
||||
|
||||
class
|
||||
ANY_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make,
|
||||
make_with_text
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make_with_text (req: WSF_REQUEST; res: WSF_RESPONSE; h: like service; t: like text)
|
||||
do
|
||||
make (req, res, h)
|
||||
text := t
|
||||
end
|
||||
|
||||
text: detachable STRING
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
s: STRING
|
||||
do
|
||||
if attached main_content as m then
|
||||
-- ok
|
||||
elseif attached text as t then
|
||||
create b.make_empty
|
||||
s := request.path_info
|
||||
if attached service.script_url as l_script_url then
|
||||
if s.starts_with (l_script_url) then
|
||||
s.remove_head (l_script_url.count)
|
||||
if s.starts_with ("/") then
|
||||
s.remove_head (1)
|
||||
end
|
||||
end
|
||||
end
|
||||
set_title (s)
|
||||
b.append (t)
|
||||
set_main_content (b)
|
||||
else
|
||||
set_title ("...")
|
||||
set_main_content ("")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,17 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_FILE_SYSTEM_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_FILE_SYSTEM_HANDLER
|
||||
|
||||
inherit
|
||||
WSF_FILE_SYSTEM_HANDLER
|
||||
|
||||
create
|
||||
make,
|
||||
make_with_path
|
||||
|
||||
end
|
||||
@@ -1,64 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_HANDLER
|
||||
|
||||
inherit
|
||||
WSF_URI_HANDLER
|
||||
rename
|
||||
execute as execute_uri
|
||||
undefine
|
||||
new_mapping
|
||||
end
|
||||
|
||||
WSF_URI_TEMPLATE_HANDLER
|
||||
rename
|
||||
execute as execute_uri_template
|
||||
end
|
||||
|
||||
WSF_STARTS_WITH_HANDLER
|
||||
rename
|
||||
execute as execute_starts_with
|
||||
undefine
|
||||
new_mapping
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (e: like action)
|
||||
do
|
||||
action := e
|
||||
end
|
||||
|
||||
action: PROCEDURE [ANY, TUPLE [req: WSF_REQUEST; res: WSF_RESPONSE]]
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
action.call ([req, res])
|
||||
end
|
||||
|
||||
execute_uri (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
execute (req, res)
|
||||
end
|
||||
|
||||
execute_uri_template (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
execute_uri (req, res)
|
||||
end
|
||||
|
||||
execute_starts_with (a_start_path: READABLE_STRING_8; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
execute_uri (req, res)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,52 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
HOME_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
-- l_url: READABLE_STRING_8
|
||||
b: STRING_8
|
||||
do
|
||||
set_title ("Home")
|
||||
set_page_title (Void)
|
||||
create b.make_empty
|
||||
if attached service.storage.recent_nodes (1, 10) as l_nodes then
|
||||
across
|
||||
l_nodes as c
|
||||
loop
|
||||
b.append ("<div class=%"node-wrapper%">")
|
||||
b.append (c.item.to_html (theme))
|
||||
b.append ("</div>%N")
|
||||
end
|
||||
end
|
||||
|
||||
-- b.append ("<ul>%N")
|
||||
-- l_url := url ("/", Void)
|
||||
-- b.append ("<li><a href=%"" + l_url + "%">Home</a></li>%N")
|
||||
-- l_url := url ("/info/", Void)
|
||||
-- b.append ("<li><a href=%"" + l_url + "%">EWF Info</a></li>%N")
|
||||
|
||||
-- b.append ("</ul>%N")
|
||||
|
||||
debug ("cms")
|
||||
if attached controller.session as sess then
|
||||
b.append ("<div>Session#" + sess.uuid + "</div>%N")
|
||||
end
|
||||
end
|
||||
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,34 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
This class implements the web service
|
||||
|
||||
It inherits from WSF_DEFAULT_SERVICE to get default EWF connector ready
|
||||
And from WSF_URI_TEMPLATE_ROUTED_SERVICE to use the router service
|
||||
|
||||
`initialize' can be redefine to provide custom options if needed.
|
||||
]"
|
||||
|
||||
class
|
||||
NOT_FOUND_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
do
|
||||
status_code := {HTTP_STATUS_CODE}.not_found
|
||||
create b.make_empty
|
||||
set_title ("Page Not Found")
|
||||
b.append ("<em>The requested page could not be found.</em>%N")
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,47 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
THEME_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
-- l_url: READABLE_STRING_8
|
||||
b: STRING_8
|
||||
do
|
||||
set_title ("Home")
|
||||
create b.make_empty
|
||||
|
||||
b.append ("<h1>Home</h1>%N")
|
||||
if attached service.storage.recent_nodes (1, 10) as l_nodes then
|
||||
across
|
||||
l_nodes as c
|
||||
loop
|
||||
b.append ("<div class=%"node-wrapper%">")
|
||||
b.append (c.item.to_html (theme))
|
||||
b.append ("</div>%N")
|
||||
end
|
||||
end
|
||||
|
||||
-- b.append ("<ul>%N")
|
||||
-- l_url := url ("/", Void)
|
||||
-- b.append ("<li><a href=%"" + l_url + "%">Home</a></li>%N")
|
||||
-- l_url := url ("/info/", Void)
|
||||
-- b.append ("<li><a href=%"" + l_url + "%">EWF Info</a></li>%N")
|
||||
|
||||
-- b.append ("</ul>%N")
|
||||
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,10 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HOOK}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_HOOK
|
||||
|
||||
end
|
||||
@@ -1,33 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
Summary description for {CMS_HOOK_AUTO_REGISTER}.
|
||||
When inheriting from this class, the declared hooks are automatically
|
||||
registered, otherwise, each descendant has to add it to the cms service
|
||||
itself.
|
||||
]"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_HOOK_AUTO_REGISTER
|
||||
|
||||
inherit
|
||||
CMS_HOOK
|
||||
|
||||
feature -- Hook
|
||||
|
||||
hook_auto_register (a_service: CMS_SERVICE)
|
||||
do
|
||||
if attached {CMS_HOOK_MENU_ALTER} Current as h_menu_alter then
|
||||
a_service.add_menu_alter_hook (h_menu_alter)
|
||||
end
|
||||
if attached {CMS_HOOK_BLOCK} Current as h_block then
|
||||
a_service.add_block_hook (h_block)
|
||||
end
|
||||
if attached {CMS_HOOK_FORM_ALTER} Current as h_block then
|
||||
a_service.add_form_alter_hook (h_block)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,23 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HOOK_BLOCK}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_HOOK_BLOCK
|
||||
|
||||
inherit
|
||||
CMS_HOOK
|
||||
|
||||
feature -- Hook
|
||||
|
||||
block_list: ITERABLE [like {CMS_BLOCK}.name]
|
||||
deferred
|
||||
end
|
||||
|
||||
get_block_view (a_block_id: detachable READABLE_STRING_8; a_execution: CMS_EXECUTION)
|
||||
deferred
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HOOK_FORM_ALTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_HOOK_FORM_ALTER
|
||||
|
||||
inherit
|
||||
CMS_HOOK
|
||||
|
||||
feature -- Hook
|
||||
|
||||
form_alter (a_form: CMS_FORM; a_form_data: detachable WSF_FORM_DATA; a_execution: CMS_EXECUTION)
|
||||
deferred
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HOOK_MENU_ALTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_HOOK_MENU_ALTER
|
||||
|
||||
inherit
|
||||
CMS_HOOK
|
||||
|
||||
feature -- Hook
|
||||
|
||||
menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_execution: CMS_EXECUTION)
|
||||
deferred
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,26 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_API_OPTIONS}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_API_OPTIONS
|
||||
|
||||
inherit
|
||||
WSF_API_OPTIONS
|
||||
|
||||
create
|
||||
make,
|
||||
make_from_manifest
|
||||
|
||||
convert
|
||||
make_from_manifest ({ ARRAY [TUPLE [key: STRING; value: detachable ANY]],
|
||||
ARRAY [TUPLE [STRING_8, ARRAY [TUPLE [STRING_8, STRING_32]]]],
|
||||
ARRAY [TUPLE [STRING_8, ARRAY [TUPLE [STRING_8, STRING_8]]]]
|
||||
})
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
|
||||
end
|
||||
@@ -1,102 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {WSF_CMS_COMMON_API}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_COMMON_API
|
||||
|
||||
inherit
|
||||
WSF_API_UTILITIES
|
||||
|
||||
feature {NONE} -- Access
|
||||
|
||||
service: CMS_SERVICE
|
||||
deferred
|
||||
end
|
||||
|
||||
site_url: READABLE_STRING_8
|
||||
do
|
||||
Result := service.site_url
|
||||
end
|
||||
|
||||
base_url: detachable READABLE_STRING_8
|
||||
-- Base url if any.
|
||||
do
|
||||
Result := service.script_url
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
user_link (u: CMS_USER): like link
|
||||
do
|
||||
Result := link (u.name, "/user/" + u.id.out, Void)
|
||||
end
|
||||
|
||||
node_link (n: CMS_NODE): like link
|
||||
do
|
||||
Result := link (n.title, "/node/" + n.id.out, Void)
|
||||
end
|
||||
|
||||
user_url (u: CMS_USER): like url
|
||||
do
|
||||
Result := url ("/user/" + u.id.out, Void)
|
||||
end
|
||||
|
||||
node_url (n: CMS_NODE): like url
|
||||
do
|
||||
Result := url ("/node/" + n.id.out, Void)
|
||||
end
|
||||
|
||||
feature -- Helper
|
||||
|
||||
is_empty (s: detachable READABLE_STRING_GENERAL): BOOLEAN
|
||||
-- Is `s' is Void or empty ?
|
||||
do
|
||||
Result := s = Void or else s.is_empty
|
||||
end
|
||||
|
||||
unix_timestamp (dt: DATE_TIME): INTEGER_64
|
||||
do
|
||||
Result := (create {HTTP_DATE_TIME_UTILITIES}).unix_time_stamp (dt)
|
||||
end
|
||||
|
||||
unix_timestamp_to_date_time (t: INTEGER_64): DATE_TIME
|
||||
do
|
||||
Result := (create {HTTP_DATE_TIME_UTILITIES}).unix_time_stamp_to_date_time (t)
|
||||
end
|
||||
|
||||
string_unix_timestamp_to_date_time (s: READABLE_STRING_8): DATE_TIME
|
||||
do
|
||||
if s.is_integer_64 then
|
||||
Result := (create {HTTP_DATE_TIME_UTILITIES}).unix_time_stamp_to_date_time (s.to_integer_64)
|
||||
else
|
||||
Result := (create {HTTP_DATE_TIME_UTILITIES}).unix_time_stamp_to_date_time (0)
|
||||
end
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
options_boolean (opts: HASH_TABLE [detachable ANY, STRING]; k: STRING; dft: BOOLEAN): BOOLEAN
|
||||
do
|
||||
if attached {BOOLEAN} opts.item (k) as h then
|
||||
Result := h
|
||||
else
|
||||
Result := dft
|
||||
end
|
||||
end
|
||||
|
||||
options_string (opts: HASH_TABLE [detachable ANY, STRING]; k: STRING): detachable STRING
|
||||
do
|
||||
if attached {STRING} opts.item (k) as s then
|
||||
Result := s
|
||||
end
|
||||
end
|
||||
|
||||
-- html_encoder: HTML_ENCODER
|
||||
-- once ("thread")
|
||||
-- create Result
|
||||
-- end
|
||||
|
||||
end
|
||||
@@ -1,25 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_URL_API_OPTIONS}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_URL_API_OPTIONS
|
||||
|
||||
inherit
|
||||
CMS_API_OPTIONS
|
||||
|
||||
create
|
||||
make,
|
||||
make_absolute
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make_absolute
|
||||
do
|
||||
make (1)
|
||||
force (True, "absolute")
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,16 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_AUTH_ENGINE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_AUTH_ENGINE
|
||||
|
||||
feature -- Status
|
||||
|
||||
valid_credential (u,p: READABLE_STRING_32): BOOLEAN
|
||||
deferred
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,32 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_STORAGE_AUTH_ENGINE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_STORAGE_AUTH_ENGINE
|
||||
|
||||
inherit
|
||||
CMS_AUTH_ENGINE
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_storage: like storage)
|
||||
do
|
||||
storage := a_storage
|
||||
end
|
||||
|
||||
storage: CMS_STORAGE
|
||||
|
||||
feature -- Status
|
||||
|
||||
valid_credential (u,p: READABLE_STRING_32): BOOLEAN
|
||||
do
|
||||
Result := storage.is_valid_credential (u, p)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,225 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HTML_PAGE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_HTML_PAGE
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
create regions.make (5)
|
||||
language := "en"
|
||||
|
||||
status_code := {HTTP_STATUS_CODE}.ok
|
||||
create header.make
|
||||
create {ARRAYED_LIST [STRING]} head_lines.make (5)
|
||||
header.put_content_type_text_html
|
||||
end
|
||||
|
||||
feature -- Status
|
||||
|
||||
status_code: INTEGER
|
||||
|
||||
feature -- Header
|
||||
|
||||
header: HTTP_HEADER
|
||||
|
||||
feature -- Region
|
||||
|
||||
regions: HASH_TABLE [STRING_8, STRING_8]
|
||||
-- header
|
||||
-- content
|
||||
-- footer
|
||||
-- could have sidebar first, sidebar second, ...
|
||||
|
||||
region (n: STRING_8): STRING_8
|
||||
do
|
||||
if attached regions.item (n) as r then
|
||||
Result := r
|
||||
else
|
||||
Result := ""
|
||||
debug
|
||||
Result := "{{" + n + "}}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
html_head: STRING_8
|
||||
local
|
||||
t: like title
|
||||
lines: like head_lines
|
||||
do
|
||||
t := title
|
||||
lines := head_lines
|
||||
if t /= Void or else lines.count > 0 then
|
||||
create Result.make (50)
|
||||
if t /= Void then
|
||||
Result.append ("<title>" + t + "</title>%N")
|
||||
end
|
||||
Result.append_character ('%N')
|
||||
across
|
||||
lines as l
|
||||
loop
|
||||
Result.append (l.item)
|
||||
Result.append_character ('%N')
|
||||
end
|
||||
else
|
||||
create Result.make_empty
|
||||
end
|
||||
end
|
||||
|
||||
header_region: STRING_8
|
||||
do
|
||||
Result := region ("header")
|
||||
end
|
||||
|
||||
content_region: STRING_8
|
||||
do
|
||||
Result := region ("content")
|
||||
end
|
||||
|
||||
footer_region: STRING_8
|
||||
do
|
||||
Result := region ("content")
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
add_to_region (s: STRING; k: STRING)
|
||||
local
|
||||
r: detachable STRING
|
||||
do
|
||||
r := regions.item (k)
|
||||
if r = Void then
|
||||
create r.make_from_string (s)
|
||||
set_region (r, k)
|
||||
else
|
||||
r.append (s)
|
||||
end
|
||||
end
|
||||
|
||||
add_to_header_region (s: STRING)
|
||||
do
|
||||
add_to_region (s, "header")
|
||||
end
|
||||
|
||||
add_to_content_region (s: STRING)
|
||||
do
|
||||
add_to_region (s, "content")
|
||||
end
|
||||
|
||||
add_to_footer_region (s: STRING)
|
||||
do
|
||||
add_to_region (s, "footer")
|
||||
end
|
||||
|
||||
set_region (s: STRING; k: STRING)
|
||||
do
|
||||
regions.force (s, k)
|
||||
end
|
||||
|
||||
-- set_header_region (s: STRING)
|
||||
-- do
|
||||
-- set_region (s, "header")
|
||||
-- end
|
||||
|
||||
-- set_content_region (s: STRING)
|
||||
-- do
|
||||
-- set_region (s, "content")
|
||||
-- end
|
||||
|
||||
-- set_footer_region (s: STRING)
|
||||
-- do
|
||||
-- set_region (s, "footer")
|
||||
-- end
|
||||
|
||||
feature -- Access
|
||||
|
||||
title: detachable STRING
|
||||
|
||||
language: STRING
|
||||
|
||||
head_lines: LIST [STRING]
|
||||
|
||||
head_lines_to_string: STRING
|
||||
do
|
||||
create Result.make_empty
|
||||
across
|
||||
head_lines as h
|
||||
loop
|
||||
Result.append (h.item)
|
||||
Result.append_character ('%N')
|
||||
end
|
||||
end
|
||||
|
||||
-- variables: HASH_TABLE [detachable ANY, STRING_8]
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_status_code (c: like status_code)
|
||||
do
|
||||
status_code := c
|
||||
end
|
||||
|
||||
set_language (s: like language)
|
||||
do
|
||||
language := s
|
||||
end
|
||||
|
||||
set_title (s: like title)
|
||||
do
|
||||
title := s
|
||||
end
|
||||
|
||||
add_meta_name_content (a_name: STRING; a_content: STRING)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
s := "<meta name=%"" + a_name + "%" content=%"" + a_content + "%" />"
|
||||
head_lines.extend (s)
|
||||
end
|
||||
|
||||
add_meta_http_equiv (a_http_equiv: STRING; a_content: STRING)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
s := "<meta http-equiv=%"" + a_http_equiv + "%" content=%"" + a_content + "%" />"
|
||||
head_lines.extend (s)
|
||||
end
|
||||
|
||||
add_style (a_href: STRING; a_media: detachable STRING)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
s := "<link rel=%"stylesheet%" href=%""+ a_href + "%" type=%"text/css%""
|
||||
if a_media /= Void then
|
||||
s.append (" media=%""+ a_media + "%"")
|
||||
end
|
||||
s.append ("/>")
|
||||
head_lines.extend (s)
|
||||
end
|
||||
|
||||
add_javascript_url (a_src: STRING)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
s := "<script type=%"text/javascript%" src=%"" + a_src + "%"></script>"
|
||||
head_lines.extend (s)
|
||||
end
|
||||
|
||||
add_javascript_content (a_script: STRING)
|
||||
local
|
||||
s: STRING_8
|
||||
do
|
||||
s := "<script type=%"text/javascript%">%N" + a_script + "%N</script>"
|
||||
head_lines.extend (s)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,139 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
Summary description for CMS_SESSION_CONTROLER.
|
||||
]"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_SESSION_CONTROLER
|
||||
|
||||
inherit
|
||||
ANY
|
||||
|
||||
WSF_SESSION_FACTORY [WSF_SESSION]
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Initialization
|
||||
|
||||
make (req: WSF_REQUEST; a_mngr: like session_manager; a_site_id: READABLE_STRING_8)
|
||||
do
|
||||
site_id := a_site_id
|
||||
session_manager := a_mngr
|
||||
initialize
|
||||
create discarded_sessions.make
|
||||
get_session (req)
|
||||
end
|
||||
|
||||
initialize
|
||||
do
|
||||
session_id_name := "_EWF_CMS_SESSID__" + site_id
|
||||
end
|
||||
|
||||
feature -- Session access
|
||||
|
||||
site_id: READABLE_STRING_8
|
||||
-- Associated CMS site id.
|
||||
|
||||
session: WSF_SESSION
|
||||
|
||||
has_pending_session: BOOLEAN
|
||||
|
||||
discarded_sessions: LINKED_LIST [like session]
|
||||
|
||||
feature -- Session operation
|
||||
|
||||
session_commit (page: CMS_HTML_PAGE_RESPONSE; e: CMS_EXECUTION)
|
||||
do
|
||||
if has_pending_session then
|
||||
session.apply_to (page.header, e.request, e.request.script_url ("/"))
|
||||
end
|
||||
session.commit
|
||||
end
|
||||
|
||||
apply_sessions_to (h: HTTP_HEADER; req: WSF_REQUEST; a_path: detachable READABLE_STRING_8)
|
||||
do
|
||||
session.apply_to (h, req, a_path)
|
||||
across
|
||||
discarded_sessions as c
|
||||
loop
|
||||
c.item.apply_to (h, req, a_path)
|
||||
end
|
||||
end
|
||||
|
||||
start_session (req: WSF_REQUEST)
|
||||
-- Start a new session
|
||||
local
|
||||
s: like session
|
||||
do
|
||||
close_session (req)
|
||||
s := new_session (req, False, session_manager)
|
||||
req.set_execution_variable (session_request_variable_name, s)
|
||||
session := s
|
||||
if s.is_pending then
|
||||
has_pending_session := True
|
||||
end
|
||||
ensure
|
||||
session_attached: session /= Void
|
||||
end
|
||||
|
||||
get_session (req: WSF_REQUEST)
|
||||
-- Get existing session, or start a new one
|
||||
local
|
||||
s: like session
|
||||
do
|
||||
if attached {like session} req.execution_variable (session_request_variable_name) as r_session then
|
||||
session := r_session
|
||||
else
|
||||
s := new_session (req, True, session_manager)
|
||||
-- create {CMS_SESSION} s.make (req, "_EWF_CMS_SESSID")
|
||||
if s.is_pending then
|
||||
has_pending_session := True
|
||||
end
|
||||
session := s
|
||||
req.set_execution_variable (session_request_variable_name, s)
|
||||
end
|
||||
if session.expired then
|
||||
start_session (req)
|
||||
end
|
||||
end
|
||||
|
||||
close_session (req: WSF_REQUEST)
|
||||
-- Close `session' if any
|
||||
do
|
||||
if session.is_pending then
|
||||
has_pending_session := has_pending_session or not discarded_sessions.is_empty
|
||||
else
|
||||
has_pending_session := True
|
||||
discarded_sessions.extend (session)
|
||||
end
|
||||
session.destroy
|
||||
end
|
||||
|
||||
feature -- Session internal
|
||||
|
||||
session_manager: WSF_SESSION_MANAGER
|
||||
|
||||
new_session (req: WSF_REQUEST; a_reuse: BOOLEAN; m: WSF_SESSION_MANAGER): like session
|
||||
local
|
||||
s: CMS_SESSION
|
||||
dt: DATE_TIME
|
||||
do
|
||||
if a_reuse then
|
||||
create s.make (req, session_id_name, m)
|
||||
else
|
||||
create s.make_new (session_id_name, m)
|
||||
create dt.make_now_utc
|
||||
dt.day_add (31)
|
||||
s.set_expiration (dt)
|
||||
end
|
||||
Result := s
|
||||
end
|
||||
|
||||
session_request_variable_name: STRING = "_EWF_CMS_SESSION_"
|
||||
|
||||
session_id_name: READABLE_STRING_8
|
||||
|
||||
end
|
||||
@@ -1,195 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_USER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_USER
|
||||
|
||||
inherit
|
||||
DEBUG_OUTPUT
|
||||
|
||||
create
|
||||
make_new,
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_id: like id; n: like name; dt: like creation_date)
|
||||
require
|
||||
a_id > 0
|
||||
do
|
||||
id := a_id
|
||||
creation_date := dt
|
||||
name := n
|
||||
ensure
|
||||
valid_password: password = Void
|
||||
end
|
||||
|
||||
make_new (n: like name)
|
||||
do
|
||||
name := n
|
||||
create creation_date.make_now_utc
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
is_admin: BOOLEAN
|
||||
do
|
||||
Result := id = 1
|
||||
end
|
||||
|
||||
id: INTEGER
|
||||
|
||||
name: STRING_8
|
||||
|
||||
password: detachable READABLE_STRING_32
|
||||
|
||||
email: detachable READABLE_STRING_8
|
||||
|
||||
profile: detachable CMS_USER_PROFILE
|
||||
|
||||
creation_date: DATE_TIME
|
||||
|
||||
last_login_date: detachable DATE_TIME
|
||||
|
||||
data: detachable HASH_TABLE [detachable ANY, STRING]
|
||||
|
||||
data_item (k: STRING): detachable ANY
|
||||
do
|
||||
if attached data as l_data then
|
||||
Result := l_data.item (k)
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Permission
|
||||
|
||||
roles: detachable LIST [INTEGER]
|
||||
-- Associated roles
|
||||
-- Note: does not include "authenticated" and "anonymous".
|
||||
|
||||
has_role (r: CMS_USER_ROLE): BOOLEAN
|
||||
do
|
||||
Result := attached roles as lst and then lst.has (r.id)
|
||||
end
|
||||
|
||||
clear_roles
|
||||
do
|
||||
roles := Void
|
||||
end
|
||||
|
||||
add_role_by_id (r_id: INTEGER)
|
||||
local
|
||||
lst: like roles
|
||||
do
|
||||
lst := roles
|
||||
if r_id <= 2 then -- Anonymous=1 and Authenticated=2
|
||||
lst := roles
|
||||
if lst /= Void and then lst.is_empty then
|
||||
clear_roles
|
||||
end
|
||||
else
|
||||
if lst = Void then
|
||||
create {ARRAYED_SET [INTEGER]} lst.make (1)
|
||||
roles := lst
|
||||
end
|
||||
lst.force (r_id)
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Status report
|
||||
|
||||
has_id: BOOLEAN
|
||||
do
|
||||
Result := id > 0
|
||||
end
|
||||
|
||||
has_email: BOOLEAN
|
||||
do
|
||||
Result := attached email as e and then not e.is_empty
|
||||
end
|
||||
|
||||
debug_output: STRING
|
||||
do
|
||||
Result := name
|
||||
end
|
||||
|
||||
same_as (u: detachable CMS_USER): BOOLEAN
|
||||
do
|
||||
Result := u /= Void and then id = u.id
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_id (a_id: like id)
|
||||
do
|
||||
id := a_id
|
||||
end
|
||||
|
||||
set_password (p: like password)
|
||||
do
|
||||
password := p
|
||||
end
|
||||
|
||||
set_email (m: like email)
|
||||
do
|
||||
email := m
|
||||
end
|
||||
|
||||
set_profile (prof: like profile)
|
||||
do
|
||||
profile := prof
|
||||
end
|
||||
|
||||
set_data_item (k: READABLE_STRING_8; d: like data_item)
|
||||
local
|
||||
l_data: like data
|
||||
do
|
||||
l_data := data
|
||||
if l_data = Void then
|
||||
create l_data.make (1)
|
||||
data := l_data
|
||||
end
|
||||
l_data.force (d, k)
|
||||
end
|
||||
|
||||
remove_data_item (k: READABLE_STRING_8)
|
||||
do
|
||||
if attached data as l_data then
|
||||
l_data.remove (k)
|
||||
end
|
||||
end
|
||||
|
||||
set_profile_item (k: READABLE_STRING_8; v: READABLE_STRING_8)
|
||||
local
|
||||
prof: like profile
|
||||
do
|
||||
prof := profile
|
||||
if prof = Void then
|
||||
create prof.make
|
||||
profile := prof
|
||||
end
|
||||
prof.force (v, k)
|
||||
end
|
||||
|
||||
set_last_login_date (dt: like last_login_date)
|
||||
do
|
||||
last_login_date := dt
|
||||
end
|
||||
|
||||
set_last_login_date_now
|
||||
do
|
||||
set_last_login_date (create {DATE_TIME}.make_now_utc)
|
||||
end
|
||||
|
||||
feature {CMS_STORAGE} -- Security
|
||||
|
||||
encoded_password: detachable READABLE_STRING_8
|
||||
|
||||
set_encoded_password (p: like encoded_password)
|
||||
do
|
||||
encoded_password := p
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,51 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_USER_PROFILE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_USER_PROFILE
|
||||
|
||||
inherit
|
||||
TABLE_ITERABLE [READABLE_STRING_8, READABLE_STRING_8]
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
create items.make (0)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
item (k: READABLE_STRING_8): detachable READABLE_STRING_8
|
||||
do
|
||||
Result := items.item (k.as_string_8)
|
||||
end
|
||||
|
||||
feature -- Change
|
||||
|
||||
force (v: READABLE_STRING_8; k: READABLE_STRING_8)
|
||||
do
|
||||
items.force (v, k.as_string_8)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
new_cursor: TABLE_ITERATION_CURSOR [READABLE_STRING_8, READABLE_STRING_8]
|
||||
-- Fresh cursor associated with current structure
|
||||
do
|
||||
Result := items.new_cursor
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
items: HASH_TABLE [READABLE_STRING_8, STRING_8]
|
||||
|
||||
invariant
|
||||
|
||||
end
|
||||
@@ -1,85 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_USER_ROLE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_USER_ROLE
|
||||
|
||||
inherit
|
||||
ANY
|
||||
redefine
|
||||
is_equal
|
||||
end
|
||||
|
||||
create
|
||||
make,
|
||||
make_with_id
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make_with_id (a_id: like id; a_name: like name)
|
||||
do
|
||||
id := a_id
|
||||
make (a_name)
|
||||
end
|
||||
|
||||
make (a_name: like name)
|
||||
do
|
||||
name := a_name
|
||||
create {ARRAYED_LIST [READABLE_STRING_8]} permissions.make (0)
|
||||
end
|
||||
|
||||
feature -- Status report
|
||||
|
||||
has_id: BOOLEAN
|
||||
do
|
||||
Result := id > 0
|
||||
end
|
||||
|
||||
has_permission (p: READABLE_STRING_8): BOOLEAN
|
||||
do
|
||||
Result := across permissions as c some c.item.is_case_insensitive_equal (p) end
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
id: INTEGER
|
||||
|
||||
name: READABLE_STRING_8
|
||||
|
||||
permissions: LIST [READABLE_STRING_8]
|
||||
|
||||
feature -- Comparison
|
||||
|
||||
same_user_role (r: CMS_USER_ROLE): BOOLEAN
|
||||
do
|
||||
Result := r.id = id
|
||||
end
|
||||
|
||||
is_equal (other: like Current): BOOLEAN
|
||||
-- Is `other' attached to an object considered
|
||||
-- equal to current object?
|
||||
do
|
||||
Result := id = other.id
|
||||
end
|
||||
|
||||
feature -- Change
|
||||
|
||||
set_id (a_id: like id)
|
||||
do
|
||||
id := a_id
|
||||
end
|
||||
|
||||
set_name (a_name: like name)
|
||||
do
|
||||
name := a_name
|
||||
end
|
||||
|
||||
add_permission (n: READABLE_STRING_8)
|
||||
do
|
||||
permissions.force (n)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,32 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_BLOCK}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_BLOCK
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: READABLE_STRING_8
|
||||
deferred
|
||||
end
|
||||
|
||||
title: detachable READABLE_STRING_32
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- status report
|
||||
|
||||
is_enabled: BOOLEAN
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
to_html (a_theme: CMS_THEME): STRING_8
|
||||
deferred
|
||||
end
|
||||
|
||||
invariant
|
||||
|
||||
end
|
||||
@@ -1,46 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_CONTENT_BLOCK}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_CONTENT_BLOCK
|
||||
|
||||
inherit
|
||||
CMS_BLOCK
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_name: like name; a_title: like title; a_body: like body; a_format: like format)
|
||||
do
|
||||
is_enabled := True
|
||||
name := a_name
|
||||
title := a_title
|
||||
body := a_body
|
||||
format := a_format
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: READABLE_STRING_8
|
||||
|
||||
title: detachable READABLE_STRING_32
|
||||
|
||||
body: READABLE_STRING_8
|
||||
|
||||
format: CMS_FORMAT
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
to_html (a_theme: CMS_THEME): STRING_8
|
||||
do
|
||||
Result := format.to_html (body)
|
||||
end
|
||||
|
||||
invariant
|
||||
|
||||
end
|
||||
@@ -1,60 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_CONTENT_TYPE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_CONTENT_TYPE
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: READABLE_STRING_8
|
||||
-- Internal name
|
||||
deferred
|
||||
end
|
||||
|
||||
title: READABLE_STRING_8
|
||||
deferred
|
||||
end
|
||||
|
||||
description: detachable READABLE_STRING_8
|
||||
-- Optional description
|
||||
deferred
|
||||
end
|
||||
|
||||
available_formats: LIST [CMS_FORMAT]
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- Factory
|
||||
|
||||
fill_edit_form (f: CMS_FORM; a_node: detachable CMS_NODE)
|
||||
-- Fill the edit form `f'
|
||||
deferred
|
||||
end
|
||||
|
||||
change_node (a_execution: CMS_EXECUTION; a_form_data: WSF_FORM_DATA; a_node: like new_node)
|
||||
-- Apply data from `a_form_data' to a_node
|
||||
require
|
||||
a_node.has_id
|
||||
deferred
|
||||
end
|
||||
|
||||
new_node (a_execution: CMS_EXECUTION; a_form_data: WSF_FORM_DATA; a_node: detachable like new_node): CMS_NODE
|
||||
-- New content created with `a_form_data'
|
||||
deferred
|
||||
ensure
|
||||
a_node /= Void implies a_node = Result
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation: helper
|
||||
|
||||
formats: CMS_FORMATS
|
||||
once
|
||||
create Result
|
||||
end
|
||||
|
||||
invariant
|
||||
|
||||
end
|
||||
@@ -1,45 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_MENU_BLOCK}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_MENU_BLOCK
|
||||
|
||||
inherit
|
||||
CMS_BLOCK
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_menu: like menu)
|
||||
do
|
||||
is_enabled := True
|
||||
menu := a_menu
|
||||
name := a_menu.name
|
||||
title := a_menu.title
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
menu: CMS_MENU
|
||||
|
||||
name: READABLE_STRING_8
|
||||
|
||||
title: detachable READABLE_STRING_32
|
||||
|
||||
is_horizontal: BOOLEAN
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
to_html (a_theme: CMS_THEME): STRING_8
|
||||
do
|
||||
Result := a_theme.menu_html (menu, is_horizontal)
|
||||
end
|
||||
|
||||
invariant
|
||||
|
||||
end
|
||||
@@ -1,101 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {WSF_CMS_NODE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_NODE
|
||||
|
||||
feature -- Access
|
||||
|
||||
id: INTEGER
|
||||
-- Unique identifier of Current.
|
||||
|
||||
title: detachable READABLE_STRING_32
|
||||
-- Associated title (optional).
|
||||
deferred
|
||||
end
|
||||
|
||||
body: detachable READABLE_STRING_8
|
||||
-- Body of Current.
|
||||
deferred
|
||||
end
|
||||
|
||||
format: CMS_FORMAT
|
||||
-- Format associated with `body'
|
||||
deferred
|
||||
end
|
||||
|
||||
content_type_name: STRING
|
||||
-- Associated content type name
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- status report
|
||||
|
||||
has_id: BOOLEAN
|
||||
do
|
||||
Result := id > 0
|
||||
end
|
||||
|
||||
feature -- Access: status
|
||||
|
||||
author: detachable CMS_USER
|
||||
|
||||
creation_date: DATE_TIME
|
||||
|
||||
modification_date: DATE_TIME
|
||||
|
||||
feature -- Change
|
||||
|
||||
set_id (a_id: like id)
|
||||
require
|
||||
not has_id
|
||||
do
|
||||
id := a_id
|
||||
end
|
||||
|
||||
set_author (u: like author)
|
||||
do
|
||||
author := u
|
||||
end
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
to_html (a_theme: CMS_THEME): STRING_8
|
||||
local
|
||||
d: STRING
|
||||
do
|
||||
Result := "<div class=%"node " + content_type_name + "%" id=%"nid-" + id.out + "%">"
|
||||
if attached title as l_title then
|
||||
Result.append ("<div class=%"title%">" + a_theme.node_link (Current) + "</div>")
|
||||
end
|
||||
create d.make_empty
|
||||
if attached author as u then
|
||||
d.append ("by " + a_theme.user_link (u) + " ")
|
||||
end
|
||||
if attached modification_date as dt then
|
||||
d.append ("last modified: " + dt.year.out + "/" + dt.month.out + "/" + dt.day.out + "")
|
||||
end
|
||||
if not d.is_empty then
|
||||
Result.append ("<div class=%"description%">")
|
||||
Result.append (d)
|
||||
Result.append ("</div>")
|
||||
end
|
||||
if attached body as b then
|
||||
Result.append ("<div class=%"inner%">")
|
||||
Result.append (format.to_html (b))
|
||||
Result.append ("</div>")
|
||||
end
|
||||
Result.append ("</div>")
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation: helper
|
||||
|
||||
formats: CMS_FORMATS
|
||||
once
|
||||
create Result
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,44 +0,0 @@
|
||||
note
|
||||
description : "[
|
||||
Filtered html format
|
||||
]"
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
|
||||
class
|
||||
CMS_FILTERED_HTML_FORMAT
|
||||
|
||||
inherit
|
||||
CMS_FORMAT
|
||||
redefine
|
||||
default_create
|
||||
end
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
default_create
|
||||
do
|
||||
Precursor
|
||||
create filters.make (3)
|
||||
filters.force (create {CMS_URL_FILTER})
|
||||
filters.force (create {CMS_HTML_FILTER})
|
||||
filters.force (create {CMS_LINE_BREAK_CONVERTER_FILTER})
|
||||
|
||||
-- help := "<ul><li>Web page addresses and e-mail addresses turn into links automatically.</li><li>Allowed HTML tags: "
|
||||
-- across
|
||||
-- allowed_html_tags as c
|
||||
-- loop
|
||||
-- help.append ("<" + c.item + "> ")
|
||||
-- end
|
||||
-- help.append ("</li><li>Lines and paragraphs break automatically.</li></ul>")
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING = "filtered_html"
|
||||
|
||||
title: STRING_8 = "Filtered HTML"
|
||||
|
||||
filters: ARRAYED_LIST [CMS_FILTER]
|
||||
|
||||
end
|
||||
@@ -1,46 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {WSF_CMS_FORMAT}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_FORMAT
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING
|
||||
deferred
|
||||
end
|
||||
|
||||
title: READABLE_STRING_8
|
||||
deferred
|
||||
end
|
||||
|
||||
help: STRING
|
||||
do
|
||||
create Result.make (0)
|
||||
across
|
||||
filters as c
|
||||
loop
|
||||
if attached c.item.help as h and then not h.is_empty then
|
||||
Result.append ("<li>" + h + "</li>")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
filters: LIST [CMS_FILTER]
|
||||
deferred
|
||||
end
|
||||
|
||||
to_html (a_text: READABLE_STRING_8): STRING_8
|
||||
do
|
||||
create Result.make_from_string (a_text)
|
||||
across
|
||||
filters as c
|
||||
loop
|
||||
c.item.filter (Result)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,54 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_FORMATS}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_FORMATS
|
||||
|
||||
feature -- Access
|
||||
|
||||
format (a_name: like {CMS_FORMAT}.name): detachable CMS_FORMAT
|
||||
do
|
||||
across
|
||||
all_formats as c
|
||||
until
|
||||
Result /= Void
|
||||
loop
|
||||
if c.item.name.same_string (a_name) then
|
||||
Result := c.item
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
all_formats: LIST [CMS_FORMAT]
|
||||
once
|
||||
create {ARRAYED_LIST [CMS_FORMAT]} Result.make (3)
|
||||
Result.force (plain_text)
|
||||
Result.force (full_html)
|
||||
Result.force (filtered_html)
|
||||
end
|
||||
|
||||
default_format: CMS_FORMAT
|
||||
do
|
||||
Result := plain_text --FIXME
|
||||
end
|
||||
|
||||
plain_text: CMS_PLAIN_TEXT_FORMAT
|
||||
once
|
||||
create Result
|
||||
end
|
||||
|
||||
full_html: CMS_FULL_HTML_FORMAT
|
||||
once
|
||||
create Result
|
||||
end
|
||||
|
||||
filtered_html: CMS_FILTERED_HTML_FORMAT
|
||||
once
|
||||
create Result
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@@ -1,35 +0,0 @@
|
||||
note
|
||||
description : "[
|
||||
Full html format
|
||||
]"
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
|
||||
class
|
||||
CMS_FULL_HTML_FORMAT
|
||||
|
||||
inherit
|
||||
CMS_FORMAT
|
||||
redefine
|
||||
default_create
|
||||
end
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
default_create
|
||||
do
|
||||
Precursor
|
||||
create filters.make (2)
|
||||
filters.force (create {CMS_URL_FILTER})
|
||||
filters.force (create {CMS_LINE_BREAK_CONVERTER_FILTER})
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING = "full_html"
|
||||
|
||||
title: STRING_8 = "Full HTML"
|
||||
|
||||
filters: ARRAYED_LIST [CMS_FILTER]
|
||||
|
||||
end
|
||||
@@ -1,49 +0,0 @@
|
||||
note
|
||||
description : "[
|
||||
Plain Text format
|
||||
]"
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
|
||||
class
|
||||
CMS_PLAIN_TEXT_FORMAT
|
||||
|
||||
inherit
|
||||
CMS_FORMAT
|
||||
redefine
|
||||
default_create,
|
||||
help
|
||||
end
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
default_create
|
||||
do
|
||||
Precursor
|
||||
create filters.make (2)
|
||||
filters.force (create {CMS_HTML_TO_TEXT_FILTER})
|
||||
filters.force (create {CMS_LINE_BREAK_CONVERTER_FILTER})
|
||||
end
|
||||
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING = "plain_text"
|
||||
|
||||
title: STRING_8 = "Plain text"
|
||||
|
||||
help: STRING
|
||||
do
|
||||
Result := "<li>No HTML tags allowed.</li>"
|
||||
Result.append (Precursor)
|
||||
end
|
||||
-- <ul>
|
||||
-- <li>No HTML tags allowed.</li>
|
||||
-- <li>Web page addresses and e-mail addresses turn into links automatically.</li>
|
||||
-- <li>Lines and paragraphs break automatically.</li>
|
||||
-- </ul>
|
||||
-- ]"
|
||||
|
||||
filters: ARRAYED_LIST [CMS_FILTER]
|
||||
|
||||
end
|
||||
@@ -1,35 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_FILTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_FILTER
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: READABLE_STRING_8
|
||||
deferred
|
||||
end
|
||||
|
||||
title: READABLE_STRING_8
|
||||
deferred
|
||||
end
|
||||
|
||||
description: READABLE_STRING_8
|
||||
deferred
|
||||
end
|
||||
|
||||
help: READABLE_STRING_8
|
||||
do
|
||||
Result := description
|
||||
end
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
filter (s: STRING_8)
|
||||
deferred
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,128 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HTML_FILTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_HTML_FILTER
|
||||
|
||||
inherit
|
||||
CMS_FILTER
|
||||
redefine
|
||||
default_create
|
||||
end
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
default_create
|
||||
do
|
||||
Precursor
|
||||
allowed_html_tags := <<"a", "em", "strong", "cite", "blockquote", "code", "ul", "ol", "li", "dl">>
|
||||
description := "Allowed HTML tags: "
|
||||
across
|
||||
allowed_html_tags as c
|
||||
loop
|
||||
description.append ("<" + c.item + "> ")
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING_8 = "html_filter"
|
||||
|
||||
title: STRING_8 = "HTML filter"
|
||||
|
||||
description: STRING_8
|
||||
|
||||
allowed_html_tags: ITERABLE [READABLE_STRING_8]
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
filter (a_text: STRING_8)
|
||||
local
|
||||
l_new: STRING_8
|
||||
i: INTEGER
|
||||
n: INTEGER
|
||||
in_tag: BOOLEAN
|
||||
p1, p2: INTEGER
|
||||
do
|
||||
create l_new.make (a_text.count)
|
||||
from
|
||||
p1 := 1
|
||||
i := a_text.index_of ('<', 1)
|
||||
if i > 0 then
|
||||
l_new.append (a_text.substring (1, i - 1))
|
||||
end
|
||||
n := a_text.count
|
||||
until
|
||||
i = 0 or i > n
|
||||
loop
|
||||
if a_text[i] = '<' then
|
||||
in_tag := True
|
||||
p1 := i
|
||||
p2 := a_text.index_of ('>', i + 1)
|
||||
if p2 = 0 then
|
||||
-- next '<'
|
||||
i := a_text.index_of ('<', i + 1)
|
||||
if i > 0 then
|
||||
l_new.append (a_text.substring (p1, i - 1))
|
||||
end
|
||||
else
|
||||
if is_authorized (a_text.substring (p1, p2)) then
|
||||
l_new.append (a_text.substring (p1, p2))
|
||||
i := a_text.index_of ('<', p2 + 1)
|
||||
else
|
||||
i := a_text.index_of ('<', p2 + 1)
|
||||
end
|
||||
if i = 0 then
|
||||
p1 := p2 + 1
|
||||
else
|
||||
l_new.append (a_text.substring (p2 + 1, i - 1))
|
||||
end
|
||||
end
|
||||
else
|
||||
i := i + 1
|
||||
end
|
||||
end
|
||||
l_new.append (a_text.substring (p1, n))
|
||||
a_text.wipe_out
|
||||
a_text.append (l_new)
|
||||
end
|
||||
|
||||
is_authorized (s: READABLE_STRING_8): BOOLEAN
|
||||
-- Is `s' authorized?
|
||||
--| `s' has either "<....>" or "<..../>" or "</.....>"
|
||||
local
|
||||
l_tagname: detachable STRING
|
||||
i,n,p1: INTEGER
|
||||
do
|
||||
-- create l_tagname.make_empty
|
||||
from
|
||||
i := 2 -- skip first '<'
|
||||
n := s.count
|
||||
until
|
||||
i > n or l_tagname /= Void
|
||||
loop
|
||||
if p1 > 0 then
|
||||
if s[i].is_space or s[i] = '/' or s[i] = '>' then
|
||||
l_tagname := s.substring (p1, i - 1)
|
||||
end
|
||||
else
|
||||
if s[i].is_space or s[i] = '/' then
|
||||
else
|
||||
p1 := i
|
||||
end
|
||||
end
|
||||
i := i + 1
|
||||
end
|
||||
if l_tagname /= Void then
|
||||
l_tagname.to_lower
|
||||
Result := across allowed_html_tags as c some c.item.same_string (l_tagname) end
|
||||
else
|
||||
Result := True
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@@ -1,34 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HTML_TO_TEXT_FILTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_HTML_TO_TEXT_FILTER
|
||||
|
||||
inherit
|
||||
CMS_FILTER
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING_8 = "html_to_text"
|
||||
|
||||
title: STRING_8 = "HTML to text"
|
||||
|
||||
description: STRING_8 = "Replaces HTML tags and entities with plain text formatting, moving links at the end. This filter is just for text messages and it isn't safe for rendering content on a web page."
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
filter (a_text: STRING_8)
|
||||
local
|
||||
enc: HTML_ENCODER
|
||||
s: STRING_8
|
||||
do
|
||||
create enc
|
||||
s := enc.encoded_string (a_text)
|
||||
a_text.wipe_out
|
||||
a_text.append (s)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,34 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_HTML_FILTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_LINE_BREAK_CONVERTER_FILTER
|
||||
|
||||
inherit
|
||||
CMS_FILTER
|
||||
redefine
|
||||
help
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING_8 = "line_break_converter"
|
||||
|
||||
title: STRING_8 = "Line break converter"
|
||||
|
||||
help: STRING = "Lines and paragraphs break automatically"
|
||||
|
||||
description: STRING_8 = "Converts line breaks into HTML (i.e. <br> and <p> tags)."
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
filter (a_text: STRING_8)
|
||||
do
|
||||
a_text.replace_substring_all ("%N", "<br/>%N")
|
||||
-- FIXME jfiat [2012/09/12] :also use <p> ...
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,77 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_NO_HTML_FILTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_NO_HTML_FILTER
|
||||
|
||||
inherit
|
||||
CMS_FILTER
|
||||
redefine
|
||||
default_create
|
||||
end
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
default_create
|
||||
do
|
||||
Precursor
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING_8 = "no_html_filter"
|
||||
|
||||
title: STRING_8 = "No HTML filter"
|
||||
|
||||
description: STRING_8 = "HTML tags removed! "
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
filter (a_text: STRING_8)
|
||||
local
|
||||
l_new: STRING_8
|
||||
i: INTEGER
|
||||
n: INTEGER
|
||||
in_tag: BOOLEAN
|
||||
p1, p2: INTEGER
|
||||
do
|
||||
create l_new.make (a_text.count)
|
||||
from
|
||||
p1 := 1
|
||||
i := a_text.index_of ('<', 1)
|
||||
if i > 0 then
|
||||
l_new.append (a_text.substring (1, i - 1))
|
||||
end
|
||||
n := a_text.count
|
||||
until
|
||||
i = 0 or i > n
|
||||
loop
|
||||
if a_text[i] = '<' then
|
||||
in_tag := True
|
||||
p1 := i
|
||||
p2 := a_text.index_of ('>', i + 1)
|
||||
if p2 = 0 then
|
||||
-- next '<'
|
||||
i := a_text.index_of ('<', i + 1)
|
||||
if i > 0 then
|
||||
l_new.append (a_text.substring (p1, i - 1))
|
||||
end
|
||||
else
|
||||
i := a_text.index_of ('<', p2 + 1)
|
||||
if i > 0 then
|
||||
l_new.append (a_text.substring (p2 + 1, i - 1))
|
||||
end
|
||||
end
|
||||
else
|
||||
i := i + 1
|
||||
end
|
||||
end
|
||||
l_new.append (a_text.substring (p1, n))
|
||||
a_text.wipe_out
|
||||
a_text.append (l_new)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,33 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_URL_FILTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_URL_FILTER
|
||||
|
||||
inherit
|
||||
CMS_FILTER
|
||||
redefine
|
||||
help
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING_8 = "url"
|
||||
|
||||
title: STRING_8 = "URL filter"
|
||||
|
||||
description: STRING_8 = "Turns web and e-mail addresses into clickable links."
|
||||
|
||||
help: STRING = "Web page addresses and e-mail addresses turn into links automatically."
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
filter (a_text: STRING_8)
|
||||
do
|
||||
--| FIXME jfiat [2012/09/12] : todo
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,38 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_EXTERNAL_MENU}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_EXTERNAL_LINK
|
||||
|
||||
inherit
|
||||
CMS_LINK
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_title: like title; a_location: like location)
|
||||
do
|
||||
title := a_title
|
||||
location := a_location
|
||||
end
|
||||
|
||||
feature -- Status report
|
||||
|
||||
is_active: BOOLEAN = False
|
||||
|
||||
is_expanded: BOOLEAN = False
|
||||
|
||||
is_expandable: BOOLEAN = False
|
||||
|
||||
has_children: BOOLEAN = False
|
||||
|
||||
children: detachable LIST [CMS_LINK]
|
||||
do
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,71 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_MENU}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_LINK
|
||||
|
||||
inherit
|
||||
REFACTORING_HELPER
|
||||
|
||||
DEBUG_OUTPUT
|
||||
|
||||
ITERABLE [CMS_LINK]
|
||||
|
||||
feature -- Access
|
||||
|
||||
title: READABLE_STRING_32
|
||||
|
||||
location: READABLE_STRING_8
|
||||
|
||||
options: detachable CMS_API_OPTIONS
|
||||
|
||||
feature -- status report
|
||||
|
||||
is_active: BOOLEAN
|
||||
deferred
|
||||
end
|
||||
|
||||
is_expanded: BOOLEAN
|
||||
deferred
|
||||
end
|
||||
|
||||
is_expandable: BOOLEAN
|
||||
deferred
|
||||
end
|
||||
|
||||
has_children: BOOLEAN
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- Query
|
||||
|
||||
parent: detachable CMS_LINK
|
||||
|
||||
children: detachable LIST [CMS_LINK]
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
new_cursor: ITERATION_CURSOR [CMS_LINK]
|
||||
-- Fresh cursor associated with current structure
|
||||
do
|
||||
if attached children as lst then
|
||||
Result := lst.new_cursor
|
||||
else
|
||||
Result := (create {ARRAYED_LIST [CMS_LINK]}.make (0)).new_cursor
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Status report
|
||||
|
||||
debug_output: STRING
|
||||
-- String that should be displayed in debugger to represent `Current'.
|
||||
do
|
||||
Result := title.as_string_8 + " -> " + location
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,27 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_LINK_COMPOSITE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_LINK_COMPOSITE
|
||||
|
||||
inherit
|
||||
ITERABLE [CMS_LINK]
|
||||
|
||||
feature -- Access
|
||||
|
||||
items: detachable LIST [CMS_LINK]
|
||||
deferred
|
||||
end
|
||||
|
||||
extend (lnk: CMS_LINK)
|
||||
deferred
|
||||
end
|
||||
|
||||
remove (lnk: CMS_LINK)
|
||||
deferred
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,129 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_LOCAL_MENU}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_LOCAL_LINK
|
||||
|
||||
inherit
|
||||
CMS_LINK
|
||||
|
||||
CMS_LINK_COMPOSITE
|
||||
rename
|
||||
items as children,
|
||||
extend as add_link,
|
||||
remove as remove_link
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_title: detachable like title; a_location: like location)
|
||||
do
|
||||
if a_title /= Void then
|
||||
title := a_title
|
||||
else
|
||||
title := a_location
|
||||
end
|
||||
location := a_location
|
||||
end
|
||||
|
||||
feature -- Status report
|
||||
|
||||
is_active: BOOLEAN
|
||||
|
||||
is_expanded: BOOLEAN
|
||||
do
|
||||
Result := is_expandable and then internal_is_expanded
|
||||
end
|
||||
|
||||
is_expandable: BOOLEAN
|
||||
do
|
||||
Result := internal_is_expandable or internal_is_expanded or has_children
|
||||
end
|
||||
|
||||
has_children: BOOLEAN
|
||||
do
|
||||
Result := attached children as l_children and then not l_children.is_empty
|
||||
end
|
||||
|
||||
permission_arguments: detachable ITERABLE [READABLE_STRING_8]
|
||||
|
||||
children: detachable LIST [CMS_LINK]
|
||||
|
||||
internal_is_expandable: BOOLEAN
|
||||
|
||||
internal_is_expanded: BOOLEAN
|
||||
|
||||
feature -- Element change
|
||||
|
||||
add_link (lnk: CMS_LINK)
|
||||
local
|
||||
lst: like children
|
||||
do
|
||||
lst := children
|
||||
if lst = Void then
|
||||
create {ARRAYED_LIST [CMS_LINK]} lst.make (1)
|
||||
children := lst
|
||||
end
|
||||
lst.force (lnk)
|
||||
end
|
||||
|
||||
remove_link (lnk: CMS_LINK)
|
||||
local
|
||||
lst: like children
|
||||
do
|
||||
lst := children
|
||||
if lst /= Void then
|
||||
lst.prune_all (lnk)
|
||||
if lst.is_empty then
|
||||
children := Void
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
set_children (lst: like children)
|
||||
do
|
||||
children := lst
|
||||
end
|
||||
|
||||
set_expanded (b: like is_expanded)
|
||||
do
|
||||
internal_is_expanded := b
|
||||
end
|
||||
|
||||
set_expandable (b: like is_expandable)
|
||||
do
|
||||
internal_is_expandable := b
|
||||
end
|
||||
|
||||
get_is_active (req: WSF_REQUEST)
|
||||
local
|
||||
qs: STRING
|
||||
do
|
||||
create qs.make_from_string (req.path_info)
|
||||
is_active := qs.same_string (location)
|
||||
if not is_active then
|
||||
if attached req.query_string as l_query_string and then not l_query_string.is_empty then
|
||||
qs.append_character ('?')
|
||||
qs.append (l_query_string)
|
||||
end
|
||||
is_active := qs.same_string (location)
|
||||
end
|
||||
end
|
||||
|
||||
set_permission_arguments (args: like permission_arguments)
|
||||
do
|
||||
permission_arguments := args
|
||||
end
|
||||
|
||||
set_options (opts: like options)
|
||||
do
|
||||
options := opts
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,73 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_MENU}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_MENU
|
||||
|
||||
inherit
|
||||
CMS_LINK_COMPOSITE
|
||||
|
||||
create
|
||||
make,
|
||||
make_with_title
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_name: like name; n: INTEGER)
|
||||
do
|
||||
name := a_name
|
||||
create items.make (n)
|
||||
end
|
||||
|
||||
make_with_title (a_name: like name; a_title: READABLE_STRING_32; n: INTEGER)
|
||||
do
|
||||
make (a_name, n)
|
||||
set_title (a_title)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: READABLE_STRING_8
|
||||
|
||||
title: detachable READABLE_STRING_32
|
||||
|
||||
items: ARRAYED_LIST [CMS_LINK]
|
||||
|
||||
extend (lnk: CMS_LINK)
|
||||
do
|
||||
items.extend (lnk)
|
||||
end
|
||||
|
||||
remove (lnk: CMS_LINK)
|
||||
do
|
||||
items.prune_all (lnk)
|
||||
end
|
||||
|
||||
feature -- status report
|
||||
|
||||
is_empty: BOOLEAN
|
||||
do
|
||||
Result := items.is_empty
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_title (t: like title)
|
||||
do
|
||||
title := t
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
new_cursor: ITERATION_CURSOR [CMS_LINK]
|
||||
-- Fresh cursor associated with current structure
|
||||
do
|
||||
Result := items.new_cursor
|
||||
end
|
||||
|
||||
invariant
|
||||
|
||||
end
|
||||
@@ -1,88 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_MENU_SYSTEM}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_MENU_SYSTEM
|
||||
|
||||
inherit
|
||||
ITERABLE [CMS_MENU]
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
create items.make (5)
|
||||
force (create {CMS_MENU}.make ("main-menu", 3))
|
||||
force (create {CMS_MENU}.make_with_title ("management", "Management", 3))
|
||||
force (create {CMS_MENU}.make_with_title ("navigation", "Navigation", 3))
|
||||
force (create {CMS_MENU}.make_with_title ("user", "User", 3))
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
item (n: like {CMS_MENU}.name): CMS_MENU
|
||||
local
|
||||
m: detachable CMS_MENU
|
||||
do
|
||||
m := items.item (n)
|
||||
if m = Void then
|
||||
create m.make (n, 3)
|
||||
force (m)
|
||||
end
|
||||
Result := m
|
||||
end
|
||||
|
||||
main_menu: CMS_MENU
|
||||
do
|
||||
Result := item ("main-menu")
|
||||
end
|
||||
|
||||
management_menu: CMS_MENU
|
||||
do
|
||||
Result := item ("management")
|
||||
end
|
||||
|
||||
navigation_menu: CMS_MENU
|
||||
do
|
||||
Result := item ("navigation")
|
||||
end
|
||||
|
||||
user_menu: CMS_MENU
|
||||
do
|
||||
Result := item ("user")
|
||||
end
|
||||
|
||||
primary_tabs: CMS_MENU
|
||||
do
|
||||
Result := item ("primary-tabs")
|
||||
end
|
||||
|
||||
feature -- Change
|
||||
|
||||
force (m: CMS_MENU)
|
||||
do
|
||||
items.force (m, m.name)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
new_cursor: ITERATION_CURSOR [CMS_MENU]
|
||||
-- Fresh cursor associated with current structure
|
||||
do
|
||||
Result := items.new_cursor
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
items: HASH_TABLE [CMS_MENU, like {CMS_MENU}.name]
|
||||
-- items: ARRAYED_LIST [CMS_MENU]
|
||||
|
||||
invariant
|
||||
|
||||
end
|
||||
@@ -1,17 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_PAGER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_PAGER
|
||||
|
||||
inherit
|
||||
WSF_WIDGET_PAGER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
|
||||
end
|
||||
@@ -1,152 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_LOG}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_LOG
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_category: like category; a_message: like message; a_level: like level; a_date: detachable like date)
|
||||
do
|
||||
category := a_category
|
||||
message := a_message
|
||||
set_level (a_level)
|
||||
if a_date = Void then
|
||||
create date.make_now_utc
|
||||
else
|
||||
date := a_date
|
||||
end
|
||||
end
|
||||
|
||||
make_with_id (a_id: like id; a_category: like category; a_message: like message; a_level: like level; a_date: detachable like date)
|
||||
do
|
||||
id := a_id
|
||||
make (a_category, a_message, a_level, a_date)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
id: INTEGER
|
||||
-- Unique identifier of Current.
|
||||
|
||||
category: READABLE_STRING_8
|
||||
-- Associated title (optional).
|
||||
|
||||
message: READABLE_STRING_8
|
||||
-- Log message
|
||||
|
||||
level: INTEGER
|
||||
-- Severity level
|
||||
|
||||
level_name: STRING
|
||||
do
|
||||
Result := level_to_string (level)
|
||||
end
|
||||
|
||||
info: detachable READABLE_STRING_8
|
||||
|
||||
link: detachable CMS_LINK
|
||||
|
||||
date: DATE_TIME
|
||||
|
||||
feature -- status report
|
||||
|
||||
has_id: BOOLEAN
|
||||
do
|
||||
Result := id > 0
|
||||
end
|
||||
|
||||
feature -- Change
|
||||
|
||||
set_id (a_id: like id)
|
||||
require
|
||||
not has_id
|
||||
do
|
||||
id := a_id
|
||||
end
|
||||
|
||||
set_level (a_level: like level)
|
||||
do
|
||||
if a_level = 0 then
|
||||
level := level_notice
|
||||
else
|
||||
level := a_level
|
||||
end
|
||||
end
|
||||
|
||||
set_link (lnk: like link)
|
||||
do
|
||||
link := lnk
|
||||
end
|
||||
|
||||
set_info (inf: like info)
|
||||
do
|
||||
info := inf
|
||||
end
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
to_html (a_theme: WSF_THEME): STRING_8
|
||||
do
|
||||
Result := "<div class=%"log " + category + " " + level_name + "%" id=%"log-" + id.out + "%">"
|
||||
Result.append ("<div class=%"inner%">")
|
||||
Result.append (message)
|
||||
if attached info as l_info then
|
||||
Result.append ("<br/><strong>Information:</strong> ")
|
||||
Result.append (l_info)
|
||||
end
|
||||
if attached link as lnk then
|
||||
Result.append ("<br/><strong>Associated link:</strong> ")
|
||||
Result.append (a_theme.link (lnk.title, lnk.location, lnk.options))
|
||||
end
|
||||
Result.append ("</div>")
|
||||
Result.append ("<div class=%"description%">")
|
||||
Result.append ("(date: " + date.year.out + "/" + date.month.out + "/" + date.day.out + ")")
|
||||
Result.append ("</div>")
|
||||
|
||||
Result.append ("</div>")
|
||||
end
|
||||
|
||||
feature -- Constants
|
||||
|
||||
level_to_string (a_level: INTEGER): STRING
|
||||
do
|
||||
inspect a_level
|
||||
when level_emergency then
|
||||
Result := "emergency"
|
||||
when level_alert then
|
||||
Result := "alert"
|
||||
when level_critical then
|
||||
Result := "critical"
|
||||
when level_error then
|
||||
Result := "error"
|
||||
when level_warning then
|
||||
Result := "warning"
|
||||
when level_notice then
|
||||
Result := "notice"
|
||||
when level_info then
|
||||
Result := "info"
|
||||
when level_debug then
|
||||
Result := "debug"
|
||||
else
|
||||
Result := "level-" + a_level.out
|
||||
end
|
||||
end
|
||||
|
||||
level_emergency: INTEGER = 1
|
||||
level_alert: INTEGER = 2
|
||||
level_critical: INTEGER = 3
|
||||
level_error: INTEGER = 4
|
||||
level_warning: INTEGER = 5
|
||||
level_notice: INTEGER = 6
|
||||
level_info: INTEGER = 7
|
||||
level_debug: INTEGER = 8
|
||||
|
||||
|
||||
|
||||
end
|
||||
@@ -1,57 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {ADMIN_BLOCKS_CMS_EXECUTION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ADMIN_BLOCKS_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
do
|
||||
set_title ("Blocks")
|
||||
-- check Permission !!!
|
||||
create b.make_empty
|
||||
if has_permission ("administrate blocks") then
|
||||
b.append ("<ul id=%"block-list%">")
|
||||
across
|
||||
blocks as c
|
||||
loop
|
||||
if attached c.item as b_info then
|
||||
if b_info.block.is_enabled then
|
||||
b.append ("<li class=%"enabled%">")
|
||||
else
|
||||
b.append ("<li class=%"disabled%">")
|
||||
end
|
||||
b.append ("<strong>" + b_info.name + "</strong> (region=" + b_info.region + ")")
|
||||
if b_info.block.is_enabled then
|
||||
b.append (" [<a href=%"%">disable</a>]")
|
||||
else
|
||||
b.append (" [<a href=%"%">enable</a>]")
|
||||
end
|
||||
if attached b_info.block.title as l_title then
|
||||
b.append ("<div>title=<em>" + l_title + "</em></div>")
|
||||
end
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
b.append ("</ul>")
|
||||
else
|
||||
b.append ("<div class=%"denied%">Access denied</div>")
|
||||
end
|
||||
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,46 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_ADMIN_EXECUTION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ADMIN_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
do
|
||||
set_title ("Administration")
|
||||
-- check Permission !!!
|
||||
create b.make_empty
|
||||
if has_permission ("administrate modules") then
|
||||
b.append ("<li>" + link ("Modules", "/admin/modules/", Void) + "</li>")
|
||||
end
|
||||
if has_permission ("administrate blocks") then
|
||||
b.append ("<li>" + link ("Blocks", "/admin/blocks/", Void) + "</li>")
|
||||
end
|
||||
if has_permission ("administrate user-roles") then
|
||||
b.append ("<li>" + link ("User roles", "/admin/roles/", Void) + "</li>")
|
||||
end
|
||||
if has_permission ("administrate users") then
|
||||
b.append ("<li>" + link ("Users", "/admin/users/", Void) + "</li>")
|
||||
end
|
||||
if has_permission ("administrate logs") then
|
||||
b.append ("<li>" + link ("Logs", "/admin/logs/", Void) + "</li>")
|
||||
end
|
||||
|
||||
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,47 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {ADMIN_LOGS_CMS_EXECUTION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ADMIN_LOGS_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
do
|
||||
set_title ("Logs")
|
||||
-- check Permission !!!
|
||||
create b.make_empty
|
||||
if has_permission ("admin logs") then
|
||||
b.append ("<ul id=%"log-list%">")
|
||||
across
|
||||
storage.recent_logs (1, 25) as c
|
||||
loop
|
||||
if attached c.item as l_log then
|
||||
b.append ("<li class=%"log%">")
|
||||
b.append (link ("[" + l_log.id.out + "]", "/admin/log/" + l_log.id.out, Void))
|
||||
b.append (" <strong>" + l_log.category + "</strong> (level=" + l_log.level_name + ")")
|
||||
b.append (": " + truncated_string (l_log.message, 60, "..."))
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
b.append ("</ul>")
|
||||
else
|
||||
b.append ("<div class=%"denied%">Access denied</div>")
|
||||
end
|
||||
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,112 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {ADMIN_MODULE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ADMIN_MODULE
|
||||
|
||||
inherit
|
||||
CMS_MODULE
|
||||
redefine
|
||||
permissions
|
||||
end
|
||||
|
||||
CMS_HOOK_MENU_ALTER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
name := "admin"
|
||||
version := "1.0"
|
||||
description := "Set of service to administrate the site"
|
||||
package := "core"
|
||||
|
||||
enable
|
||||
end
|
||||
|
||||
feature {CMS_SERVICE} -- Registration
|
||||
|
||||
service: detachable CMS_SERVICE
|
||||
|
||||
register (a_service: CMS_SERVICE)
|
||||
do
|
||||
service := a_service
|
||||
a_service.map_uri ("/admin/", agent handle_admin (a_service, ?, ?))
|
||||
a_service.map_uri ("/admin/users/", agent handle_admin_users (a_service, ?, ?))
|
||||
a_service.map_uri ("/admin/roles/", agent handle_admin_user_roles (a_service, ?, ?))
|
||||
a_service.map_uri ("/admin/blocks/", agent handle_admin_blocks (a_service, ?, ?))
|
||||
a_service.map_uri ("/admin/modules/", agent handle_admin_modules (a_service, ?, ?))
|
||||
a_service.map_uri ("/admin/logs/", agent handle_admin_logs (a_service, ?, ?))
|
||||
a_service.map_uri_template ("/admin/log/{log-id}", agent handle_admin_log_view (a_service, ?, ?))
|
||||
|
||||
a_service.add_menu_alter_hook (Current)
|
||||
end
|
||||
|
||||
feature -- Hooks
|
||||
|
||||
menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_execution: CMS_EXECUTION)
|
||||
local
|
||||
lnk: CMS_LOCAL_LINK
|
||||
do
|
||||
create lnk.make ("Administer", "/admin/")
|
||||
lnk.set_permission_arguments (<<"administer">>)
|
||||
a_menu_system.management_menu.extend (lnk)
|
||||
end
|
||||
|
||||
permissions (a_service: CMS_SERVICE): LIST [CMS_PERMISSION]
|
||||
do
|
||||
Result := Precursor (a_service)
|
||||
Result.extend ("administer")
|
||||
Result.extend ("administer users")
|
||||
Result.extend ("administer user roles")
|
||||
Result.extend ("administer content")
|
||||
Result.extend ("administer logs")
|
||||
Result.extend ("administer blocks")
|
||||
Result.extend ("administer modules")
|
||||
end
|
||||
|
||||
feature -- Handler
|
||||
|
||||
handle_admin (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {ADMIN_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_admin_users (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {ADMIN_USERS_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_admin_user_roles (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {ADMIN_USER_ROLES_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_admin_blocks (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {ADMIN_BLOCKS_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_admin_modules (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {ADMIN_MODULES_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_admin_logs (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {ADMIN_LOGS_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_admin_log_view (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {LOG_VIEW_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@@ -1,57 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {ADMIN_MODULES_CMS_EXECUTION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ADMIN_MODULES_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
do
|
||||
set_title ("Modules")
|
||||
-- check Permission !!!
|
||||
create b.make_empty
|
||||
if has_permission ("administrate modules") then
|
||||
b.append ("<ul id=%"module-list%">")
|
||||
across
|
||||
service.modules as m
|
||||
loop
|
||||
if attached m.item as mod then
|
||||
if mod.is_enabled then
|
||||
b.append ("<li class=%"enabled%">")
|
||||
else
|
||||
b.append ("<li class=%"disabled%">")
|
||||
end
|
||||
b.append ("<strong>" + mod.name + "</strong> (version:" + mod.version + ")")
|
||||
b.append (" package=" + mod.package)
|
||||
if mod.is_enabled then
|
||||
b.append (" [<a href=%"%">disable</a>]")
|
||||
else
|
||||
b.append (" [<a href=%"%">enable</a>]")
|
||||
end
|
||||
b.append ("<pre>" + mod.description + "</pre>")
|
||||
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
b.append ("</ul>")
|
||||
else
|
||||
b.append ("<div class=%"denied%">Access denied</div>")
|
||||
end
|
||||
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,211 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {ADMIN_USER_ROLES_CMS_EXECUTION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ADMIN_USER_ROLES_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
do
|
||||
if request.is_post_request_method then
|
||||
process_post
|
||||
else
|
||||
process_get
|
||||
end
|
||||
end
|
||||
|
||||
process_get
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
f: CMS_FORM
|
||||
l_roles: LIST [CMS_USER_ROLE]
|
||||
do
|
||||
set_title ("User roles")
|
||||
-- check Permission !!!
|
||||
create b.make_empty
|
||||
if has_permission ("administrate user roles") then
|
||||
l_roles := service.storage.user_roles
|
||||
f := new_edit_form (url (request.path_info, Void), l_roles, True)
|
||||
f.append_to_html (theme, b)
|
||||
else
|
||||
b.append ("<div class=%"denied%">Access denied</div>")
|
||||
end
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
process_post
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
f: CMS_FORM
|
||||
l_roles: LIST [CMS_USER_ROLE]
|
||||
do
|
||||
set_title ("User roles")
|
||||
create b.make_empty
|
||||
|
||||
debug ("cms")
|
||||
across
|
||||
request.form_parameters as c
|
||||
loop
|
||||
b.append ("<li>")
|
||||
b.append (html_encoded (c.item.name))
|
||||
b.append ("=")
|
||||
b.append (html_encoded (c.item.string_representation))
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
|
||||
if has_permission ("administer user roles") then
|
||||
l_roles := service.storage.user_roles
|
||||
f := new_edit_form (url (request.path_info, Void), l_roles, False)
|
||||
f.submit_actions.extend (agent edit_form_submit (?, l_roles))
|
||||
f.process (Current)
|
||||
f.append_to_html (theme, b)
|
||||
else
|
||||
b.append ("<div class=%"denied%">Access denied</div>")
|
||||
end
|
||||
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
feature -- Forms
|
||||
|
||||
edit_form_submit (fd: WSF_FORM_DATA; a_roles: LIST [CMS_USER_ROLE])
|
||||
local
|
||||
l_role: CMS_USER_ROLE
|
||||
do
|
||||
if fd.item_same_string ("op", "Apply") then
|
||||
across
|
||||
a_roles as r
|
||||
loop
|
||||
if attached fd.table_item (r.item.name) as perms then
|
||||
r.item.permissions.wipe_out
|
||||
across
|
||||
perms as c
|
||||
loop
|
||||
if attached {WSF_STRING} c.item as s then
|
||||
r.item.add_permission (s.value)
|
||||
end
|
||||
end
|
||||
service.storage.save_user_role (r.item)
|
||||
end
|
||||
end
|
||||
elseif fd.item_same_string ("op", "Add role") then
|
||||
if attached fd.string_item ("new-role") as l_new_role then
|
||||
create l_role.make (l_new_role)
|
||||
service.storage.save_user_role (l_role)
|
||||
set_redirection (url (request.path_info, Void))
|
||||
end
|
||||
elseif fd.item_same_string ("op", "Add permission") then
|
||||
if attached fd.string_item ("new-permission") as l_new_permission then
|
||||
l_role := service.storage.authenticated_user_role
|
||||
l_role.add_permission (l_new_permission)
|
||||
service.storage.save_user_role (l_role)
|
||||
set_redirection (url (request.path_info, Void))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
new_edit_form (a_action: READABLE_STRING_8; a_roles: LIST [CMS_USER_ROLE]; a_use_data: BOOLEAN): CMS_FORM
|
||||
local
|
||||
perms: ARRAYED_SET [READABLE_STRING_8]
|
||||
tb: WSF_WIDGET_AGENT_TABLE [READABLE_STRING_8]
|
||||
i: INTEGER
|
||||
tf: WSF_FORM_TEXT_INPUT
|
||||
do
|
||||
create perms.make (10)
|
||||
perms.compare_objects
|
||||
across
|
||||
service.modules as m
|
||||
loop
|
||||
across
|
||||
m.item.permissions (service) as p
|
||||
loop
|
||||
perms.extend (p.item.name)
|
||||
end
|
||||
end
|
||||
across
|
||||
a_roles as c
|
||||
loop
|
||||
across
|
||||
c.item.permissions as p
|
||||
loop
|
||||
perms.extend (p.item)
|
||||
end
|
||||
end
|
||||
|
||||
create tb.make
|
||||
tb.set_column_count (1 + a_roles.count)
|
||||
i := 1
|
||||
tb.column (i).set_title ("Permissions")
|
||||
across
|
||||
a_roles as r
|
||||
loop
|
||||
i := i + 1
|
||||
tb.column (i).set_title (r.item.name)
|
||||
end
|
||||
|
||||
tb.add_css_style ("border: solid 1px #999;")
|
||||
tb.set_data (perms)
|
||||
tb.set_compute_item_function (agent (p: READABLE_STRING_8; ia_roles: LIST [CMS_USER_ROLE]; ia_use_data: BOOLEAN): WSF_WIDGET_TABLE_ROW
|
||||
local
|
||||
it: WSF_WIDGET_TABLE_ITEM
|
||||
cb: WSF_FORM_CHECKBOX_INPUT
|
||||
do
|
||||
create Result.make (1 + ia_roles.count)
|
||||
create it.make_with_text (p)
|
||||
Result.set_item (it, 1)
|
||||
across
|
||||
ia_roles as r
|
||||
loop
|
||||
create cb.make (r.item.name + "[" + p + "]")
|
||||
cb.set_text_value (p)
|
||||
|
||||
if ia_use_data then
|
||||
if r.item.has_permission (p) then
|
||||
cb.set_checked (True)
|
||||
else
|
||||
cb.set_checked (False)
|
||||
end
|
||||
end
|
||||
create it.make_with_content (cb)
|
||||
Result.add_item (it)
|
||||
end
|
||||
end(?, a_roles, a_use_data)
|
||||
)
|
||||
|
||||
create Result.make (a_action, "edit-user-roles")
|
||||
Result.set_method_post
|
||||
Result.extend (tb.to_computed_table)
|
||||
Result.extend (create {WSF_FORM_SUBMIT_INPUT}.make_with_text ("op", "Apply"))
|
||||
|
||||
create tf.make ("new-role")
|
||||
tf.add_css_class ("horizontal")
|
||||
tf.set_size (24)
|
||||
tf.set_label ("New user role")
|
||||
Result.extend (tf)
|
||||
Result.extend (create {WSF_FORM_SUBMIT_INPUT}.make_with_text ("op", "Add role"))
|
||||
|
||||
create tf.make ("new-permission")
|
||||
tf.add_css_class ("horizontal")
|
||||
tf.set_size (24)
|
||||
tf.set_label ("New permission")
|
||||
Result.extend (tf)
|
||||
Result.extend (create {WSF_FORM_SUBMIT_INPUT}.make_with_text ("op", "Add permission"))
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,56 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {ADMIN_USERS_CMS_EXECUTION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ADMIN_USERS_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
do
|
||||
set_title ("Users")
|
||||
-- check Permission !!!
|
||||
create b.make_empty
|
||||
if has_permission ("administrate users") then
|
||||
|
||||
b.append ("<ul id=%"user-list%">")
|
||||
across
|
||||
service.storage.all_users as c
|
||||
loop
|
||||
if attached c.item as u then
|
||||
b.append ("<li class=%"user%">")
|
||||
b.append ("<strong>" + user_link (u) + "</strong> (id=" + u.id.out + ")")
|
||||
if attached u.email as l_email then
|
||||
b.append (" [<a mailto=%""+ l_email +"%">"+ l_email +"</a>]")
|
||||
end
|
||||
if attached u.creation_date as dt then
|
||||
b.append (" - created: " + dt.out)
|
||||
end
|
||||
if attached u.last_login_date as dt then
|
||||
b.append (" - last signed: " + dt.out)
|
||||
end
|
||||
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
b.append ("</ul>")
|
||||
else
|
||||
b.append ("<div class=%"denied%">Access denied</div>")
|
||||
end
|
||||
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,39 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {LOG_VIEW_CMS_EXECUTION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
LOG_VIEW_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
do
|
||||
if attached {WSF_STRING} request.path_parameter ("log-id") as p_id and then p_id.is_integer then
|
||||
create b.make_empty
|
||||
|
||||
if attached storage.log (p_id.integer_value) as l_log then
|
||||
set_title ("Log #" + l_log.id.out)
|
||||
b.append (l_log.to_html (theme))
|
||||
else
|
||||
set_title ("Log [" + p_id.value + "] does not exists!")
|
||||
end
|
||||
set_main_content (b)
|
||||
else
|
||||
set_redirection ("/admin/logs")
|
||||
set_main_content ("not found")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,58 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {WSF_CMS_MODULE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_MODULE
|
||||
|
||||
feature -- Access
|
||||
|
||||
is_enabled: BOOLEAN
|
||||
|
||||
name: STRING
|
||||
|
||||
description: STRING
|
||||
|
||||
package: STRING
|
||||
|
||||
version: STRING
|
||||
|
||||
feature {CMS_SERVICE} -- Registration
|
||||
|
||||
register (a_service: CMS_SERVICE)
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- Settings
|
||||
|
||||
enable
|
||||
do
|
||||
is_enabled := True
|
||||
end
|
||||
|
||||
disable
|
||||
do
|
||||
is_enabled := False
|
||||
end
|
||||
|
||||
feature -- Hooks
|
||||
|
||||
help_text (a_path: STRING): STRING
|
||||
do
|
||||
create Result.make_empty
|
||||
end
|
||||
|
||||
permissions (a_service: CMS_SERVICE): LIST [CMS_PERMISSION]
|
||||
do
|
||||
create {ARRAYED_SET [CMS_PERMISSION]} Result.make (0)
|
||||
end
|
||||
|
||||
links: HASH_TABLE [CMS_MODULE_LINK, STRING]
|
||||
-- Link indexed by path
|
||||
do
|
||||
create Result.make (0)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,50 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_MODULE_LINK}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_MODULE_LINK
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_title: like title)
|
||||
do
|
||||
title := a_title
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
title: STRING_32
|
||||
|
||||
description: detachable STRING_32
|
||||
|
||||
callback: detachable PROCEDURE [ANY, TUPLE [cms: detachable CMS_EXECUTION; args: detachable ITERABLE [STRING]]]
|
||||
callback_arguments: detachable ITERABLE [STRING]
|
||||
|
||||
permission: detachable LIST [STRING]
|
||||
|
||||
parent: detachable CMS_MODULE_LINK
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_callback (cb: like callback; args: like callback_arguments)
|
||||
do
|
||||
callback := cb
|
||||
callback_arguments := args
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute
|
||||
do
|
||||
if attached callback as cb then
|
||||
cb.call ([Void, callback_arguments])
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,36 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_PERMISSION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_PERMISSION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
convert
|
||||
make ({READABLE_STRING_8, STRING_8, IMMUTABLE_STRING_8})
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (n: like name)
|
||||
do
|
||||
name := n
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: READABLE_STRING_8
|
||||
|
||||
description: detachable READABLE_STRING_8
|
||||
|
||||
feature -- Change
|
||||
|
||||
set_description (s: like description)
|
||||
do
|
||||
description := s
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,128 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {DEBUG_MODULE}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
DEBUG_MODULE
|
||||
|
||||
inherit
|
||||
CMS_MODULE
|
||||
|
||||
-- CMS_HOOK_BLOCK
|
||||
|
||||
CMS_HOOK_AUTO_REGISTER
|
||||
|
||||
SHARED_EXECUTION_ENVIRONMENT
|
||||
export
|
||||
{NONE} all
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
name := "debug"
|
||||
version := "1.0"
|
||||
description := "Debug"
|
||||
package := "cms"
|
||||
end
|
||||
|
||||
feature {CMS_SERVICE} -- Registration
|
||||
|
||||
service: detachable CMS_SERVICE
|
||||
|
||||
register (a_service: CMS_SERVICE)
|
||||
do
|
||||
service := a_service
|
||||
a_service.map_uri_template ("/debug/", agent handle_debug (a_service, ?, ?))
|
||||
end
|
||||
|
||||
feature -- Hooks
|
||||
|
||||
-- block_list: ITERABLE [like {CMS_BLOCK}.name]
|
||||
-- do
|
||||
-- Result := <<"debug-info">>
|
||||
-- end
|
||||
|
||||
-- get_block_view (a_block_id: detachable READABLE_STRING_8; a_execution: CMS_EXECUTION)
|
||||
-- local
|
||||
-- b: CMS_CONTENT_BLOCK
|
||||
-- do
|
||||
-- create b.make ("debug-info", "Debug", "... ", a_execution.formats.plain_text)
|
||||
-- a_execution.add_block (b, Void)
|
||||
-- end
|
||||
|
||||
feature -- Handler
|
||||
|
||||
handle_debug (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
local
|
||||
e: CMS_EXECUTION
|
||||
s: STRING
|
||||
do
|
||||
if req.is_get_request_method then
|
||||
create {ANY_CMS_EXECUTION} e.make (req, res, cms)
|
||||
e.set_title ("DEBUG")
|
||||
|
||||
create s.make_empty
|
||||
append_info_to ("Name", cms.site_name, e, s)
|
||||
append_info_to ("Url", cms.site_url, e, s)
|
||||
|
||||
if attached cms.configuration as cfg and then attached cfg.configuration_location as l_loc then
|
||||
s.append ("<hr/>")
|
||||
append_info_to ("Configuration file", l_loc.name, e, s)
|
||||
end
|
||||
|
||||
s.append ("<hr/>")
|
||||
|
||||
append_info_to ("Current dir", execution_environment.current_working_path.utf_8_name, e, s)
|
||||
append_info_to ("Base url", cms.base_url, e, s)
|
||||
append_info_to ("Script url", cms.script_url, e, s)
|
||||
s.append ("<hr/>")
|
||||
append_info_to ("Dir", cms.site_dir.utf_8_name, e, s)
|
||||
append_info_to ("Var dir", cms.site_var_dir.utf_8_name, e, s)
|
||||
s.append ("<hr/>")
|
||||
append_info_to ("Theme", cms.theme_name, e, s)
|
||||
append_info_to ("Theme location", cms.theme_resource_location.utf_8_name, e, s)
|
||||
s.append ("<hr/>")
|
||||
append_info_to ("Files location", cms.files_location.utf_8_name, e, s)
|
||||
s.append ("<hr/>")
|
||||
|
||||
append_info_to ("Url", e.url ("/", Void), e, s)
|
||||
if attached e.user as u then
|
||||
append_info_to ("User", u.name, e, s)
|
||||
append_info_to ("User url", e.user_url (u), e, s)
|
||||
|
||||
end
|
||||
|
||||
e.set_main_content (s)
|
||||
else
|
||||
create {NOT_FOUND_CMS_EXECUTION} e.make (req, res, cms)
|
||||
end
|
||||
e.execute
|
||||
end
|
||||
|
||||
append_info_to (n: READABLE_STRING_8; v: detachable READABLE_STRING_GENERAL; e: CMS_EXECUTION; t: STRING)
|
||||
do
|
||||
t.append ("<li>")
|
||||
t.append ("<strong>" + n + "</strong>: ")
|
||||
if v /= Void then
|
||||
t.append (e.html_encoded (v))
|
||||
end
|
||||
t.append ("</li>")
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2013, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -1,75 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_PAGE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_PAGE
|
||||
|
||||
inherit
|
||||
CMS_NODE
|
||||
|
||||
create
|
||||
make_new,
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_id: like id; a_title: like title; dt: like creation_date)
|
||||
require
|
||||
a_id > 0
|
||||
do
|
||||
set_id (a_id)
|
||||
creation_date := dt
|
||||
modification_date := dt
|
||||
title := a_title
|
||||
initialize
|
||||
end
|
||||
|
||||
make_new (a_title: like title)
|
||||
do
|
||||
title := a_title
|
||||
create creation_date.make_now_utc
|
||||
modification_date := creation_date
|
||||
initialize
|
||||
end
|
||||
|
||||
initialize
|
||||
do
|
||||
format := formats.default_format
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
title: detachable READABLE_STRING_32
|
||||
|
||||
body: detachable READABLE_STRING_8
|
||||
|
||||
format: CMS_FORMAT
|
||||
|
||||
content_type_name: STRING = "page"
|
||||
|
||||
feature -- Change
|
||||
|
||||
set_title (a_title: like title)
|
||||
-- Set `title' to `a_title'
|
||||
do
|
||||
title := a_title
|
||||
end
|
||||
|
||||
set_body (a_body: like body; a_format: like format)
|
||||
-- Set `body' and associated `format'
|
||||
do
|
||||
body := a_body
|
||||
format := a_format
|
||||
end
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
-- to_html (a_theme: CMS_THEME): STRING_8
|
||||
-- do
|
||||
-- Result := Precursor (a_theme)
|
||||
-- end
|
||||
|
||||
end
|
||||
@@ -1,176 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {CMS_PAGE_CONTENT_TYPE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_PAGE_CONTENT_TYPE
|
||||
|
||||
inherit
|
||||
CMS_CONTENT_TYPE
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
create {ARRAYED_LIST [like available_formats.item]} available_formats.make (1)
|
||||
available_formats.extend (formats.plain_text)
|
||||
available_formats.extend (formats.filtered_html)
|
||||
available_formats.extend (formats.full_html)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
name: STRING = "page"
|
||||
|
||||
title: STRING = "basic page"
|
||||
|
||||
description: detachable READABLE_STRING_8
|
||||
-- Optional description
|
||||
do
|
||||
Result := "Use <em>basic pages</em> for your static content, such as an 'About us' page."
|
||||
end
|
||||
|
||||
available_formats: LIST [CMS_FORMAT]
|
||||
|
||||
feature -- Factory
|
||||
|
||||
fill_edit_form (f: CMS_FORM; a_node: detachable CMS_NODE)
|
||||
local
|
||||
ti: WSF_FORM_TEXT_INPUT
|
||||
fset: WSF_FORM_FIELD_SET
|
||||
ta: WSF_FORM_TEXTAREA
|
||||
tselect: WSF_FORM_SELECT
|
||||
opt: WSF_FORM_SELECT_OPTION
|
||||
do
|
||||
create ti.make ("title")
|
||||
ti.set_label ("Title")
|
||||
ti.set_size (70)
|
||||
if a_node /= Void then
|
||||
ti.set_text_value (a_node.title)
|
||||
end
|
||||
ti.set_is_required (True)
|
||||
f.extend (ti)
|
||||
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create ta.make ("body")
|
||||
ta.set_rows (10)
|
||||
ta.set_cols (70)
|
||||
if a_node /= Void then
|
||||
ta.set_text_value (a_node.body)
|
||||
end
|
||||
-- ta.set_label ("Body")
|
||||
ta.set_description ("This is the main content")
|
||||
ta.set_is_required (False)
|
||||
|
||||
create fset.make
|
||||
fset.set_legend ("Body")
|
||||
fset.extend (ta)
|
||||
|
||||
fset.extend_text ("<br/>")
|
||||
|
||||
create tselect.make ("format")
|
||||
tselect.set_label ("Body's format")
|
||||
tselect.set_is_required (True)
|
||||
across
|
||||
available_formats as c
|
||||
loop
|
||||
create opt.make (c.item.name, c.item.title)
|
||||
if attached c.item.help as f_help then
|
||||
opt.set_description ("<ul>" + f_help + "</ul>")
|
||||
end
|
||||
tselect.add_option (opt)
|
||||
end
|
||||
if a_node /= Void then
|
||||
tselect.set_text_by_value (a_node.format.name)
|
||||
end
|
||||
|
||||
fset.extend (tselect)
|
||||
|
||||
f.extend (fset)
|
||||
|
||||
end
|
||||
|
||||
change_node (a_execution: CMS_EXECUTION; fd: WSF_FORM_DATA; a_node: like new_node)
|
||||
local
|
||||
b: detachable READABLE_STRING_8
|
||||
f: detachable CMS_FORMAT
|
||||
do
|
||||
if attached fd.integer_item ("id") as l_id and then l_id > 0 then
|
||||
check a_node.id = l_id end
|
||||
end
|
||||
if attached fd.string_item ("title") as l_title then
|
||||
a_node.set_title (l_title)
|
||||
end
|
||||
|
||||
if attached fd.string_item ("body") as l_body then
|
||||
b := l_body
|
||||
end
|
||||
if attached fd.string_item ("format") as s_format and then attached formats.format (s_format) as f_format then
|
||||
f := f_format
|
||||
elseif a_node /= Void then
|
||||
f := a_node.format
|
||||
else
|
||||
f := formats.default_format
|
||||
end
|
||||
if b /= Void then
|
||||
a_node.set_body (b, f)
|
||||
end
|
||||
end
|
||||
|
||||
new_node (a_execution: CMS_EXECUTION; fd: WSF_FORM_DATA; a_node: detachable like new_node): CMS_PAGE
|
||||
-- <Precursor>
|
||||
local
|
||||
b: detachable READABLE_STRING_8
|
||||
f: detachable CMS_FORMAT
|
||||
l_node: detachable like new_node
|
||||
do
|
||||
l_node := a_node
|
||||
if attached fd.integer_item ("id") as l_id and then l_id > 0 then
|
||||
if l_node /= Void then
|
||||
check l_node.id = l_id end
|
||||
else
|
||||
if attached {like new_node} a_execution.service.storage.node (l_id) as n then
|
||||
l_node := n
|
||||
else
|
||||
-- FIXME: Error
|
||||
end
|
||||
end
|
||||
end
|
||||
if attached fd.string_item ("title") as l_title then
|
||||
if l_node = Void then
|
||||
create l_node.make_new (l_title)
|
||||
else
|
||||
l_node.set_title (l_title)
|
||||
end
|
||||
else
|
||||
if l_node = Void then
|
||||
create l_node.make_new ("...")
|
||||
end
|
||||
end
|
||||
l_node.set_author (a_execution.user)
|
||||
|
||||
if attached fd.string_item ("body") as l_body then
|
||||
b := l_body
|
||||
end
|
||||
if attached fd.string_item ("format") as s_format and then attached formats.format (s_format) as f_format then
|
||||
f := f_format
|
||||
elseif a_node /= Void then
|
||||
f := a_node.format
|
||||
else
|
||||
f := formats.default_format
|
||||
end
|
||||
if b /= Void then
|
||||
l_node.set_body (b, f)
|
||||
end
|
||||
Result := l_node
|
||||
end
|
||||
|
||||
invariant
|
||||
|
||||
end
|
||||
@@ -1,61 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
NODE_ADD_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
NODE_CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
f: like edit_form
|
||||
fd: detachable WSF_FORM_DATA
|
||||
do
|
||||
create b.make_empty
|
||||
if attached non_empty_string_path_parameter ("type") as s_type then
|
||||
if attached service.content_type (s_type) as l_type then
|
||||
f := edit_form (Void, url (request.path_info, Void), "add-" + l_type.name, l_type)
|
||||
set_title ("Create " + l_type.title)
|
||||
if has_permission ("create " + l_type.name) then
|
||||
if request.is_post_request_method then
|
||||
f.validation_actions.extend (agent edit_form_validate (?, b))
|
||||
f.submit_actions.extend (agent edit_form_submit (?, Void, l_type, b))
|
||||
f.process (Current)
|
||||
fd := f.last_data
|
||||
end
|
||||
f.append_to_html (theme, b)
|
||||
else
|
||||
set_title ("Access denied")
|
||||
end
|
||||
else
|
||||
set_title ("Unknown content type [" + s_type + "]")
|
||||
end
|
||||
else
|
||||
set_title ("Create new content ...")
|
||||
b.append ("<ul id=%"content-types%">")
|
||||
across
|
||||
service.content_types as c
|
||||
loop
|
||||
if has_permission ("create " + c.item.name) then
|
||||
b.append ("<li>" + link (c.item.name, "/node/add/" + c.item.name, Void))
|
||||
if attached c.item.description as d then
|
||||
b.append ("<div class=%"description%">" + d + "</div>")
|
||||
end
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
b.append ("</ul>")
|
||||
end
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,141 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {NODE_CMS_EXECUTION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
NODE_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
feature -- Form
|
||||
|
||||
edit_form_validate (fd: WSF_FORM_DATA; b: STRING)
|
||||
local
|
||||
l_preview: BOOLEAN
|
||||
l_format: detachable CMS_FORMAT
|
||||
do
|
||||
l_preview := attached {WSF_STRING} fd.item ("op") as l_op and then l_op.same_string ("Preview")
|
||||
if l_preview then
|
||||
b.append ("<strong>Preview</strong><div class=%"preview%">")
|
||||
if attached fd.string_item ("format") as s_format and then attached formats.format (s_format) as f_format then
|
||||
l_format := f_format
|
||||
end
|
||||
if attached fd.string_item ("title") as l_title then
|
||||
b.append ("<strong>Title:</strong><div class=%"title%">" + html_encoded (l_title) + "</div>")
|
||||
end
|
||||
if attached fd.string_item ("body") as l_body then
|
||||
b.append ("<strong>Body:</strong><div class=%"body%">")
|
||||
if l_format /= Void then
|
||||
b.append (l_format.to_html (l_body))
|
||||
else
|
||||
b.append (html_encoded (l_body))
|
||||
end
|
||||
b.append ("</div>")
|
||||
end
|
||||
b.append ("</div>")
|
||||
end
|
||||
end
|
||||
|
||||
edit_form_submit (fd: WSF_FORM_DATA; a_node: detachable CMS_NODE; a_type: CMS_CONTENT_TYPE; b: STRING)
|
||||
local
|
||||
l_preview: BOOLEAN
|
||||
l_node: detachable CMS_NODE
|
||||
s: STRING
|
||||
do
|
||||
l_preview := attached {WSF_STRING} fd.item ("op") as l_op and then l_op.same_string ("Preview")
|
||||
if not l_preview then
|
||||
debug ("cms")
|
||||
across
|
||||
fd as c
|
||||
loop
|
||||
b.append ("<li>" + html_encoded (c.key) + "=")
|
||||
if attached c.item as v then
|
||||
b.append (html_encoded (v.string_representation))
|
||||
end
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
if a_node /= Void then
|
||||
l_node := a_node
|
||||
a_type.change_node (Current, fd, a_node)
|
||||
s := "modified"
|
||||
else
|
||||
l_node := a_type.new_node (Current, fd, Void)
|
||||
s := "created"
|
||||
end
|
||||
service.storage.save_node (l_node)
|
||||
if attached user as u then
|
||||
service.log ("node", "User %"" + user_link (u) + "%" " + s + " node " + link (a_type.name +" #" + l_node.id.out, "/node/" + l_node.id.out , Void), 0, node_local_link (l_node))
|
||||
else
|
||||
service.log ("node", "Anonymous " + s + " node " + a_type.name +" #" + l_node.id.out, 0, node_local_link (l_node))
|
||||
end
|
||||
add_success_message ("Node #" + l_node.id.out + " saved.")
|
||||
set_redirection (node_url (l_node))
|
||||
end
|
||||
end
|
||||
|
||||
-- edit_form_submit (fd: WSF_FORM_DATA; a_type: CMS_CONTENT_TYPE; b: STRING)
|
||||
-- local
|
||||
-- l_preview: BOOLEAN
|
||||
-- do
|
||||
-- l_preview := attached {WSF_STRING} fd.item ("op") as l_op and then l_op.same_string ("Preview")
|
||||
-- if not l_preview then
|
||||
-- debug ("cms")
|
||||
-- across
|
||||
-- fd as c
|
||||
-- loop
|
||||
-- b.append ("<li>" + html_encoded (c.key) + "=")
|
||||
-- if attached c.item as v then
|
||||
-- b.append (html_encoded (v.string_representation))
|
||||
-- end
|
||||
-- b.append ("</li>")
|
||||
-- end
|
||||
-- end
|
||||
-- if attached a_type.new_node (Current, fd, Void) as l_node then
|
||||
-- service.storage.save_node (l_node)
|
||||
-- if attached user as u then
|
||||
-- service.log ("node", "User %"" + user_link (u) + "%" created node " + link (a_type.name +" #" + l_node.id.out, "/node/" + l_node.id.out , Void), 0, node_local_link (l_node))
|
||||
-- else
|
||||
-- service.log ("node", "Anonymous created node "+ a_type.name +" #" + l_node.id.out, 0, node_local_link (l_node))
|
||||
-- end
|
||||
-- add_success_message ("Node #" + l_node.id.out + " saved.")
|
||||
-- set_redirection (node_url (l_node))
|
||||
-- end
|
||||
-- end
|
||||
-- end
|
||||
|
||||
edit_form (a_node: detachable CMS_NODE; a_url: READABLE_STRING_8; a_name: STRING; a_type: CMS_CONTENT_TYPE): CMS_FORM
|
||||
local
|
||||
f: CMS_FORM
|
||||
ts: WSF_FORM_SUBMIT_INPUT
|
||||
th: WSF_FORM_HIDDEN_INPUT
|
||||
do
|
||||
create f.make (a_url, a_name)
|
||||
|
||||
create th.make ("node-id")
|
||||
if a_node /= Void then
|
||||
th.set_text_value (a_node.id.out)
|
||||
else
|
||||
th.set_text_value ("0")
|
||||
end
|
||||
f.extend (th)
|
||||
|
||||
a_type.fill_edit_form (f, a_node)
|
||||
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create ts.make ("op")
|
||||
ts.set_default_value ("Save")
|
||||
f.extend (ts)
|
||||
|
||||
create ts.make ("op")
|
||||
ts.set_default_value ("Preview")
|
||||
f.extend (ts)
|
||||
|
||||
Result := f
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,166 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
NODE_EDIT_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
NODE_CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
f: like edit_form
|
||||
fd: detachable WSF_FORM_DATA
|
||||
do
|
||||
create b.make_empty
|
||||
if
|
||||
attached {WSF_STRING} request.path_parameter ("nid") as p_nid and then
|
||||
p_nid.is_integer and then
|
||||
attached service.storage.node (p_nid.integer_value) as l_node
|
||||
then
|
||||
if attached service.content_type (l_node.content_type_name) as l_type then
|
||||
if has_permission ("edit " + l_type.name) then
|
||||
f := edit_form (l_node, url (request.path_info, Void), "edit-" + l_type.name, l_type)
|
||||
if request.is_post_request_method then
|
||||
f.validation_actions.extend (agent edit_form_validate (?, b))
|
||||
f.submit_actions.extend (agent edit_form_submit (?, l_node, l_type, b))
|
||||
f.process (Current)
|
||||
fd := f.last_data
|
||||
end
|
||||
|
||||
set_title ("Edit #" + l_node.id.out)
|
||||
|
||||
add_to_menu (create {CMS_LOCAL_LINK}.make ("View", node_url (l_node)), primary_tabs)
|
||||
add_to_menu (create {CMS_LOCAL_LINK}.make ("Edit", "/node/" + l_node.id.out + "/edit"), primary_tabs)
|
||||
|
||||
f.append_to_html (theme, b)
|
||||
else
|
||||
b.append ("<h1>Access denied</h1>")
|
||||
end
|
||||
else
|
||||
set_title ("Unknown node")
|
||||
end
|
||||
else
|
||||
set_title ("Create new content ...")
|
||||
b.append ("<ul id=%"content-types%">")
|
||||
across
|
||||
service.content_types as c
|
||||
loop
|
||||
if has_permission ("create " + c.item.name) then
|
||||
b.append ("<li>" + link (c.item.name, "/node/add/" + c.item.name, Void))
|
||||
if attached c.item.description as d then
|
||||
b.append ("<div class=%"description%">" + d + "</div>")
|
||||
end
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
b.append ("</ul>")
|
||||
end
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
-- edit_form_validate (fd: CMS_FORM_DATA; b: STRING)
|
||||
-- local
|
||||
-- l_preview: BOOLEAN
|
||||
-- l_format: detachable CMS_FORMAT
|
||||
-- do
|
||||
-- l_preview := attached {WSF_STRING} fd.item ("op") as l_op and then l_op.same_string ("Preview")
|
||||
-- if l_preview then
|
||||
-- b.append ("<strong>Preview</strong><div class=%"preview%">")
|
||||
-- if attached fd.string_item ("format") as s_format and then attached formats.format (s_format) as f_format then
|
||||
-- l_format := f_format
|
||||
-- end
|
||||
-- if attached fd.string_item ("title") as l_title then
|
||||
-- b.append ("<strong>Title:</strong><div class=%"title%">" + html_encoded (l_title) + "</div>")
|
||||
-- end
|
||||
-- if attached fd.string_item ("body") as l_body then
|
||||
-- b.append ("<strong>Body:</strong><div class=%"body%">")
|
||||
-- if l_format /= Void then
|
||||
-- b.append (l_format.to_html (l_body))
|
||||
-- else
|
||||
-- b.append (html_encoded (l_body))
|
||||
-- end
|
||||
-- b.append ("</div>")
|
||||
-- end
|
||||
-- b.append ("</div>")
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- edit_form_submit (fd: CMS_FORM_DATA; a_node: detachable CMS_NODE; a_type: CMS_CONTENT_TYPE; b: STRING)
|
||||
-- local
|
||||
-- l_preview: BOOLEAN
|
||||
-- l_node: detachable CMS_NODE
|
||||
-- s: STRING
|
||||
-- do
|
||||
-- l_preview := attached {WSF_STRING} fd.item ("op") as l_op and then l_op.same_string ("Preview")
|
||||
-- if not l_preview then
|
||||
-- debug ("cms")
|
||||
-- across
|
||||
-- fd as c
|
||||
-- loop
|
||||
-- b.append ("<li>" + html_encoded (c.key) + "=")
|
||||
-- if attached c.item as v then
|
||||
-- b.append (html_encoded (v.string_representation))
|
||||
-- end
|
||||
-- b.append ("</li>")
|
||||
-- end
|
||||
-- end
|
||||
-- if a_node /= Void then
|
||||
-- l_node := a_node
|
||||
-- a_type.change_node (Current, fd, a_node)
|
||||
-- s := "modified"
|
||||
-- else
|
||||
-- l_node := a_type.new_node (Current, fd, Void)
|
||||
-- s := "created"
|
||||
-- end
|
||||
-- service.storage.save_node (l_node)
|
||||
-- if attached user as u then
|
||||
-- service.log ("node", "User %"" + user_link (u) + "%" " + s + " node " + link (a_type.name +" #" + l_node.id.out, "/node/" + l_node.id.out , Void), 0, node_local_link (l_node))
|
||||
-- else
|
||||
-- service.log ("node", "Anonymous " + s + " node " + a_type.name +" #" + l_node.id.out, 0, node_local_link (l_node))
|
||||
-- end
|
||||
-- add_success_message ("Node #" + l_node.id.out + " saved.")
|
||||
-- set_redirection (node_url (l_node))
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- edit_form (a_node: detachable CMS_NODE; a_url: READABLE_STRING_8; a_name: STRING; a_type: CMS_CONTENT_TYPE): CMS_FORM
|
||||
-- local
|
||||
-- f: CMS_FORM
|
||||
-- ts: CMS_FORM_SUBMIT_INPUT
|
||||
-- th: CMS_FORM_HIDDEN_INPUT
|
||||
-- do
|
||||
-- create f.make (a_url, a_name)
|
||||
|
||||
-- create th.make ("node-id")
|
||||
-- if a_node /= Void then
|
||||
-- th.set_text_value (a_node.id.out)
|
||||
-- else
|
||||
-- th.set_text_value ("0")
|
||||
-- end
|
||||
-- f.extend (th)
|
||||
|
||||
-- a_type.fill_edit_form (f, a_node)
|
||||
|
||||
-- f.extend_text ("<br/>")
|
||||
|
||||
-- create ts.make ("op")
|
||||
-- ts.set_default_value ("Save")
|
||||
-- f.extend (ts)
|
||||
|
||||
-- create ts.make ("op")
|
||||
-- ts.set_default_value ("Preview")
|
||||
-- f.extend (ts)
|
||||
|
||||
-- Result := f
|
||||
-- end
|
||||
|
||||
end
|
||||
@@ -1,127 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {NODE_MODULE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
NODE_MODULE
|
||||
|
||||
inherit
|
||||
CMS_MODULE
|
||||
redefine
|
||||
permissions
|
||||
end
|
||||
|
||||
CMS_HOOK_MENU_ALTER
|
||||
|
||||
CMS_HOOK_BLOCK
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
name := "node"
|
||||
version := "1.0"
|
||||
description := "Service to manage content based on 'node'"
|
||||
package := "core"
|
||||
|
||||
enable
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
permissions (a_service: CMS_SERVICE): LIST [CMS_PERMISSION]
|
||||
do
|
||||
Result := Precursor (a_service)
|
||||
across
|
||||
a_service.content_types as c
|
||||
loop
|
||||
Result.extend ("create " + c.item.name)
|
||||
Result.extend ("edit " + c.item.name)
|
||||
Result.extend ("delete " + c.item.name)
|
||||
end
|
||||
end
|
||||
|
||||
feature {CMS_SERVICE} -- Registration
|
||||
|
||||
service: detachable CMS_SERVICE
|
||||
|
||||
register (a_service: CMS_SERVICE)
|
||||
local
|
||||
h: CMS_HANDLER
|
||||
do
|
||||
service := a_service
|
||||
a_service.map_uri ("/node/add", agent handle_node_add (a_service, ?, ?))
|
||||
a_service.map_uri_template ("/node/add/{type}", agent handle_node_add (a_service, ?, ?))
|
||||
|
||||
create {CMS_HANDLER} h.make (agent handle_node_view (a_service, ?, ?))
|
||||
a_service.router.map (create {WSF_URI_TEMPLATE_MAPPING}.make ("/node/{nid}", h))
|
||||
a_service.router.map (create {WSF_URI_TEMPLATE_MAPPING}.make ("/node/{nid}/view", h))
|
||||
|
||||
a_service.map_uri_template ("/node/{nid}/edit", agent handle_node_edit (a_service, ?, ?))
|
||||
|
||||
a_service.add_content_type (create {CMS_PAGE_CONTENT_TYPE}.make)
|
||||
|
||||
a_service.add_menu_alter_hook (Current)
|
||||
a_service.add_block_hook (Current)
|
||||
|
||||
end
|
||||
|
||||
feature -- Hooks
|
||||
|
||||
block_list: ITERABLE [like {CMS_BLOCK}.name]
|
||||
do
|
||||
Result := <<"node-info">>
|
||||
end
|
||||
|
||||
get_block_view (a_block_id: detachable READABLE_STRING_8; a_execution: CMS_EXECUTION)
|
||||
-- local
|
||||
-- b: CMS_CONTENT_BLOCK
|
||||
do
|
||||
-- if
|
||||
-- a_execution.is_front and then
|
||||
-- attached a_execution.user as u
|
||||
-- then
|
||||
-- create b.make ("node-info", "Node", "Node ...", a_execution.formats.plain_text)
|
||||
-- a_execution.add_block (b, Void)
|
||||
-- end
|
||||
end
|
||||
|
||||
menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_execution: CMS_EXECUTION)
|
||||
local
|
||||
lnk: CMS_LOCAL_LINK
|
||||
perms: detachable ARRAYED_LIST [READABLE_STRING_8]
|
||||
do
|
||||
if attached a_execution.service.content_types as lst then
|
||||
create perms.make (lst.count)
|
||||
across
|
||||
lst as c
|
||||
loop
|
||||
perms.force ("create " + c.item.name)
|
||||
end
|
||||
end
|
||||
create lnk.make ("Add content", "/node/add/")
|
||||
lnk.set_permission_arguments (perms)
|
||||
a_menu_system.navigation_menu.extend (lnk)
|
||||
end
|
||||
|
||||
handle_node_view (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {NODE_VIEW_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_node_edit (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {NODE_EDIT_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_node_add (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {NODE_ADD_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,41 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
NODE_VIEW_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
NODE_CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
do
|
||||
if attached {WSF_STRING} request.path_parameter ("nid") as p_nid and then p_nid.is_integer then
|
||||
create b.make_empty
|
||||
|
||||
if attached storage.node (p_nid.integer_value) as l_node then
|
||||
set_title ("Node [" + l_node.id.out + "]")
|
||||
add_to_menu (create {CMS_LOCAL_LINK}.make ("View", node_url (l_node)), primary_tabs)
|
||||
add_to_menu (create {CMS_LOCAL_LINK}.make ("Edit", "/node/" + l_node.id.out + "/edit"), primary_tabs)
|
||||
|
||||
b.append (l_node.to_html (theme))
|
||||
else
|
||||
set_title ("Node [" + p_nid.value + "] does not exists!")
|
||||
end
|
||||
set_main_content (b)
|
||||
else
|
||||
set_title ("Node ...")
|
||||
create b.make_empty
|
||||
set_main_content (b)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,149 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {OPENID_CMS_EXECUTION}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
OPENID_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
local
|
||||
b: STRING
|
||||
f: CMS_FORM
|
||||
tf: WSF_FORM_TEXT_INPUT
|
||||
ts: WSF_FORM_SUBMIT_INPUT
|
||||
o: OPENID_CONSUMER
|
||||
v: OPENID_CONSUMER_VALIDATION
|
||||
tb: HASH_TABLE [READABLE_STRING_8, STRING_8]
|
||||
l_uid: INTEGER
|
||||
do
|
||||
create b.make_empty
|
||||
set_title ("OpenID identities")
|
||||
if attached request.string_item ("openid.mode") as l_openid_mode then
|
||||
-- Callback
|
||||
create o.make (request.absolute_script_url ("/openid/login"))
|
||||
o.ask_email (True)
|
||||
o.ask_nickname (False)
|
||||
-- o.ask_all_info (False)
|
||||
|
||||
create v.make_from_items (o, request.items_as_string_items)
|
||||
v.validate
|
||||
if v.is_valid then
|
||||
if attached v.identity as l_identity then
|
||||
if attached user as u then
|
||||
if attached service.storage.custom_value (l_identity, "openid") as obj then
|
||||
l_uid := user_id_from_custom_value (obj)
|
||||
if l_uid > 0 and then l_uid = u.id then
|
||||
-- Authenticated
|
||||
b.append ("OpenID already associated to user %""+ user_link (u) +"%"")
|
||||
else
|
||||
-- Wrong USER !!!
|
||||
b.append ("OpenID already associated to another user !!!")
|
||||
end
|
||||
else
|
||||
-- New OpenID association
|
||||
create tb.make (1)
|
||||
tb.force (l_identity, "openid_identity")
|
||||
tb.force (u.id.out, "uid")
|
||||
service.storage.set_custom_value (l_identity, tb, "openid")
|
||||
|
||||
b.append ("OpenID %""+ l_identity +"%" is now associated with user %""+ user_link (u) +"%"")
|
||||
end
|
||||
else
|
||||
if
|
||||
attached service.storage.custom_value (l_identity, "openid") as obj and then
|
||||
attached user_id_from_custom_value (obj) as obj_uid and then
|
||||
obj_uid > 0 and then
|
||||
attached service.storage.user_by_id (obj_uid.to_integer) as u
|
||||
then
|
||||
-- Authenticated
|
||||
set_user (u)
|
||||
b.append ("Authenticated as %""+ user_link (u) +"%"")
|
||||
set_redirection (user_url (u))
|
||||
else
|
||||
-- Register new account
|
||||
b.append ("Register new account associated with Openid %"" + l_identity + "%"?")
|
||||
across
|
||||
v.attributes as c
|
||||
loop
|
||||
b.append ("<li>" + c.key + "=" + c.item + "</li>")
|
||||
end
|
||||
set_session_item ("openid.identity", l_identity)
|
||||
if attached v.email_attribute as att_email then
|
||||
set_session_item ("openid.email", att_email)
|
||||
end
|
||||
if attached v.nickname_attribute as att_nickname then
|
||||
set_session_item ("openid.nickname", att_nickname)
|
||||
end
|
||||
b.append ("Create new account from your OpenID ")
|
||||
b.append (link ("Register new account", "/user/register", Void))
|
||||
set_redirection (url ("/user/register", Void))
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
b.append ("User authentication failed!!")
|
||||
end
|
||||
elseif attached request.string_item ("openid") as p_openid then
|
||||
b.append ("Check openID: " + p_openid)
|
||||
create o.make (request.absolute_script_url ("/openid/login"))
|
||||
o.ask_email (True)
|
||||
o.ask_all_info (False)
|
||||
if attached o.auth_url (p_openid) as l_url then
|
||||
set_redirection (l_url)
|
||||
else
|
||||
b.append ("Failure")
|
||||
end
|
||||
else
|
||||
if attached user as u then
|
||||
if attached service.storage.custom_value_names_where ("uid", u.id.out, "openid") as lst then
|
||||
across
|
||||
lst as c
|
||||
loop
|
||||
b.append ("<li>OpenID: " + c.item + "</li>")
|
||||
end
|
||||
else
|
||||
b.append ("No OpenID associated with current account")
|
||||
end
|
||||
end
|
||||
create f.make (url ("/openid/login", Void), "openid-login")
|
||||
create tf.make ("openid")
|
||||
tf.set_size (50)
|
||||
tf.set_text_value ("")
|
||||
tf.set_label ("OpenID identifier")
|
||||
f.extend (tf)
|
||||
create ts.make_with_text ("op", "Validate")
|
||||
f.extend (ts)
|
||||
f.prepare (Current)
|
||||
f.append_to_html (theme, b)
|
||||
end
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
user_id_from_custom_value (lst: TABLE_ITERABLE [READABLE_STRING_8, STRING_8]): INTEGER
|
||||
local
|
||||
l_uid: detachable READABLE_STRING_8
|
||||
do
|
||||
across
|
||||
lst as c
|
||||
until
|
||||
l_uid /= Void
|
||||
loop
|
||||
if c.key.same_string ("uid") then
|
||||
l_uid := c.item
|
||||
end
|
||||
end
|
||||
if l_uid /= Void and then l_uid.is_integer then
|
||||
Result := l_uid.to_integer
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,141 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {OPENID_MODULE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
OPENID_MODULE
|
||||
|
||||
inherit
|
||||
CMS_MODULE
|
||||
|
||||
CMS_HOOK_MENU_ALTER
|
||||
|
||||
CMS_HOOK_FORM_ALTER
|
||||
|
||||
CMS_HOOK_AUTO_REGISTER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
name := "openid"
|
||||
version := "1.0"
|
||||
description := "OpenID login support"
|
||||
package := "server"
|
||||
end
|
||||
|
||||
feature {CMS_SERVICE} -- Registration
|
||||
|
||||
service: detachable CMS_SERVICE
|
||||
|
||||
register (a_service: CMS_SERVICE)
|
||||
do
|
||||
a_service.map_uri ("/openid/login", agent handle_login)
|
||||
|
||||
a_service.add_menu_alter_hook (Current)
|
||||
service := a_service
|
||||
end
|
||||
|
||||
feature -- Hooks
|
||||
|
||||
menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_execution: CMS_EXECUTION)
|
||||
local
|
||||
lnk: CMS_LOCAL_LINK
|
||||
req: WSF_REQUEST
|
||||
do
|
||||
req := a_execution.request
|
||||
if req.path_info.starts_with ("/user") then
|
||||
if a_execution.authenticated then
|
||||
create lnk.make ("Openid identities", "/openid/login")
|
||||
else
|
||||
create lnk.make ("Login with Openid", "/openid/login")
|
||||
end
|
||||
-- a_menu_system.management_menu.extend (lnk)
|
||||
a_menu_system.primary_tabs.extend (lnk)
|
||||
end
|
||||
end
|
||||
|
||||
form_alter (a_form: CMS_FORM; a_form_data: detachable WSF_FORM_DATA; a_execution: CMS_EXECUTION)
|
||||
local
|
||||
i: WSF_FORM_DIV
|
||||
fh: WSF_FORM_HIDDEN_INPUT
|
||||
do
|
||||
if a_form.id.same_string ("openid-login") then
|
||||
create i.make_with_text_and_css_id (
|
||||
"Login with " + a_execution.link ("OpenID", "/openid/login", Void)
|
||||
+ " , " + a_execution.link ("Google", "/openid/login?openid=https://www.google.com/accounts/o8/id", Void)
|
||||
+ " , " + a_execution.link ("Yahoo", "/openid/login?openid=https://me.yahoo.com/", Void)
|
||||
,
|
||||
"openid"
|
||||
)
|
||||
a_form.extend (i)
|
||||
elseif a_form.id.same_string ("user-login") then
|
||||
create i.make_with_text_and_css_id (
|
||||
"Login with " + a_execution.link ("OpenID", "/openid/login", Void)
|
||||
+ " , " + a_execution.link ("Google", "/openid/login?openid=https://www.google.com/accounts/o8/id", Void)
|
||||
+ " , " + a_execution.link ("Yahoo", "/openid/login?openid=https://me.yahoo.com/", Void)
|
||||
,
|
||||
"openid"
|
||||
)
|
||||
if attached a_form.items_by_type ({WSF_WIDGET_TEXT}) as lst and then not lst.is_empty then
|
||||
a_form.insert_before (i, lst.last)
|
||||
else
|
||||
a_form.extend (i)
|
||||
end
|
||||
elseif a_form.id.same_string ("user-register") then
|
||||
if attached {READABLE_STRING_GENERAL} a_execution.session_item ("openid.identity") as l_openid_identity then
|
||||
create fh.make_with_text ("openid-identity", l_openid_identity.to_string_32)
|
||||
a_execution.remove_session_item ("openid.identity")
|
||||
a_form.extend (fh)
|
||||
a_form.extend_text ("The new account will be associated with OpenID %""+ a_execution.html_encoded (l_openid_identity) +"%"")
|
||||
if attached {READABLE_STRING_GENERAL} a_execution.session_item ("openid.nickname") as l_openid_nickname then
|
||||
if attached a_form.fields_by_name ("username") as f_lst then
|
||||
across
|
||||
f_lst as c
|
||||
loop
|
||||
if attached {WSF_FORM_TEXT_INPUT} c.item as txt then
|
||||
txt.set_text_value (l_openid_nickname.to_string_32)
|
||||
end
|
||||
end
|
||||
end
|
||||
a_execution.remove_session_item ("openid.nickname")
|
||||
end
|
||||
if attached {READABLE_STRING_GENERAL} a_execution.session_item ("openid.email") as l_openid_email then
|
||||
if attached a_form.fields_by_name ("email") as f_lst then
|
||||
across
|
||||
f_lst as c
|
||||
loop
|
||||
if attached {WSF_FORM_TEXT_INPUT} c.item as txt then
|
||||
txt.set_text_value (l_openid_email.to_string_32)
|
||||
end
|
||||
end
|
||||
end
|
||||
a_execution.remove_session_item ("openid.email")
|
||||
end
|
||||
a_form.submit_actions.extend (agent openid_user_register_submitted)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
openid_user_register_submitted (a_form_data: WSF_FORM_DATA)
|
||||
do
|
||||
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
handle_login (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
if attached service as l_service then
|
||||
(create {OPENID_CMS_EXECUTION}.make (req, res, l_service)).execute
|
||||
else
|
||||
res.set_status_code ({HTTP_STATUS_CODE}.expectation_failed)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,59 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
USER_ACCOUNT_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
vars: detachable ARRAY [READABLE_STRING_32]
|
||||
n: INTEGER
|
||||
-- vars: detachable WSF_TABLE
|
||||
do
|
||||
if attached {WSF_TABLE} request.path_parameter ("vars") as tb then
|
||||
vars := tb.as_array_of_string
|
||||
end
|
||||
if vars = Void or else vars.is_empty then
|
||||
set_title ("Account")
|
||||
create b.make_empty
|
||||
b.append ("Account")
|
||||
set_main_content (b)
|
||||
else
|
||||
n := vars.count
|
||||
create b.make_empty
|
||||
if n >= 1 then
|
||||
if vars[1].same_string ("password") then
|
||||
set_title ("Password")
|
||||
if n >= 2 then
|
||||
if vars[2].same_string ("reset") then
|
||||
b.append ("Reset password")
|
||||
else
|
||||
b.append ("password ???")
|
||||
end
|
||||
end
|
||||
elseif vars[1].same_string ("register") then
|
||||
set_title ("Registration")
|
||||
b.append ("Register new account")
|
||||
else
|
||||
b.append ("???")
|
||||
end
|
||||
else
|
||||
set_title ("Account/")
|
||||
b.append ("...")
|
||||
end
|
||||
set_main_content (b)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,206 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
USER_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
USER_MODULE_LIB
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
u: detachable CMS_USER
|
||||
l_first: BOOLEAN
|
||||
do
|
||||
if attached {WSF_STRING} request.path_parameter ("uid") as p_uid then
|
||||
if p_uid.is_integer then
|
||||
u := service.storage.user_by_id (p_uid.integer_value)
|
||||
else
|
||||
u := service.storage.user_by_name (p_uid.value)
|
||||
end
|
||||
else
|
||||
u := user
|
||||
end
|
||||
initialize_primary_tabs (u)
|
||||
|
||||
if u /= Void then
|
||||
if not u.same_as (user) and then not has_permission ("admin view users") then
|
||||
set_main_content ("Access denied")
|
||||
else
|
||||
service.storage.fill_user_profile (u)
|
||||
create b.make_empty
|
||||
set_title ("User [" + u.name + "]")
|
||||
b.append ("<ul>%N")
|
||||
if attached u.email as l_email then
|
||||
b.append ("<li>Email: <a mailto=%""+ l_email +"%">"+ l_email +"</a></li>")
|
||||
end
|
||||
if has_permission ("administer users") and attached u.roles as u_roles then
|
||||
b.append ("<li>Roles:")
|
||||
l_first := True
|
||||
across
|
||||
u_roles as r
|
||||
loop
|
||||
if l_first then
|
||||
l_first := False
|
||||
else
|
||||
b.append (", ")
|
||||
end
|
||||
if attached service.storage.user_role_by_id (r.item) as ur then
|
||||
b.append (ur.name)
|
||||
else
|
||||
b.append (r.item.out)
|
||||
end
|
||||
end
|
||||
b.append ("</li>")
|
||||
end
|
||||
b.append ("<li>Created: "+ u.creation_date.out +"</li>%N")
|
||||
if attached u.last_login_date as dt then
|
||||
b.append ("<li>Last signed: "+ dt.out +"</li>%N")
|
||||
else
|
||||
b.append ("<li>Never signed yet</li>%N")
|
||||
end
|
||||
if u = user and then attached last_user_access_date as dt then
|
||||
b.append ("<li>Session date: "+ dt.out +"</li>%N")
|
||||
end
|
||||
|
||||
service.storage.fill_user_profile (u)
|
||||
if attached u.profile as prof then
|
||||
across
|
||||
prof as p
|
||||
loop
|
||||
b.append ("<li>" + p.key + "=" + p.item +"</li>%N")
|
||||
end
|
||||
end
|
||||
b.append ("</ul>")
|
||||
set_main_content (b)
|
||||
end
|
||||
else
|
||||
process_login
|
||||
end
|
||||
end
|
||||
|
||||
process_login
|
||||
local
|
||||
l_url: detachable READABLE_STRING_8
|
||||
b: STRING_8
|
||||
f: CMS_FORM
|
||||
fd: detachable WSF_FORM_DATA
|
||||
do
|
||||
if
|
||||
attached {WSF_STRING} request.item ("destination") as s_dest
|
||||
then
|
||||
l_url := request.script_url (s_dest.value)
|
||||
end
|
||||
if l_url = Void then
|
||||
l_url := request.script_url ("/user")
|
||||
end
|
||||
f := login_form (url ("/user", Void), "user-login", l_url)
|
||||
if request.is_request_method ("post") then
|
||||
f.submit_actions.extend (agent on_form_submitted)
|
||||
f.process (Current)
|
||||
fd := f.last_data
|
||||
else
|
||||
f.prepare (Current)
|
||||
end
|
||||
|
||||
if authenticated then
|
||||
if
|
||||
fd /= Void and then fd.is_valid and then
|
||||
attached {WSF_STRING} fd.integer_item ("form-destination") as s_dest
|
||||
then
|
||||
l_url := request.script_url (s_dest.value)
|
||||
end
|
||||
|
||||
set_redirection (l_url)
|
||||
set_title ("Login")
|
||||
create b.make_empty
|
||||
set_main_content (b)
|
||||
set_redirection (url ("/user", Void))
|
||||
else
|
||||
set_title ("Login")
|
||||
create b.make_empty
|
||||
f.append_to_html (theme, b)
|
||||
set_main_content (b)
|
||||
end
|
||||
end
|
||||
|
||||
on_form_submitted (fd: WSF_FORM_DATA)
|
||||
local
|
||||
u: detachable CMS_USER
|
||||
do
|
||||
if attached {WSF_STRING} fd.item (form_username_or_email_name) as s_name and then not s_name.is_empty then
|
||||
u := service.storage.user_by_name (s_name.value)
|
||||
if u = Void then
|
||||
u := service.storage.user_by_email (s_name.value)
|
||||
end
|
||||
end
|
||||
if u = Void then
|
||||
fd.report_error ("Sorry, unrecognized username/email or password. " + link ("Have you forgotten your password?", "/user/password", Void))
|
||||
else
|
||||
if attached {WSF_STRING} fd.item (form_password_name) as s_passwd and then not s_passwd.is_empty then
|
||||
if service.auth_engine.valid_credential (u.name, s_passwd.value) then
|
||||
login (u, request)
|
||||
else
|
||||
fd.report_error ("Sorry, unrecognized username/email or password. " + link ("Have you forgotten your password?", "/user/password", Void))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
login_form (a_action: READABLE_STRING_8; a_form_name: READABLE_STRING_8; a_destination: READABLE_STRING_8): CMS_FORM
|
||||
local
|
||||
th: WSF_FORM_HIDDEN_INPUT
|
||||
ti: WSF_FORM_TEXT_INPUT
|
||||
tp: WSF_FORM_PASSWORD_INPUT
|
||||
ts: WSF_FORM_SUBMIT_INPUT
|
||||
l_logo: WSF_FORM_RAW_TEXT
|
||||
d: WSF_FORM_DIV
|
||||
do
|
||||
create Result.make (a_action, a_form_name)
|
||||
|
||||
create th.make ("form-destination")
|
||||
th.set_default_value (a_destination)
|
||||
Result.extend (th)
|
||||
|
||||
create l_logo.make ("[
|
||||
<img class="logo" alt="login"
|
||||
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAHiQAAB4kB+XNYvQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAASmSURBVGiB1ZpbaBxVGMd/Mzu5bSRJY6LubmKJl4J9qShdwdpGGxGlharJSwpVVFrUUF+iT1VEUYRgaEGqsa2FGtu8xNtDsBQi5EFBS8UnsYWUtpsmaqppIdkkm+4eH77ZzWazl7lllv7gPOycmXP+/9kzM+d839GUUnjEOqAL2A7cCdSYJWjWx4F5s/wN/AgMAzNedK65NHI38CKwAwiZpcLitUvAlFlGgBPAFadCnBppAQ4DDwNhQHMqwEQBk8A5oAeYsNuAXSP1QD/wFNBqtzOLxIAzQC9ww/JVSimrZbdSalwplVJrT8rsa7dVfVZNHFRKTftgIJdps++SGksNrSDwLbAFqHUxXNwwB/wEPIe8+fJSzEi12cCDgO61OpukgN+RG7qQ74RiRkaApylg4sj4YZLqpgcalwloBvvu7SlUnQJOI6/6VRQy8jHwKkWG04aRMIlUwp7SElTqlVzYMVnslDlgAHgztyLf3e5GPnLleiaKUYto686tyDXSCHwANPkgyilNiMbG7INGzkn9QJvdltdVNnJg43uOVH34x7vMJP6ze1kbovWl9IFsI+uBJ3Ew3QgGaulqXfVvW+Lg+T5msG1EQ7SuBy7DyqH1GTKHulVoQTQDy0YiwKayyHHHJkR7xsgLyBTcFYupRbdN2CWEaM8Y2Yn7qTjHLw4w9s+o22bsoCHa0YEGZE3hmsXkInvP7vHbTBhoMJDlacTu1fs39JJMJQGoq6jLHE+kEuw9u4ejmwdpv6PDI61FiQBdBtCB9eVphv339xas89lMBdCh48FDno+0GZ+GWchAIh0F+f7q15y6fMJSaxPx2IrfPv4zNQbL4Zq8TM5P8Mu/PzvuwSczQZ0SRrzAh2EW9G3lp6Ghaa4/VQXRKbIO9ooqvYqj0UG2NW9fqy7iBiWMhGtaeOT2Ry21NhGPcXV+5QNfpVdxLPoVW5ufcKzSAnEDicUWZFekk12RTkutHTrfx6ELfZnfYuIkW5sfdyPSCvMGEnv1nOpANcc2n+Sx5va1aD6XKQMYBTqx+XXv//MjbqolAOoqGnjtvjcydT6bWAJGDSS0/w4SWbfM5+OfZKIokZrWjJHqQDVfRE+xpWmbt3ILMwUM68B1PBpeNUaQ49EhP02AaL+eXrN/A0RxuSZ5uW0fFXqlW2F2UIj2zMJqEMlPuMJnEyCaB2HZyBSSZLnVOIf5WGRPUXpwkfoqA1cQzcDKuNYEkil6BZvPSjw5x3BsyJGaeHLOyWUK0ZpJ0eUGseuB34B7SrVUpiB2movAQ2Sl5nJnvzeAt4Fpz9R5zzSicUV+Md80fghJFc/6IMous4i2VeM4N4id5i3gASTRE8h3woGN769JoqcISWDM1LaKUqm3MSSXnteMjySRV207BVJvxVaIC+aFpynvMJs1NRQ0AaWTnAtISHIAuOaZNOtcM/veSRETgK0NA91KqUvKvw0Dl8w+Pd0wkC71SqkjSqnYGpqImX3U29HmdFNNCPgUmTGH8GZTzRTwK/A6DpYVbrc53YXkJ55FouJh7G1zmjTLd8CXwF9Ohbg1ks1twPPAM8i/FCT/xrM4csd/QNYSnrwR/wfI5AekDWyX2QAAAABJRU5ErkJggg=="
|
||||
/>
|
||||
]"
|
||||
)
|
||||
create ti.make (form_username_or_email_name)
|
||||
ti.set_label ("Username or email")
|
||||
ti.set_is_required (True)
|
||||
|
||||
create tp.make (form_password_name)
|
||||
tp.set_label ("Password")
|
||||
tp.set_is_required (True)
|
||||
tp.set_description (link ("Reset password", "/user/password", Void))
|
||||
|
||||
create ts.make ("op")
|
||||
ts.set_default_value ("Log in")
|
||||
|
||||
create d.make_with_item (ti)
|
||||
d.add_css_class ("input")
|
||||
d.extend (tp)
|
||||
Result.extend (l_logo)
|
||||
Result.extend (d)
|
||||
Result.extend (ts)
|
||||
|
||||
Result.extend_text ("<div>Need an account?<br/>" + link ("Sign up now!", "/user/register", Void) + "</div>")
|
||||
end
|
||||
|
||||
form_username_or_email_name: STRING = "name"
|
||||
form_password_name: STRING = "password"
|
||||
|
||||
end
|
||||
@@ -1,215 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
USER_EDIT_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
USER_MODULE_LIB
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
f: CMS_FORM
|
||||
fd: detachable WSF_FORM_DATA
|
||||
u: detachable CMS_USER
|
||||
l_is_editing_current_user: BOOLEAN
|
||||
do
|
||||
if attached {WSF_STRING} request.path_parameter ("uid") as p_uid and then p_uid.is_integer then
|
||||
u := service.storage.user_by_id (p_uid.integer_value)
|
||||
if has_permission ("view users") then
|
||||
else
|
||||
if u /= Void and then u.same_as (user) then
|
||||
else
|
||||
u := Void
|
||||
end
|
||||
end
|
||||
else
|
||||
u := user
|
||||
end
|
||||
if attached user as l_active_user then
|
||||
l_is_editing_current_user := l_active_user.same_as (u)
|
||||
end
|
||||
create b.make_empty
|
||||
initialize_primary_tabs (u)
|
||||
if u = Void then
|
||||
b.append ("Access denied")
|
||||
set_redirection (url ("/user/register", Void))
|
||||
else
|
||||
service.storage.fill_user_profile (u)
|
||||
f := edit_form (u, url (request.path_info, Void), "user-edit")
|
||||
|
||||
if request.is_post_request_method then
|
||||
f.validation_actions.extend (agent edit_form_validate (?, u))
|
||||
f.submit_actions.extend (agent edit_form_submit (?, u, l_is_editing_current_user, b))
|
||||
f.process (Current)
|
||||
fd := f.last_data
|
||||
else
|
||||
f.prepare (Current)
|
||||
end
|
||||
|
||||
f.append_to_html (theme, b)
|
||||
|
||||
end
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
edit_form_validate (fd: WSF_FORM_DATA; u: CMS_USER)
|
||||
local
|
||||
fu: detachable CMS_USER
|
||||
do
|
||||
if attached {WSF_STRING} fd.item ("username") as s_username then
|
||||
fu := service.storage.user_by_name (s_username.value)
|
||||
if fu = Void then
|
||||
fd.report_invalid_field ("username", "User does not exist!")
|
||||
end
|
||||
end
|
||||
if attached {WSF_STRING} fd.item ("email") as s_email then
|
||||
fu := service.storage.user_by_email (s_email.value)
|
||||
if fu /= Void and then fu.id /= u.id then
|
||||
fd.report_invalid_field ("email", "Email is already used by another user!")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
edit_form_submit (fd: WSF_FORM_DATA; u: CMS_USER; a_is_editing_current_user: BOOLEAN; b: STRING)
|
||||
local
|
||||
up: detachable CMS_USER_PROFILE
|
||||
l_roles: like {CMS_USER}.roles
|
||||
do
|
||||
debug
|
||||
across
|
||||
fd as c
|
||||
loop
|
||||
b.append ("<li>" + html_encoded (c.key) + "=")
|
||||
if attached c.item as v then
|
||||
b.append (html_encoded (v.string_representation))
|
||||
end
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
|
||||
if attached {WSF_STRING} fd.item ("password") as s_password and then not s_password.is_empty then
|
||||
u.set_password (s_password.value)
|
||||
end
|
||||
if attached {WSF_STRING} fd.item ("email") as s_email then
|
||||
u.set_email (s_email.value)
|
||||
end
|
||||
|
||||
if attached {WSF_STRING} fd.item ("note") as s_note then
|
||||
up := u.profile
|
||||
if up = Void then
|
||||
create up.make
|
||||
end
|
||||
up.force (s_note.value, "note")
|
||||
u.set_profile (up)
|
||||
end
|
||||
if has_permission ("administer users") then
|
||||
l_roles := u.roles
|
||||
u.clear_roles
|
||||
if attached fd.table_item ("roles") as f_roles and then not f_roles.is_empty then
|
||||
create {ARRAYED_LIST [INTEGER]} l_roles.make (f_roles.count)
|
||||
across
|
||||
f_roles as r
|
||||
loop
|
||||
if attached {WSF_STRING} r.item as s and then attached s.is_integer then
|
||||
u.add_role_by_id (s.integer_value)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
service.storage.save_user (u)
|
||||
if a_is_editing_current_user and u /= user then
|
||||
set_user (u)
|
||||
end
|
||||
set_redirection (user_url (u))
|
||||
end
|
||||
|
||||
edit_form (u: CMS_USER; a_url: READABLE_STRING_8; a_name: STRING): CMS_FORM
|
||||
local
|
||||
f: CMS_FORM
|
||||
ti: WSF_FORM_TEXT_INPUT
|
||||
tp: WSF_FORM_PASSWORD_INPUT
|
||||
ta: WSF_FORM_TEXTAREA
|
||||
ts: WSF_FORM_SUBMIT_INPUT
|
||||
tset: WSF_FORM_FIELD_SET
|
||||
cb: WSF_FORM_CHECKBOX_INPUT
|
||||
do
|
||||
create f.make (a_url, a_name)
|
||||
|
||||
create ti.make ("username")
|
||||
ti.set_label ("Username")
|
||||
ti.set_default_value (u.name)
|
||||
ti.set_is_required (False)
|
||||
ti.set_is_readonly (True)
|
||||
f.extend (ti)
|
||||
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create tp.make ("password")
|
||||
tp.set_label ("Password")
|
||||
tp.set_is_required (False)
|
||||
f.extend (tp)
|
||||
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create ti.make ("email")
|
||||
ti.set_label ("Valid email address")
|
||||
if attached u.email as l_email then
|
||||
ti.set_default_value (l_email)
|
||||
end
|
||||
ti.set_is_required (True)
|
||||
f.extend (ti)
|
||||
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create ta.make ("note")
|
||||
ta.set_label ("Additional note about you")
|
||||
ta.set_description ("You can use this input to tell us more about you")
|
||||
if attached u.profile as p and then attached p.item ("note") as l_note then
|
||||
ta.set_default_value (l_note)
|
||||
end
|
||||
ta.set_is_required (False)
|
||||
f.extend (ta)
|
||||
|
||||
if has_permission ("administer users") then
|
||||
create tset.make
|
||||
tset.set_legend ("User roles")
|
||||
tset.set_collapsible (True)
|
||||
f.extend (tset)
|
||||
across
|
||||
service.storage.user_roles as r
|
||||
loop
|
||||
if
|
||||
r.item ~ service.storage.anonymous_user_role or
|
||||
r.item ~ service.storage.authenticated_user_role
|
||||
then
|
||||
-- Skip
|
||||
else
|
||||
create cb.make_with_value ("roles[]", r.item.id.out)
|
||||
cb.set_title (r.item.name)
|
||||
cb.set_checked (u /= Void and then u.has_role (r.item))
|
||||
tset.extend (cb)
|
||||
end
|
||||
end
|
||||
end
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create ts.make ("op")
|
||||
ts.set_default_value ("Save")
|
||||
f.extend (ts)
|
||||
|
||||
Result := f
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,39 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
USER_LOGOUT_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
-- l_url: READABLE_STRING_8
|
||||
b: STRING_8
|
||||
do
|
||||
logout (request)
|
||||
|
||||
if
|
||||
attached {WSF_STRING} request.item ("destination") as s_dest
|
||||
then
|
||||
set_redirection (request.script_url (s_dest.value))
|
||||
else
|
||||
set_redirection (request.script_url ("/"))
|
||||
end
|
||||
|
||||
set_title ("Logout")
|
||||
create b.make_empty
|
||||
set_main_content (b)
|
||||
-- l_url := request.script_url ("/info/")
|
||||
-- res.redirect_now_with_content (l_url, "Redirection to " + l_url, "text/html")
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,152 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {USER_MODULE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
USER_MODULE
|
||||
|
||||
inherit
|
||||
CMS_MODULE
|
||||
redefine
|
||||
permissions
|
||||
end
|
||||
|
||||
CMS_HOOK_MENU_ALTER
|
||||
|
||||
CMS_HOOK_BLOCK
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
name := "user"
|
||||
version := "1.0"
|
||||
description := "Users management"
|
||||
package := "core"
|
||||
|
||||
enable
|
||||
end
|
||||
|
||||
feature {CMS_SERVICE} -- Registration
|
||||
|
||||
service: detachable CMS_SERVICE
|
||||
|
||||
register (a_service: CMS_SERVICE)
|
||||
local
|
||||
h: CMS_HANDLER
|
||||
do
|
||||
service := a_service
|
||||
|
||||
a_service.map_uri ("/user/logout", agent handle_logout (a_service, ?, ?))
|
||||
a_service.map_uri ("/user/register", agent handle_register (a_service, ?, ?))
|
||||
a_service.map_uri ("/user/password", agent handle_request_new_password (a_service, ?, ?))
|
||||
|
||||
create {CMS_HANDLER} h.make (agent handle_user (a_service, ?, ?))
|
||||
a_service.router.map (create {WSF_URI_TEMPLATE_MAPPING}.make ("/user/{uid}", h))
|
||||
a_service.router.map (create {WSF_URI_MAPPING}.make_trailing_slash_ignored ("/user", h))
|
||||
a_service.map_uri_template ("/user/{uid}/edit", agent handle_edit (a_service, ?, ?))
|
||||
a_service.map_uri_template ("/user/reset/{uid}/{last-signed}/{extra}", agent handle_reset_password (a_service, ?, ?))
|
||||
|
||||
a_service.add_menu_alter_hook (Current)
|
||||
a_service.add_block_hook (Current)
|
||||
end
|
||||
|
||||
feature -- Hooks
|
||||
|
||||
permissions (a_service: CMS_SERVICE): LIST [CMS_PERMISSION]
|
||||
do
|
||||
Result := Precursor (a_service)
|
||||
Result.extend ("register account")
|
||||
Result.extend ("change username")
|
||||
end
|
||||
|
||||
block_list: ITERABLE [like {CMS_BLOCK}.name]
|
||||
do
|
||||
Result := <<"user-info">>
|
||||
end
|
||||
|
||||
get_block_view (a_block_id: detachable READABLE_STRING_8; a_execution: CMS_EXECUTION)
|
||||
local
|
||||
b: CMS_CONTENT_BLOCK
|
||||
do
|
||||
if
|
||||
a_execution.is_front and then
|
||||
attached a_execution.user as u
|
||||
then
|
||||
create b.make ("user-info", "User", "Welcome " + a_execution.html_encoded (u.name), a_execution.formats.plain_text)
|
||||
a_execution.add_block (b, Void)
|
||||
end
|
||||
end
|
||||
|
||||
menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_execution: CMS_EXECUTION)
|
||||
local
|
||||
lnk: CMS_LOCAL_LINK
|
||||
opts: CMS_API_OPTIONS
|
||||
do
|
||||
if attached a_execution.user as u then
|
||||
create lnk.make ("Logout", "/user/logout")
|
||||
a_execution.add_to_main_menu (lnk)
|
||||
else
|
||||
create lnk.make ("Login", "/user")
|
||||
create opts.make_from_manifest (<<["query", <<["destination", a_execution.request.path_info]>> ]>>)
|
||||
lnk.set_options (opts)
|
||||
a_execution.add_to_main_menu (lnk)
|
||||
|
||||
create lnk.make ("Sign up", "/user/register")
|
||||
lnk.set_options (opts)
|
||||
a_execution.add_to_main_menu (lnk)
|
||||
end
|
||||
if a_execution.authenticated then
|
||||
if attached a_execution.user as u then
|
||||
create lnk.make ("My Account (" + u.name + ")", "/user")
|
||||
else
|
||||
create lnk.make ("My Account", "/user")
|
||||
end
|
||||
a_menu_system.user_menu.extend (lnk)
|
||||
create lnk.make ("Logout", "/user/logout")
|
||||
a_menu_system.user_menu.extend (lnk)
|
||||
else
|
||||
create lnk.make ("Login", "/user")
|
||||
a_menu_system.user_menu.extend (lnk)
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Handlers
|
||||
|
||||
handle_logout (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {USER_LOGOUT_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_user (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {USER_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_edit (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {USER_EDIT_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_register (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {USER_REGISTER_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_request_new_password (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {USER_NEW_PASSWORD_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
handle_reset_password (cms: CMS_SERVICE; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
(create {USER_RESET_PASSWORD_CMS_EXECUTION}.make (req, res, cms)).execute
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@@ -1,29 +0,0 @@
|
||||
note
|
||||
description: "Summary description for {USER_MODULE_LIB}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
USER_MODULE_LIB
|
||||
|
||||
inherit
|
||||
CMS_COMMON_API
|
||||
|
||||
CMS_EXECUTION
|
||||
|
||||
feature -- Initialization
|
||||
|
||||
initialize_primary_tabs (u: detachable CMS_USER)
|
||||
do
|
||||
if u /= Void then
|
||||
primary_tabs.extend (create {CMS_LOCAL_LINK}.make ("View", "/user/" + u.id.out))
|
||||
primary_tabs.extend (create {CMS_LOCAL_LINK}.make ("Edit", "/user/" + u.id.out + "/edit"))
|
||||
else
|
||||
primary_tabs.extend (create {CMS_LOCAL_LINK}.make ("Create new account", "/user/register"))
|
||||
primary_tabs.extend (create {CMS_LOCAL_LINK}.make ("Log in", "/user"))
|
||||
primary_tabs.extend (create {CMS_LOCAL_LINK}.make ("Request new password", "/user/password"))
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,171 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
USER_NEW_PASSWORD_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
USER_MODULE_LIB
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
f: CMS_FORM
|
||||
u: detachable CMS_USER
|
||||
fd: detachable WSF_FORM_DATA
|
||||
do
|
||||
set_title ("Request new password")
|
||||
create b.make_empty
|
||||
if not request.is_post_request_method and authenticated then
|
||||
u := user
|
||||
initialize_primary_tabs (u)
|
||||
if u /= Void then
|
||||
if attached u.email as l_email then
|
||||
f := new_password_form (url (request.path_info, Void), "new-password")
|
||||
b.append ("Password reset instructions will be mailed to <em>" + l_email + "</em>. You must " + link ("log out", "/user/logout", Void) + " to use the password reset link in the e-mail.")
|
||||
f.append_to_html (theme, b)
|
||||
else
|
||||
b.append ("Your account does not have any email address set!")
|
||||
set_redirection (url ("/user/"+ u.id.out +"/edit", Void))
|
||||
end
|
||||
else
|
||||
b.append ("Unexpected issue")
|
||||
end
|
||||
else
|
||||
f := new_password_form (url (request.path_info, Void), "new-password")
|
||||
if request.is_post_request_method then
|
||||
f.validation_actions.extend (agent password_form_validate)
|
||||
f.submit_actions.extend (agent password_form_submit (?, b))
|
||||
f.process (Current)
|
||||
fd := f.last_data
|
||||
else
|
||||
initialize_primary_tabs (Void)
|
||||
end
|
||||
|
||||
f.append_to_html (theme, b)
|
||||
end
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
password_form_validate (fd: WSF_FORM_DATA)
|
||||
local
|
||||
u: detachable CMS_USER
|
||||
do
|
||||
if attached {WSF_STRING} fd.item ("name") as s_name then
|
||||
u := service.storage.user_by_name (s_name.value)
|
||||
if u = Void then
|
||||
u := service.storage.user_by_email (s_name.value)
|
||||
if u = Void then
|
||||
fd.report_invalid_field ("name", "Sorry, " + html_encoded (s_name.value)+ " is not recognized as a user name or an e-mail address.")
|
||||
end
|
||||
end
|
||||
end
|
||||
fd.add_cached_value ("user", u)
|
||||
initialize_primary_tabs (u)
|
||||
end
|
||||
|
||||
password_form_submit (fd: WSF_FORM_DATA; b: STRING)
|
||||
local
|
||||
e: detachable CMS_EMAIL
|
||||
l_uuid: UUID
|
||||
do
|
||||
debug
|
||||
across
|
||||
fd as c
|
||||
loop
|
||||
b.append ("<li>" + html_encoded (c.key) + "=")
|
||||
if attached c.item as v then
|
||||
b.append (html_encoded (v.string_representation))
|
||||
end
|
||||
b.append ("</li>")
|
||||
end
|
||||
end
|
||||
if attached {CMS_USER} fd.cached_value ("user") as u then
|
||||
if attached u.email as l_mail_address then
|
||||
l_uuid := (create {UUID_GENERATOR}).generate_uuid
|
||||
e := new_password_email (u, l_mail_address, l_uuid.out)
|
||||
u.set_data_item ("new_password_extra", l_uuid.out)
|
||||
service.storage.save_user (u)
|
||||
service.mailer.safe_process_email (e)
|
||||
add_success_message ("Further instructions have been sent to your e-mail address.")
|
||||
set_redirection (url ("/user", Void))
|
||||
else
|
||||
add_error_message ("No email is associated with the requested account. Please contact the webmaster for help.")
|
||||
set_redirection (url ("/user", Void))
|
||||
end
|
||||
else
|
||||
add_error_message ("User not defined!")
|
||||
end
|
||||
end
|
||||
|
||||
new_password_form (a_url: READABLE_STRING_8; a_name: STRING): CMS_FORM
|
||||
require
|
||||
attached user as l_auth_user implies l_auth_user.has_email
|
||||
local
|
||||
u: like user
|
||||
f: CMS_FORM
|
||||
ti: WSF_FORM_TEXT_INPUT
|
||||
th: WSF_FORM_HIDDEN_INPUT
|
||||
ts: WSF_FORM_SUBMIT_INPUT
|
||||
err: BOOLEAN
|
||||
do
|
||||
create f.make (a_url, a_name)
|
||||
u := user
|
||||
if u = Void then
|
||||
create ti.make ("name")
|
||||
ti.set_label ("Username or e-mail address")
|
||||
ti.set_is_required (True)
|
||||
f.extend (ti)
|
||||
elseif attached u.email as l_mail then
|
||||
create th.make ("name")
|
||||
th.set_default_value (l_mail)
|
||||
th.set_is_required (True)
|
||||
f.extend (th)
|
||||
else
|
||||
f.extend_text ("The associated account has no e-mail address.")
|
||||
err := True
|
||||
end
|
||||
|
||||
if not err then
|
||||
create ts.make ("op")
|
||||
ts.set_default_value ("E-mail new password")
|
||||
f.extend (ts)
|
||||
end
|
||||
|
||||
Result := f
|
||||
end
|
||||
|
||||
new_password_email (u: CMS_USER; a_mail_address: STRING; a_extra: READABLE_STRING_8): CMS_EMAIL
|
||||
local
|
||||
b: STRING
|
||||
opts: CMS_URL_API_OPTIONS
|
||||
dt: detachable DATE_TIME
|
||||
do
|
||||
create b.make_empty
|
||||
create opts.make_absolute
|
||||
|
||||
b.append ("A request to reset the password for your account has been made at " + service.site_name + ".%N")
|
||||
b.append ("You may now log in by clicking this link or copying and pasting it to your browser:%N%N")
|
||||
dt := u.last_login_date
|
||||
if dt = Void then
|
||||
dt := u.creation_date
|
||||
end
|
||||
b.append (url ("/user/reset/" + u.id.out + "/" + unix_timestamp (dt).out + "/" + a_extra, opts))
|
||||
b.append ("%N")
|
||||
b.append ("%N")
|
||||
b.append ("This link can only be used once to log in and will lead you to a page where you can set your password. It expires after one day and nothing will happen if it's not used.%N")
|
||||
b.append ("%N%N-- The %"" + service.site_name + "%" team")
|
||||
|
||||
create Result.make (service.site_email, a_mail_address, "Account details for " + u.name + " at " + service.site_name, b)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,217 +0,0 @@
|
||||
note
|
||||
description: "[
|
||||
]"
|
||||
|
||||
class
|
||||
USER_REGISTER_CMS_EXECUTION
|
||||
|
||||
inherit
|
||||
CMS_EXECUTION
|
||||
|
||||
USER_MODULE_LIB
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Execution
|
||||
|
||||
process
|
||||
-- Computed response message.
|
||||
local
|
||||
b: STRING_8
|
||||
f: CMS_FORM
|
||||
fd: detachable WSF_FORM_DATA
|
||||
do
|
||||
set_title ("Create new account")
|
||||
create b.make_empty
|
||||
if authenticated then
|
||||
initialize_primary_tabs (user)
|
||||
b.append ("You are already " + link ("signed in", "/user", Void) + ", please " + link ("signout", "/user/logout", Void) + " before trying to " + link ("register a new account", "/account/register", Void) + ".")
|
||||
set_redirection (url ("/user", Void))
|
||||
else
|
||||
f := registration_form (url (request.path_info, Void), "user-register")
|
||||
|
||||
if request.is_post_request_method then
|
||||
f.validation_actions.extend (agent registration_form_validate)
|
||||
f.submit_actions.extend (agent registration_form_submitted (?, b))
|
||||
|
||||
f.process (Current)
|
||||
fd := f.last_data
|
||||
else
|
||||
f.prepare (Current)
|
||||
end
|
||||
if fd /= Void and then fd.is_valid then
|
||||
set_main_content (b)
|
||||
else
|
||||
initialize_primary_tabs (user)
|
||||
f.append_to_html (theme, b)
|
||||
end
|
||||
end
|
||||
set_main_content (b)
|
||||
end
|
||||
|
||||
registration_form_validate (fd: WSF_FORM_DATA)
|
||||
local
|
||||
u: detachable CMS_USER
|
||||
do
|
||||
if attached {WSF_STRING} fd.item ("username") as s_username then
|
||||
u := service.storage.user_by_name (s_username.value)
|
||||
if u /= Void then
|
||||
fd.report_invalid_field ("username", "User already exists!")
|
||||
end
|
||||
end
|
||||
if attached {WSF_STRING} fd.item ("email") as s_email then
|
||||
u := service.storage.user_by_email (s_email.value)
|
||||
if u /= Void then
|
||||
fd.report_invalid_field ("email", "Email is already used!")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
registration_form_submitted (fd: WSF_FORM_DATA; buf: STRING)
|
||||
local
|
||||
b: STRING
|
||||
u: detachable CMS_USER
|
||||
up: detachable CMS_USER_PROFILE
|
||||
e: detachable CMS_EMAIL
|
||||
l_pass: detachable READABLE_STRING_32
|
||||
l_uuid: UUID
|
||||
do
|
||||
b := buf
|
||||
across
|
||||
fd as c
|
||||
loop
|
||||
b.append ("<li>" + html_encoded (c.key) + "=")
|
||||
if attached c.item as v then
|
||||
b.append (html_encoded (v.string_representation))
|
||||
end
|
||||
b.append ("</li>")
|
||||
end
|
||||
if attached {WSF_STRING} fd.item ("username") as s_username then
|
||||
u := service.storage.user_by_name (s_username.value)
|
||||
|
||||
create u.make_new (s_username.value)
|
||||
if attached {WSF_STRING} fd.item ("password") as s_password then
|
||||
u.set_password (s_password.value)
|
||||
l_pass := u.password
|
||||
end
|
||||
if attached {WSF_STRING} fd.item ("email") as s_email then
|
||||
u.set_email (s_email.value)
|
||||
end
|
||||
|
||||
if attached {WSF_STRING} fd.item ("note") as s_note then
|
||||
create up.make
|
||||
up.force (s_note.value, "note")
|
||||
u.set_profile (up)
|
||||
end
|
||||
|
||||
l_uuid := (create {UUID_GENERATOR}).generate_uuid
|
||||
u.set_data_item ("new_password_extra", l_uuid.out)
|
||||
|
||||
service.storage.save_user (u)
|
||||
if attached u.email as l_mail_address then
|
||||
e := new_registration_email (l_mail_address, u, l_pass, l_uuid.out)
|
||||
service.mailer.safe_process_email (e)
|
||||
end
|
||||
e := new_user_account_email (service.site_email, u)
|
||||
service.mailer.safe_process_email (e)
|
||||
|
||||
login (u, request)
|
||||
set_redirection (url ("/user", Void))
|
||||
end
|
||||
end
|
||||
|
||||
registration_form (a_url: READABLE_STRING_8; a_name: STRING): CMS_FORM
|
||||
local
|
||||
f: CMS_FORM
|
||||
ti: WSF_FORM_TEXT_INPUT
|
||||
tp: WSF_FORM_PASSWORD_INPUT
|
||||
ta: WSF_FORM_TEXTAREA
|
||||
ts: WSF_FORM_SUBMIT_INPUT
|
||||
do
|
||||
create f.make (a_url, a_name)
|
||||
|
||||
create ti.make ("username")
|
||||
ti.set_label ("Username")
|
||||
ti.set_is_required (True)
|
||||
ti.set_validation_action (agent (fd: WSF_FORM_DATA)
|
||||
do
|
||||
if attached {WSF_STRING} fd.item ("username") as f_username and then f_username.value.count >= 5 then
|
||||
else
|
||||
fd.report_invalid_field ("username", "Username should contain at least 5 characters!")
|
||||
end
|
||||
end)
|
||||
f.extend (ti)
|
||||
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create tp.make ("password")
|
||||
tp.set_label ("Password")
|
||||
tp.set_is_required (True)
|
||||
f.extend (tp)
|
||||
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create ti.make ("email")
|
||||
ti.set_label ("Valid email address")
|
||||
ti.set_is_required (True)
|
||||
f.extend (ti)
|
||||
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create ta.make ("note")
|
||||
ta.set_label ("Additional note about you")
|
||||
ta.set_description ("You can use this input to tell us more about you")
|
||||
ta.set_is_required (False)
|
||||
f.extend (ta)
|
||||
|
||||
f.extend_text ("<br/>")
|
||||
|
||||
create ts.make ("Register")
|
||||
ts.set_default_value ("Register")
|
||||
f.extend (ts)
|
||||
|
||||
Result := f
|
||||
end
|
||||
|
||||
new_registration_email (a_mail_address: STRING; u: CMS_USER; a_password: detachable like {CMS_USER}.password; a_extra: READABLE_STRING_8): CMS_EMAIL
|
||||
require
|
||||
has_clear_password: u.password /= Void or else a_password /= Void
|
||||
local
|
||||
p: detachable like {CMS_USER}.password
|
||||
b: STRING
|
||||
opts: CMS_URL_API_OPTIONS
|
||||
do
|
||||
p := a_password
|
||||
if p = Void then
|
||||
p := u.password
|
||||
end
|
||||
|
||||
create b.make_from_string (u.name + "%N" + "Thank you for registering at " + service.site_name + ". ")
|
||||
create opts.make_absolute
|
||||
-- if p /= Void then
|
||||
b.append ("You may now log in to " + url ("/user", opts) + " using your username %""+ u.name +"%" and password%N")
|
||||
-- b.append ("%Nusername: " + u.name + "%Npassword: " + p + "%N%N")
|
||||
-- end
|
||||
b.append ("You may also log in by clicking on this link or copying and pasting it in your browser:%N%N")
|
||||
b.append (url ("/user/reset/" + u.id.out + "/" + unix_timestamp (u.creation_date).out + "/" + a_extra, opts))
|
||||
-- b.append (url ("/user/reset/" + u.id.out + "/" + unix_timestamp (u.creation_date).out + "/", opts))
|
||||
b.append ("%N%NThis is a one-time login, so it can be used only once.%N%NAfter logging in, you will be redirected to " + url ("/user/" + u.id.out + "/edit", opts) + " so you can change your password.%N")
|
||||
b.append ("%N%N-- The %"" + service.site_name + "%" team")
|
||||
|
||||
create Result.make (service.site_email, a_mail_address, "Account details for " + u.name + " at " + service.site_name, b)
|
||||
end
|
||||
|
||||
new_user_account_email (a_mail_address: STRING; u: CMS_USER): CMS_EMAIL
|
||||
local
|
||||
b: STRING
|
||||
opts: CMS_URL_API_OPTIONS
|
||||
do
|
||||
create b.make_from_string ("New user account %"" + u.name + "%" at " + service.site_name + ". ")
|
||||
create opts.make_absolute
|
||||
b.append ("See user account: " + user_url (u) + "%N")
|
||||
b.append ("%N%N-- The %"" + service.site_name + "%" team")
|
||||
create Result.make (service.site_email, a_mail_address, "New User Account %"" + u.name + "%" at " + service.site_name, b)
|
||||
end
|
||||
|
||||
end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user