diff --git a/examples/demo/site/config/application_configuration.json b/examples/demo/site/config/application_configuration.json index 793f8ef..52dbb4b 100644 --- a/examples/demo/site/config/application_configuration.json +++ b/examples/demo/site/config/application_configuration.json @@ -1,10 +1,13 @@ { "database": { "datasource": { - "driver": "MySQL", - "environment": "development" + "driver": "sqlite", + "environment": "sqlite" }, "environments": { + "sqlite": { + "connection_string":"Driver=SQLite3 ODBC Driver;Database=./site/database.sqlite;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;" + }, "test": { "connection_string":"Server=localhost;Port=3306;Database=cms_dev;Uid=root;Pwd=;" }, @@ -29,4 +32,4 @@ } - \ No newline at end of file + diff --git a/examples/demo/src/ewf_roc_server.e b/examples/demo/src/ewf_roc_server.e index c6c1a75..510deac 100644 --- a/examples/demo/src/ewf_roc_server.e +++ b/examples/demo/src/ewf_roc_server.e @@ -71,7 +71,7 @@ feature {NONE} -- Launch operation l_message: STRING do if not l_retry then - log.write_debug (generator + ".launch") + write_debug_log (generator + ".launch") launcher.launch (a_service, opts) else -- error hanling. @@ -92,7 +92,7 @@ feature {NONE} -- Launch operation l_message.append ("%N%N") end -- send email shutdown - log.write_debug (generator + ".launch shutdown") + write_debug_log (generator + ".launch shutdown") end rescue l_retry := True @@ -111,7 +111,7 @@ feature -- CMS Initialization create layout.make_default end initialize_logger (layout) - log.write_debug (generator + ".cms_setup based directory %"" + utf.escaped_utf_32_string_to_utf_8_string_8 (layout.path.name) + "%"") + write_debug_log (generator + ".cms_setup based directory %"" + utf.escaped_utf_32_string_to_utf_8_string_8 (layout.path.name) + "%"") create Result.make (layout) setup_storage (Result) end @@ -121,7 +121,7 @@ feature -- CMS Initialization cms: CMS_SERVICE api: CMS_API do - log.write_debug (generator + ".initialize_cms") + write_debug_log (generator + ".initialize_cms") setup_modules (a_setup) create api.make (a_setup) create cms.make (api) diff --git a/library/layout/src/error/shared_error.e b/library/layout/src/error/shared_error.e index 943cd5c..1842ac8 100644 --- a/library/layout/src/error/shared_error.e +++ b/library/layout/src/error/shared_error.e @@ -56,10 +56,10 @@ feature -- Element Settings l_message.append ("An unknown exception was raised.") end set_last_error (l_message, a_location) - log.write_critical (generator + ".set_last_error_from_exception " + l_message) + write_critical_log (generator + ".set_last_error_from_exception " + l_message) else set_last_error ("Generic error", "") - log.write_critical (generator + ".set_last_error_from_exception Generic Error") + write_critical_log (generator + ".set_last_error_from_exception Generic Error") end rescue l_retried := True @@ -75,7 +75,7 @@ feature -- Element Settings attached_location: a_location /= Void do create last_error.make (a_message, a_location) - log.write_critical (generator + ".set_last_error " + a_message) + write_critical_log (generator + ".set_last_error " + a_message) successful := False ensure last_error_set: attached last_error @@ -103,6 +103,6 @@ feature -- Element Settings successful: successful end note - copyright: "2011-2014, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" + copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" end diff --git a/library/layout/src/logger/logger.e b/library/layout/src/logger/logger.e new file mode 100644 index 0000000..032cdbe --- /dev/null +++ b/library/layout/src/logger/logger.e @@ -0,0 +1,172 @@ +note + description: "Summary description for {LOGGER}." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + LOGGER + +inherit + ANY + + LOG_PRIORITY_CONSTANTS + export + {NONE} all + end + + SHARED_EXECUTION_ENVIRONMENT + export + {NONE} all + end + +create + make, + make_with_layout + +feature {NONE} -- Initialization + + make + do + create log.make + end + + make_with_layout (app: APPLICATION_LAYOUT) + do + make + apply_layout (app) + end + +feature -- Change + + apply_layout (app: APPLICATION_LAYOUT) + do + initialize_logger (app, log) + end + +feature {NONE} -- Internal + + log: LOGGING_FACILITY + +feature -- Logging + + put_information (a_message: separate READABLE_STRING_8) + do + log.write_information (create {STRING}.make_from_separate (a_message)) + end + + put_error (a_message: separate READABLE_STRING_8) + do + log.write_error (create {STRING}.make_from_separate (a_message)) + end + + put_warning (a_message: separate READABLE_STRING_8) + do + log.write_warning (create {STRING}.make_from_separate (a_message)) + end + + put_critical (a_message: separate READABLE_STRING_8) + do + log.write_critical (create {STRING}.make_from_separate (a_message)) + end + + put_alert (a_message: separate READABLE_STRING_8) + do + log.write_alert (create {STRING}.make_from_separate (a_message)) + end + + put_debug (a_message: separate READABLE_STRING_8) + do + log.write_debug (create {STRING}.make_from_separate (a_message)) + end + +feature {NONE} -- Implementation + + initialize_logger (app: APPLICATION_LAYOUT; a_log: like log) + local + l_log_writer_file: LOG_ROLLING_WRITER_FILE + l_log_writer: LOG_WRITER + l_logs_path: detachable PATH + l_logger_config: LOGGER_CONFIGURATION + ut: FILE_UTILITIES + do + l_logger_config := new_logger_level_configuration (app.application_config_path) + l_logs_path := l_logger_config.location + if l_logs_path = Void then + l_logs_path := app.logs_path + end + if ut.directory_path_exists (l_logs_path) then + create l_log_writer_file.make_at_location (l_logs_path.extended (app.name).appended_with_extension ("log")) + l_log_writer_file.set_max_file_size ({NATURAL_64} 1024 * 1204) + l_log_writer_file.set_max_backup_count (l_logger_config.backup_count) + l_log_writer := l_log_writer_file + else + -- Should we create the directory anyway ? + create {LOG_WRITER_NULL} l_log_writer + end + set_logger_level (l_log_writer, l_logger_config.level) + a_log.register_log_writer (l_log_writer) + end + + set_logger_level (a_log_writer: LOG_WRITER; a_priority: INTEGER) + -- Setup the logger level based on `a_priority' + do + if a_priority = log_debug then + a_log_writer.enable_debug_log_level + elseif a_priority = Log_emergency then + a_log_writer.enable_emergency_log_level + elseif a_priority = Log_alert then + a_log_writer.enable_alert_log_level + elseif a_priority = Log_critical then + a_log_writer.enable_critical_log_level + elseif a_priority = Log_error then + a_log_writer.enable_error_log_level + elseif a_priority = Log_warning then + a_log_writer.enable_warning_log_level + elseif a_priority = Log_notice then + a_log_writer.enable_notice_log_level + elseif a_priority = Log_information then + a_log_writer.enable_information_log_level + else + a_log_writer.enable_unkno_log_level + end + end + + new_logger_level_configuration (a_path: PATH): LOGGER_CONFIGURATION + -- Retrieve a new logger level configuration. + -- By default, level is set to `DEBUG'. + local + l_parser: JSON_PARSER + ut: FILE_UTILITIES + do + create Result + if + ut.file_path_exists (a_path) and then + attached (create {JSON_FILE_READER}).read_json_from (a_path.name) as json_file + then + create l_parser.make_with_string (json_file) + l_parser.parse_content + if + l_parser.is_valid and then + attached l_parser.parsed_json_object as jv and then + attached {JSON_OBJECT} jv.item ("logger") as l_logger + then + if attached {JSON_STRING} l_logger.item ("location") as l_location then + Result.set_location_with_string (l_location.item) + end + if attached {JSON_STRING} l_logger.item ("backup_count") as l_count then + if l_count.item.is_natural then + Result.set_backup_count (l_count.item.to_natural) + end + end + if attached {JSON_STRING} l_logger.item ("level") as l_level then + Result.set_level (l_level.item) + end + end + end + end + +note + copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/library/layout/src/logger/logging_facility.e b/library/layout/src/logger/logging_facility.e index 7807e15..0b87e88 100644 --- a/library/layout/src/logger/logging_facility.e +++ b/library/layout/src/logger/logging_facility.e @@ -67,7 +67,6 @@ feature -- Output rescue l_retry := True retry - end write_emergency (msg: STRING) @@ -135,6 +134,6 @@ feature -- Output retry end note - copyright: "2011-2014, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" + copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" end diff --git a/library/layout/src/logger/shared_logger.e b/library/layout/src/logger/shared_logger.e index 20a24fd..8d32052 100644 --- a/library/layout/src/logger/shared_logger.e +++ b/library/layout/src/logger/shared_logger.e @@ -13,100 +13,103 @@ inherit feature -- Logger - log: LOGGING_FACILITY + logger: separate LOGGER -- `log' facility (once per process) -- that could be shared between threads -- without reinitializing it. - once ("PROCESS") - create Result.make + do + Result := logger_cell_item (logger_cell) end + logger_cell: separate CELL [separate LOGGER] + once ("PROCESS") + create Result.put (create {separate LOGGER}.make) + end + + logger_cell_item (a_cell: like logger_cell): separate LOGGER + do + Result := a_cell.item + end + +feature -- Logging + + write_debug_log (m: READABLE_STRING_8) + do + write_debug_log_to (m, logger) + end + + write_information_log (m: READABLE_STRING_8) + do + write_information_log_to (m, logger) + end + + write_warning_log (m: READABLE_STRING_8) + do + write_warning_log_to (m, logger) + end + + write_error_log (m: READABLE_STRING_8) + do + write_error_log_to (m, logger) + end + + write_critical_log (m: READABLE_STRING_8) + do + write_critical_log_to (m, logger) + end + + write_alert_log (m: READABLE_STRING_8) + do + write_alert_log_to (m, logger) + end + +feature {NONE} -- Logger: separate implementation + + write_debug_log_to (m: READABLE_STRING_8; a_log: like logger) + do + a_log.put_debug (m) + end + + write_information_log_to (m: READABLE_STRING_8; a_log: like logger) + do + a_log.put_information (m) + end + + write_warning_log_to (m: READABLE_STRING_8; a_log: like logger) + do + a_log.put_warning (m) + end + + write_error_log_to (m: READABLE_STRING_8; a_log: like logger) + do + a_log.put_error (m) + end + + write_critical_log_to (m: READABLE_STRING_8; a_log: like logger) + do + a_log.put_critical (m) + end + + write_alert_log_to (m: READABLE_STRING_8; a_log: like logger) + do + a_log.put_alert (m) + end + + feature {NONE} -- Implementation initialize_logger (app: APPLICATION_LAYOUT) local - l_log_writer_file: LOG_ROLLING_WRITER_FILE - l_log_writer: LOG_WRITER - l_logs_path: detachable PATH - l_logger_config: LOGGER_CONFIGURATION - ut: FILE_UTILITIES + l_logger: LOGGER do - l_logger_config := new_logger_level_configuration (app.application_config_path) - l_logs_path := l_logger_config.location - if l_logs_path = Void then - l_logs_path := app.logs_path - end - if ut.directory_path_exists (l_logs_path) then - create l_log_writer_file.make_at_location (l_logs_path.extended (app.name).appended_with_extension ("log")) - l_log_writer_file.set_max_file_size ({NATURAL_64} 1024 * 1204) - l_log_writer_file.set_max_backup_count (l_logger_config.backup_count) - l_log_writer := l_log_writer_file - else - -- Should we create the directory anyway ? - create {LOG_WRITER_NULL} l_log_writer - end - set_logger_level (l_log_writer, l_logger_config.level) - log.register_log_writer (l_log_writer) + create l_logger.make_with_layout (app) + set_logger_to (l_logger, logger_cell) end - set_logger_level (a_log_writer: LOG_WRITER; a_priority: INTEGER) - -- Setup the logger level based on `a_priority' + set_logger_to (a_logger: separate LOGGER; a_cell: like logger_cell) do - if a_priority = log_debug then - a_log_writer.enable_debug_log_level - elseif a_priority = Log_emergency then - a_log_writer.enable_emergency_log_level - elseif a_priority = Log_alert then - a_log_writer.enable_alert_log_level - elseif a_priority = Log_critical then - a_log_writer.enable_critical_log_level - elseif a_priority = Log_error then - a_log_writer.enable_error_log_level - elseif a_priority = Log_warning then - a_log_writer.enable_warning_log_level - elseif a_priority = Log_notice then - a_log_writer.enable_notice_log_level - elseif a_priority = Log_information then - a_log_writer.enable_information_log_level - else - a_log_writer.enable_unkno_log_level - end + a_cell.replace (a_logger) end - - new_logger_level_configuration (a_path: PATH): LOGGER_CONFIGURATION - -- Retrieve a new logger level configuration. - -- By default, level is set to `DEBUG'. - local - l_parser: JSON_PARSER - ut: FILE_UTILITIES - do - create Result - if - ut.file_path_exists (a_path) and then - attached (create {JSON_FILE_READER}).read_json_from (a_path.name) as json_file - then - create l_parser.make_with_string (json_file) - l_parser.parse_content - if - l_parser.is_valid and then - attached l_parser.parsed_json_object as jv and then - attached {JSON_OBJECT} jv.item ("logger") as l_logger - then - if attached {JSON_STRING} l_logger.item ("location") as l_location then - Result.set_location_with_string (l_location.item) - end - if attached {JSON_STRING} l_logger.item ("backup_count") as l_count then - if l_count.item.is_natural then - Result.set_backup_count (l_count.item.to_natural) - end - end - if attached {JSON_STRING} l_logger.item ("level") as l_level then - Result.set_level (l_level.item) - end - end - end - end - note copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" diff --git a/library/model/src/content/cms_node.e b/library/model/src/content/cms_node.e index 8735e72..072d9c1 100644 --- a/library/model/src/content/cms_node.e +++ b/library/model/src/content/cms_node.e @@ -14,10 +14,17 @@ inherit REFACTORING_HELPER create - make + make, + make_empty feature{NONE} -- Initialization + make_empty + -- Create empty node. + do + make ({STRING_32} "", {STRING_32} "", {STRING_32} "") + end + make (a_content: READABLE_STRING_32; a_summary: READABLE_STRING_32; a_title: READABLE_STRING_32) -- Create current node with `a_content', `a_summary' and `a_title'. local @@ -83,9 +90,6 @@ feature -- Access author: detachable CMS_USER -- Author of current node. --- collaborators: detachable LIST[CMS_USER] --- -- Users contributed to current Node. - feature -- status report has_id: BOOLEAN @@ -191,6 +195,6 @@ feature -- Element change -- end note - copyright: "2011-2014, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" + copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" end diff --git a/library/persistence/implementation/store/cms_storage_store_sql.e b/library/persistence/implementation/store/cms_storage_store_sql.e index 57cee85..d5511bd 100644 --- a/library/persistence/implementation/store/cms_storage_store_sql.e +++ b/library/persistence/implementation/store/cms_storage_store_sql.e @@ -20,7 +20,7 @@ feature {NONE} -- Initialization is_connected: a_connection.is_connected do connection := a_connection - log.write_information (generator + ".make - is database connected? "+ a_connection.is_connected.out ) + write_information_log (generator + ".make - is database connected? "+ a_connection.is_connected.out ) create {DATABASE_HANDLER_IMPL} db_handler.make (a_connection) @@ -50,7 +50,7 @@ feature -- Query do error_handler.append (db_handler.database_error_handler) if error_handler.has_error then - log.write_critical (generator + ".post_execution " + error_handler.as_string_representation) + write_critical_log (generator + ".post_execution " + error_handler.as_string_representation) end end diff --git a/library/persistence/implementation/store/database/database_connection_odbc.e b/library/persistence/implementation/store/database/database_connection_odbc.e index cc03ea5..c9c2512 100644 --- a/library/persistence/implementation/store/database/database_connection_odbc.e +++ b/library/persistence/implementation/store/database/database_connection_odbc.e @@ -42,7 +42,7 @@ feature -- Initialization rescue create db_control.make -- set_last_error_from_exception ("Connection execution") --- log.write_critical (generator + ".make_common:" + last_error_message) +-- write_critical_log (generator + ".make_common:" + last_error_message) if is_connected then disconnect end @@ -73,7 +73,7 @@ feature -- Initialization rescue create db_control.make -- set_last_error_from_exception ("Connection execution") --- log.write_critical (generator + ".make_common:" + last_error_message) +-- write_critical_log (generator + ".make_common:" + last_error_message) if is_connected then disconnect end @@ -103,20 +103,20 @@ feature -- Initialization login_with_connection_string (a_string: STRING) -- Login with `a_connection_string'and immediately connect to database. do - log.write_debug (generator +".login_with_connection_string") + write_debug_log (generator +".login_with_connection_string") create db_application.login_with_connection_string (a_string) create database_error_handler.make db_application.set_base create db_control.make - log.write_debug (generator +".login_with_connection_string, is_keep_connection? "+ is_keep_connection.out ) + write_debug_log (generator +".login_with_connection_string, is_keep_connection? "+ is_keep_connection.out ) keep_connection := is_keep_connection if keep_connection then connect if not db_control.is_ok then - log.write_critical (generator +".login_with_connection_string:"+ db_control.error_code.out ) - log.write_critical (generator +".login_with_connection_string:"+ db_control.error_message_32 ) + write_critical_log (generator +".login_with_connection_string:"+ db_control.error_code.out ) + write_critical_log (generator +".login_with_connection_string:"+ db_control.error_message_32 ) end - log.write_debug (generator +".login_with_connection_string, After connect, is_connected? "+ is_connected.out) + write_debug_log (generator +".login_with_connection_string, After connect, is_connected? "+ is_connected.out) end end diff --git a/library/persistence/implementation/store/database/database_handler.e b/library/persistence/implementation/store/database/database_handler.e index ee33311..c974b35 100644 --- a/library/persistence/implementation/store/database/database_handler.e +++ b/library/persistence/implementation/store/database/database_handler.e @@ -177,7 +177,7 @@ feature -- Error handling do if attached db_change as l_change and then not l_change.is_ok then database_error_handler.add_database_error (l_change.error_message_32, l_change.error_code) - log.write_error (generator + ".check_database_change_error: " + l_change.error_message_32) + write_error_log (generator + ".check_database_change_error: " + l_change.error_message_32) l_change.reset end end @@ -187,7 +187,7 @@ feature -- Error handling do if attached db_selection as l_selection and then not l_selection.is_ok then database_error_handler.add_database_error (l_selection.error_message_32, l_selection.error_code) - log.write_error (generator + ".check_database_selection_error: " + l_selection.error_message_32) + write_error_log (generator + ".check_database_selection_error: " + l_selection.error_message_32) l_selection.reset end end diff --git a/library/persistence/implementation/store/database/database_handler_impl.e b/library/persistence/implementation/store/database/database_handler_impl.e index 1de28a1..e6e61b6 100644 --- a/library/persistence/implementation/store/database/database_handler_impl.e +++ b/library/persistence/implementation/store/database/database_handler_impl.e @@ -44,7 +44,7 @@ feature -- Functionality items := l_store.execute_reader (l_db_selection) check_database_selection_error end - log.write_debug ( generator+".execute_reader Successful") + write_debug_log ( generator+".execute_reader Successful") end rescue l_retried := True @@ -69,7 +69,7 @@ feature -- Functionality l_store.execute_writer (l_db_change) check_database_change_error end - log.write_debug ( generator+".execute_writer Successful") + write_debug_log ( generator+".execute_writer Successful") end rescue l_retried := True diff --git a/library/persistence/implementation/store/database/database_query.e b/library/persistence/implementation/store/database/database_query.e index 9c91238..531409d 100644 --- a/library/persistence/implementation/store/database/database_query.e +++ b/library/persistence/implementation/store/database/database_query.e @@ -19,8 +19,8 @@ feature {NONE} -- Intialization data_reader (a_query: STRING; a_parameters: like parameters) -- SQL data reader for the query `a_query' with arguments `a_parameters' do - log.write_information (generator + ".data_reader" + " execute query: " + a_query) - log.write_debug (generator + ".data_reader" + " arguments:" + log_parameters (a_parameters)) + write_information_log (generator + ".data_reader" + " execute query: " + a_query) + write_debug_log (generator + ".data_reader" + " arguments:" + log_parameters (a_parameters)) query := a_query parameters := a_parameters ensure @@ -43,7 +43,7 @@ feature -- Execution a_base_selection.load_result Result := a_base_selection.container else - log.write_error (generator + "." + a_base_selection.error_message_32) + write_error_log (generator + "." + a_base_selection.error_message_32) end unset_map_name (a_base_selection) a_base_selection.terminate diff --git a/library/persistence/implementation/store/database/database_store_procedure.e b/library/persistence/implementation/store/database/database_store_procedure.e index 82c9fa8..97d5ecd 100644 --- a/library/persistence/implementation/store/database/database_store_procedure.e +++ b/library/persistence/implementation/store/database/database_store_procedure.e @@ -20,8 +20,8 @@ feature -- Intialization local l_retried: BOOLEAN do - log.write_information (generator + ".data_reader" + " execute store procedure: " + a_sp) - log.write_debug (generator + ".data_reader" + " arguments:" + log_parameters (a_parameters)) + write_information_log (generator + ".data_reader" + " execute store procedure: " + a_sp) + write_debug_log (generator + ".data_reader" + " arguments:" + log_parameters (a_parameters)) if not l_retried then stored_procedure := a_sp parameters := a_parameters @@ -33,14 +33,14 @@ feature -- Intialization if proc.exists then if proc.text_32 /= Void then debug - log.write_debug ( generator + ".data_reader: " + proc.text_32) + write_debug_log ( generator + ".data_reader: " + proc.text_32) end end else has_error := True error_message := proc.error_message_32 error_code := proc.error_code - log.write_error (generator + ".data_witer message:" + proc.error_message_32 + " code:" + proc.error_code.out) + write_error_log (generator + ".data_witer message:" + proc.error_message_32 + " code:" + proc.error_code.out) end else stored_procedure := a_sp @@ -49,7 +49,7 @@ feature -- Intialization end rescue set_last_error_from_exception ("SQL execution") - log.write_critical (generator+ ".data_reader " + last_error_message) + write_critical_log (generator+ ".data_reader " + last_error_message) l_retried := True retry end @@ -59,8 +59,8 @@ feature -- Intialization local l_retried: BOOLEAN do - log.write_information (generator + ".data_reader" + " execute store procedure: " + a_sp) - log.write_debug (generator + ".data_reader" + " arguments:" + log_parameters (a_parameters)) + write_information_log (generator + ".data_reader" + " execute store procedure: " + a_sp) + write_debug_log (generator + ".data_reader" + " arguments:" + log_parameters (a_parameters)) if not l_retried then stored_procedure := a_sp parameters := a_parameters @@ -70,14 +70,14 @@ feature -- Intialization if proc.exists then if proc.text_32 /= Void then debug - log.write_debug ( generator + ".data_writer: " + proc.text_32) + write_debug_log ( generator + ".data_writer: " + proc.text_32) end end else has_error := True error_message := proc.error_message_32 error_code := proc.error_code - log.write_error (generator + ".data_witer message:" + proc.error_message_32 + " code:" + proc.error_code.out) + write_error_log (generator + ".data_witer message:" + proc.error_message_32 + " code:" + proc.error_code.out) end else stored_procedure := a_sp @@ -86,12 +86,11 @@ feature -- Intialization end rescue set_last_error_from_exception ("SQL execution") - log.write_critical (generator+ ".data_reader " + last_error_message) + write_critical_log (generator+ ".data_reader " + last_error_message) l_retried := True retry end - execute_reader (a_base_selection: DB_SELECTION): detachable LIST [DB_RESULT] -- Execute the Current store procedure. do diff --git a/library/persistence/sqlite/src/cms_node_storage_sqlite.e b/library/persistence/sqlite/src/cms_node_storage_sqlite.e index 7f0dc80..5d9b150 100644 --- a/library/persistence/sqlite/src/cms_node_storage_sqlite.e +++ b/library/persistence/sqlite/src/cms_node_storage_sqlite.e @@ -47,7 +47,7 @@ feature -- Access: iterator l_parameters: STRING_TABLE [ANY] do error_handler.reset - log.write_information (generator + ".nodes_iterator") + write_information_log (generator + ".nodes_iterator") create l_parameters.make (0) sql_query (select_nodes, l_parameters) create Result.make (db_handler, agent fetch_node) @@ -61,7 +61,7 @@ feature -- Access: iterator do -- FIXME: check implementation... error_handler.reset - log.write_information (generator + ".recent_nodes_iterator") + write_information_log (generator + ".recent_nodes_iterator") create l_parameters.make (2) l_parameters.put (a_rows, "rows") l_parameters.put (a_lower, "offset") diff --git a/src/modules/basic_auth/basic_auth_module.e b/src/modules/basic_auth/basic_auth_module.e index 33967cd..1cb025c 100644 --- a/src/modules/basic_auth/basic_auth_module.e +++ b/src/modules/basic_auth/basic_auth_module.e @@ -1,5 +1,8 @@ note - description: "This module allows the use of HTTP Basic Authentication to restrict access by looking up users in the given providers." + description: "[ + This module allows the use of HTTP Basic Authentication to restrict access + by looking up users in the given providers. + ]" date: "$Date: 2015-02-09 22:29:56 +0100 (lun., 09 févr. 2015) $" revision: "$Revision: 96596 $" @@ -82,7 +85,7 @@ feature -- Hooks configuration -- Module hooks configuration. do -- a_response.subscribe_to_block_hook (Current) - end + end feature -- Hooks @@ -107,9 +110,9 @@ feature -- Hooks lnk: CMS_LOCAL_LINK do if attached a_response.current_user (a_response.request) as u then - create lnk.make ("Logout", "/basic_auth_logoff") + create lnk.make (u.name + " (Logout)", "/basic_auth_logoff?destination=" + a_response.request.request_uri) else - create lnk.make ("Login", "/basic_auth_login") + create lnk.make ("Login", "/basic_auth_login?destination=" + a_response.request.request_uri) end -- if not a_menu_system.primary_menu.has (lnk) then lnk.set_weight (99) diff --git a/src/modules/basic_auth/filter/basic_auth_filter.e b/src/modules/basic_auth/filter/basic_auth_filter.e index 0659cb6..158d4be 100644 --- a/src/modules/basic_auth/filter/basic_auth_filter.e +++ b/src/modules/basic_auth/filter/basic_auth_filter.e @@ -50,7 +50,7 @@ feature -- Basic operations execute_next (req, res) end else - api.logger.put_error (generator + ".execute Not valid", Void) + api.logger.put_debug (generator + ".execute without authentication", Void) execute_next (req, res) end end diff --git a/src/modules/basic_auth/handler/basic_auth_login_handler.e b/src/modules/basic_auth/handler/basic_auth_login_handler.e index fe738c2..c92b024 100644 --- a/src/modules/basic_auth/handler/basic_auth_login_handler.e +++ b/src/modules/basic_auth/handler/basic_auth_login_handler.e @@ -50,11 +50,21 @@ feature -- HTTP Methods do api.logger.put_information (generator + ".do_get Processing basic auth login", Void) if attached {STRING_32} current_user_name (req) as l_user then - (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url("/")) + if attached {WSF_STRING} req.query_parameter ("destination") as l_uri then + redirect_to (req.absolute_script_url (l_uri.url_encoded_value), res) + else + redirect_to (req.absolute_script_url ("/"), res) + end else - (create {CMS_GENERIC_RESPONSE}).new_response_authenticate (req, res) + send_basic_authentication_challenge (Void, res) end end +feature -- Helpers + + send_basic_authentication_challenge (a_realm: detachable READABLE_STRING_8; res: WSF_RESPONSE) + do + res.send (create {CMS_UNAUTHORIZED_RESPONSE_MESSAGE}.make_with_basic_auth_challenge (a_realm)) + end end diff --git a/src/modules/basic_auth/handler/basic_auth_logoff_handler.e b/src/modules/basic_auth/handler/basic_auth_logoff_handler.e index 329a707..432376e 100644 --- a/src/modules/basic_auth/handler/basic_auth_logoff_handler.e +++ b/src/modules/basic_auth/handler/basic_auth_logoff_handler.e @@ -45,13 +45,29 @@ feature -- HTTP Methods -- local l_page: CMS_RESPONSE + l_url: STRING + i: INTEGER do api.logger.put_information (generator + ".do_get Processing basic auth logoff", Void) if attached req.query_parameter ("prompt") as l_prompt then - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + unset_current_user (req) + send_access_denied (res) else create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api) - l_page.set_status_code ({HTTP_STATUS_CODE}.unauthorized) + unset_current_user (req) + l_page.set_status_code ({HTTP_STATUS_CODE}.found) -- Note: can not use {HTTP_STATUS_CODE}.unauthorized for redirection + if attached {WSF_STRING} req.query_parameter ("destination") as l_uri then + l_url := req.absolute_script_url (l_uri.url_encoded_value) + else + l_url := req.absolute_script_url ("") + end + i := l_url.substring_index ("://", 1) + if i > 0 then + -- Note: this is a hack to have the logout effective on various browser + -- (firefox requires this). + l_url.replace_substring ("://_logout_basic_auth_@", i, i + 2) + end + l_page.set_redirection (l_url) l_page.execute end end diff --git a/src/modules/node/handler/node_content_handler.e b/src/modules/node/handler/node_content_handler.e index 47fd59b..fae3487 100644 --- a/src/modules/node/handler/node_content_handler.e +++ b/src/modules/node/handler/node_content_handler.e @@ -77,7 +77,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end @@ -102,7 +102,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end @@ -118,7 +118,7 @@ feature -- HTTP Methods u_node := extract_data_form (req) u_node.set_id (l_id.value.to_integer_64) node_api.update_node_content (l_user.id, u_node.id, u_node.content) - (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) + redirect_to (req.absolute_script_url (""), res) else do_error (req, res, l_id) end @@ -126,7 +126,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end feature -- Error diff --git a/src/modules/node/handler/node_handler.e b/src/modules/node/handler/node_handler.e index f55dd3c..4257563 100644 --- a/src/modules/node/handler/node_handler.e +++ b/src/modules/node/handler/node_handler.e @@ -111,10 +111,10 @@ feature -- HTTP Methods update_node_from_data_form (req, u_node) u_node.set_author (l_user) node_api.new_node (u_node) - (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) + redirect_to (req.absolute_script_url (""), res) end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end @@ -131,7 +131,7 @@ feature -- HTTP Methods update_node_from_data_form (req, l_node) l_node.set_author (l_user) node_api.update_node (l_node) - (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) + redirect_to (req.absolute_script_url (""), res) else do_error (req, res, l_id) end @@ -139,7 +139,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end @@ -153,7 +153,7 @@ feature -- HTTP Methods attached node_api.node (l_id.integer_value) as l_node then node_api.delete_node (l_node) - (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) + res.send (create {CMS_REDIRECTION_RESPONSE_MESSAGE}.make (req.absolute_script_url (""))) else do_error (req, res, l_id) end @@ -161,7 +161,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end @@ -196,7 +196,7 @@ feature {NONE} -- Node create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api) l_page.execute else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end diff --git a/src/modules/node/handler/node_summary_handler.e b/src/modules/node/handler/node_summary_handler.e index bf83150..7a3d3af 100644 --- a/src/modules/node/handler/node_summary_handler.e +++ b/src/modules/node/handler/node_summary_handler.e @@ -77,7 +77,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end @@ -102,7 +102,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end @@ -117,7 +117,7 @@ feature -- HTTP Methods u_node := extract_data_form (req) u_node.set_id (l_id.value.to_integer_64) node_api.update_node_summary (l_user.id,u_node.id, u_node.summary) - (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) + redirect_to (req.absolute_script_url (""), res) else do_error (req, res, l_id) end @@ -125,7 +125,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end diff --git a/src/modules/node/handler/node_title_handler.e b/src/modules/node/handler/node_title_handler.e index 63d0233..5f72b72 100644 --- a/src/modules/node/handler/node_title_handler.e +++ b/src/modules/node/handler/node_title_handler.e @@ -77,7 +77,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end @@ -101,7 +101,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end @@ -117,7 +117,7 @@ feature -- HTTP Methods u_node := extract_data_form (req) u_node.set_id (l_id.value.to_integer_64) node_api.update_node_title (l_user.id, u_node.id, u_node.title) - (create {CMS_GENERIC_RESPONSE}).new_response_redirect (req, res, req.absolute_script_url ("")) + redirect_to (req.absolute_script_url (""), res) else do_error (req, res, l_id) end @@ -125,7 +125,7 @@ feature -- HTTP Methods (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute end else - (create {CMS_GENERIC_RESPONSE}).new_response_unauthorized (req, res) + send_access_denied (res) end end diff --git a/src/modules/node/handler/nodes_handler.e b/src/modules/node/handler/nodes_handler.e index 36e1696..a4b790b 100644 --- a/src/modules/node/handler/nodes_handler.e +++ b/src/modules/node/handler/nodes_handler.e @@ -1,5 +1,5 @@ note - description: "Summary description for {NODES_HANDLER}." + description: "Request handler related to /nodes." date: "$Date: 2015-02-13 13:08:13 +0100 (ven., 13 févr. 2015) $" revision: "$Revision: 96616 $" @@ -38,12 +38,40 @@ feature -- HTTP Methods -- local l_page: CMS_RESPONSE + s: STRING + l_user: CMS_USER + l_node: CMS_NODE do -- At the moment the template is hardcoded, but we can -- get them from the configuration file and load them into -- the setup class. + create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api) l_page.add_variable (node_api.nodes, "nodes") + + + -- NOTE: for development purposes we have the following hardcode output. + create s.make_from_string ("

Nodes:

") + if attached node_api.nodes as lst then + across + lst as ic + loop + s.append ("
  • ") + s.append ("") + s.append (api.html_encoded (ic.item.title)) + s.append (" (") + s.append (ic.item.id.out) + s.append (")") + s.append ("") + s.append ("
  • %N") + end + end + + l_page.set_main_content (s) + l_page.add_block (create {CMS_CONTENT_BLOCK}.make ("nodes_warning", Void, "/nodes/ is not yet fully implemented
    ", Void), "highlighted") l_page.execute end + end diff --git a/src/modules/node/node_module.e b/src/modules/node/node_module.e index 91cdc52..9ff4304 100644 --- a/src/modules/node/node_module.e +++ b/src/modules/node/node_module.e @@ -73,7 +73,7 @@ feature {NONE} -- Implementation: routes l_methods.enable_put l_methods.enable_delete a_router.handle_with_request_methods ("/node/{id}", l_node_handler, l_methods) - a_router.handle_with_request_methods ("/nodes/", create {WSF_URI_AGENT_HANDLER}.make (agent do_get_nodes (?,?, a_api, a_node_api)), a_router.methods_get) +-- a_router.handle_with_request_methods ("/nodes/", create {WSF_URI_AGENT_HANDLER}.make (agent do_get_nodes (?,?, a_api, a_node_api)), a_router.methods_get) end configure_api_nodes (a_api: CMS_API; a_node_api: CMS_NODE_API; a_router: WSF_ROUTER) @@ -97,7 +97,7 @@ feature {NONE} -- Implementation: routes l_methods.enable_get l_methods.enable_post l_methods.enable_put - a_router.handle_with_request_methods ("/node/{id}/summary", l_report_handler, l_methods) + a_router.handle_with_request_methods ("/node/{id}/field/summary", l_report_handler, l_methods) end configure_api_node_title (a_api: CMS_API; a_node_api: CMS_NODE_API; a_router: WSF_ROUTER) @@ -110,7 +110,7 @@ feature {NONE} -- Implementation: routes l_methods.enable_get l_methods.enable_post l_methods.enable_put - a_router.handle_with_request_methods ("/node/{id}/title", l_report_handler, l_methods) + a_router.handle_with_request_methods ("/node/{id}/field/title", l_report_handler, l_methods) end configure_api_node_content (a_api: CMS_API; a_node_api: CMS_NODE_API; a_router: WSF_ROUTER) @@ -123,7 +123,7 @@ feature {NONE} -- Implementation: routes l_methods.enable_get l_methods.enable_post l_methods.enable_put - a_router.handle_with_request_methods ("/node/{id}/content", l_report_handler, l_methods) + a_router.handle_with_request_methods ("/node/{id}/field/content", l_report_handler, l_methods) end feature -- Hooks @@ -156,48 +156,4 @@ feature -- Hooks a_menu_system.primary_menu.extend (lnk) end -feature -- Handler - - do_get_nodes (req: WSF_REQUEST; res: WSF_RESPONSE; a_api: CMS_API; a_node_api: CMS_NODE_API) - local - r: CMS_RESPONSE - s: STRING - l_user: CMS_USER - l_node: CMS_NODE - do - create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, a_api) - - if attached a_api.user_api.user_by_name ("foo") as u then - l_user := u - else - create l_user.make ("foo") - l_user.set_password ("foobar#") - l_user.set_email ("test@example.com") - a_api.user_api.new_user (l_user) - end - if a_node_api.nodes_count = 0 then - create l_node.make ({STRING_32} "This is a content", {STRING_32} "And a summary", {STRING_32} "Nice title") - l_node.set_author (l_user) - a_node_api.new_node (l_node) - end - - create s.make_from_string ("

    Nodes:

    ") - if attached a_node_api.nodes as lst then - across - lst as ic - loop - s.append ("
  • ") - s.append (a_api.html_encoded (ic.item.title)) - s.append (" (") - s.append (ic.item.id.out) - s.append (")") - s.append ("
  • %N") - end - end - - r.set_main_content (s) - r.add_block (create {CMS_CONTENT_BLOCK}.make ("nodes_warning", Void, "/nodes/ is not yet fully implemented
    ", Void), "highlighted") - r.execute - end - end diff --git a/src/persistence/cms_storage_null.e b/src/persistence/cms_storage_null.e index a9cfb95..7e28103 100644 --- a/src/persistence/cms_storage_null.e +++ b/src/persistence/cms_storage_null.e @@ -49,7 +49,7 @@ feature -- Access: user users: LIST [CMS_USER] do - create {ARRAYED_LIST[CMS_USER]} Result.make (0) + create {ARRAYED_LIST [CMS_USER]} Result.make (0) end user_by_id (a_id: like {CMS_USER}.id): detachable CMS_USER @@ -70,16 +70,16 @@ feature -- Access: user feature -- User Nodes - user_collaborator_nodes (a_id: like {CMS_USER}.id): LIST[CMS_NODE] + user_collaborator_nodes (a_id: like {CMS_USER}.id): LIST [CMS_NODE] -- Possible list of nodes where the user identified by `a_id', is a collaborator. do - create {ARRAYED_LIST[CMS_NODE]} Result.make (0) + create {ARRAYED_LIST [CMS_NODE]} Result.make (0) end - user_author_nodes (a_id: like {CMS_USER}.id): LIST[CMS_NODE] + user_author_nodes (a_id: like {CMS_USER}.id): LIST [CMS_NODE] -- Possible list of nodes where the user identified by `a_id', is the author. do - create {ARRAYED_LIST[CMS_NODE]} Result.make (0) + create {ARRAYED_LIST [CMS_NODE]} Result.make (0) end feature -- Change: user @@ -87,6 +87,7 @@ feature -- Change: user new_user (a_user: CMS_USER) -- Add a new user `a_user'. do + a_user.set_id (1) end update_user (a_user: CMS_USER) @@ -102,10 +103,9 @@ feature -- Access: roles and permissions user_roles: LIST [CMS_USER_ROLE] do - create {ARRAYED_LIST[CMS_USER_ROLE]} Result.make (0) + create {ARRAYED_LIST [CMS_USER_ROLE]} Result.make (0) end - feature -- Change: roles and permissions save_user_role (a_user_role: CMS_USER_ROLE) @@ -122,13 +122,13 @@ feature -- Access: node nodes: LIST[CMS_NODE] -- List of nodes. do - create {ARRAYED_LIST[CMS_NODE]} Result.make (0) + create {ARRAYED_LIST [CMS_NODE]} Result.make (0) end recent_nodes (a_lower: INTEGER; a_count: INTEGER): LIST [CMS_NODE] -- List of the `a_count' most recent nodes, starting from `a_lower'. do - create {ARRAYED_LIST[CMS_NODE]} Result.make (0) + create {ARRAYED_LIST [CMS_NODE]} Result.make (0) end node_by_id (a_id: INTEGER_64): detachable CMS_NODE @@ -144,7 +144,7 @@ feature -- Access: node node_collaborators (a_id: like {CMS_NODE}.id): LIST [CMS_USER] -- Possible list of node's collaborator. do - create {ARRAYED_LIST[CMS_USER]} Result.make (0) + create {ARRAYED_LIST [CMS_USER]} Result.make (0) end feature -- Node diff --git a/src/persistence/node/cms_node_storage_sql.e b/src/persistence/node/cms_node_storage_sql.e index 8d83ef5..42f7c5f 100644 --- a/src/persistence/node/cms_node_storage_sql.e +++ b/src/persistence/node/cms_node_storage_sql.e @@ -22,7 +22,7 @@ feature -- Access -- Number of items nodes. do error_handler.reset - log.write_information (generator + ".nodes_count") + write_information_log (generator + ".nodes_count") sql_query (select_nodes_count, Void) if sql_rows_count = 1 then Result := sql_read_integer_64 (1) @@ -35,7 +35,7 @@ feature -- Access create {ARRAYED_LIST [CMS_NODE]} Result.make (0) error_handler.reset - log.write_information (generator + ".nodes") + write_information_log (generator + ".nodes") from sql_query (select_nodes, Void) @@ -58,7 +58,7 @@ feature -- Access create {ARRAYED_LIST [CMS_NODE]} Result.make (0) error_handler.reset - log.write_information (generator + ".nodes") + write_information_log (generator + ".nodes") from create l_parameters.make (2) @@ -82,7 +82,7 @@ feature -- Access l_parameters: STRING_TABLE [ANY] do error_handler.reset - log.write_information (generator + ".node") + write_information_log (generator + ".node") create l_parameters.make (1) l_parameters.put (a_id,"id") sql_query (select_node_by_id, l_parameters) @@ -97,7 +97,7 @@ feature -- Access l_parameters: STRING_TABLE [ANY] do error_handler.reset - log.write_information (generator + ".node_author") + write_information_log (generator + ".node_author") create l_parameters.make (1) l_parameters.put (a_id, "node_id") sql_query (select_node_author, l_parameters) @@ -110,7 +110,7 @@ feature -- Access -- Last insert node id. do error_handler.reset - log.write_information (generator + ".last_inserted_node_id") + write_information_log (generator + ".last_inserted_node_id") sql_query (Sql_last_insert_node_id, Void) if sql_rows_count = 1 then Result := sql_read_integer_64 (1) @@ -126,7 +126,7 @@ feature -- Change: Node do -- New node error_handler.reset - log.write_information (generator + ".new_node") + write_information_log (generator + ".new_node") create l_parameters.make (7) l_parameters.put (a_node.title, "title") l_parameters.put (a_node.summary, "summary") @@ -153,7 +153,7 @@ feature -- Change: Node local l_parameters: STRING_TABLE [ANY] do - log.write_information (generator + ".delete_node") + write_information_log (generator + ".delete_node") error_handler.reset create l_parameters.make (1) @@ -169,7 +169,7 @@ feature -- Change: Node do create now.make_now_utc error_handler.reset - log.write_information (generator + ".update_node") + write_information_log (generator + ".update_node") create l_parameters.make (7) l_parameters.put (a_node.title, "title") l_parameters.put (a_node.summary, "summary") @@ -195,7 +195,7 @@ feature -- Change: Node do -- FIXME: unused a_user_id ! error_handler.reset - log.write_information (generator + ".update_node_title") + write_information_log (generator + ".update_node_title") create l_parameters.make (3) l_parameters.put (a_title, "title") l_parameters.put (create {DATE_TIME}.make_now_utc, "changed") @@ -210,7 +210,7 @@ feature -- Change: Node do -- FIXME: unused a_user_id ! error_handler.reset - log.write_information (generator + ".update_node_summary") + write_information_log (generator + ".update_node_summary") create l_parameters.make (3) l_parameters.put (a_summary, "summary") l_parameters.put (create {DATE_TIME}.make_now_utc, "changed") @@ -225,7 +225,7 @@ feature -- Change: Node do -- FIXME: unused a_user_id ! error_handler.reset - log.write_information (generator + ".update_node_content") + write_information_log (generator + ".update_node_content") create l_parameters.make (3) l_parameters.put (a_content, "content") l_parameters.put (create {DATE_TIME}.make_now_utc, "changed") diff --git a/src/persistence/user/cms_user_storage_sql.e b/src/persistence/user/cms_user_storage_sql.e index 72e45f8..b98ef69 100644 --- a/src/persistence/user/cms_user_storage_sql.e +++ b/src/persistence/user/cms_user_storage_sql.e @@ -28,7 +28,7 @@ feature -- Access: user -- Number of items users. do error_handler.reset - log.write_information (generator + ".user_count") + write_information_log (generator + ".user_count") sql_query (select_users_count, Void) if sql_rows_count = 1 then @@ -41,7 +41,7 @@ feature -- Access: user create {ARRAYED_LIST [CMS_USER]} Result.make (0) error_handler.reset - log.write_information (generator + ".all_users") + write_information_log (generator + ".all_users") from sql_query (select_users, Void) @@ -62,7 +62,7 @@ feature -- Access: user l_parameters: STRING_TABLE [detachable ANY] do error_handler.reset - log.write_information (generator + ".user") + write_information_log (generator + ".user") create l_parameters.make (1) l_parameters.put (a_id, "uid") sql_query (select_user_by_id, l_parameters) @@ -79,7 +79,7 @@ feature -- Access: user l_parameters: STRING_TABLE [detachable ANY] do error_handler.reset - log.write_information (generator + ".user_by_name") + write_information_log (generator + ".user_by_name") create l_parameters.make (1) l_parameters.put (a_name, "name") sql_query (select_user_by_name, l_parameters) @@ -96,7 +96,7 @@ feature -- Access: user l_parameters: STRING_TABLE [detachable ANY] do error_handler.reset - log.write_information (generator + ".user_by_email") + write_information_log (generator + ".user_by_email") create l_parameters.make (1) l_parameters.put (a_email, "email") sql_query (select_user_by_email, l_parameters) @@ -120,10 +120,10 @@ feature -- Access: user then Result := True else - log.write_information (generator + ".is_valid_credential User: wrong username or password" ) + write_information_log (generator + ".is_valid_credential User: wrong username or password" ) end else - log.write_information (generator + ".is_valid_credential User:" + l_auth_login + "does not exist" ) + write_information_log (generator + ".is_valid_credential User:" + l_auth_login + "does not exist" ) end end @@ -148,7 +148,7 @@ feature -- Change: user l_password_salt := l_security.salt l_password_hash := l_security.password_hash (l_password, l_password_salt) - log.write_information (generator + ".new_user") + write_information_log (generator + ".new_user") create l_parameters.make (4) l_parameters.put (a_user.name, "name") l_parameters.put (l_password_hash, "password") @@ -189,7 +189,7 @@ feature -- Change: user l_password_hash /= Void and l_password_salt /= Void and attached a_user.email as l_email then - log.write_information (generator + ".update_user") + write_information_log (generator + ".update_user") create l_parameters.make (6) l_parameters.put (a_user.id, "uid") l_parameters.put (a_user.name, "name") @@ -233,7 +233,7 @@ feature {NONE} -- Implementation l_parameters: STRING_TABLE [detachable ANY] do error_handler.reset - log.write_information (generator + ".user_salt") + write_information_log (generator + ".user_salt") create l_parameters.make (1) l_parameters.put (a_username, "name") sql_query (select_salt_by_username, l_parameters) @@ -282,7 +282,7 @@ feature {NONE} -- Implementation -- Last insert user id. do error_handler.reset - log.write_information (generator + ".last_inserted_user_id") + write_information_log (generator + ".last_inserted_user_id") sql_query (Sql_last_insert_user_id, Void) if sql_rows_count = 1 then Result := sql_read_integer_64 (1) diff --git a/src/service/cms_api.e b/src/service/cms_api.e index 6b640aa..8eb8e78 100644 --- a/src/service/cms_api.e +++ b/src/service/cms_api.e @@ -50,7 +50,7 @@ feature -- Access -- Logger storage: CMS_STORAGE - -- Persistence storage. + -- Default persistence storage. feature -- Status Report diff --git a/src/service/handler/cms_handler.e b/src/service/handler/cms_handler.e index 03869bf..e90c572 100644 --- a/src/service/handler/cms_handler.e +++ b/src/service/handler/cms_handler.e @@ -1,6 +1,7 @@ note - description: "Summary description for {CMS_HANDLER}." - author: "" + description: "[ + Common interface for request handler specific to the CMS component. + ]" date: "$Date: 2015-02-13 13:08:13 +0100 (ven., 13 févr. 2015) $" revision: "$Revision: 96616 $" @@ -26,4 +27,19 @@ feature -- API Service api: CMS_API +feature -- Response helpers + + redirect_to (a_location: READABLE_STRING_8; res: WSF_RESPONSE) + -- Send via `res' a redirection message for location `a_location'. + do + res.redirect_now (a_location) +-- res.send (create {CMS_REDIRECTION_RESPONSE_MESSAGE}.make (a_location)) + end + + send_access_denied (res: WSF_RESPONSE) + -- Send via `res' an access denied response. + do + res.send (create {CMS_FORBIDDEN_RESPONSE_MESSAGE}.make) + end + end diff --git a/src/service/logger/cms_env_logger.e b/src/service/logger/cms_env_logger.e index ebb4c58..8f91331 100644 --- a/src/service/logger/cms_env_logger.e +++ b/src/service/logger/cms_env_logger.e @@ -11,9 +11,6 @@ inherit CMS_LOGGER SHARED_LOGGER - rename - log as log_facility - end create make @@ -29,32 +26,32 @@ feature -- Logging put_information (a_message: READABLE_STRING_8; a_data: detachable ANY) do - log_facility.write_information (log_message (a_message, a_data)) + write_information_log (log_message (a_message, a_data)) end put_error (a_message: READABLE_STRING_8; a_data: detachable ANY) do - log_facility.write_error (log_message (a_message, a_data)) + write_error_log (log_message (a_message, a_data)) end put_warning (a_message: READABLE_STRING_8; a_data: detachable ANY) do - log_facility.write_warning (log_message (a_message, a_data)) + write_warning_log (log_message (a_message, a_data)) end put_critical (a_message: READABLE_STRING_8; a_data: detachable ANY) do - log_facility.write_critical (log_message (a_message, a_data)) + write_critical_log (log_message (a_message, a_data)) end put_alert (a_message: READABLE_STRING_8; a_data: detachable ANY) do - log_facility.write_alert (log_message (a_message, a_data)) + write_alert_log (log_message (a_message, a_data)) end put_debug (a_message: READABLE_STRING_8; a_data: detachable ANY) do - log_facility.write_debug (log_message (a_message, a_data)) + write_debug_log (log_message (a_message, a_data)) end end diff --git a/src/service/misc/cms_request_util.e b/src/service/misc/cms_request_util.e index 90df0b2..e29bc61 100644 --- a/src/service/misc/cms_request_util.e +++ b/src/service/misc/cms_request_util.e @@ -1,6 +1,5 @@ note - description: "Summary description for {CMS_REQUEST_UTIL}." - author: "" + description: "Set of helper features related to CMS Request needs." date: "$Date: 2015-02-13 13:08:13 +0100 (ven., 13 févr. 2015) $" revision: "$Revision: 96616 $" @@ -29,7 +28,7 @@ feature -- User note EIS: "eiffel:?class=AUTHENTICATION_FILTER&feature=execute" do - if attached {CMS_USER} req.execution_variable ("_cms_active_user_") as l_user then + if attached {CMS_USER} req.execution_variable (current_user_execution_variable_name) as l_user then Result := l_user end end @@ -40,14 +39,27 @@ feature -- Change -- Set `a_user' as `current_user'. do if a_user = Void then - req.unset_execution_variable ("_cms_active_user_") + req.unset_execution_variable (current_user_execution_variable_name) else - req.set_execution_variable ("_cms_active_user_", a_user) + req.set_execution_variable (current_user_execution_variable_name, a_user) end ensure user_set: current_user (req) ~ a_user end + unset_current_user (req: WSF_REQUEST) + -- Unset current user. + do + req.unset_execution_variable (current_user_execution_variable_name) + ensure + user_unset: current_user (req) = Void + end + +feature {NONE} -- Implementation: current user + + current_user_execution_variable_name: STRING = "_cms_active_user_" + -- Execution variable name used to keep current user data. + feature -- Media Type current_media_type (req: WSF_REQUEST): detachable READABLE_STRING_32 diff --git a/src/service/response/cms_forbidden_response_message.e b/src/service/response/cms_forbidden_response_message.e new file mode 100644 index 0000000..b8ec2d4 --- /dev/null +++ b/src/service/response/cms_forbidden_response_message.e @@ -0,0 +1,25 @@ +note + description: "[ + Message response to notify a forbidden access. + ]" + date: "$Date$" + revision: "$Revision$" + +class + CMS_FORBIDDEN_RESPONSE_MESSAGE + +inherit + CMS_RESPONSE_MESSAGE + +create + make + +feature {NONE} -- Initialization + + make + do + initialize + status_code := {HTTP_STATUS_CODE}.forbidden + end + +end diff --git a/src/service/response/cms_generic_response.e b/src/service/response/cms_generic_response.e deleted file mode 100644 index 8728865..0000000 --- a/src/service/response/cms_generic_response.e +++ /dev/null @@ -1,61 +0,0 @@ -note - description: "Summary description for {CMS_GENERIC_RESPONSE}." - date: "$Date: 2014-11-13 16:23:47 +0100 (jeu., 13 nov. 2014) $" - revision: "$Revision: 96085 $" - -class - CMS_GENERIC_RESPONSE - -feature -- Responses - - new_response_redirect (req: WSF_REQUEST; res: WSF_RESPONSE; a_location: READABLE_STRING_32) - -- Redirect to `a_location' - local - h: HTTP_HEADER - do - create h.make - h.put_content_type_text_html - h.put_current_date - h.put_location (a_location) - res.set_status_code ({HTTP_STATUS_CODE}.see_other) - res.put_header_text (h.string) - end - - new_response_authenticate (req: WSF_REQUEST; res: WSF_RESPONSE) - -- Handle authenticate. - local - h: HTTP_HEADER - do - create h.make - h.put_content_type_text_html - h.put_current_date - h.put_header_key_value ({HTTP_HEADER_NAMES}.header_www_authenticate, "Basic realm=%"CMSRoc-User%"") - res.set_status_code ({HTTP_STATUS_CODE}.unauthorized) - res.put_header_text (h.string) - end - - new_response_denied (req: WSF_REQUEST; res: WSF_RESPONSE) - -- Handle access denied. - local - h: HTTP_HEADER - do - create h.make - h.put_content_type_text_html - h.put_current_date - res.set_status_code ({HTTP_STATUS_CODE}.unauthorized) - res.put_header_text (h.string) - end - - new_response_unauthorized (req: WSF_REQUEST; res: WSF_RESPONSE) - -- Handle not authorized. - local - h: HTTP_HEADER - do - create h.make - h.put_content_type_text_html - h.put_current_date - res.set_status_code ({HTTP_STATUS_CODE}.forbidden) - res.put_header_text (h.string) - end - -end diff --git a/src/service/response/cms_redirection_response_message.e b/src/service/response/cms_redirection_response_message.e new file mode 100644 index 0000000..6b074e9 --- /dev/null +++ b/src/service/response/cms_redirection_response_message.e @@ -0,0 +1,26 @@ +note + description: "[ + Message response to redirect client to new location. + ]" + date: "$Date$" + revision: "$Revision$" + +class + CMS_REDIRECTION_RESPONSE_MESSAGE + +inherit + CMS_RESPONSE_MESSAGE + +create + make + +feature {NONE} -- Initialization + + make (a_location: READABLE_STRING_8) + do + initialize + status_code := {HTTP_STATUS_CODE}.see_other + header.put_location (a_location) + end + +end diff --git a/src/service/response/cms_response.e b/src/service/response/cms_response.e index 68bf833..bd679b1 100644 --- a/src/service/response/cms_response.e +++ b/src/service/response/cms_response.e @@ -1,5 +1,8 @@ note - description: "Generic CMS Response.It builds the content to get process to render the output" + description: "[ + Generic CMS Response. + It builds the content to get process to render the output. + ]" date: "$Date: 2015-02-16 20:14:19 +0100 (lun., 16 févr. 2015) $" revision: "$Revision: 96643 $" @@ -79,6 +82,9 @@ feature -- Access additional_page_head_lines: detachable LIST [READABLE_STRING_8] -- HTML>head>...extra lines + redirection: detachable READABLE_STRING_8 + -- Location for eventual redirection. + feature -- Module module_resource_path (a_module: CMS_MODULE; a_resource: PATH): detachable PATH @@ -239,6 +245,11 @@ feature -- Element change values.remove (k) end + set_redirection (a_location: READABLE_STRING_8) + -- Set `redirection' to `a_location'. + do + redirection := a_location + end feature -- Logging @@ -247,7 +258,7 @@ feature -- Logging -- l_log: CMS_LOG do debug - to_implement ("Add implemenatation") + to_implement ("Add implementation") end -- create l_log.make (a_category, a_message, a_level, Void) -- if a_link /= Void then @@ -964,8 +975,7 @@ feature -- Generation feature -- Custom Variables variables: detachable STRING_TABLE[ANY] - -- Custom variables to feed the templates. - + -- Custom variables to feed the templates. feature -- Element change: Add custom variables. @@ -981,7 +991,6 @@ feature -- Element change: Add custom variables. l_variables.force (a_element, a_key) end - feature -- Execution execute @@ -1006,6 +1015,7 @@ feature {NONE} -- Execution cms_page: CMS_HTML_PAGE page: CMS_HTML_PAGE_RESPONSE utf: UTF_CONVERTER + h: HTTP_HEADER do if attached {READABLE_STRING_GENERAL} values.item ("optional_content_type") as l_type then create cms_page.make_typed (utf.utf_32_string_to_utf_8_string_8 (l_type)) @@ -1015,8 +1025,13 @@ feature {NONE} -- Execution prepare (cms_page) create page.make (theme.page_html (cms_page)) page.set_status_code (status_code) - page.header.put_content_length (page.html.count) - page.header.put_current_date + h := page.header + h.put_content_length (page.html.count) + h.put_current_date + h.put_header_object (header) + if attached redirection as l_location then + h.put_location (l_location) + end response.send (page) on_terminated end diff --git a/src/service/response/cms_response_message.e b/src/service/response/cms_response_message.e new file mode 100644 index 0000000..752ed3b --- /dev/null +++ b/src/service/response/cms_response_message.e @@ -0,0 +1,53 @@ +note + description: "Response message interface specific to the CMS component." + date: "$Date$" + revision: "$Revision$" + +deferred class + CMS_RESPONSE_MESSAGE + +inherit + WSF_RESPONSE_MESSAGE + +feature {NONE} -- Initialization + + initialize + do + status_code := {HTTP_STATUS_CODE}.ok + create header.make_with_count (2) + header.put_current_date + header.put_content_type_text_html + end + +feature -- Access + + status_code: INTEGER + -- Status code for the response. + + header: HTTP_HEADER + -- Header associated with the response. + +feature {WSF_RESPONSE} -- Output + + send_to (res: WSF_RESPONSE) + -- + do + res.set_status_code (status_code) + + send_header_to (res) + send_payload_to (res) + end + + send_header_to (res: WSF_RESPONSE) + -- Send header to response `res'. + do + res.put_header_lines (header) + end + + send_payload_to (res: WSF_RESPONSE) + -- Send payload data to response `res'. + do + -- Nothing by default + end + +end diff --git a/src/service/response/cms_unauthorized_response_message.e b/src/service/response/cms_unauthorized_response_message.e new file mode 100644 index 0000000..d8d26a3 --- /dev/null +++ b/src/service/response/cms_unauthorized_response_message.e @@ -0,0 +1,43 @@ +note + description: "[ + Message response to notify an unauthorized access. + ]" + date: "$Date$" + revision: "$Revision$" + +class + CMS_UNAUTHORIZED_RESPONSE_MESSAGE + +inherit + CMS_RESPONSE_MESSAGE + +create + make, + make_with_basic_auth_challenge + +feature {NONE} -- Initialization + + make + do + initialize + status_code := {HTTP_STATUS_CODE}.unauthorized + end + + make_with_basic_auth_challenge (a_realm: detachable READABLE_STRING_8) + local + l_realm: READABLE_STRING_8 + do + make + if a_realm /= Void then + l_realm := a_realm + else + l_realm := default_realm + end + header.put_header_key_value ({HTTP_HEADER_NAMES}.header_www_authenticate, "Basic realm=%""+ l_realm +"%"") + end + +feature -- Access + + default_realm: STRING = "CMS-User credential" + +end