diff --git a/examples/demo/modules/blog/cms_blog_module.e b/examples/demo/modules/blog/cms_blog_module.e index 88db448..c44e93a 100644 --- a/examples/demo/modules/blog/cms_blog_module.e +++ b/examples/demo/modules/blog/cms_blog_module.e @@ -27,12 +27,15 @@ feature {NONE} -- Initialization make do - name := "Blog demo module" version := "1.0" description := "Service to demonstrate new node for blog" package := "demo" end +feature -- Access + + name: STRING = "blog" + feature {CMS_API} -- Module Initialization initialize (api: CMS_API) diff --git a/examples/demo/modules/demo/cms_demo_module.e b/examples/demo/modules/demo/cms_demo_module.e index 25ce7e0..25af681 100644 --- a/examples/demo/modules/demo/cms_demo_module.e +++ b/examples/demo/modules/demo/cms_demo_module.e @@ -27,12 +27,15 @@ feature {NONE} -- Initialization make do - name := "Demo module" version := "1.0" description := "Service to demonstrate and test cms system" package := "demo" end +feature -- Access + + name: STRING = "demo" + feature {CMS_API} -- Module Initialization initialize (api: CMS_API) diff --git a/examples/demo/site/modules/login/login.json b/examples/demo/site/modules/auth/auth.json similarity index 100% rename from examples/demo/site/modules/login/login.json rename to examples/demo/site/modules/auth/auth.json diff --git a/examples/demo/site/modules/login/mail_templates/account_activation.html b/examples/demo/site/modules/auth/mail_templates/account_activation.html similarity index 100% rename from examples/demo/site/modules/login/mail_templates/account_activation.html rename to examples/demo/site/modules/auth/mail_templates/account_activation.html diff --git a/examples/demo/site/modules/login/mail_templates/account_new_password.html b/examples/demo/site/modules/auth/mail_templates/account_new_password.html similarity index 100% rename from examples/demo/site/modules/login/mail_templates/account_new_password.html rename to examples/demo/site/modules/auth/mail_templates/account_new_password.html diff --git a/examples/demo/site/modules/login/mail_templates/account_re_activation.html b/examples/demo/site/modules/auth/mail_templates/account_re_activation.html similarity index 100% rename from examples/demo/site/modules/login/mail_templates/account_re_activation.html rename to examples/demo/site/modules/auth/mail_templates/account_re_activation.html diff --git a/examples/demo/site/modules/login/mail_templates/account_welcome.html b/examples/demo/site/modules/auth/mail_templates/account_welcome.html similarity index 100% rename from examples/demo/site/modules/login/mail_templates/account_welcome.html rename to examples/demo/site/modules/auth/mail_templates/account_welcome.html diff --git a/examples/demo/site/modules/login/oauth2_gmail.json b/examples/demo/site/modules/auth/oauth2_gmail.json similarity index 100% rename from examples/demo/site/modules/login/oauth2_gmail.json rename to examples/demo/site/modules/auth/oauth2_gmail.json diff --git a/examples/demo/site/modules/login/templates/block_login.tpl b/examples/demo/site/modules/auth/templates/block_login.tpl similarity index 100% rename from examples/demo/site/modules/login/templates/block_login.tpl rename to examples/demo/site/modules/auth/templates/block_login.tpl diff --git a/examples/demo/site/modules/login/templates/block_new_password.tpl b/examples/demo/site/modules/auth/templates/block_new_password.tpl similarity index 100% rename from examples/demo/site/modules/login/templates/block_new_password.tpl rename to examples/demo/site/modules/auth/templates/block_new_password.tpl diff --git a/examples/demo/site/modules/login/templates/block_post_password.tpl b/examples/demo/site/modules/auth/templates/block_post_password.tpl similarity index 100% rename from examples/demo/site/modules/login/templates/block_post_password.tpl rename to examples/demo/site/modules/auth/templates/block_post_password.tpl diff --git a/examples/demo/site/modules/login/templates/block_post_reactivate.tpl b/examples/demo/site/modules/auth/templates/block_post_reactivate.tpl similarity index 100% rename from examples/demo/site/modules/login/templates/block_post_reactivate.tpl rename to examples/demo/site/modules/auth/templates/block_post_reactivate.tpl diff --git a/examples/demo/site/modules/login/templates/block_post_register.tpl b/examples/demo/site/modules/auth/templates/block_post_register.tpl similarity index 100% rename from examples/demo/site/modules/login/templates/block_post_register.tpl rename to examples/demo/site/modules/auth/templates/block_post_register.tpl diff --git a/examples/demo/site/modules/login/templates/block_post_reset.tpl b/examples/demo/site/modules/auth/templates/block_post_reset.tpl similarity index 100% rename from examples/demo/site/modules/login/templates/block_post_reset.tpl rename to examples/demo/site/modules/auth/templates/block_post_reset.tpl diff --git a/examples/demo/site/modules/login/templates/block_reactivate.tpl b/examples/demo/site/modules/auth/templates/block_reactivate.tpl similarity index 100% rename from examples/demo/site/modules/login/templates/block_reactivate.tpl rename to examples/demo/site/modules/auth/templates/block_reactivate.tpl diff --git a/examples/demo/site/modules/login/templates/block_register.tpl b/examples/demo/site/modules/auth/templates/block_register.tpl similarity index 100% rename from examples/demo/site/modules/login/templates/block_register.tpl rename to examples/demo/site/modules/auth/templates/block_register.tpl diff --git a/examples/demo/site/modules/login/templates/block_reset_password.tpl b/examples/demo/site/modules/auth/templates/block_reset_password.tpl similarity index 100% rename from examples/demo/site/modules/login/templates/block_reset_password.tpl rename to examples/demo/site/modules/auth/templates/block_reset_password.tpl diff --git a/license.lic b/license.lic new file mode 100644 index 0000000..3e50931 --- /dev/null +++ b/license.lic @@ -0,0 +1,3 @@ +${NOTE_KEYWORD} + copyright: "2011-${YEAR}, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" diff --git a/modules/auth/auth-safe.ecf b/modules/auth/auth-safe.ecf index ae9dfab..5824089 100644 --- a/modules/auth/auth-safe.ecf +++ b/modules/auth/auth-safe.ecf @@ -10,10 +10,10 @@ - - - - + + + + diff --git a/modules/auth/cms_authentication_email_service_parameters.e b/modules/auth/cms_authentication_email_service_parameters.e index 8e0d4ef..efb7b2a 100644 --- a/modules/auth/cms_authentication_email_service_parameters.e +++ b/modules/auth/cms_authentication_email_service_parameters.e @@ -31,7 +31,7 @@ feature {NONE} -- Initialization admin_email := l_site_name + " <" + admin_email +">" end - if attached {CONFIG_READER} a_cms_api.module_configuration_by_name ("login", Void) as cfg then + if attached {CONFIG_READER} a_cms_api.module_configuration_by_name ({CMS_AUTHENTICATION_MODULE}.name, Void) as cfg then if attached cfg.text_item ("smtp") as l_smtp then -- Overwrite global smtp setting if any. smtp_server := utf.utf_32_string_to_utf_8_string_8 (l_smtp) @@ -138,7 +138,7 @@ feature {NONE} -- Implementation: Template p: PATH do create p.make_from_string (a_name) - Result := cms_api.module_location_by_name ("login").extended ("mail_templates").extended (a_name) + Result := cms_api.module_location_by_name ({CMS_AUTHENTICATION_MODULE}.name).extended ("mail_templates").extended (a_name) end template_string (a_name: READABLE_STRING_GENERAL; a_default: STRING): STRING diff --git a/modules/auth/cms_authentication_module.e b/modules/auth/cms_authentication_module.e index 3dabcd6..dcd0768 100644 --- a/modules/auth/cms_authentication_module.e +++ b/modules/auth/cms_authentication_module.e @@ -8,12 +8,10 @@ class inherit CMS_MODULE - redefine register_hooks end - CMS_HOOK_BLOCK CMS_HOOK_AUTO_REGISTER @@ -33,7 +31,6 @@ inherit CMS_REQUEST_UTIL - create make @@ -42,7 +39,6 @@ feature {NONE} -- Initialization make -- Create current module do - name := "login" version := "1.0" description := "Authentication module" package := "authentication" @@ -51,6 +47,10 @@ feature {NONE} -- Initialization cache_duration := 0 end +feature -- Access + + name: STRING = "auth" + feature -- Access: docs root_dir: PATH diff --git a/modules/auth/site/auth.json b/modules/auth/site/auth.json new file mode 100644 index 0000000..2f3e155 --- /dev/null +++ b/modules/auth/site/auth.json @@ -0,0 +1,8 @@ +{ + "email": "webmaster@example.com", + "subjet_register": "Thank you for regitering with us, activate account", + "subjet_activate": "New account ativation token", + "subjet_password": "Password Recovery!!!", + "subjet_oauth": "Welcome", + "smtp": "127.0.0.1" +} diff --git a/modules/auth/site/mail_templates/account_activation.html b/modules/auth/site/mail_templates/account_activation.html new file mode 100644 index 0000000..0ab4c4f --- /dev/null +++ b/modules/auth/site/mail_templates/account_activation.html @@ -0,0 +1,18 @@ + + + + + Activation + + + + + +

Thank you for registering at ROC CMS

+ +

To complete your registration, please click on this link to activate your account:

+ +

$link

+

Thank you for joining us.

+ + diff --git a/modules/auth/site/mail_templates/account_new_password.html b/modules/auth/site/mail_templates/account_new_password.html new file mode 100644 index 0000000..dfcd355 --- /dev/null +++ b/modules/auth/site/mail_templates/account_new_password.html @@ -0,0 +1,17 @@ + + + + + New Password + + + + + +

You have required a new password at ROC CMS

+ +

To complete your request, please click on this link to genereate a new password:

+ +

$link

+ + \ No newline at end of file diff --git a/modules/auth/site/mail_templates/account_re_activation.html b/modules/auth/site/mail_templates/account_re_activation.html new file mode 100644 index 0000000..95aebb2 --- /dev/null +++ b/modules/auth/site/mail_templates/account_re_activation.html @@ -0,0 +1,18 @@ + + + + + New Activation + + + + + +

You have request a new activation token atROC CMS

+ +

To complete your registration, please click on this link to activate your account:

+ +

$link

+

Thank you for joining us.

+ + \ No newline at end of file diff --git a/modules/auth/site/mail_templates/account_welcome.html b/modules/auth/site/mail_templates/account_welcome.html new file mode 100644 index 0000000..0ea987c --- /dev/null +++ b/modules/auth/site/mail_templates/account_welcome.html @@ -0,0 +1,13 @@ + + + + + Welcome + + + + +

Welcome toROC CMS

+

Thank you for joining us.

+ + \ No newline at end of file diff --git a/modules/auth/site/oauth2_gmail.json b/modules/auth/site/oauth2_gmail.json new file mode 100644 index 0000000..8cd35ef --- /dev/null +++ b/modules/auth/site/oauth2_gmail.json @@ -0,0 +1,7 @@ +{ + "api_secret":"ADD_YOUR_SECRET_KEY", + "api_key":"ADD_YOUR_PUBLIC_KEY", + "scope": "email", + "api_revoke":"https://accounts.google.com/o/oauth2/revoke?token=$ACCESS_TOKEN", + "protected_resource_url":"https://www.googleapis.com/plus/v1/people/me" +} diff --git a/modules/auth/site/templates/block_login.tpl b/modules/auth/site/templates/block_login.tpl new file mode 100644 index 0000000..0549b24 --- /dev/null +++ b/modules/auth/site/templates/block_login.tpl @@ -0,0 +1,34 @@ +
+ {unless isset="$user"} +

Login or Register

+
+
+
+
+ + +
+ +
+ + +
+ + +
+
+
+
+ +
+
+ {foreach item="item" from="$oauth_consumers"} + Login with {$item/}
+ {/foreach} +
+ {/unless} +
diff --git a/modules/auth/site/templates/block_new_password.tpl b/modules/auth/site/templates/block_new_password.tpl new file mode 100644 index 0000000..ef5407f --- /dev/null +++ b/modules/auth/site/templates/block_new_password.tpl @@ -0,0 +1,16 @@ +
+
+
+ Require new password +
+ + + {if isset="$error_email"} + {$error_email/}
+ {/if} +
+
+ +
+
+
diff --git a/modules/auth/site/templates/block_post_password.tpl b/modules/auth/site/templates/block_post_password.tpl new file mode 100644 index 0000000..0ec7a7c --- /dev/null +++ b/modules/auth/site/templates/block_post_password.tpl @@ -0,0 +1,3 @@ +
+

We have send you a new token code, check your email to generate a new password

+
diff --git a/modules/auth/site/templates/block_post_reactivate.tpl b/modules/auth/site/templates/block_post_reactivate.tpl new file mode 100644 index 0000000..09e7206 --- /dev/null +++ b/modules/auth/site/templates/block_post_reactivate.tpl @@ -0,0 +1,3 @@ +
+

We have send you a new activation code, check your email to activate your account.

+
diff --git a/modules/auth/site/templates/block_post_register.tpl b/modules/auth/site/templates/block_post_register.tpl new file mode 100644 index 0000000..d59f75a --- /dev/null +++ b/modules/auth/site/templates/block_post_register.tpl @@ -0,0 +1,3 @@ +
+

Thanks for register, check your email to activate your account.

+
diff --git a/modules/auth/site/templates/block_post_reset.tpl b/modules/auth/site/templates/block_post_reset.tpl new file mode 100644 index 0000000..9ccecfb --- /dev/null +++ b/modules/auth/site/templates/block_post_reset.tpl @@ -0,0 +1,3 @@ +
+

You new password has been saved!

+
diff --git a/modules/auth/site/templates/block_reactivate.tpl b/modules/auth/site/templates/block_reactivate.tpl new file mode 100644 index 0000000..bef65c0 --- /dev/null +++ b/modules/auth/site/templates/block_reactivate.tpl @@ -0,0 +1,19 @@ +
+
+
+ Reactivate Form +
+ + + {if isset="$error_email"} + {$error_email/}
+ {/if} +
+ {if isset="$is_active"} + {$is_active/}
+ {/if} +
+ +
+
+
diff --git a/modules/auth/site/templates/block_register.tpl b/modules/auth/site/templates/block_register.tpl new file mode 100644 index 0000000..58a4872 --- /dev/null +++ b/modules/auth/site/templates/block_register.tpl @@ -0,0 +1,28 @@ +
+
+
+ Register Form +
+ + + {if isset="$error_name"} + {$error_name/}
+ {/if} +
+
+ + +
+
+ + + {if isset="$error_email"} + {$error_email/}
+ {/if} +
+ + + +
+
+
diff --git a/modules/auth/site/templates/block_reset_password.tpl b/modules/auth/site/templates/block_reset_password.tpl new file mode 100644 index 0000000..b99289d --- /dev/null +++ b/modules/auth/site/templates/block_reset_password.tpl @@ -0,0 +1,28 @@ +
+
+
+ Generate New Password Form +
+ + + {if isset="$error_token"} + {$error_token/}
+ {/if} +
+
+ + +
+
+ + +
+ + + {if isset="$error_password"} + {$error_password/}
+ {/if} + +
+
+
diff --git a/modules/basic_auth/basic_auth_module.e b/modules/basic_auth/basic_auth_module.e index 0d9d649..cc1069f 100644 --- a/modules/basic_auth/basic_auth_module.e +++ b/modules/basic_auth/basic_auth_module.e @@ -29,12 +29,15 @@ feature {NONE} -- Initialization make do - name := "basic auth" version := "1.0" description := "Service to manage basic authentication" package := "core" end +feature -- Access + + name: STRING = "basic_auth" + feature -- Access: router setup_router (a_router: WSF_ROUTER; a_api: CMS_API) diff --git a/modules/node/node_module.e b/modules/node/node_module.e index 397ac7b..0f31f86 100644 --- a/modules/node/node_module.e +++ b/modules/node/node_module.e @@ -29,7 +29,6 @@ feature {NONE} -- Initialization make (a_setup: CMS_SETUP) -- Create Current module, disabled by default. do - name := "node" version := "1.0" description := "Service to manage content based on 'node'" package := "core" @@ -39,6 +38,10 @@ feature {NONE} -- Initialization config: CMS_SETUP -- Node configuration. +feature -- Access + + name: STRING = "node" + feature {CMS_API} -- Module Initialization initialize (a_api: CMS_API) diff --git a/modules/node/site/scripts/node.sql b/modules/node/site/scripts/node.sql new file mode 100644 index 0000000..43078f9 --- /dev/null +++ b/modules/node/site/scripts/node.sql @@ -0,0 +1,22 @@ + +CREATE TABLE nodes ( + `nid` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT UNIQUE, + `revision` INTEGER, + `type` TEXT NOT NULL, + `title` VARCHAR(255) NOT NULL, + `summary` TEXT, + `content` TEXT, + `format` VARCHAR(128), + `author` INTEGER, + `publish` DATETIME, + `created` DATETIME NOT NULL, + `changed` DATETIME NOT NULL, + `status` INTEGER +); + +CREATE TABLE page_nodes( + `nid` INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, + `revision` INTEGER, + `parent` INTEGER +); + diff --git a/modules/oauth20/cms_oauth_20_email_service_parameters.e b/modules/oauth20/cms_oauth_20_email_service_parameters.e index c8657f4..824d905 100644 --- a/modules/oauth20/cms_oauth_20_email_service_parameters.e +++ b/modules/oauth20/cms_oauth_20_email_service_parameters.e @@ -21,7 +21,7 @@ feature {NONE} -- Initialization s: detachable READABLE_STRING_32 l_contact_email, l_subject_register, l_subject_activate, l_subject_password, l_subject_oauth: detachable READABLE_STRING_8 do - setup := a_cms_api.setup + cms_api := a_cms_api -- Use global smtp setting if any, otherwise "localhost" smtp_server := utf.escaped_utf_32_string_to_utf_8_string_8 (a_cms_api.setup.text_item_or_default ("smtp", "localhost")) l_site_name := utf.escaped_utf_32_string_to_utf_8_string_8 (a_cms_api.setup.site_name) @@ -31,7 +31,7 @@ feature {NONE} -- Initialization admin_email := l_site_name + " <" + admin_email +">" end - if attached {CONFIG_READER} a_cms_api.module_configuration_by_name ("login", Void) as cfg then + if attached {CONFIG_READER} a_cms_api.module_configuration_by_name ({CMS_AUTHENTICATION_MODULE}.name, Void) as cfg then if attached cfg.text_item ("smtp") as l_smtp then -- Overwrite global smtp setting if any. smtp_server := utf.utf_32_string_to_utf_8_string_8 (l_smtp) @@ -133,7 +133,7 @@ feature {NONE} -- Implementation: Template template_path (a_name: READABLE_STRING_GENERAL): PATH -- Location of template named `a_name'. do - Result := setup.environment.config_path.extended ("modules").extended ("login").extended (a_name) + Result := cms_api.module_location_by_name ({CMS_AUTHENTICATION_MODULE}.name).extended (a_name) end template_string (a_name: READABLE_STRING_GENERAL; a_default: STRING): STRING @@ -151,7 +151,7 @@ feature {NONE} -- Implementation: Template feature {NONE} -- Implementation - setup: CMS_SETUP + cms_api: CMS_API read_template_file (a_path: PATH): detachable STRING -- Read the content of the file at path `a_path'. diff --git a/modules/oauth20/cms_oauth_20_module.e b/modules/oauth20/cms_oauth_20_module.e index c18a4b4..dd3d0d9 100644 --- a/modules/oauth20/cms_oauth_20_module.e +++ b/modules/oauth20/cms_oauth_20_module.e @@ -47,7 +47,6 @@ feature {NONE} -- Initialization make -- Create current module do - name := "oauth20" version := "1.0" description := "OAuth20 module" package := "Oauth20" @@ -56,6 +55,10 @@ feature {NONE} -- Initialization cache_duration := 0 end +feature -- Access + + name: STRING = "oauth20" + feature {CMS_API} -- Module Initialization initialize (a_api: CMS_API) diff --git a/modules/oauth20/oauth20-safe.ecf b/modules/oauth20/oauth20-safe.ecf index 233bdd8..76e5d31 100644 --- a/modules/oauth20/oauth20-safe.ecf +++ b/modules/oauth20/oauth20-safe.ecf @@ -1,5 +1,5 @@ - + @@ -12,6 +12,7 @@ + diff --git a/modules/oauth20/site/scripts/oauth2_consumers.sql b/modules/oauth20/site/scripts/oauth2_consumers.sql new file mode 100644 index 0000000..1c7eea6 --- /dev/null +++ b/modules/oauth20/site/scripts/oauth2_consumers.sql @@ -0,0 +1,18 @@ + +CREATE TABLE oauth2_consumers( + `cid` INTEGER PRIMARY KEY NOT NULL CHECK(`cid`>=0), + `name` VARCHAR(255) NOT NULL, + `api_secret` TEXT NOT NULL, + `api_key` TEXT NOT NULL, + `scope` VARCHAR (100) NOT NULL, + `protected_resource_url` VARCHAR (255) NOT NULL, + `callback_name` VARCHAR(255) NOT NULL, + `extractor` VARCHAR(50) NOT NULL, + `authorize_url` VARCHAR (255) NOT NULL, + `endpoint` VARCHAR (255) NOT NULL, + CONSTRAINT `cid` + UNIQUE(`cid`), + CONSTRAINT `name` + UNIQUE(`name`) + ); + diff --git a/modules/oauth20/site/scripts/oauth2_consumers_initialize.sql b/modules/oauth20/site/scripts/oauth2_consumers_initialize.sql new file mode 100644 index 0000000..a600e71 --- /dev/null +++ b/modules/oauth20/site/scripts/oauth2_consumers_initialize.sql @@ -0,0 +1,7 @@ + -- Change the values TO_COMPLETE based on your API. + -- API SECTET KEY AND API PUBLIC KEY +INSERT INTO oauth2_consumers (name, api_secret, api_key, scope, protected_resource_url, callback_name, extractor, authorize_url, endpoint) +VALUES ('google', 'TO-COMPLETE', 'TO-COMPLETE', 'email', 'https://www.googleapis.com/plus/v1/people/me', 'callback_google', 'json','https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=$CLIENT_ID&redirect_uri=$REDIRECT_URI','https://accounts.google.com/o/oauth2/token'); + +INSERT INTO oauth2_consumers (name, api_secret, api_key, scope, protected_resource_url, callback_name, extractor, authorize_url, endpoint ) +VALUES ('facebook', 'TO-COMPLETE', 'TO-COMPLETE', 'email', 'https://graph.facebook.com/me', 'callback_facebook','text','https://www.facebook.com/dialog/oauth?response_type=code&client_id=$CLIENT_ID&redirect_uri=$REDIRECT_URI','https://graph.facebook.com/oauth/access_token'); diff --git a/modules/oauth20/site/scripts/oauth2_table.sql.tpl b/modules/oauth20/site/scripts/oauth2_table.sql.tpl new file mode 100644 index 0000000..3471b1f --- /dev/null +++ b/modules/oauth20/site/scripts/oauth2_table.sql.tpl @@ -0,0 +1,10 @@ + +CREATE TABLE $table_name ( + `uid` INTEGER PRIMARY KEY NOT NULL CHECK(`uid`>=0), + `access_token` TEXT NOT NULL, + `created` DATETIME NOT NULL, + `details` TEXT NOT NULL, + CONSTRAINT `uid` + UNIQUE(`uid`) + ); + diff --git a/modules/oauth20/site/templates/block_login.tpl b/modules/oauth20/site/templates/block_login.tpl new file mode 100644 index 0000000..44c7bd4 --- /dev/null +++ b/modules/oauth20/site/templates/block_login.tpl @@ -0,0 +1,7 @@ +
+
+ {foreach item="item" from="$oauth_consumers"} + Login with {$item/}
+ {/foreach} +
+
diff --git a/src/configuration/cms_default_setup.e b/src/configuration/cms_default_setup.e index 1bf8f6a..9f3b42e 100644 --- a/src/configuration/cms_default_setup.e +++ b/src/configuration/cms_default_setup.e @@ -42,6 +42,8 @@ feature {NONE} -- Initialization local l_url: like site_url do + site_location := environment.path + --| Site id, used to identified a site, this could be set to a uuid, or else site_id := text_item_or_default ("site.id", "_EWF_CMS_NO_ID_") @@ -169,4 +171,7 @@ feature -- Theme: Compute location theme_location := themes_location.extended (theme_name) end +note + copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" end diff --git a/src/configuration/cms_setup.e b/src/configuration/cms_setup.e index 7537e47..cfe7584 100644 --- a/src/configuration/cms_setup.e +++ b/src/configuration/cms_setup.e @@ -92,6 +92,9 @@ feature -- Query feature -- Access: Theme + site_location: PATH + -- Path to CMS site root dir. + modules_location: PATH -- Path to modules. @@ -186,4 +189,7 @@ feature -- Element change module_registered: module_registered (m) end +note + copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" end diff --git a/src/modules/cms_debug_module.e b/src/modules/cms_debug_module.e index 3a25a35..b0938c7 100644 --- a/src/modules/cms_debug_module.e +++ b/src/modules/cms_debug_module.e @@ -28,12 +28,15 @@ feature {NONE} -- Initialization make do - name := "debug" version := "1.0" description := "Debug" package := "cms" end +feature -- Access + + name: STRING = "debug" + feature -- Router setup_router (a_router: WSF_ROUTER; a_api: CMS_API) @@ -134,7 +137,7 @@ feature -- Handler end note - copyright: "Copyright (c) 1984-2013, Eiffel Software and others" + copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software diff --git a/src/service/cms_api.e b/src/service/cms_api.e index 697c5d0..0933765 100644 --- a/src/service/cms_api.e +++ b/src/service/cms_api.e @@ -319,6 +319,12 @@ feature {NONE}-- Implemenation feature -- Environment/ theme + site_location: PATH + -- CMS site location. + do + Result := setup.site_location + end + theme_location: PATH -- Active theme location. do @@ -349,6 +355,7 @@ feature -- Environment/ module else l_name := a_name end + p := setup.environment.config_path p := module_location_by_name (a_module_name).extended ("config").extended (l_name) @@ -393,7 +400,14 @@ feature -- Environment/ module -- Location of resource `a_resource' for `a_module'. do --| site/modules/$modname/$a_name.json - Result := module_location (a_module).extended_path (a_resource) + Result := module_resource_location_by_name (a_module.name, a_resource) + end + + module_resource_location_by_name (a_module_name: READABLE_STRING_GENERAL; a_resource: PATH): PATH + -- Location of resource `a_resource' for `a_module'. + do + --| site/modules/$modname/$a_name.json + Result := module_location_by_name (a_module_name).extended_path (a_resource) end feature -- Environment/ modules and theme @@ -419,10 +433,37 @@ feature -- Environment/ modules and theme end end + module_theme_resource_location_by_name (a_module_name: READABLE_STRING_GENERAL; a_resource: PATH): detachable PATH + -- Theme resource location of `a_resource' for module named `a_module_name', if exists. + -- By default, located under the module location folder, but could be overriden + -- from files located under modules subfolder of active `theme_location'. + --| First search in themes/$theme/modules/$a_module.name/$a_resource, + --| and if not found then search in + --| modules/$a_module_name/$a_resource. + local + ut: FILE_UTILITIES + do + -- Check first in selected theme folder. + Result := module_theme_location_by_name (a_module_name).extended_path (a_resource) + if not ut.file_path_exists (Result) then + -- And if not found, look into site/modules/$a_module.name/.... folders. + Result := module_resource_location_by_name (a_module_name, a_resource) + if not ut.file_path_exists (Result) then + Result := Void + end + end + end + module_theme_location (a_module: CMS_MODULE): PATH -- Location for overriden files associated with `a_module_name'. do - Result := theme_location.extended ("modules").extended (a_module.name) + Result := module_theme_location_by_name (a_module.name) + end + + module_theme_location_by_name (a_module_name: READABLE_STRING_GENERAL): PATH + -- Location for overriden files associated with `a_module_name'. + do + Result := theme_location.extended ("modules").extended (a_module_name) end module_configuration (a_module: CMS_MODULE; a_name: detachable READABLE_STRING_GENERAL): detachable CONFIG_READER @@ -430,5 +471,8 @@ feature -- Environment/ modules and theme Result := module_configuration_by_name (a_module.name, a_name) end +note + copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" end diff --git a/src/service/cms_module.e b/src/service/cms_module.e index 1988de0..0c46a25 100644 --- a/src/service/cms_module.e +++ b/src/service/cms_module.e @@ -16,6 +16,8 @@ feature -- Access name: STRING -- Name of the module. + deferred + end description: STRING -- Description of the module. @@ -132,4 +134,7 @@ feature -- Hooks create Result.make_empty end +note + copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" end diff --git a/tools/roc/application.e b/tools/roc/application.e new file mode 100644 index 0000000..d6bf2df --- /dev/null +++ b/tools/roc/application.e @@ -0,0 +1,122 @@ +note + description: "[ + roc tool: install modules into an existing CMS Application. + + roc install [--module|-m ] [(--dir|-d ) | ] + + install: Install a given module to the corresponding cms application + --module|-m: module path or current directory if is not defined. + --dir|-d cms application path or current directory if is not defined + + Running the command will copy to the CMS Application site/modules the following artifacts if the current module provide them. + + config + scripts + themes + running + roc install blog + will look for a module blog in the modules directory starting at the current directory. + ]" + date: "$Date$" + revision: "$Revision$" + +class + APPLICATION + +inherit + + SHARED_EXECUTION_ENVIRONMENT + rename + print as ascii_print + end + + ARGUMENTS_32 + rename + print as ascii_print + end + + LOCALIZED_PRINTER + rename + print as ascii_print, + localized_print as print + end + +create + make + +feature {NONE} -- Initialization + + make + -- Initialize tool. + local + cmd_args: like command_arguments + do + -- TODO add support to other commands. + if argument_count = 0 then + print_usage + elseif attached commands.item (argument (1)) as cmd then + cmd_args := command_arguments + if cmd.is_valid (cmd_args) then + cmd.execute (cmd_args) + else + print_command_usage (cmd) + end + else + print ("Wrong command %"" + argument (1) + "%".%N") + print_usage + end + end + + commands: STRING_TABLE [ROC_COMMAND] + local + cmd: ROC_COMMAND + once + create Result.make (1) + create {ROC_INSTALL_COMMAND} cmd.make ("install") + Result.force (cmd, cmd.name) + end + + command_arguments: ARRAY [READABLE_STRING_32] + local + i,n: INTEGER + do + create Result.make_empty + Result.rebase (0) + Result.force (argument (0), 0) + from + i := 2 -- skip first arg which is command name + n := argument_count + until + i > n + loop + Result.force (argument (i), i - 1) + i := i + 1 + end + end + +feature -- Usage + + print_usage + do + print ("Usage:%N") + across + commands as ic + loop + print_command_usage (ic.item) + end + end + + print_command_usage (cmd: ROC_COMMAND) + do + print ("roc ") + print (cmd.name) + print (" ") + print (cmd.help) + print ("%N") + end + + +note + copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/tools/roc/license.lic b/tools/roc/license.lic new file mode 100644 index 0000000..3e50931 --- /dev/null +++ b/tools/roc/license.lic @@ -0,0 +1,3 @@ +${NOTE_KEYWORD} + copyright: "2011-${YEAR}, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" diff --git a/tools/roc/roc.ecf b/tools/roc/roc.ecf new file mode 100644 index 0000000..e38b269 --- /dev/null +++ b/tools/roc/roc.ecf @@ -0,0 +1,19 @@ + + + + + + + + + + + /EIFGENs$ + /CVS$ + /.svn$ + + + + diff --git a/tools/roc/roc_command.e b/tools/roc/roc_command.e new file mode 100644 index 0000000..28c3c81 --- /dev/null +++ b/tools/roc/roc_command.e @@ -0,0 +1,53 @@ +note + description: "Abstraction of roc command." + date: "$Date$" + revision: "$Revision$" + +deferred class + ROC_COMMAND + +inherit + SHARED_EXECUTION_ENVIRONMENT + rename + print as ascii_print + end + + LOCALIZED_PRINTER + rename + print as ascii_print, + localized_print as print + end + +feature {NONE} -- Initialization + + make (a_name: READABLE_STRING_8) + do + create name.make_from_string (a_name) + end + +feature -- Access + + name: IMMUTABLE_STRING_8 + + help: STRING_32 + deferred + end + +feature -- Status report + + is_valid (args: ARRAY [READABLE_STRING_32]): BOOLEAN + deferred + end + +feature -- Execution + + execute (args: ARRAY [READABLE_STRING_32]) + require + args.lower = 0 -- Prog name at index 0, args at index 1, ... + deferred + end + +note + copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/tools/roc/roc_install_command.e b/tools/roc/roc_install_command.e new file mode 100644 index 0000000..df15f07 --- /dev/null +++ b/tools/roc/roc_install_command.e @@ -0,0 +1,285 @@ +note + description: "Installation command." + date: "$Date$" + revision: "$Revision$" + +class + ROC_INSTALL_COMMAND + +inherit + ROC_COMMAND + +create + make + +feature -- Access + + help: STRING_32 + once + Result := "[--module|-m ] [(--dir|-d ) | ] [--site-dir ]" + end + +feature -- Status report + + is_valid (args: ARRAY [READABLE_STRING_32]): BOOLEAN + -- Is the submitted install command valid? + local + i, n: INTEGER + optional_module: BOOLEAN + cms_path: BOOLEAN + do + n := args.upper + -- TODO add error reporting. + if n >= 1 and then n <= 4 then + from + i := 1 + until + i > n + loop + if args [i].same_string ("-m") then + optional_module := True + elseif args [i].same_string ("--module") then + optional_module := True + elseif args [i].same_string ("-d") then + cms_path := True + elseif args [i].same_string ("--dir") then + cms_path := True + end + i := i + 1 + end + if n = 4 then + if (cms_path and optional_module) then + -- valid command + Result := True + else + print ("Error check the optional argument --module|-m and --dir|-d") + end + elseif n = 2 then + if (cms_path and not optional_module) then + Result := True + else + print ("Error missing value for dir") + Result := False + end + else + Result := True + end + else + Result := False + if n > 4 then + print ("Too many arguments") + end + if n < 1 then + print ("Too few argumetns") + end + end + end + +feature -- Helpers + + module_name (a_path: PATH): STRING_32 + do + -- FIXME: better implementation needed. Either based on "a" new module.info file, or parsing the .ecf + if attached a_path.entry as e then + Result := e.name + else + Result := a_path.name + end + end + +feature -- Execution + + execute (args: ARRAY [READABLE_STRING_32]) + -- Install a module into a cms application. + -- Pattern: module_src/site/* => cms/site/modules/$module_name/* + local + l_site_path, l_cms_path, l_module_source_path: detachable PATH + l_site_dir: DIRECTORY + l_modules_dir: DIRECTORY + l_dest_dir: DIRECTORY + i,n: INTEGER + do + from + i := 1 + n := args.upper + until + i > n + loop + if attached args[i] as arg then + if + arg.same_string ("-d") + or arg.same_string ("--dir") + then + i := i + 1 + if i <= n then + create l_cms_path.make_from_string (args[i]) + end + elseif + arg.same_string ("--site-dir") + then + i := i + 1 + if i <= n then + create l_site_path.make_from_string (args[i]) + end + elseif + arg.same_string ("-m") + or arg.same_string ("--module") + then + i := i + 1 + if i <= n then + create l_module_source_path.make_from_string (args[i]) + end + end + end + i := i + 1 + end + if l_module_source_path = Void then + l_module_source_path := Execution_environment.current_working_path + end + if l_cms_path = Void then + l_cms_path := Execution_environment.current_working_path.extended ("modules") + end + if l_cms_path /= Void and l_module_source_path /= Void then + -- If l_site_path is not set; initialize it to $cms_path/site. + if l_site_path = Void then + l_site_path := l_cms_path.extended ("site") + end + + -- Install configuration files. + if attached module_name (l_module_source_path) as l_mod_name then + create l_site_dir.make_with_path (l_site_path) + + if l_site_dir.exists then + create l_modules_dir.make_with_path (l_site_path.extended ("modules")) + if not l_modules_dir.exists then + l_modules_dir.create_dir + end + + create l_dest_dir.make_with_path (l_modules_dir.path.extended (l_mod_name)) + if not l_dest_dir.exists then + l_dest_dir.create_dir + end + install_module_elements (l_module_source_path, l_dest_dir.path, Void) +-- install_module_elements (l_module_source_path, l_dest_dir.path, Config_dir) +-- install_module_elements (l_module_source_path, l_dest_dir.path, Scripts_dir) +-- install_module_elements (l_module_source_path, l_dest_dir.path, Themes_dir) + print ("Module ") + print (l_mod_name) + print (" was successfuly installed to the CMS Application location ") + print (l_cms_path.name) + print ("%NCheck the module elements at ") + print (l_dest_dir.path.name) + print (".%N") + else + print ({STRING_32} "The CMS Application located at " + l_cms_path.name + "does not have the site or modules folders.%N") + end + else + print ("Error: not possible to retrieve module name.%N") + end + else + print ("Error: wrong path to CMS application.%N") + end + end + + install_module_elements (a_module_source_path: PATH; a_cms_module_target_path: PATH; a_element: detachable READABLE_STRING_GENERAL) + -- Install module site files from `a_module_source_path' to cms application `a_cms_module_target_path' under expected modules folder. + -- If `a_element' is set, take into account only sub folder `a_element'. + local + l_path: PATH + l_dest_dir: DIRECTORY + l_src_dir: DIRECTORY + do + l_path := a_module_source_path.extended ("site") + if a_element /= Void then + -- Copy all files under "site/$a_element" into "site/modules/$module_name/$a_element" location. + create l_src_dir.make_with_path (l_path.extended (a_element)) + create l_dest_dir.make_with_path (a_cms_module_target_path.extended (a_element)) + else + -- Copy all files under "site" into "site/modules/$module_name/" location. + create l_src_dir.make_with_path (l_path) + create l_dest_dir.make_with_path (a_cms_module_target_path) + end + if not l_dest_dir.exists then + l_dest_dir.create_dir + end + copy_directory (l_src_dir, l_dest_dir, True) + end + +feature {NONE} -- System/copy files + + copy_directory (a_src: DIRECTORY; a_dest: DIRECTORY; is_recursive: BOOLEAN) + -- Copy all elements from `a_src' to `a_dest'. + local + l_dir: DIRECTORY + l_new_dir: DIRECTORY + entry: PATH + l_path: PATH + l_file: FILE + ut: FILE_UTILITIES + do + across + a_src.entries as ic + loop + entry := ic.item + if not (entry.is_current_symbol or else entry.is_parent_symbol) then + l_path := a_src.path.extended_path (entry) + create {RAW_FILE} l_file.make_with_path (l_path) + if not l_file.is_directory then + copy_file_in_directory (l_file, a_dest.path) + elseif is_recursive then + create l_dir.make_with_path (l_path) + create l_new_dir.make_with_path (a_dest.path.extended_path (entry)) + ut.create_directory_path (l_new_dir.path) + if l_dir.exists then + copy_directory (l_dir, l_new_dir, is_recursive) + end + end + end + end + end + + copy_file_in_directory (a_file: FILE; a_dir: PATH) + -- Copy file `a_file' to dir `a_dir'. + local + retried: BOOLEAN + l_dest: RAW_FILE + do + if not retried then + if attached a_file.path.entry as e then + create l_dest.make_with_path (a_dir.extended_path (e)) + l_dest.create_read_write + a_file.open_read + -- Copy file source to destination + if + l_dest.exists and then + l_dest.is_writable and then + a_file.exists and then + a_file.is_readable + then + a_file.copy_to (l_dest) + a_file.close + l_dest.close + end + end + end + rescue + retried := True + retry + end + +--feature -- Constants + +-- Config_dir: STRING = "config" +-- -- Configuration dir. + +-- Scripts_dir: STRING = "scripts" +-- -- Scripts dir. + +-- Themes_dir: STRING = "themes" +-- -- Themes dir. + + +note + copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end