diff options
author | Jörn Friedrich Dreyer <jfd@butonic.de> | 2014-06-03 16:50:05 +0200 |
---|---|---|
committer | Jörn Friedrich Dreyer <jfd@butonic.de> | 2014-06-03 16:53:03 +0200 |
commit | b5a145b297ee933dc4c9d7e016a57feba91bf8ac (patch) | |
tree | 4999e4053582a73b2a07c030afd3877f4937717b | |
parent | 37afab87b56fa7b2a1b0e751df72e9624663f94f (diff) | |
download | nextcloud-server-b5a145b297ee933dc4c9d7e016a57feba91bf8ac.tar.gz nextcloud-server-b5a145b297ee933dc4c9d7e016a57feba91bf8ac.zip |
convert mail template editor to app framework for a restful api
-rw-r--r-- | apps/files_sharing/ajax/getmailtemplate.php | 21 | ||||
-rw-r--r-- | apps/files_sharing/ajax/resetmailtemplate.php | 24 | ||||
-rw-r--r-- | apps/files_sharing/ajax/setmailtemplate.php | 24 | ||||
-rw-r--r-- | apps/files_sharing/ajax/settings.php | 5 | ||||
-rw-r--r-- | apps/files_sharing/app/sharing.php | 25 | ||||
-rw-r--r-- | apps/files_sharing/appinfo/routes.php | 15 | ||||
-rw-r--r-- | apps/files_sharing/controller/adminsettingscontroller.php | 49 | ||||
-rw-r--r-- | apps/files_sharing/css/settings-admin.css | 2 | ||||
-rw-r--r-- | apps/files_sharing/http/mailtemplateresponse.php | 55 | ||||
-rw-r--r-- | apps/files_sharing/js/settings-admin.js | 42 | ||||
-rw-r--r-- | apps/files_sharing/lib/mailtemplate.php | 41 | ||||
-rw-r--r-- | apps/files_sharing/settings-admin.php | 34 | ||||
-rw-r--r-- | apps/files_sharing/templates/settings-admin.php | 8 |
13 files changed, 204 insertions, 141 deletions
diff --git a/apps/files_sharing/ajax/getmailtemplate.php b/apps/files_sharing/ajax/getmailtemplate.php deleted file mode 100644 index 8caf0ebcec8..00000000000 --- a/apps/files_sharing/ajax/getmailtemplate.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -OC_JSON::checkAdminUser(); -OCP\JSON::callCheck(); - -if(!\OCP\App::isEnabled('files_sharing')){ - \OC_Response::setStatus(410); // GONE -} - -// Get data -if ( isset( $_GET['theme'] ) && isset( $_GET['template'] ) ) { - - $template = new \OCA\Files_Sharing\MailTemplate( $_GET['theme'], $_GET['template'] ); - try { - $template->renderContent(); - } catch (\OCP\Files\NotPermittedException $ex) { - \OC_Response::setStatus(403); // forbidden - } - exit(); -} -\OC_Response::setStatus(404); // not found diff --git a/apps/files_sharing/ajax/resetmailtemplate.php b/apps/files_sharing/ajax/resetmailtemplate.php deleted file mode 100644 index 4050235bc5d..00000000000 --- a/apps/files_sharing/ajax/resetmailtemplate.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -OC_JSON::checkAdminUser(); -OCP\JSON::callCheck(); - -if(!\OCP\App::isEnabled('files_sharing')){ - \OCP\Response::setStatus(410); // GONE -} - -$l=OC_L10N::get('core'); - -// post data -if ( isset( $_POST['theme'] ) && isset( $_POST['template'] ) ) { - - $template = new \OCA\Files_Sharing\MailTemplate( $_POST['theme'], $_POST['template'] ); - try { - $template->reset(); - \OC_Response::setStatus(200); // ok - } catch (\OCP\Files\NotPermittedException $ex) { - \OC_Response::setStatus(403); // forbidden - } - exit(); -} -\OC_Response::setStatus(404); // not found diff --git a/apps/files_sharing/ajax/setmailtemplate.php b/apps/files_sharing/ajax/setmailtemplate.php deleted file mode 100644 index d8bb587627c..00000000000 --- a/apps/files_sharing/ajax/setmailtemplate.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -OC_JSON::checkAdminUser(); -OCP\JSON::callCheck(); - -if(!\OCP\App::isEnabled('files_sharing')){ - \OCP\Response::setStatus(410); // GONE -} - -$l=OC_L10N::get('core'); - -// post data -if ( isset( $_POST['theme'] ) && isset( $_POST['template'] ) && isset( $_POST['content'] ) ) { - - $template = new \OCA\Files_Sharing\MailTemplate( $_POST['theme'], $_POST['template'] ); - try { - $template->setContent($_POST['content']); - \OC_Response::setStatus(200); // ok - } catch (\OCP\Files\NotPermittedException $ex) { - \OC_Response::setStatus(403); // forbidden - } - exit(); -} -\OC_Response::setStatus(404); // not found diff --git a/apps/files_sharing/ajax/settings.php b/apps/files_sharing/ajax/settings.php deleted file mode 100644 index da244f8de47..00000000000 --- a/apps/files_sharing/ajax/settings.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php - -if(!\OCP\App::isEnabled('files_sharing')){ - \OCP\Response::setStatus(410); // GONE -} diff --git a/apps/files_sharing/app/sharing.php b/apps/files_sharing/app/sharing.php new file mode 100644 index 00000000000..427269755b9 --- /dev/null +++ b/apps/files_sharing/app/sharing.php @@ -0,0 +1,25 @@ +<?php + +namespace OCA\Files_Sharing\App; + +use \OCP\AppFramework\App; +use \OCA\Files_Sharing\Controller\AdminSettingsController; + +class Sharing extends App { + + public function __construct(array $urlParams=array()){ + parent::__construct('files_sharing', $urlParams); + + $container = $this->getContainer(); + + /** + * Controllers + */ + $container->registerService('AdminSettingsController', function($c) { + return new AdminSettingsController( + $c->query('AppName'), + $c->query('Request') + ); + }); + } +} diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index 7c2834dc9c2..5b6286e2bfb 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -5,6 +5,21 @@ $this->create('core_ajax_public_preview', '/publicpreview')->action( require_once __DIR__ . '/../ajax/publicpreview.php'; }); +use \OCA\Files_Sharing\App\Sharing; + +$app = new Sharing(); + +$app->registerRoutes($this, array('routes' => array( + + // mailTemplate settings + array('name' => 'admin_settings#render', 'url' => '/settings/mailtemplate', 'verb' => 'GET'), + + array('name' => 'admin_settings#update', 'url' => '/settings/mailtemplate', 'verb' => 'POST'), + + array('name' => 'admin_settings#reset', 'url' => '/settings/mailtemplate', 'verb' => 'DELETE') + +))); + // OCS API //TODO: SET: mail notification, waiting for PR #4689 to be accepted diff --git a/apps/files_sharing/controller/adminsettingscontroller.php b/apps/files_sharing/controller/adminsettingscontroller.php new file mode 100644 index 00000000000..7125641617d --- /dev/null +++ b/apps/files_sharing/controller/adminsettingscontroller.php @@ -0,0 +1,49 @@ +<?php + +namespace OCA\Files_Sharing\Controller; + +use \OCP\AppFramework\ApiController; +use \OCP\IRequest; +use \OCP\AppFramework\Http\JSONResponse; + +class AdminSettingsController extends ApiController { + + public function __construct($appName, IRequest $request) { + parent::__construct($appName, $request); + } + + /** + * @param string $theme + * @param string $template + * @return type Description + * @return \OCA\Files_Sharing\Http\MailTemplateResponse + */ + public function render( $theme, $template ) { + $template = new \OCA\Files_Sharing\MailTemplate( $theme, $template ); + return $template->getResponse(); + } + + /** + * @param string $theme + * @param string $template + * @param string $content + * @return array + */ + public function update( $theme, $template, $content ) { + $template = new \OCA\Files_Sharing\MailTemplate( $theme, $template ); + $template->setContent( $content ); + return new JSONResponse(); + } + + /** + * @param string $theme + * @param string $template + * @return array + */ + public function reset( $theme, $template ) { + $template = new \OCA\Files_Sharing\MailTemplate( $theme, $template ); + $template->reset(); + return new JSONResponse(); + } + +} diff --git a/apps/files_sharing/css/settings-admin.css b/apps/files_sharing/css/settings-admin.css index c807fc83c76..7ee71963436 100644 --- a/apps/files_sharing/css/settings-admin.css +++ b/apps/files_sharing/css/settings-admin.css @@ -9,7 +9,7 @@ #mailTemplateSettings textarea { box-sizing: border-box; width: 100%; - height: 100px; + height: 150px; } #mailTemplateSettings .templateEditor + .actions { diff --git a/apps/files_sharing/http/mailtemplateresponse.php b/apps/files_sharing/http/mailtemplateresponse.php new file mode 100644 index 00000000000..98a2dfcc94e --- /dev/null +++ b/apps/files_sharing/http/mailtemplateresponse.php @@ -0,0 +1,55 @@ +<?php + +/** + * ownCloud - App Framework + * + * @author Jörn Dreyer + * @copyright 2014 Jörn Dreyer <jfd@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files_Sharing\Http; + +/** + * Prompts the user to download the a file + */ +class MailTemplateResponse extends \OCP\AppFramework\Http\Response { + + private $filename; + private $contentType; + + /** + * Creates a response that prompts the user to download the file + * @param string $filename the name that the downloaded file should have + * @param string $contentType the mimetype that the downloaded file should have + */ + public function __construct($filename, $contentType = 'text/php') { + $this->filename = $filename; + $this->contentType = $contentType; + + $this->addHeader('Content-Disposition', 'attachment; filename="' . $filename . '"'); + $this->addHeader('Content-Type', $contentType); + } + + /** + * Returns the raw template content + * @return string the file + */ + public function render(){ + return file_get_contents($this->filename); + } + +} diff --git a/apps/files_sharing/js/settings-admin.js b/apps/files_sharing/js/settings-admin.js index 25950b9f4f3..0362af0232b 100644 --- a/apps/files_sharing/js/settings-admin.js +++ b/apps/files_sharing/js/settings-admin.js @@ -1,17 +1,16 @@ $(document).ready(function() { - + var loadTemplate = function (theme, template) { - $.get( - OC.filePath( 'files_sharing', 'ajax', 'getmailtemplate.php' ) - , { theme: theme, template: template } - ).done(function( result ) { - $( '#mailTemplateSettings textarea' ).val(result); - }).fail(function( result ) { - alert(result); - }); - + $.get( + OC.generateUrl('apps/files_sharing/settings/mailtemplate'), + { theme: theme, template: template } + ).done(function( result ) { + $( '#mailTemplateSettings textarea' ).val(result); + }).fail(function( result ) { + alert(result); + }); } - + // load default template var theme = $( '#mts-theme' ).val(); var template = $( '#mts-template' ).val(); @@ -24,6 +23,7 @@ $(document).ready(function() { loadTemplate(theme, template); } ); + $( '#mts-theme' ).change( function() { var theme = $( this ).val(); @@ -31,6 +31,7 @@ $(document).ready(function() { loadTemplate(theme, template); } ); + $( '#mailTemplateSettings .actions' ).on('click', '.save', function() { var theme = $( '#mts-theme' ).val(); @@ -38,27 +39,29 @@ $(document).ready(function() { var content = $( '#mailTemplateSettings textarea' ).val(); OC.msg.startSaving('#mts-msg'); $.post( - OC.filePath( 'files_sharing', 'ajax', 'setmailtemplate.php' ) - , { theme: theme, template: template, content: content } + OC.generateUrl('apps/files_sharing/settings/mailtemplate'), + { theme: theme, template: template, content: content } ).done(function( result ) { var data = { status:'success', data:{message:t('files_sharing', 'Saved')} }; OC.msg.finishedSaving('#mts-msg', data); }).fail(function( result ) { var data = { status:'error', data:{message:t('files_sharing', 'Error')} }; OC.msg.finishedSaving('#mts-msg', data); - }); + }); } ); + $( '#mailTemplateSettings .actions' ).on('click', '.reset', function() { var theme = $( '#mts-theme' ).val(); var template = $( '#mts-template' ).val(); var content = $( '#mailTemplateSettings textarea' ).val(); OC.msg.startSaving('#mts-msg'); - $.post( - OC.filePath( 'files_sharing', 'ajax', 'resetmailtemplate.php' ) - , { theme: theme, template: template } - ).done(function( result ) { + $.ajax({ + type: "DELETE", + url: OC.generateUrl('apps/files_sharing/settings/mailtemplate'), + data: { theme: theme, template: template } + }).done(function( result ) { var data = { status:'success', data:{message:t('files_sharing', 'Reset')} }; OC.msg.finishedSaving('#mts-msg', data); @@ -69,7 +72,8 @@ $(document).ready(function() { }).fail(function( result ) { var data = { status:'error', data:{message:t('files_sharing', 'Error')} }; OC.msg.finishedSaving('#mts-msg', data); - }); + }); } ); + }); diff --git a/apps/files_sharing/lib/mailtemplate.php b/apps/files_sharing/lib/mailtemplate.php index 0ea8b6ea344..cb08b534d6f 100644 --- a/apps/files_sharing/lib/mailtemplate.php +++ b/apps/files_sharing/lib/mailtemplate.php @@ -3,9 +3,11 @@ namespace OCA\Files_Sharing; use \OCP\Files\NotPermittedException; +use \OC\AppFramework\Middleware\Security\SecurityException; +use OCA\Files_Sharing\Http\MailTemplateResponse; class MailTemplate extends \OC_Template { - + private $path; private $theme; private $editableThemes; @@ -14,24 +16,37 @@ class MailTemplate extends \OC_Template { public function __construct($theme, $path) { $this->theme = $theme; $this->path = $path; - + //determine valid theme names $this->editableThemes = self::getEditableThemes(); //for now hardcode the valid mail template paths $this->editableTemplates = self::getEditableTemplates(); } + /** + * + * @return \OCA\Files_Sharing\Http\MailTemplateResponse + */ + public function getResponse() { + if($this->isEditable()) { + list($app, $filename) = explode('/templates/', $this->path, 2); + $name = substr($filename, 0, -4); + list($path, $template) = $this->findTemplate($this->theme, $app, $name, ''); + return new MailTemplateResponse($template); + } + } + public function renderContent() { if($this->isEditable()) { - list($app, $filename) = explode("/templates/", $this->path, 2); + list($app, $filename) = explode('/templates/', $this->path, 2); $name = substr($filename, 0, -4); list($path, $template) = $this->findTemplate($this->theme, $app, $name, ''); \OC_Response::sendFile($template); } else { - throw new NotPermittedException('Template not editable.'); + throw new SecurityException('Template not editable.', 403); } } - + public function isEditable() { if ($this->editableThemes[$this->theme] && $this->editableTemplates[$this->path] @@ -40,6 +55,7 @@ class MailTemplate extends \OC_Template { } return false; } + public function setContent($data) { if($this->isEditable()) { //save default templates in default folder to overwrite core template @@ -47,19 +63,20 @@ class MailTemplate extends \OC_Template { $parent = dirname($absolutePath); if ( ! is_dir($parent) ) { if ( ! mkdir(dirname($absolutePath), 0777, true) ){ - throw new NotPermittedException('Could not create directory.'); + throw new \Exception('Could not create directory.', 500); } } if ( $this->theme !== 'default' && is_file($absolutePath) ) { if ( ! copy($absolutePath, $absolutePath.'.bak') ){ - throw new NotPermittedException('Could not create directory.'); + throw new \Exception('Could not overwrite template.', 500); } } //overwrite theme templates? versioning? return file_put_contents($absolutePath, $data); } - throw new NotPermittedException('Template not editable.'); + throw new SecurityException('Template not editable.', 403); } + public function reset(){ if($this->isEditable()) { $absolutePath = \OC::$SERVERROOT.'/themes/'.$this->theme.'/'.$this->path; @@ -78,15 +95,16 @@ class MailTemplate extends \OC_Template { } return false; } - throw new NotPermittedException('Template not editable.'); + throw new NotPermittedException('Template not editable.', 403); } + public static function getEditableThemes() { $themes = array( 'default' => true ); if ($handle = opendir(\OC::$SERVERROOT.'/themes')) { while (false !== ($entry = readdir($handle))) { - if ($entry != '.' && $entry != '..') { + if ($entry != '.' && $entry != '..' && $entry != 'default') { if (is_dir(\OC::$SERVERROOT.'/themes/'.$entry)) { $themes[$entry] = true; } @@ -96,6 +114,7 @@ class MailTemplate extends \OC_Template { } return $themes; } + public static function getEditableTemplates() { return array( 'core/templates/mail.php' => true, @@ -103,4 +122,4 @@ class MailTemplate extends \OC_Template { 'core/lostpassword/templates/email.php' => true, ); } -}
\ No newline at end of file +} diff --git a/apps/files_sharing/settings-admin.php b/apps/files_sharing/settings-admin.php index cbc500c2185..8f15e272312 100644 --- a/apps/files_sharing/settings-admin.php +++ b/apps/files_sharing/settings-admin.php @@ -8,46 +8,14 @@ \OC_Util::checkAdminUser(); -if (\OC_Util::getTheme()) { - $mailTemplatePath = \OC::$SERVERROOT . '/themes/' . OC_Util::getTheme() . '/core/templates/mail.php'; -} - -if (!isset($mailTemplatePath) || !file_exists($mailTemplatePath) ) { - $mailTemplatePath = \OC::$SERVERROOT . '/core/templates/mail.php'; -} - -if (file_exists($mailTemplatePath)) { - $mailTemplate = file_get_contents($mailTemplatePath); -} else { - //log no mail template found -} - - \OCP\Util::addStyle('files_sharing', 'settings-admin'); \OCP\Util::addScript('files_sharing', 'settings-admin'); -//\OCP\Util::addScript('settings', 'personal'); - -$themes = array('default'); - -if ($handle = opendir(\OC::$SERVERROOT.'/themes')) { - while (false !== ($entry = readdir($handle))) { - if ($entry != '.' && $entry != '..') { - if (is_dir(\OC::$SERVERROOT.'/themes/'.$entry)) { - $themes[] = $entry; - } - } - } - closedir($handle); -} +$themes = \OCA\Files_Sharing\MailTemplate::getEditableThemes(); $editableTemplates = \OCA\Files_Sharing\MailTemplate::getEditableTemplates(); $tmpl = new OCP\Template('files_sharing', 'settings-admin'); $tmpl->assign('themes', $themes); $tmpl->assign('editableTemplates', $editableTemplates); - -//\OCP\Util::addscript('files_settings', 'settings'); -//\OCP\Util::addscript('core', 'multiselect'); - return $tmpl->fetchPage(); diff --git a/apps/files_sharing/templates/settings-admin.php b/apps/files_sharing/templates/settings-admin.php index 44864c24717..4021be871cd 100644 --- a/apps/files_sharing/templates/settings-admin.php +++ b/apps/files_sharing/templates/settings-admin.php @@ -1,4 +1,5 @@ <div class="section" id="mailTemplateSettings" > + <h2><?php p($l->t('Mail templates'));?></h2> <div class="actions"> @@ -6,7 +7,7 @@ <div> <label for="mts-theme"><?php p($l->t('Theme'));?></label> <select id="mts-theme"> - <?php foreach($_['themes'] as $theme): ?> + <?php foreach($_['themes'] as $theme => $editable): ?> <option><?php p($theme); ?></option> <?php endforeach; ?> </select> @@ -22,11 +23,11 @@ </div> </div> - + <div class="templateEditor"> <textarea></textarea> </div> - + <div class="actions"> <button class="reset"><?php p($l->t('Reset'));?></button> @@ -36,4 +37,5 @@ <span id="mts-msg" class="msg"></span> </div> + </div> |