/**
  * Get a list of all available modules.
  *
  * @return array
  */
 public static function getModuleList()
 {
     if (self::$modules) {
         return self::$modules;
     }
     // find all backend directories
     $dirs = glob(PathHelper::path(App::getInstance()['projectPath'], 'include', '*', 'Module'), GLOB_ONLYDIR);
     if (!$dirs) {
         $dirs = array();
     }
     $dirs[] = __DIR__;
     // find all php files in the directories
     $modules = array();
     foreach ($dirs as $dir) {
         $classes = ClassEnumerator::findClasses($dir);
         foreach ($classes as $className) {
             if (class_exists($className)) {
                 $r = new \ReflectionClass($className);
                 if ($r->isSubclassOf(__CLASS__) && !$r->isAbstract()) {
                     $modules[$className] = $className;
                 }
             }
         }
     }
     ksort($modules);
     self::$modules = $modules;
     return self::$modules;
 }
Exemple #2
0
 /** {@inheritdoc} */
 public function show(Request $request)
 {
     $this->addMainMenu();
     $configFile = $this->app['configPath'];
     if (!$configFile) {
         $this->addMessage("Configuration file not set.", self::MSG_ERROR);
     } else {
         if (!is_writable($configFile)) {
             $this->addMessage("Configuration file doesn't seem to be writable.", self::MSG_ERROR);
         }
     }
     $config = $this->app->openConfiguration();
     $defaultConfig = $this->app->getDefaultConfiguration();
     $form = new \Curry_Form(array('action' => url('', array("module", "view")), 'method' => 'post'));
     $themes = array();
     $backendPath = PathHelper::path(true, $this->app['wwwPath'], 'shared', 'backend');
     if ($backendPath) {
         foreach (new \DirectoryIterator($backendPath) as $entry) {
             $name = $entry->getFilename();
             if (!$entry->isDot() && $entry->isDir() && $name !== 'common') {
                 $themes[$name] = $name;
             }
         }
     }
     $activeTheme = isset($config->backend->theme) ? $config->backend->theme : false;
     if ($activeTheme && !array_key_exists($activeTheme, $themes)) {
         $themes[$activeTheme] = $activeTheme;
     }
     $pages = \PagePeer::getSelect();
     $loggers = $this->getDefaultLoggers($config);
     $enabledLoggers = isset($config->log) ? array_filter($config->log->toArray(), function ($log) {
         return !isset($log['enabled']) || $log['enabled'];
     }) : array();
     // General
     $form->addSubForm(new \Curry_Form_SubForm(array('legend' => 'General', 'elements' => array('name' => array('text', array('label' => 'Name', 'required' => true, 'value' => isset($config->name) ? $config->name : '', 'description' => 'Name of site, shown in backend header and page title by default.', 'placeholder' => $defaultConfig->name)), 'baseUrl' => array('text', array('label' => 'Base URL', 'value' => isset($config->baseUrl) ? $config->baseUrl : '', 'description' => 'The URL to use when creating absolute URLs. This should end with a slash, and may include a path.', 'placeholder' => $defaultConfig->baseUrl)), 'adminEmail' => array('text', array('label' => 'Admin email', 'value' => isset($config->adminEmail) ? $config->adminEmail : '')), 'divertOutMailToAdmin' => array('checkbox', array('label' => 'Divert outgoing email to admin email', 'value' => isset($config->divertOutMailToAdmin) ? $config->divertOutMailToAdmin : '', 'description' => 'All outgoing Curry\\Mail will be diverted to admin email.')), 'developmentMode' => array('checkbox', array('label' => 'Development mode', 'value' => isset($config->developmentMode) ? $config->developmentMode : '')), 'forceDomain' => array('checkbox', array('label' => 'Force domain', 'value' => isset($config->forceDomain) ? $config->forceDomain : '', 'description' => 'If the domain of the requested URL doesn\'t match the domain set by Base URL, the user will be redirected to the correct domain.')), 'fallbackLanguage' => array('select', array('label' => 'Fallback Language', 'multiOptions' => array('' => '[ None ]') + \LanguageQuery::create()->find()->toKeyValue('PrimaryKey', 'Name'), 'value' => isset($config->fallbackLanguage) ? $config->fallbackLanguage : '', 'description' => 'The language used when no language has been specified for the rendered page. Also the language used in backend context.'))))), 'general');
     // Backend
     $form->addSubForm(new \Curry_Form_SubForm(array('legend' => 'Backend', 'class' => 'advanced', 'elements' => array('theme' => array('select', array('label' => 'Theme', 'multiOptions' => array('' => '[ Default ]') + $themes, 'value' => isset($config->backend->theme) ? $config->backend->theme : '', 'description' => 'Theme for the administrative back-end.')), 'logotype' => array('filebrowser', array('label' => 'Backend Logotype', 'value' => isset($config->backend->logotype) ? $config->backend->logotype : '', 'description' => 'Path to the backend logotype. The height of this image should be 100px.')), 'templatePage' => array('select', array('label' => 'Template page', 'multiOptions' => array('' => '[ None ]') + $pages, 'value' => isset($config->backend->templatePage) ? $config->backend->templatePage : '', 'description' => 'The page containing page templates (i.e. pages to be used as base pages). When creating new pages or editing a page using the Content tab, only this page and pages below will be shown as base pages.')), 'defaultEditor' => array('text', array('label' => 'Default HTML editor', 'value' => isset($config->defaultEditor) ? $config->defaultEditor : '', 'description' => 'The default WYSIWYG editor to use with the article module.', 'placeholder' => $defaultConfig->defaultEditor)), 'autoBackup' => array('text', array('label' => 'Automatic database backup', 'value' => isset($config->autoBackup) ? $config->autoBackup : '', 'placeholder' => $defaultConfig->autoBackup, 'description' => 'Specifies the number of seconds since last backup to create automatic database backups when logged in to the backend.')), 'revisioning' => array('checkbox', array('label' => 'Revisioning', 'value' => isset($config->revisioning) ? $config->revisioning : '', 'description' => 'When enabled, a new working revision will automatically be created when you create a page. You will also be warned when editing a published page revision')), 'autoPublish' => array('checkbox', array('label' => 'Auto Publish', 'value' => isset($config->autoPublish) ? $config->autoPublish : '', 'description' => 'When enabled, a check will be made on every request to check if there are any pages that should be published (using publish date).')), 'noauth' => array('checkbox', array('label' => 'Disable Backend Authorization', 'value' => isset($config->backend->noauth) ? $config->backend->noauth : '', 'description' => 'This will completely disable authorization for the backend.')), 'autoUpdateIndex' => array('checkbox', array('label' => 'Auto Update Search Index', 'value' => isset($config->autoUpdateIndex) ? $config->autoUpdateIndex : '', 'description' => 'Automatically update (rebuild) search index when changing page content.'))))), 'backend');
     // Live edit
     $form->addSubForm(new \Curry_Form_SubForm(array('legend' => 'Live edit', 'class' => 'advanced', 'elements' => array('liveEdit' => array('checkbox', array('label' => 'Enable Live Edit', 'value' => isset($config->liveEdit) ? $config->liveEdit : $defaultConfig->liveEdit, 'description' => 'Enables editing of content directly in the front-end.')), 'placeholderExclude' => array('textarea', array('label' => 'Excluded placeholders', 'value' => isset($config->backend->placeholderExclude) ? join(PHP_EOL, $config->backend->placeholderExclude->toArray()) : '', 'description' => 'Prevent placeholders from showing up in live edit mode. Use newlines to separate placeholders.', 'rows' => 5))))), 'liveEdit');
     // Error pages
     $form->addSubForm(new \Curry_Form_SubForm(array('legend' => 'Error pages', 'class' => 'advanced', 'elements' => array('notFound' => array('select', array('label' => 'Page not found (404)', 'multiOptions' => array('' => '[ None ]') + $pages, 'value' => isset($config->errorPage->notFound) ? $config->errorPage->notFound : '')), 'unauthorized' => array('select', array('label' => 'Unauthorized (401)', 'multiOptions' => array('' => '[ None ]') + $pages, 'value' => isset($config->errorPage->unauthorized) ? $config->errorPage->unauthorized : '')), 'error' => array('select', array('label' => 'Internal server error (500)', 'multiOptions' => array('' => '[ None ]') + $pages, 'value' => isset($config->errorPage->error) ? $config->errorPage->error : ''))))), 'errorPage');
     // Maintenance
     $form->addSubForm(new \Curry_Form_SubForm(array('legend' => 'Maintenance', 'class' => 'advanced', 'elements' => array('enabled' => array('checkbox', array('label' => 'Enabled', 'required' => true, 'value' => isset($config->maintenance->enabled) ? $config->maintenance->enabled : '', 'description' => 'When maintenance is enabled, users will not be able to access the pages. Only a page (specified below) will be shown. If no page is specified, the message will be shown.')), 'page' => array('select', array('label' => 'Page to show', 'multiOptions' => array('' => '[ None ]') + $pages, 'value' => isset($config->maintenance->page) ? $config->maintenance->page : '')), 'message' => array('textarea', array('label' => 'Message', 'value' => isset($config->maintenance->message) ? $config->maintenance->message : '', 'rows' => 6, 'cols' => 40))))), 'maintenance');
     // Mail
     $dlgOpts = array('width' => 600, 'minHeight' => 150);
     $form->addSubForm(new \Curry_Form_SubForm(array('legend' => 'Mail', 'class' => 'advanced', 'elements' => array('fromEmail' => array('text', array('label' => 'From email', 'value' => isset($config->mail->from->email) ? $config->mail->from->email : '')), 'fromName' => array('text', array('label' => 'From name', 'value' => isset($config->mail->from->name) ? $config->mail->from->name : '')), 'replytoEmail' => array('text', array('label' => 'ReplyTo email', 'value' => isset($config->mail->replyto->email) ? $config->mail->replyto->email : '')), 'replytoName' => array('text', array('label' => 'ReplyTo name', 'value' => isset($config->mail->replyto->name) ? $config->mail->replyto->name : '')), 'method' => array('select', array('label' => 'Transport', 'multiOptions' => array('' => '[ Default ]', 'smtp' => 'SMTP', 'sendmail' => 'PHP mail() function, ie sendmail.'), 'value' => isset($config->mail->method) ? $config->mail->method : '')), 'host' => array('text', array('label' => 'Host', 'value' => isset($config->mail->host) ? $config->mail->host : '')), 'port' => array('text', array('label' => 'Port', 'value' => isset($config->mail->options->port) ? $config->mail->options->port : '')), 'auth' => array('select', array('label' => 'Auth', 'multiOptions' => array('' => '[ Default ]', 'plain' => 'plain', 'login' => 'login', 'cram-md5' => 'cram-md5'), 'value' => isset($config->mail->options->auth) ? $config->mail->options->auth : '')), 'username' => array('text', array('label' => 'Username', 'value' => isset($config->mail->options->username) ? $config->mail->options->username : '')), 'password' => array('password', array('label' => 'Password')), 'ssl' => array('select', array('label' => 'SSL', 'multiOptions' => array('' => 'Disabled', 'ssl' => 'SSL', 'tls' => 'TLS'), 'value' => isset($config->mail->options->ssl) ? $config->mail->options->ssl : '')), 'mailTest' => array('rawHtml', array('value' => '<a href="' . $this->testemail->url() . '" class="btn dialog" data-dialog="' . htmlspecialchars(json_encode($dlgOpts)) . '">Test email</a>'))))), 'mail');
     // Paths
     $form->addSubForm(new \Curry_Form_SubForm(array('legend' => 'Paths', 'class' => 'advanced', 'elements' => array('basePath' => array('text', array('label' => 'Base path', 'value' => isset($config->basePath) ? $config->basePath : '', 'placeholder' => $defaultConfig->basePath)), 'projectPath' => array('text', array('label' => 'Project Path', 'value' => isset($config->projectPath) ? $config->projectPath : '', 'placeholder' => $defaultConfig->projectPath)), 'wwwPath' => array('text', array('label' => 'WWW path', 'value' => isset($config->wwwPath) ? $config->wwwPath : '', 'placeholder' => $defaultConfig->wwwPath)), 'vendorPath' => array('text', array('label' => 'Vendor path', 'value' => isset($config->vendorPath) ? $config->vendorPath : '', 'placeholder' => $defaultConfig->vendorPath))))), 'paths');
     // Misc
     $form->addSubForm(new \Curry_Form_SubForm(array('legend' => 'Misc', 'class' => 'advanced', 'elements' => array('error_notification' => array('checkbox', array('label' => 'Error notification', 'value' => isset($config->errorNotification) ? $config->errorNotification : '', 'description' => 'If enabled, an attempt to send error-logs to the admin email will be performed when an error occur.')), 'log_propel' => array('checkbox', array('label' => 'Propel Logging', 'value' => isset($config->propel->logging) ? $config->propel->logging : '', 'description' => 'Database queries and other debug information will be logged to the selected logging facility.')), 'debug_propel' => array('checkbox', array('label' => 'Debug Propel', 'value' => isset($config->propel->debug) ? $config->propel->debug : '', 'description' => 'Enables query counting but doesn\'t log queries.')), 'log' => array('multiselect', array('label' => 'Logging', 'multiOptions' => array_combine(array_keys($loggers), array_keys($loggers)), 'value' => array_keys($enabledLoggers))), 'update_translations' => array('checkbox', array('label' => 'Update Language strings', 'value' => isset($config->updateTranslationStrings) ? $config->updateTranslationStrings : '', 'description' => 'Add strings as they are used and record last used timestamp'))))), 'misc');
     $form->addElement('submit', 'save', array('label' => 'Save', 'disabled' => $configFile ? null : 'disabled'));
     if (isPost() && $form->isValid($_POST)) {
         $this->saveSettings($config, $form->getValues());
     }
     $this->addMainContent($form);
     return parent::render();
 }
Exemple #3
0
 /**
  * Get file details.
  *
  * @param array $selected
  * @return array
  */
 public function getFileInfo($selected)
 {
     if (count($selected) == 1) {
         try {
             $path = $selected[0];
             $physical = self::virtualToPhysical($path);
             $public = self::physicalToPublic($physical);
             if (!is_file($physical)) {
                 return null;
             }
             $owner = fileowner($physical);
             if (function_exists('posix_getpwuid')) {
                 $owner = posix_getpwuid($owner);
                 $owner = '<span title="' . $owner['uid'] . '">' . htmlspecialchars($owner['name']) . '</span>';
             }
             $group = filegroup($physical);
             if (function_exists('posix_getgrgid')) {
                 $group = posix_getgrgid($group);
                 $group = '<span title="' . $group['gid'] . '">' . htmlspecialchars($group['name']) . '</span>';
             }
             $fi = array('Name' => '<h2>' . basename($physical) . '</h2>', 'Preview' => '', 'Size' => '<strong>Size: </strong>' . Helper::humanReadableBytes(filesize($physical)), 'Writable' => '<strong>Writable: </strong>' . (self::isWritable($physical) ? 'Yes' : 'No'), 'Permissions' => '<strong>Permissions: </strong>' . PathHelper::getFilePermissions($physical), 'Owner' => '<strong>Owner: </strong>' . $owner . ' / ' . $group);
             switch (strtolower(pathinfo($physical, PATHINFO_EXTENSION))) {
                 case 'jpg':
                 case 'gif':
                 case 'png':
                 case 'bmp':
                     $image = getimagesize($physical);
                     $fi['Preview'] = '<img src="' . $public . '?' . filemtime($physical) . '" alt="" class="preview" />';
                     if ($image[0] > 240 || $image[1] > 240) {
                         $fi['Preview'] = '<a href="' . $public . '?' . filemtime($physical) . '" target="_blank" class="fullscreen-preview" title="Click to toggle fullscreen">' . $fi['Preview'] . '</a>';
                     }
                     $fi['Dimensions'] = '<strong>Dimension: </strong>' . $image[0] . 'x' . $image[1];
                     if (self::isPhysicalWritable($physical)) {
                         $fi['Actions'] = '<a href="' . url('', array('module', 'view' => 'PixlrEdit', 'image' => $public)) . '" class="dialog" onclick="$(this).data(\'dialog\').width = $(window).width() - 20; $(this).data(\'dialog\').height = $(window).height() - 20;" data-dialog=\'{"width":"90%","height":600,"resizable":false,"draggable":false}\'>Edit with Pixlr</a>';
                     }
                     break;
                 case 'ogg':
                 case 'ogv':
                 case 'mp4':
                 case 'webm':
                     $fi['Preview'] = '<video src="' . $public . '" class="preview" controls />';
                     break;
                 case 'mp3':
                 case 'oga':
                 case 'wav':
                     $fi['Preview'] = '<audio src="' . $public . '" class="preview" controls />';
                     break;
                 case 'swf':
                     $size = getimagesize($physical);
                     $flash = Flash::embed(Flash::SWFOBJECT_STATIC, $public, $size[0], $size[1], '9.0.0', array());
                     $fi['Preview'] = $flash['html'];
                     break;
             }
             return $fi;
         } catch (Exception $e) {
             $this->app->logger->error($e->getMessage());
         }
     } else {
         $totalSize = 0;
         foreach ($selected as $s) {
             $physical = self::virtualToPhysical($s);
             $totalSize += filesize($physical);
         }
         return array('Name' => '<h2>' . count($selected) . ' files</h2>', 'Size' => '<strong>Size: </strong>' . Helper::humanReadableBytes($totalSize));
     }
     return null;
 }
Exemple #4
0
 /**
  * Create new folder view.
  */
 public function showNewFolder()
 {
     $form = $this->getNewForm();
     if (isPost() && $form->isValid($_POST)) {
         $values = $form->getValues();
         $target = PathHelper::path($this->root, $values['location'], $values['name']);
         mkdir($target);
         self::redirect(url('', array('module', 'view' => 'Main')));
     } else {
         $this->addMainContent($form);
     }
 }
 /**
  * Get the twig environment used with the backend.
  *
  * @return \Twig_Environment
  */
 public function getTwig()
 {
     if (!$this->twig) {
         $backendPath = PathHelper::path(true, $this->app['basePath'], 'shared', 'backend');
         if (!$backendPath) {
             throw new \Exception('Curry\\Controller\\Backend path (shared/backend) not found.');
         }
         $templatePaths = array(PathHelper::path($backendPath, $this->app['backend.theme'], 'templates'), PathHelper::path($backendPath, 'common', 'templates'));
         $templatePaths = array_filter($templatePaths, 'is_dir');
         $options = array('debug' => true, 'trim_blocks' => true, 'base_template_class' => '\\Curry\\Twig\\Template');
         $loader = new \Twig_Loader_Filesystem($templatePaths);
         $twig = new \Twig_Environment($loader, $options);
         $twig->addFunction('url', new \Twig_Function_Function('url'));
         $twig->addFunction('L', new \Twig_Function_Function('L'));
         $twig->addFilter('rewrite', new \Twig_Filter_Function('Curry\\Util\\StringHelper::getRewriteString'));
         $twig->addFilter('attr', new \Twig_Filter_Function('Curry\\Util\\Html::attr'));
         $this->twig = $twig;
     }
     return $this->twig;
 }
Exemple #6
0
 /**
  * Get temporary path, uses sys_get_temp_dir() and makes sure the path is writable,
  * if not it uses a fallback in the project directory.
  *
  * @param string $projectPath
  * @return string
  */
 protected static function getTempDir($projectPath)
 {
     $dir = PathHelper::path($projectPath, 'data', 'temp');
     if (function_exists('sys_get_temp_dir')) {
         // prefer system temp dir if it exists
         $d = sys_get_temp_dir();
         if (is_writable($d)) {
             $dir = $d;
         }
     }
     return $dir;
 }
Exemple #7
0
 /**
  * @param \User|\UserRole $userOrRole
  * @param $name
  * @param $path
  * @param bool $write
  * @return \FilebrowserAccess
  * @throws \Exception
  */
 protected static function createFilebrowserAccess($userOrRole, $name, $path, $write = true)
 {
     $fba = new \FilebrowserAccess();
     $fba->setName($name);
     if ($userOrRole instanceof \User) {
         $fba->setUser($userOrRole);
     } else {
         if ($userOrRole instanceof \UserRole) {
             $fba->setUserRole($userOrRole);
         }
     }
     $fba->setPath($path);
     $fba->setWrite($write);
     @mkdir(PathHelper::path(\Curry\App::getInstance()['wwwPath'], $path), 0777, true);
     return $fba;
 }