function saveAction() { if (!$this->getRequest()->isPost()) { $this->_helper->flashMessenger(array('type' => 'error', 'text' => X_Env::_('p_auth_err_invalidrequest'))); $this->_helper->redirector('accounts', 'auth'); return; } $form = new Application_Form_AuthAccount(); if ($this->getRequest()->getPost('id', false)) { $form->password->setAttrib('allowEmpty', true); $form->password->setRequired(false); $form->username->setRequired(false); $form->username->setAttrib('disabled', true); } $_permissions = X_VlcShares_Plugins::helpers()->acl()->getClasses(); $permissions = array(); $permissionsDefault = array(); foreach ($_permissions as $perm) { /* @var $perm Application_Model_AclClass */ $description = X_Env::_($perm->getDescription()); $permissions[$perm->getName()] = "{$perm->getName()} - <i>{$description}</i>"; //if ( in_array($perm->getName(), X_VlcShares_Plugins::helpers()->acl()->getPermissions($account->getUsername())) ) { //$permissionsDefault[] = $perm->getName(); //} } $form->permissions->setMultiOptions($permissions); if ($form->isValid($this->getRequest()->getPost())) { $account = new Application_Model_AuthAccount(); $id = $form->getValue('id'); if ($id) { Application_Model_AuthAccountsMapper::i()->find($id, $account); if (is_null($account->getId())) { $this->_helper->flashMessenger(array('type' => 'error', 'text' => X_Env::_('p_auth_err_invalidaccount'))); $this->_helper->redirector('accounts', 'auth'); return; } // empty passwords are ignored: empty = do not change if (strlen($form->getValue('password')) > 0) { $account->setPassword(md5("{$account->getUsername()}:{$form->getValue('password')}"))->setPassphrase(md5("{$account->getUsername()}:{$form->getValue('password')}:" . rand(10000, 99999) . time())); } } else { $account->setUsername($form->getValue('username')); $account->setPassword(md5("{$form->getValue('username')}:{$form->getValue('password')}"))->setPassphrase(md5("{$form->getValue('username')}:{$form->getValue('password')}:" . rand(10000, 99999) . time())); } $account->setEnabled((bool) $form->getValue('enabled'))->setAltAllowed((bool) $form->getValue('altallowed')); try { Application_Model_AuthAccountsMapper::i()->save($account); // if is a new account, grant browse permission to the new account /* if ( !$id ) { X_VlcShares_Plugins::helpers()->acl()->grantPermission($account->getUsername(), Application_Model_AclClass::CLASS_BROWSE); } */ $acl = X_VlcShares_Plugins::helpers()->acl(); $prevPermissions = array(); if ($id) { $prevPermissions = $acl->getPermissions($account->getUsername()); } $newPermissions = $form->getValue('permissions'); // first remove all old permissions that are not available anymore foreach ($prevPermissions as $pPerm) { if (!in_array($pPerm, $newPermissions)) { $acl->revokePermission($account->getUsername(), $pPerm); } } // add new granted not in old permissions foreach ($newPermissions as $nPerm) { if (!in_array($nPerm, $prevPermissions)) { $acl->grantPermission($account->getUsername(), $nPerm); } } $this->_helper->flashMessenger(array('type' => 'success', 'text' => X_Env::_('p_auth_accountstored'))); $this->_helper->redirector('accounts', 'auth'); } catch (Exception $e) { $this->_helper->flashMessenger(array('type' => 'error', 'text' => X_Env::_('p_auth_dberror', $e->getMessage()))); $this->_helper->redirector('accounts', 'auth'); } } else { $form->setAction($this->_helper->url('save', 'auth')); $form->setDefaults($this->getRequest()->getPost()); $this->view->form = $form; $this->_helper->viewRenderer->setScriptAction('edit'); } }
public function installPlugin($source, $isUrl = false) { X_Debug::i("Installing plugin from {{$source}}: isUrl = {{$isUrl}}"); if ($isUrl) { // perform a download in a temp file $http = new Zend_Http_Client($source, array('headers' => array('User-Agent' => "vlc-shares/" . X_VlcShares::VERSION . " plugininstaller/" . X_VlcShares::VERSION))); $http->setStream(true); $source = $http->request()->getStreamName(); } try { // unzip and manifest parse $egg = X_Egg::factory($source, APPLICATION_PATH . '/../', APPLICATION_PATH . '/../data/plugin/tmp/', true); $pluginKey = $egg->getKey(); // first we must check if key already exists in the db $plugin = new Application_Model_Plugin(); Application_Model_PluginsMapper::i()->fetchByKey($pluginKey, $plugin); if ($plugin->getId() !== null) { throw new Exception(X_Env::_('plugin_err_installerror_keyexists') . ": {$pluginKey}"); } // time to check if plugin support this vlc-shares version $vFrom = $egg->getCompatibilityFrom(); $vTo = $egg->getCompatibilityTo(); if (version_compare(X_VlcShares::VERSION_CLEAN, $vFrom, '<') || $vTo !== null && version_compare(X_VlcShares::VERSION_CLEAN, $vTo, '>=')) { throw new Exception(X_Env::_('plugin_err_installerror_unsupported') . ": {$vFrom} - {$vTo}"); } // copy the files: first check if some file exists... $toBeCopied = array(); foreach ($egg->getFiles() as $file) { /* @var $file X_Egg_File */ if (!$file->getProperty(X_Egg_File::P_REPLACE, false) && file_exists($file->getDestination())) { throw new Exception(X_Env::_('plugin_err_installerror_fileexists') . ": {$file->getDestination()}"); } if (!file_exists($file->getSource())) { if (!$file->getProperty(X_Egg_File::P_IGNOREIFNOTEXISTS, false)) { throw new Exception(X_Env::_('plugin_err_installerror_sourcenotexists') . ": {$file->getSource()}"); } // ignore this item if P_IGNOREIFNOTEXISTS is true and file not exists continue; } $toBeCopied[] = array('src' => $file->getSource(), 'dest' => $file->getDestination(), 'resource' => $file); } // before copy act, i must be sure to be able to revert changes $plugin = new Application_Model_Plugin(); $plugin->setLabel($egg->getLabel())->setKey($pluginKey)->setDescription($egg->getDescription())->setFile($egg->getFile())->setClass($egg->getClass())->setType(Application_Model_Plugin::USER)->setVersion($egg->getVersion()); Application_Model_PluginsMapper::i()->save($plugin); // so i must copy uninstall information inside a uninstall dir in data $dest = APPLICATION_PATH . '/../data/plugin/_uninstall/' . $pluginKey; // i have to create the directory if (!mkdir($dest, 0777, true)) { throw new Exception(X_Env::_('plugin_err_installerror_uninstalldircreation') . ": {$dest}"); } if (!copy($egg->getManifestFile(), "{$dest}/manifest.xml")) { throw new Exception(X_Env::_('plugin_err_installerror_uninstallmanifestcopy') . ": " . $egg->getManifestFile() . " -> {$dest}/manifest.xml"); } $uninstallSql = $egg->getUninstallSQL(); if ($uninstallSql !== null && file_exists($uninstallSql)) { if (!copy($uninstallSql, "{$dest}/uninstall.sql")) { throw new Exception(X_Env::_('plugin_err_installerror_uninstallsqlcopy') . ": {$dest}"); } } // ... then copy foreach ($toBeCopied as $copyInfo) { $copied = false; if (!file_exists(dirname($copyInfo['dest']))) { @mkdir(dirname($copyInfo['dest']), 0777, true); } if (!copy($copyInfo['src'], $copyInfo['dest'])) { $this->_helper->flashMessenger(array('text' => X_Env::_('plugin_err_installerror_copyerror') . ": <br/>" . $copyInfo['src'] . '<br/>' . $copyInfo['dest'], 'type' => 'error')); } else { X_Debug::i("File copied {{$copyInfo['dest']}}"); $copied = true; } /* @var $xeggFile X_Egg_File */ $xeggFile = $copyInfo['resource']; if ($copied) { // check permission $permission = $xeggFile->getProperty(X_Egg_File::P_PERMISSIONS, false); if ($permission !== false) { if (!chmod($copyInfo['dest'], octdec($permission))) { X_Debug::e("Chmod {{$permission}} failed for file {{$copyInfo['dest']}}"); } else { X_Debug::i("Permissions set to {{$permission}} for file {{$copyInfo['dest']}} as required"); } } } else { if ($xeggFile->getProperty(X_Egg_File::P_HALTONCOPYERROR, false)) { X_Debug::f("File not copied {{$copyInfo['dest']}} and flagged as HaltOnCopyError"); break; } } } // change database $installSql = $egg->getInstallSQL(); if ($installSql !== null && file_exists($installSql)) { try { $dataSql = file_get_contents($installSql); if (trim($dataSql) !== '') { $bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); $db = $bootstrap->getResource('db'); $db->getConnection()->exec($dataSql); } } catch (Exception $e) { X_Debug::e("DB Error while installind: {$e->getMessage()}"); $this->_helper->flashMessenger(X_Env::_('plugin_err_installerror_sqlerror') . ": {$e->getMessage()}"); //throw $e; } } // process acl fragment $aclHelper = X_VlcShares_Plugins::helpers()->acl(); // new classes $accounts = Application_Model_AuthAccountsMapper::i()->fetchAll(); foreach ($egg->getAclClasses() as $aclClass) { /* @var $aclClass X_Egg_AclClass */ $res = $aclHelper->addClass($aclClass->getName(), $aclClass->getProperty(X_Egg_AclClass::P_DESCRIPTION, '')); if (!$res) { $this->_helper->flashMessenger(array('text' => X_Env::_('plugin_err_installerror_aclclass', $aclClass->getName()), 'type' => 'warning')); continue; } $extends = $aclClass->getExtends(); if (count($extends)) { foreach ($accounts as $account) { /* @var $account Application_Model_AuthAccount */ foreach ($extends as $baseClass) { if (in_array($baseClass, $aclHelper->getPermissions($account->getUsername()))) { $aclHelper->grantPermission($account->getUsername(), $aclClass->getName()); } } } } } //new resources foreach ($egg->getAclResources() as $resource) { /* @var $resource X_Egg_AclResource */ $aclHelper->addResource($resource->getKey(), $resource->getClass(), $egg->getKey(), false); } $egg->cleanTmp(); unlink($source); return true; } catch (Exception $e) { if ($egg !== null) { $egg->cleanTmp(); } // delete the uploaded file unlink($source); //$this->_helper->flashMessenger(array('text' => X_Env::_('plugin_err_installerror').": ".$e->getMessage(), 'type' => 'error')); //return false; throw $e; } }
public function checkAuth($username, $password, $altMethod = false) { if (!$altMethod) { return Application_Model_AuthAccountsMapper::i()->fetchByUsernamePassword($username, $password); } else { return Application_Model_AuthAccountsMapper::i()->fetchByUsernamePassphrase($username, $password); } }
public function saveAction() { $lang = $this->getRequest()->getParam('lang', false); $lang = $lang !== false ? str_replace('../', '', $lang) : $lang; if ($lang !== false && file_exists(APPLICATION_PATH . "/../languages/{$lang}")) { $config = new Application_Model_Config(); Application_Model_ConfigsMapper::i()->fetchByKey('languageFile', $config); if ($config->getId() !== null) { $config->setValue($lang); try { Application_Model_ConfigsMapper::i()->save($config); $this->_helper->flashMessenger(array('type' => 'success', 'text' => X_Env::_('installer_language_done'))); //$this->_helper->redirector('execute'); } catch (Exception $e) { $this->_helper->flashMessenger(array('type' => 'fatal', 'text' => X_Env::_("installer_err_db") . ": {$e->getMessage()}")); } } } else { $this->_helper->flashMessenger(array('type' => 'error', 'text' => X_Env::_('installer_invalid_language'))); $this->_helper->redirector('index'); } // check for admin username/password $form = new Application_Form_Installer(); $form->removeElement('lang'); $form->removeElement('plugins'); if (!$form->isValid($this->getRequest()->getPost())) { $ns = new Zend_Session_Namespace('vlc-shares::installer'); $ns->errors = true; $ns->data = $this->getRequest()->getPost(); $this->_helper->flashMessenger(array('type' => 'error', 'text' => X_Env::_('installer_invalid_data'))); $this->_helper->redirector('index'); return; } $username = $form->getValue('username'); $password = $form->getValue('password'); if (Application_Model_AuthAccountsMapper::i()->getCount(true) == 0) { // try to reenable/create a new account try { $account = new Application_Model_AuthAccount(); Application_Model_AuthAccountsMapper::i()->fetchByUsername($username); $account->setUsername($username)->setPassword(md5("{$username}:{$password}"))->setEnabled(true)->setPassphrase(md5("{$username}:{$password}:" . rand(10000, 99999) . time()))->setAltAllowed(true); Application_Model_AuthAccountsMapper::i()->save($account); // adding permissions X_VlcShares_Plugins::helpers()->acl()->grantPermission($username, Application_Model_AclClass::CLASS_ADMIN); X_VlcShares_Plugins::helpers()->acl()->grantPermission($username, Application_Model_AclClass::CLASS_BROWSE); $this->_helper->flashMessenger(array('type' => 'success', 'text' => X_Env::_('installer_newaccount_done'))); } catch (Exception $e) { $this->_helper->flashMessenger(X_Env::_('installer_err_db') . ": {$e->getMessage()}"); $this->_helper->redirector('index'); return; } // after that account is stored, try to do a login if (X_VlcShares_Plugins::broker()->isRegistered('auth')) { $auth = X_VlcShares_Plugins::broker()->getPlugins('auth'); } else { $auth = new X_VlcShares_Plugins_Auth(); } if (!$auth->isLoggedIn()) { $auth->doLogin($username); } } try { // enable auth plugin after authentication if ($form->getValue('auth', '0') == '1') { /* $plugin = new Application_Model_Plugin(); Application_Model_PluginsMapper::i()->fetchByClass('X_VlcShares_Plugins_Auth', $plugin); //Application_Model_PluginsMapper::i()->delete($plugin); $plugin->setEnabled(true); Application_Model_PluginsMapper::i()->save($plugin); */ $config = new Application_Model_Config(); Application_Model_ConfigsMapper::i()->fetchByKey('auth.login.enabled', $config); $config->setValue('1'); Application_Model_ConfigsMapper::i()->save($config); } // check forker url $forkerUrl = $form->getValue('threads', false); if ($forkerUrl) { $config = new Application_Model_Config(); Application_Model_ConfigsMapper::i()->fetchByKey('threads.forker', $config); $config->setValue($forkerUrl); Application_Model_ConfigsMapper::i()->save($config); } } catch (Exception $e) { $this->_helper->flashMessenger(X_Env::_('installer_err_db') . ": {$e->getMessage()}"); $this->_helper->redirector('index'); } $plugins = $this->getRequest()->getParam('plugins', array()); //ini_set('max_execution_time', 0); ignore_user_abort(true); if (is_array($plugins)) { /* @var $pluginInstaller X_VlcShares_Plugins_PluginInstaller */ $pluginInstaller = X_VlcShares_Plugins::broker()->getPlugins('plugininstaller'); foreach ($plugins as $plugin) { // allow 30 seconds for each plugin set_time_limit(30); try { $pluginInstaller->installPlugin($plugin, true); $this->_helper->flashMessenger(array('type' => 'success', 'text' => X_Env::_('plugin_install_done') . ": {$plugin}")); } catch (Exception $e) { $this->_helper->flashMessenger(array('text' => X_Env::_('plugin_err_installerror') . ": " . $e->getMessage(), 'type' => 'error')); } // download the plugin file /* $http = new Zend_Http_Client($plugin); $http->setStream(true); $response = $http->request(); if ( $this->_installPlugin($response->getStreamName()) ) { $this->_helper->flashMessenger(array('type' => 'success', 'text' => X_Env::_('plugin_install_done') . ": $plugin")); } */ } } $this->_helper->redirector('execute'); }