This is now out of EWF repository.
This commit is contained in:
2013-07-02 12:21:54 +02:00
parent cb3f983b91
commit c216b96707
118 changed files with 2 additions and 10069 deletions

View File

@@ -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

View File

@@ -1 +0,0 @@
_storage_

View File

@@ -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.

View File

@@ -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>

View File

@@ -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>

View File

@@ -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

View File

@@ -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>

View File

@@ -1,6 +0,0 @@
#include <windows.h>
STRINGTABLE
BEGIN
1 "This Program was made using EiffelStudio using Visual Studio C++"
END

View File

@@ -1,4 +0,0 @@
# For nino connector, use port 9999
port=9090
#verbose=true

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,10 +0,0 @@
note
description: "Summary description for {CMS_HOOK}."
author: ""
date: "$Date$"
revision: "$Revision$"
deferred class
CMS_HOOK
end

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 ("&lt;" + c.item + "&gt; ")
-- 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 ("&lt;" + c.item + "&gt; ")
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

View File

@@ -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

View File

@@ -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. &lt;br&gt; and &lt;p&gt; 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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