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 index 2e18c36..d6bf2df 100644 --- a/tools/roc/application.e +++ b/tools/roc/application.e @@ -14,7 +14,7 @@ note scripts themes running - roc instal blog + roc install blog will look for a module blog in the modules directory starting at the current directory. ]" date: "$Date$" @@ -26,8 +26,20 @@ class inherit SHARED_EXECUTION_ENVIRONMENT + rename + print as ascii_print + end - ARGUMENTS + ARGUMENTS_32 + rename + print as ascii_print + end + + LOCALIZED_PRINTER + rename + print as ascii_print, + localized_print as print + end create make @@ -36,252 +48,75 @@ 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 ("Use: roc install [--module|-m ] [(--dir|-d ) | ]") - elseif argument (1).starts_with ("install") then - execute_install - else - print ("Wrong command") - print ("%NUse: roc install [--module|-m ] -cap ") - end - end - -feature {NONE} -- Install - - execute_install - -- Install a new module. - local - i: INTEGER - error: BOOLEAN - optional_module: BOOLEAN - cms_path: BOOLEAN - do - if is_valid_install_cmd then - do_execute_install - end - end - - do_execute_install - -- Install a module into a cms application. - -- Pattern - -- app/site/modules/module_name/config/.... - -- app/site/modules/module_name/scripts/.... - -- app/site/modules/module_name/themes/.... - local - l_module_path: PATH - l_config: PATH - l_site_dir: DIRECTORY - l_modules_dir: DIRECTORY - l_dest_dir: DIRECTORY - l_file: FILE - do - if attached install_cms_path as l_cms_path then - l_module_path := install_module_path - --Install configuration files. - if attached l_module_path.entry as l_entry then - create l_site_dir.make_with_path (l_cms_path.extended ("site")) - create l_modules_dir.make_with_path (l_cms_path.extended ("site").extended ("modules")) - - if - l_site_dir.exists and then - l_modules_dir.exists - then - create l_dest_dir.make_with_path (l_cms_path.extended ("site").extended ("modules").extended (l_entry.name)) - if not l_dest_dir.exists then - l_dest_dir.create_dir - end - install_module_elements (l_module_path, l_dest_dir.path, Config_dir) - install_module_elements (l_module_path, l_dest_dir.path, Scripts_dir) - install_module_elements (l_module_path, l_dest_dir.path, Themes_dir) - print ("Module ") - print ( l_entry) - print ( " was successfuly installed to the cms Application located ") - print (l_cms_path.name) - print ("%NCheck the module elements at ") - print (l_dest_dir.path.name) - else - print ("The CMS Application located at does not have the site or modules folders") - end + 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 ("Error not possible to retrieve module name.") + print_command_usage (cmd) end else - print ("%NWrong path to CMS application") + print ("Wrong command %"" + argument (1) + "%".%N") + print_usage end end - install_module_elements (a_module_path: PATH; a_cms_path: PATH; a_element: STRING) - -- Install module configuration files from `a_module_path' to cms application `a_cms_path' to the element `a_element'. + commands: STRING_TABLE [ROC_COMMAND] local - l_config: PATH - l_dest_dir: DIRECTORY - l_src_dir: DIRECTORY - l_file: FILE - do - if attached a_module_path.entry as l_entry then - l_config := a_module_path.extended ("site").extended (a_element) - - create l_src_dir.make_with_path (l_config) - -- Create the element - create l_dest_dir.make_with_path (a_cms_path.extended(a_element)) - if not l_dest_dir.exists then - l_dest_dir.create_dir - end - copy_elements (l_src_dir, l_dest_dir) - else - print ("Error not possible to retrieve module name.") - end + cmd: ROC_COMMAND + once + create Result.make (1) + create {ROC_INSTALL_COMMAND} cmd.make ("install") + Result.force (cmd, cmd.name) end - - copy_elements (a_src_dir: DIRECTORY; a_dest_dir: DIRECTORY) - -- Copy all elements from a_src_dir to a_dest_dir. + command_arguments: ARRAY [READABLE_STRING_32] local - l_dir: DIRECTORY - l_new_dir: DIRECTORY - entry: PATH - l_file: FILE + i,n: INTEGER do - across - a_src_dir.entries as ic + 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 - entry := ic.item - if not (entry.is_current_symbol or else entry.is_parent_symbol) then - create {RAW_FILE} l_file.make_with_path (a_src_dir.path.extended_path (ic.item)) - if not l_file.is_directory then - copy_file (l_file, a_dest_dir.path) - else - create l_dir.make_with_path (a_src_dir.path.extended_path (entry)) - create l_new_dir.make_with_path (a_dest_dir.path.extended_path (entry)) - if not l_new_dir.exists then - l_new_dir.create_dir - end - if l_dir.exists then - copy_elements (l_dir, l_new_dir) - end - end - end + Result.force (argument (i), i - 1) + i := i + 1 end end +feature -- Usage -feature {NONE} -- Copy File - - copy_file (a_file: FILE; a_dir: PATH) - --Copy file `a_file' to dir `a_dir'. - local - l_dest: RAW_FILE - l_path: PATH + print_usage do - if attached a_file.path.entry as l_name then - l_path := a_dir.absolute_path.extended (l_name.name) - create l_dest.make_with_path (l_path) - 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 - else + print ("Usage:%N") + across + commands as ic + loop + print_command_usage (ic.item) end end -feature {NONE} -- Command Validator - - install_module_path: PATH - -- Path to the module to install. + print_command_usage (cmd: ROC_COMMAND) do - if attached separate_word_option_value ("m") as l_m then - create Result.make_from_string (l_m) - elseif attached separate_word_option_value ("-module") as l_m then - create Result.make_from_string (l_m) - else - Result := Execution_environment.current_working_path - end + print ("roc ") + print (cmd.name) + print (" ") + print (cmd.help) + print ("%N") end - install_cms_path: PATH - -- Path to the cms application to install a module. - local - l_dir: DIRECTORY - do - if attached separate_word_option_value ("d") as l_m then - create Result.make_from_string (l_m) - elseif attached separate_word_option_value ("-dir") as l_m then - create Result.make_from_string (l_m) - else - Result := Execution_environment.current_working_path.extended ("modules") - end - end - - is_valid_install_cmd: BOOLEAN - -- Is the submitted install command valid? - -- install [--module|-m %MODULE_PATH%] -cap %CMS_PATH% - local - i: INTEGER - error: BOOLEAN - optional_module: BOOLEAN - cms_path: BOOLEAN - do - -- TODO add error reporting. - if argument_count >= 2 and then argument_count <= 5 then - from - i := 2 - until - i > argument_count - loop - if option_word_equal (argument (i), "m") then - optional_module := True - elseif option_word_equal (argument (i), "-module") then - optional_module := True - elseif option_word_equal (argument (i), "d") then - cms_path := True - elseif option_word_equal (argument (i), "-dir") then - cms_path := True - end - i := i + 1 - end - if argument_count = 5 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 argument_count = 3 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 argument_count > 5 then - print ("Too many arguments") - end - if argument_count < 2 then - print ("Too few argumetns") - end - end - 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 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 index 33a4fad..e38b269 100644 --- a/tools/roc/roc.ecf +++ b/tools/roc/roc.ecf @@ -1,13 +1,13 @@ - + - + /EIFGENs$ 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