.
*
*/
namespace Auth\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Auth\Model\Auth;
use Auth\Form\LoginForm;
use Zend\Session\Container;
class AuthController extends AbstractActionController
{
/**
* Variables
*/
protected $directorModel = null;
protected $bsock = null;
protected $updates = null;
/**
* Index Action
*
* @return object
*/
public function indexAction()
{
return new ViewModel();
}
/**
* Login Action
*
* @return object
*/
public function loginAction()
{
if($this->SessionTimeoutPlugin()->isValid()) {
return $this->redirect()->toRoute('dashboard', array('action' => 'index'));
}
$this->layout('layout/login');
$config = $this->getServiceLocator()->get('Config');
$dird = $this->params()->fromQuery('dird') ? $this->params()->fromQuery('dird') : null;
if(count($config['directors']) > 1) {
$multi_dird_env = true;
}
$form = new LoginForm($config['directors'], $dird);
$request = $this->getRequest();
if(!$request->isPost()) {
return $this->createNewLoginForm($form);
}
$auth = new Auth();
$form->setInputFilter($auth->getInputFilter());
$form->setData($request->getPost());
if(!$form->isValid()) {
$err_msg = "Please provide a director, username and password.";
return $this->createNewLoginForm($form,$err_msg);
}
$director = $form->getInputFilter()->getValue('director');
$username = $form->getInputFilter()->getValue('consolename');
$password = $form->getInputFilter()->getValue('password');
$locale = $form->getInputFilter()->getValue('locale');
$bareos_updates = $form->getInputFilter()->getValue('bareos_updates');
$config = $this->getServiceLocator()->get('Config');
$this->bsock = $this->getServiceLocator()->get('director');
$this->bsock->set_config($config['directors'][$director]);
$this->bsock->set_user_credentials($username, $password);
if(!$this->bsock->connect_and_authenticate()) {
$err_msg = "Sorry, can not authenticate. Wrong username and/or password.";
return $this->createNewLoginForm($form,$err_msg,$this->bsock);
}
$session = new Container('bareos');
$session->offsetSet('director', $director);
$session->offsetSet('username', $username);
$session->offsetSet('password', $password);
$session->offsetSet('authenticated', true);
$session->offsetSet('locale', $locale);
$session->offsetSet('idletime', time());
$session->offsetSet('product-updates', $bareos_updates);
$session->offsetSet('product-updates-status', false);
$session->offsetSet('dird-update-available', false);
$configuration = $this->getServiceLocator()->get('configuration');
$session->offsetSet('dt_lengthmenu', $configuration['configuration']['tables']['pagination_values']);
$session->offsetSet('dt_pagelength', $configuration['configuration']['tables']['pagination_default_value']);
$session->offsetSet('dt_statesave', ($configuration['configuration']['tables']['save_previous_state']) ? 'true' : 'false');
$session->offsetSet('dashboard_autorefresh_interval', $configuration['configuration']['dashboard']['autorefresh_interval']);
$session->offsetSet('filetree_refresh_timeout', $configuration['configuration']['restore']['filetree_refresh_timeout']);
if(isset($configuration['configuration']['autochanger']['labelpooltype'])) {
$session->offsetSet('ac_labelpooltype', $configuration['configuration']['autochanger']['labelpooltype']);
}
if($bareos_updates != "false" &&
!preg_match('/"statusText":"timeout"/', $bareos_updates)) {
$session->offsetSet('product-updates-status', true);
$this->updates = json_decode($bareos_updates, true);
$session->offsetSet('dird-update-available', $this->checkUpdateStatusDIRD());
}
$apicheck = $this->checkAPIStatusDIRD();
if(!$apicheck) {
return $this->createNewLoginForm($form, $multi_dird_env, $apicheck, $this->bsock);
}
$aclcheck = $this->checkACLStatusDIRD();
if(!$aclcheck) {
return $this->createNewLoginForm($form, $multi_dird_env, $aclcheck, $this->bsock);
} else {
$session->offsetSet('commands', $aclcheck);
}
if($this->params()->fromQuery('req')) {
$redirect = $this->params()->fromQuery('req');
$request = $this->getRequest();
$request->setUri($redirect);
if($routeToBeMatched = $this->getServiceLocator()->get('Router')->match($request)) {
return $this->redirect()->toUrl($this->params()->fromQuery('req'));
}
}
return $this->redirect()->toRoute('dashboard', array('action' => 'index'));
}
/**
* Logout Action
*
* @return object
*/
public function logoutAction()
{
$session = new Container('bareos');
$session->getManager()->destroy();
return $this->redirect()->toRoute('auth', array('action' => 'login'));
}
/**
* Get Director Model
*
* @return object
*/
public function getDirectorModel()
{
if(!$this->directorModel) {
$sm = $this->getServiceLocator();
$this->directorModel = $sm->get('Director\Model\DirectorModel');
}
return $this->directorModel;
}
/**
* Create New Login Form
*
* @return object
*/
private function createNewLoginForm($form, $err_msg = null, $bsock = null)
{
if ($bsock != null) {
$bsock->disconnect();
}
session_destroy();
return new ViewModel(
array(
'form' => $form,
'err_msg' => $err_msg,
)
);
}
/**
* DIRD API check
*
* @return mixed
*/
private function checkAPIStatusDIRD() {
$err_msg_1 = 'Sorry, the user you are trying to login with has no permissions for the .api command. For further information, please read the Bareos documentation.';
$err_msg_2 = 'Error: API 2 not available on 15.2.2 or greater and/or compile with jansson support.';
$result = $this->getDirectorModel()->sendDirectorCommand($this->bsock, ".api 2 compact=yes");
if(preg_match("/.api:/", $result)) {
return $err_msg_1;
}
if(preg_match("/result/", $result)) {
return $err_msg_2;
}
return true;
}
/**
* DIRD ACL check
*
* @return mixed
*/
private function checkACLStatusDIRD() {
$err_msg = 'Sorry, your Command ACL does not fit the minimal requirements. For further information, please read the Bareos documentation.';
try {
$commands = $this->getDirectorModel()->getAvailableCommands($this->bsock);
}
catch(Exception $e) {
echo $e->getMessage();
}
if($commands['.help']['permission'] == 0) {
return $err_msg;
}
return $commands;
}
/**
* DIRD update check
*
* @return boolean
*/
private function checkUpdateStatusDIRD() {
$dird_version = null;
$dird_dist = null;
try {
$dird_version = $this->getDirectorModel()->getDirectorVersion($this->bsock);
if(array_key_exists('version', $dird_version)) {
$dird_vers = $dird_version['version'];
}
}
catch(Exception $e) {
echo $e->getMessage();
}
if(array_key_exists('obsdistribution', $dird_version)) {
$dird_dist = $dird_version['obsdistribution'];
}
if(!array_key_exists('obsarch', $dird_version)) {
$dird_arch = null;
}
if($dird_dist !== null) {
if(preg_match("/ubuntu/i", $dird_dist) && $dird_version['obsarch'] == "x86_64") {
$dird_arch = "amd64";
}
elseif(preg_match("/debian/i", $dird_dist) && $dird_version['obsarch'] == "x86_64") {
$dird_arch = "amd64";
}
elseif(preg_match("/univention/i", $dird_dist) && $dird_version['obsarch'] == "x86_64") {
$dird_arch = "amd64";
}
elseif(preg_match("/windows/i", $dird_dist) && $dird_version['obsarch'] == "Win32") {
$dird_arch = "32";
}
elseif(preg_match("/windows/i", $dird_dist) && $dird_version['obsarch'] == "Win64") {
$dird_arch = "64";
}
else {
$dird_arch = $dird_version['obsarch'];
}
if(isset($dird_arch) && isset($dird_vers)) {
if(array_key_exists('product', $this->updates) &&
array_key_exists($dird_dist, $this->updates['product']['bareos-director']['distribution']) &&
array_key_exists($dird_arch, $this->updates['product']['bareos-director']['distribution'][$dird_dist])) {
foreach($this->updates['product']['bareos-director']['distribution'][$dird_dist][$dird_arch] as $key => $value) {
if( version_compare($dird_vers, $key, '>=') ) {
return false;
}
if( version_compare($dird_vers, $key, '<') ) {
return true;
}
}
}
}
}
return false;
}
}