From 375ee9dd03ae55bdfc3761c44b7ef033073588fc Mon Sep 17 00:00:00 2001
From: Georg Duemmler <gd@bergwerk.ag>
Date: Mon, 9 May 2016 17:17:20 +0200
Subject: [PATCH 1/5] add backend users output

---
 Classes/Domain/Model/Backend/User.php         | 140 ++++++++++++++++++
 Classes/Domain/Model/Client.php               |  54 +++++++
 .../Repository/Backend/UserRepository.php     |  16 ++
 Classes/Service/Import/ClientImport.php       |  66 +++++++++
 ...t3monitoring_domain_model_backend_user.php | 112 ++++++++++++++
 .../tx_t3monitoring_domain_model_client.php   |  24 ++-
 Resources/Private/Language/locallang.xlf      |  24 +++
 Resources/Private/Language/locallang_db.xlf   |  21 +++
 Resources/Private/Templates/Client/Show.html  |  34 +++++
 ...t3monitoring_domain_model_backend_user.gif | Bin 0 -> 533 bytes
 ext_tables.sql                                |  40 +++++
 11 files changed, 528 insertions(+), 3 deletions(-)
 create mode 100644 Classes/Domain/Model/Backend/User.php
 create mode 100644 Classes/Domain/Repository/Backend/UserRepository.php
 create mode 100644 Configuration/TCA/tx_t3monitoring_domain_model_backend_user.php
 create mode 100644 Resources/Public/Icons/tx_t3monitoring_domain_model_backend_user.gif

diff --git a/Classes/Domain/Model/Backend/User.php b/Classes/Domain/Model/Backend/User.php
new file mode 100644
index 0000000..9c1e959
--- /dev/null
+++ b/Classes/Domain/Model/Backend/User.php
@@ -0,0 +1,140 @@
+<?php
+namespace T3Monitor\T3monitoring\Domain\Model\Backend;
+
+/*
+ * This file is part of the t3monitoring extension for TYPO3 CMS.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ */
+
+use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
+
+class User extends AbstractEntity
+{
+    /**
+     * @var string
+     */
+    protected $userName;
+
+    /**
+     * @var string
+     */
+    protected $realName;
+
+    /**
+     * @var string
+     */
+    protected $description;
+
+    /**
+     * @var string
+     */
+    protected $lastLogin;
+
+    /**
+     * @var string
+     */
+    protected $emailAddress;
+
+    /**
+     * @var string
+     */
+    protected $avatar;
+
+    /**
+     * @return string
+     */
+    public function getUserName()
+    {
+        return $this->userName;
+    }
+
+    /**
+     * @param string $userName
+     */
+    public function setUserName($userName)
+    {
+        $this->userName = $userName;
+    }
+
+    /**
+     * @return string
+     */
+    public function getRealName()
+    {
+        return $this->realName;
+    }
+
+    /**
+     * @param string $realName
+     */
+    public function setRealName($realName)
+    {
+        $this->realName = $realName;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->description;
+    }
+
+    /**
+     * @param string $description
+     */
+    public function setDescription($description)
+    {
+        $this->description = $description;
+    }
+
+    /**
+     * @return string
+     */
+    public function getLastLogin()
+    {
+        return $this->lastLogin;
+    }
+
+    /**
+     * @param string $lastLogin
+     */
+    public function setLastLogin($lastLogin)
+    {
+        $this->lastLogin = $lastLogin;
+    }
+
+    /**
+     * @return string
+     */
+    public function getEmailAddress()
+    {
+        return $this->emailAddress;
+    }
+
+    /**
+     * @param string $emailAddress
+     */
+    public function setEmailAddress($emailAddress)
+    {
+        $this->emailAddress = $emailAddress;
+    }
+
+    /**
+     * @return string
+     */
+    public function getAvatar()
+    {
+        return $this->avatar;
+    }
+
+    /**
+     * @param string $avatar
+     */
+    public function setAvatar($avatar)
+    {
+        $this->avatar = $avatar;
+    }
+}
\ No newline at end of file
diff --git a/Classes/Domain/Model/Client.php b/Classes/Domain/Model/Client.php
index 1e7fcd9..0a68899 100644
--- a/Classes/Domain/Model/Client.php
+++ b/Classes/Domain/Model/Client.php
@@ -7,6 +7,8 @@
  * For the full copyright and license information, please read the
  * LICENSE.txt file that was distributed with this source code.
  */
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Extbase\Utility\DebuggerUtility;
 
 /**
  * Client
@@ -130,6 +132,14 @@ class Client extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      */
     protected $extensions = null;
 
+    /**
+     * backendUsers
+     *
+     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Monitor\T3monitoring\Domain\Model\Backend\User>
+     * @lazy
+     */
+    protected $backendUsers = null;
+
     /**
      * core
      *
@@ -166,6 +176,7 @@ public function __construct()
     protected function initStorageObjects()
     {
         $this->extensions = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
+        $this->backendUsers = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
     }
 
     /**
@@ -546,6 +557,49 @@ public function setExtensions(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $exte
         $this->extensions = $extensions;
     }
 
+    /**
+     * Adds a backend user
+     *
+     * @param \T3Monitor\T3monitoring\Domain\Model\Backend\User $backendUser
+     * @return void
+     */
+    public function addBackendUser(\T3Monitor\T3monitoring\Domain\Model\Backend\User $backendUser)
+    {
+        $this->backendUsers->attach($backendUser);
+    }
+
+    /**
+     * Removes a backend user
+     *
+     * @param \T3Monitor\T3monitoring\Domain\Model\Backend\User $backendUserToRemove The backend user to be removed
+     * @return void
+     */
+    public function removeBackendUser(\T3Monitor\T3monitoring\Domain\Model\Backend\User $backendUserToRemove)
+    {
+        $this->backendUsers->detach($backendUserToRemove);
+    }
+
+    /**
+     * Returns the backend users
+     *
+     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Monitor\T3monitoring\Domain\Model\Backend\User> $backendUsers
+     */
+    public function getBackendUsers()
+    {
+        return $this->backendUsers;
+    }
+
+    /**
+     * Sets the backend users
+     *
+     * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Monitor\T3monitoring\Domain\Model\Backend\User> $backendUsers
+     * @return void
+     */
+    public function setBackendUsers(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $backendUsers)
+    {
+        $this->backendUsers = $backendUsers;
+    }
+
     /**
      * Returns the core
      *
diff --git a/Classes/Domain/Repository/Backend/UserRepository.php b/Classes/Domain/Repository/Backend/UserRepository.php
new file mode 100644
index 0000000..cd1f28c
--- /dev/null
+++ b/Classes/Domain/Repository/Backend/UserRepository.php
@@ -0,0 +1,16 @@
+<?php
+namespace T3Monitor\T3monitoring\Domain\Repository\Backend;
+
+/*
+ * This file is part of the t3monitoring extension for TYPO3 CMS.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ */
+
+use T3Monitor\T3monitoring\Domain\Repository\BaseRepository;
+
+class UserRepository extends BaseRepository
+{
+
+}
\ No newline at end of file
diff --git a/Classes/Service/Import/ClientImport.php b/Classes/Service/Import/ClientImport.php
index 7e86d5e..6bec4fe 100644
--- a/Classes/Service/Import/ClientImport.php
+++ b/Classes/Service/Import/ClientImport.php
@@ -80,6 +80,7 @@ protected function importSingleClient(array $row)
                 'mysql_version' => $json['core']['mysqlClientVersion'],
                 'core' => $this->getUsedCore($json['core']['typo3Version']),
                 'extensions' => $this->handleExtensionRelations($row['uid'], $json['extensions']),
+                'backend_users' => $this->handleBackendUserRelations($row['uid'], $json['users']['backend']),
             );
 
             $this->addExtraData($json, $update, 'info');
@@ -211,6 +212,71 @@ protected function handleExtensionRelations($client, array $extensions = array()
         return count($extensions);
     }
 
+    /**
+     * @param int $client client uid
+     * @param array $users list of extensions
+     * @return int count of used extensions
+     */
+    protected function handleBackendUserRelations($client, array $users = array())
+    {
+        $table = 'tx_t3monitoring_domain_model_backend_user';
+        $mmTable = 'tx_t3monitoring_client_backend_user_mm';
+
+        $existingUsers = $this->getDatabaseConnection()->exec_SELECTgetRows('A.*', $table.' A LEFT OUTER JOIN '.$mmTable.' B ON A.uid=B.uid_foreign', 'B.uid_local='.(int)$client);
+
+        foreach($users as $user)
+        {
+            $userLastLoginDateTime = new \DateTime($user['lastLogin']['date'], new \DateTimeZone($user['lastLogin']['timezone']));
+            $found = null;
+
+            foreach($existingUsers as $existingUser)
+            {
+                if($existingUser['user_name'] == $user['userName'])
+                {
+                    $found = $existingUser;
+                    break;
+                }
+            }
+
+            if($found)
+            {
+                $relationId = $found['uid'];
+                $update = array(
+                    'real_name' => (string)$user['realName'],
+                    'email_address' => (string)$user['emailAddress'],
+                    'description' => (string)$user['description'],
+                    'last_login' => (string)$userLastLoginDateTime->format('U'),
+                    'avatar' => (string)$user['avatar'],
+                    'tstamp' => $GLOBALS['EXEC_TIME'],
+                );
+                $this->getDatabaseConnection()->exec_UPDATEquery($table, 'uid='.(int)$relationId, $update);
+            } else {
+                $insert = array(
+                    'pid' => $this->emConfiguration->getPid(),
+                    'user_name' => (string)$user['userName'],
+                    'real_name' => (string)$user['realName'],
+                    'email_address' => (string)$user['emailAddress'],
+                    'description' => (string)$user['description'],
+                    'last_login' => (string)$userLastLoginDateTime->format('U'),
+                    'avatar' => (string)$user['avatar'],
+                    'tstamp' => $GLOBALS['EXEC_TIME'],
+                );
+                $this->getDatabaseConnection()->exec_INSERTquery($table, $insert);
+                $relationId = $this->getDatabaseConnection()->sql_insert_id();
+            }
+            $fields = array('uid_local', 'uid_foreign');
+            $relationsToBeAdded[] = array(
+                $client,
+                $relationId
+            );
+
+            $this->getDatabaseConnection()->exec_DELETEquery($mmTable, 'uid_local=' . (int)$client);
+            $this->getDatabaseConnection()->exec_INSERTmultipleRows($mmTable, $fields, $relationsToBeAdded);
+        }
+
+        return count($users);
+    }
+
     protected function getUsedCore($version)
     {
         if (isset($this->coreVersions[$version])) {
diff --git a/Configuration/TCA/tx_t3monitoring_domain_model_backend_user.php b/Configuration/TCA/tx_t3monitoring_domain_model_backend_user.php
new file mode 100644
index 0000000..352a24d
--- /dev/null
+++ b/Configuration/TCA/tx_t3monitoring_domain_model_backend_user.php
@@ -0,0 +1,112 @@
+<?php
+return [
+    'ctrl' => [
+        'title' => 'LLL:EXT:t3monitoring/Resources/Private/Language/locallang.xlf:tx_t3monitoring_domain_model_backend_user',
+        'label' => 'real_name',
+        'label_alt' => 'user_name',
+        'label_alt_force' => true,
+        'hideTable' => true,
+        'tstamp' => 'tstamp',
+        'crdate' => 'crdate',
+        'cruser_id' => 'cruser_id',
+        'delete' => 'deleted',
+        'enablecolumns' => [
+            'disabled' => 'hidden',
+        ],
+        'searchFields' => 'user_name,real_name,email_address,last_login,description,avatar,',
+        'iconfile' => 'EXT:t3monitoring/Resources/Public/Icons/tx_t3monitoring_domain_model_backend_user.gif'
+    ],
+    'interface' => [
+        'showRecordFieldList' => 'hidden, user_name, real_name, email_address, description, last_login, avatar',
+    ],
+    'types' => [
+        '1' => [
+            'showitem' => '
+        --div--;Readonly information,user_name, real_name, email_address, description, last_login, avatar'
+        ],
+    ],
+    'palettes' => [
+    ],
+    'columns' => [
+
+        'hidden' => [
+            'exclude' => 1,
+            'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden',
+            'config' => [
+                'type' => 'check',
+            ],
+        ],
+
+        'user_name' => [
+            'exclude' => 1,
+            'label' => 'LLL:EXT:t3monitoring/Resources/Private/Language/locallang.xlf:tx_t3monitoring_domain_model_backend_user.user_name',
+            'config' => [
+                'readOnly' => true,
+                'type' => 'input',
+                'size' => 30,
+                'eval' => 'trim,required',
+                'max' => 255
+            ],
+
+        ],
+        'email_address' => [
+            'exclude' => 1,
+            'label' => 'LLL:EXT:t3monitoring/Resources/Private/Language/locallang.xlf:tx_t3monitoring_domain_model_backend_user.email_address',
+            'config' => [
+                'readOnly' => true,
+                'type' => 'input',
+                'size' => 30,
+                'eval' => 'trim',
+                'max' => 255
+            ],
+
+        ],
+        'real_name' => [
+            'exclude' => 1,
+            'label' => 'LLL:EXT:t3monitoring/Resources/Private/Language/locallang.xlf:tx_t3monitoring_domain_model_backend_user.real_name',
+            'config' => [
+                'readOnly' => true,
+                'type' => 'input',
+                'size' => 30,
+                'eval' => 'trim,required',
+                'max' => 255
+            ],
+
+        ],
+        'avatar' => [
+            'exclude' => 1,
+            'label' => 'LLL:EXT:t3monitoring/Resources/Private/Language/locallang.xlf:tx_t3monitoring_domain_model_backend_user.avatar',
+            'config' => [
+                'readOnly' => true,
+                'type' => 'input',
+                'size' => 30,
+                'eval' => 'trim',
+                'max' => 255
+            ],
+
+        ],
+        'description' => [
+            'exclude' => 1,
+            'label' => 'LLL:EXT:t3monitoring/Resources/Private/Language/locallang.xlf:tx_t3monitoring_domain_model_backend_user.description',
+            'config' => [
+                'readOnly' => true,
+                'type' => 'text',
+                'default' => '',
+                'cols' => 40,
+                'rows' => 5,
+            ],
+
+        ],
+        'last_login' => [
+            'exclude' => 1,
+            'label' => 'LLL:EXT:t3monitoring/Resources/Private/Language/locallang.xlf:tx_t3monitoring_domain_model_backend_user.last_login',
+            'config' => [
+                'readOnly' => true,
+                'type' => 'input',
+                'size' => 30,
+                'eval' => 'datetime'
+            ],
+
+        ],
+    ],
+];
diff --git a/Configuration/TCA/tx_t3monitoring_domain_model_client.php b/Configuration/TCA/tx_t3monitoring_domain_model_client.php
index 9efa186..f373e62 100644
--- a/Configuration/TCA/tx_t3monitoring_domain_model_client.php
+++ b/Configuration/TCA/tx_t3monitoring_domain_model_client.php
@@ -10,17 +10,17 @@
         'enablecolumns' => [
             'disabled' => 'hidden',
         ],
-        'searchFields' => 'title,domain,secret,email,php_version,mysql_version,insecure_core,outdated_core,insecure_extensions,outdated_extensions,error_message,extensions,core,sla,',
+        'searchFields' => 'title,domain,secret,email,php_version,mysql_version,insecure_core,outdated_core,insecure_extensions,outdated_extensions,error_message,extensions,backend_users,core,sla,',
         'iconfile' => 'EXT:t3monitoring/Resources/Public/Icons/tx_t3monitoring_domain_model_client.gif'
     ],
     'interface' => [
-        'showRecordFieldList' => 'hidden, title, domain, secret, php_version, mysql_version, insecure_core, outdated_core, insecure_extensions, outdated_extensions, error_message, extensions, core, sla',
+        'showRecordFieldList' => 'hidden, title, domain, secret, php_version, mysql_version, insecure_core, outdated_core, insecure_extensions, outdated_extensions, error_message, extensions, backend_users, core, sla',
     ],
     'types' => [
         '1' => [
             'showitem' => '
         --div--;General,title, --palette--;;paletteDomain,sla,
-        --div--;Readonly information,last_successful_import,error_message,core, --palette--;;paletteVersions,extensions,
+        --div--;Readonly information,last_successful_import,error_message,core, --palette--;;paletteVersions,extensions,backend_users,
                 insecure_core, outdated_core, insecure_extensions, outdated_extensions,
         --div--;Extra,extra_info,extra_warning,extra_danger'
         ],
@@ -234,6 +234,24 @@
                 'multiple' => 0,
             ],
 
+        ],
+        'backend_users' => [
+            'exclude' => 1,
+            'label' => 'LLL:EXT:t3monitoring/Resources/Private/Language/locallang.xlf:tx_t3monitoring_domain_model_client.backend_users',
+            'config' => [
+                'readOnly' => true,
+                'type' => 'group',
+                'internal_type' => 'db',
+                'allowed' => 'tx_t3monitoring_domain_model_backend_user',
+                'foreign_table' => 'tx_t3monitoring_domain_model_backend_user',
+                'foreign_table_where' => 'ORDER BY tx_t3monitoring_domain_model_backend_user.user_name',
+                'MM' => 'tx_t3monitoring_client_backend_user_mm',
+                'size' => 10,
+                'autoSizeMax' => 30,
+                'maxitems' => 9999,
+                'multiple' => 0,
+            ],
+
         ],
         'core' => [
             'exclude' => 1,
diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf
index 9f7542b..f51d890 100644
--- a/Resources/Private/Language/locallang.xlf
+++ b/Resources/Private/Language/locallang.xlf
@@ -3,6 +3,27 @@
 	<file source-language="en" datatype="plaintext" original="messages" date="2016-04-03T20:21:29Z" product-name="t3monitoring">
 		<header/>
 		<body>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user">
+				<source>Backend User</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.user_name">
+				<source>Username</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.real_name">
+				<source>Real Name</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.description">
+				<source>Description</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.last_login">
+				<source>Last login</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.email_address">
+				<source>Email Address</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.avatar">
+				<source>Avatar</source>
+			</trans-unit>
 			<trans-unit id="tx_t3monitoring_domain_model_client">
 				<source>Client</source>
 			</trans-unit>
@@ -54,6 +75,9 @@
 			<trans-unit id="tx_t3monitoring_domain_model_client.extensions">
 				<source>Extensions</source>
 			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_client.backend_users">
+				<source>Backend Users</source>
+			</trans-unit>
 			<trans-unit id="tx_t3monitoring_domain_model_client.core">
 				<source>Core</source>
 			</trans-unit>
diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf
index 1ecca80..c875ed4 100644
--- a/Resources/Private/Language/locallang_db.xlf
+++ b/Resources/Private/Language/locallang_db.xlf
@@ -3,6 +3,27 @@
 	<file source-language="en" datatype="plaintext" original="messages" date="2016-04-11T12:45:21Z" product-name="t3monitoring">
 		<header/>
 		<body>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user">
+				<source>Backend User</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.user_name">
+				<source>Username</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.real_name">
+				<source>Real Name</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.description">
+				<source>Description</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.last_login">
+				<source>Last login</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.email_address">
+				<source>Email Address</source>
+			</trans-unit>
+			<trans-unit id="tx_t3monitoring_domain_model_backend_user.avatar">
+				<source>Avatar</source>
+			</trans-unit>
 			<trans-unit id="tx_t3monitoring_domain_model_client">
 				<source>Client</source>
 			</trans-unit>
diff --git a/Resources/Private/Templates/Client/Show.html b/Resources/Private/Templates/Client/Show.html
index f00d853..27a519e 100644
--- a/Resources/Private/Templates/Client/Show.html
+++ b/Resources/Private/Templates/Client/Show.html
@@ -90,6 +90,40 @@ <h1>
 		</div>
 	</f:if>
 
+	<f:if condition="{client.backendUsers}">
+	<div class="panel panel-default">
+		<div class="panel-heading">
+			Backend Users ({client.backendUsers -> f:count()})
+		</div>
+		<table class="table table-striped table-hover">
+			<thead>
+			<tr>
+				<th>Avatar</th>
+				<th>User Name</th>
+				<th>Real Name</th>
+				<th>Email Address</th>
+				<th>Description</th>
+				<th>Last Login</th>
+			</tr>
+			</thead>
+			<tbody>
+			<f:for each="{client.backendUsers}" as="backendUser">
+				<tr>
+					<td><f:if condition="{backendUser.avatar}">
+						<span class="avatar-image"><img src="{client.domain}{backendUser.avatar}" width="32" /></span>
+					</f:if></td>
+					<td>{backendUser.userName}</td>
+					<td>{backendUser.realName}</td>
+					<td>{backendUser.emailAddress}</td>
+					<td>{backendUser.description}</td>
+					<td><f:format.date format="d-m-Y H:i">{backendUser.lastLogin}</f:format.date></td>
+				</tr>
+			</f:for>
+			</tbody>
+		</table>
+	</div>
+	</f:if>
+
 	<f:if condition="{client.extensions}">
 		<div class="panel panel-default">
 			<div class="panel-heading">
diff --git a/Resources/Public/Icons/tx_t3monitoring_domain_model_backend_user.gif b/Resources/Public/Icons/tx_t3monitoring_domain_model_backend_user.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6cc5f16355d84652db5ce39fcbc7256b7ea457cd
GIT binary patch
literal 533
zcmZ?wbhEHb6krfwc;>^PT&ti`uNc2IM6Fr5d*_GlT^}Mg`l>Z4?cBL@{mqr@Zmft{
z7wEdsHlXM1p|kH6En2i~+qT*bFHc_i5WY6x!0ESfTY`5SewDjFA!B!R!NKH=-7#5v
z<8pIzr=96jYgDqIV-eVU&ToZld3pKFnKKjS+;FNpvSrJblpPUfQw-u~UN@U;5Wc}@
z$BrEa{W=>rZk&4HOZ}!-d-m*!-W0Ir`qGWJ*7TfcZfa@@UE^PKph&A-&32ZV$71`A
zWAz0q9tEs&-?wjHUteGDl80Iy>iRueDs>7`>w{xsV{`V!C+`Sfvt~_7N=o9k(EtDc
zGYnRs_>+Z^fx(AC2joCdoG`E#HTX0&x3sqT=(8Hwwzskf@u~E-2#Sa)Om246<W-$H
zzgIwSvb`aPnkT=qgPD?ySBuU}w*_sI;?fdLOl)@6O}b9Za_%Oa9!=V^rt(deuH1}L
mT*gdIiZ&J+P3*$v4C>yZMom0cTFy<3E({D?-?uh0SOWmDq@H{L

literal 0
HcmV?d00001

diff --git a/ext_tables.sql b/ext_tables.sql
index 6d59d2f..15a9f13 100644
--- a/ext_tables.sql
+++ b/ext_tables.sql
@@ -1,3 +1,29 @@
+#
+# Table structure for table 'tx_t3monitoring_domain_model_backend_user'
+#
+CREATE TABLE tx_t3monitoring_domain_model_backend_user (
+
+	uid int(11) NOT NULL auto_increment,
+	pid int(11) DEFAULT '0' NOT NULL,
+
+	user_name varchar(255) DEFAULT '' NOT NULL,
+	real_name varchar(255) DEFAULT '' NOT NULL,
+	email_address varchar(255) DEFAULT '' NOT NULL,
+	avatar varchar(255) DEFAULT '' NOT NULL,
+	description text NOT NULL,
+	last_login int(11) DEFAULT '0' NOT NULL,
+
+	tstamp int(11) unsigned DEFAULT '0' NOT NULL,
+	crdate int(11) unsigned DEFAULT '0' NOT NULL,
+	cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
+	deleted tinyint(4) unsigned DEFAULT '0' NOT NULL,
+	hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
+
+	PRIMARY KEY (uid),
+	KEY parent (pid),
+
+);
+
 #
 # Table structure for table 'tx_t3monitoring_domain_model_client'
 #
@@ -22,6 +48,7 @@ CREATE TABLE tx_t3monitoring_domain_model_client (
 	extra_danger text NOT NULL,
 	last_successful_import int(11) DEFAULT '0' NOT NULL,
 	extensions int(11) unsigned DEFAULT '0' NOT NULL,
+	backend_users int(11) unsigned DEFAULT '0' NOT NULL,
 	core int(11) unsigned DEFAULT '0',
 	sla int(11) unsigned DEFAULT '0',
 
@@ -129,6 +156,19 @@ CREATE TABLE tx_t3monitoring_domain_model_sla (
 
 );
 
+#
+# Table structure for table 'tx_t3monitoring_client_backend_user_mm'
+#
+CREATE TABLE tx_t3monitoring_client_backend_user_mm (
+	uid_local int(11) unsigned DEFAULT '0' NOT NULL,
+	uid_foreign int(11) unsigned DEFAULT '0' NOT NULL,
+	sorting int(11) unsigned DEFAULT '0' NOT NULL,
+	sorting_foreign int(11) unsigned DEFAULT '0' NOT NULL,
+
+	KEY uid_local (uid_local),
+	KEY uid_foreign (uid_foreign)
+);
+
 #
 # Table structure for table 'tx_t3monitoring_client_extension_mm'
 #

From ca77f01511ec06be99ada53234b1875cb3438a6a Mon Sep 17 00:00:00 2001
From: Georg Duemmler <gd@bergwerk.ag>
Date: Mon, 9 May 2016 17:18:19 +0200
Subject: [PATCH 2/5] remove unised namespace usages

---
 Classes/Domain/Model/Client.php | 2 --
 1 file changed, 2 deletions(-)

diff --git a/Classes/Domain/Model/Client.php b/Classes/Domain/Model/Client.php
index 0a68899..4a71ccf 100644
--- a/Classes/Domain/Model/Client.php
+++ b/Classes/Domain/Model/Client.php
@@ -7,8 +7,6 @@
  * For the full copyright and license information, please read the
  * LICENSE.txt file that was distributed with this source code.
  */
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Extbase\Utility\DebuggerUtility;
 
 /**
  * Client

From e5f608c504f186ff2f3d62cfa340bd6bb0e27a96 Mon Sep 17 00:00:00 2001
From: Georg Duemmler <gd@bergwerk.ag>
Date: Tue, 10 May 2016 14:45:17 +0200
Subject: [PATCH 3/5] remove avatar usage & fix lastlogin usage caus no one
 datetime usage is necessary

---
 Classes/Controller/StatisticController.php    |  4 ++++
 Classes/Domain/Model/Backend/User.php         | 21 -------------------
 Classes/Service/Import/ClientImport.php       |  7 ++-----
 ...t3monitoring_domain_model_backend_user.php | 18 +++-------------
 Resources/Private/Language/locallang.xlf      |  3 ---
 Resources/Private/Language/locallang_db.xlf   |  3 ---
 Resources/Private/Templates/Client/Show.html  |  4 ----
 ext_tables.sql                                |  1 -
 8 files changed, 9 insertions(+), 52 deletions(-)

diff --git a/Classes/Controller/StatisticController.php b/Classes/Controller/StatisticController.php
index 1942802..20e2546 100644
--- a/Classes/Controller/StatisticController.php
+++ b/Classes/Controller/StatisticController.php
@@ -60,6 +60,9 @@ public function indexAction(ClientFilterDemand $filter = null)
             $feedItems = $bulletinImport->start();
         }
 
+        $monitorIpAddress = null;
+
+
         $this->view->assignMultiple([
             'filter' => $filter,
             'clients' => $this->clientRepository->findByDemand($filter),
@@ -76,6 +79,7 @@ public function indexAction(ClientFilterDemand $filter = null)
             'numberOfClients' => $this->clientRepository->countAll(),
             'slaVersions' => $this->slaRepository->findAll(),
             'feedItems' => $feedItems,
+            'monitorIpAddress' => $monitorIpAddress,
             'importTimes' => [
                 'client' => $this->registry->get('t3monitoring', 'importClient'),
                 'core' => $this->registry->get('t3monitoring', 'importCore'),
diff --git a/Classes/Domain/Model/Backend/User.php b/Classes/Domain/Model/Backend/User.php
index 9c1e959..ac7d622 100644
--- a/Classes/Domain/Model/Backend/User.php
+++ b/Classes/Domain/Model/Backend/User.php
@@ -37,11 +37,6 @@ class User extends AbstractEntity
      */
     protected $emailAddress;
 
-    /**
-     * @var string
-     */
-    protected $avatar;
-
     /**
      * @return string
      */
@@ -121,20 +116,4 @@ public function setEmailAddress($emailAddress)
     {
         $this->emailAddress = $emailAddress;
     }
-
-    /**
-     * @return string
-     */
-    public function getAvatar()
-    {
-        return $this->avatar;
-    }
-
-    /**
-     * @param string $avatar
-     */
-    public function setAvatar($avatar)
-    {
-        $this->avatar = $avatar;
-    }
 }
\ No newline at end of file
diff --git a/Classes/Service/Import/ClientImport.php b/Classes/Service/Import/ClientImport.php
index 6bec4fe..6353fe8 100644
--- a/Classes/Service/Import/ClientImport.php
+++ b/Classes/Service/Import/ClientImport.php
@@ -226,7 +226,6 @@ protected function handleBackendUserRelations($client, array $users = array())
 
         foreach($users as $user)
         {
-            $userLastLoginDateTime = new \DateTime($user['lastLogin']['date'], new \DateTimeZone($user['lastLogin']['timezone']));
             $found = null;
 
             foreach($existingUsers as $existingUser)
@@ -245,8 +244,7 @@ protected function handleBackendUserRelations($client, array $users = array())
                     'real_name' => (string)$user['realName'],
                     'email_address' => (string)$user['emailAddress'],
                     'description' => (string)$user['description'],
-                    'last_login' => (string)$userLastLoginDateTime->format('U'),
-                    'avatar' => (string)$user['avatar'],
+                    'last_login' => (string)$user['lastLogin'],
                     'tstamp' => $GLOBALS['EXEC_TIME'],
                 );
                 $this->getDatabaseConnection()->exec_UPDATEquery($table, 'uid='.(int)$relationId, $update);
@@ -257,8 +255,7 @@ protected function handleBackendUserRelations($client, array $users = array())
                     'real_name' => (string)$user['realName'],
                     'email_address' => (string)$user['emailAddress'],
                     'description' => (string)$user['description'],
-                    'last_login' => (string)$userLastLoginDateTime->format('U'),
-                    'avatar' => (string)$user['avatar'],
+                    'last_login' => (string)$user['lastLogin'],
                     'tstamp' => $GLOBALS['EXEC_TIME'],
                 );
                 $this->getDatabaseConnection()->exec_INSERTquery($table, $insert);
diff --git a/Configuration/TCA/tx_t3monitoring_domain_model_backend_user.php b/Configuration/TCA/tx_t3monitoring_domain_model_backend_user.php
index 352a24d..a88f1c9 100644
--- a/Configuration/TCA/tx_t3monitoring_domain_model_backend_user.php
+++ b/Configuration/TCA/tx_t3monitoring_domain_model_backend_user.php
@@ -13,16 +13,16 @@
         'enablecolumns' => [
             'disabled' => 'hidden',
         ],
-        'searchFields' => 'user_name,real_name,email_address,last_login,description,avatar,',
+        'searchFields' => 'user_name,real_name,email_address,last_login,description,',
         'iconfile' => 'EXT:t3monitoring/Resources/Public/Icons/tx_t3monitoring_domain_model_backend_user.gif'
     ],
     'interface' => [
-        'showRecordFieldList' => 'hidden, user_name, real_name, email_address, description, last_login, avatar',
+        'showRecordFieldList' => 'hidden, user_name, real_name, email_address, description, last_login',
     ],
     'types' => [
         '1' => [
             'showitem' => '
-        --div--;Readonly information,user_name, real_name, email_address, description, last_login, avatar'
+        --div--;Readonly information,user_name, real_name, email_address, description, last_login'
         ],
     ],
     'palettes' => [
@@ -72,18 +72,6 @@
                 'max' => 255
             ],
 
-        ],
-        'avatar' => [
-            'exclude' => 1,
-            'label' => 'LLL:EXT:t3monitoring/Resources/Private/Language/locallang.xlf:tx_t3monitoring_domain_model_backend_user.avatar',
-            'config' => [
-                'readOnly' => true,
-                'type' => 'input',
-                'size' => 30,
-                'eval' => 'trim',
-                'max' => 255
-            ],
-
         ],
         'description' => [
             'exclude' => 1,
diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf
index f51d890..49e5de3 100644
--- a/Resources/Private/Language/locallang.xlf
+++ b/Resources/Private/Language/locallang.xlf
@@ -21,9 +21,6 @@
 			<trans-unit id="tx_t3monitoring_domain_model_backend_user.email_address">
 				<source>Email Address</source>
 			</trans-unit>
-			<trans-unit id="tx_t3monitoring_domain_model_backend_user.avatar">
-				<source>Avatar</source>
-			</trans-unit>
 			<trans-unit id="tx_t3monitoring_domain_model_client">
 				<source>Client</source>
 			</trans-unit>
diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf
index c875ed4..9c41407 100644
--- a/Resources/Private/Language/locallang_db.xlf
+++ b/Resources/Private/Language/locallang_db.xlf
@@ -21,9 +21,6 @@
 			<trans-unit id="tx_t3monitoring_domain_model_backend_user.email_address">
 				<source>Email Address</source>
 			</trans-unit>
-			<trans-unit id="tx_t3monitoring_domain_model_backend_user.avatar">
-				<source>Avatar</source>
-			</trans-unit>
 			<trans-unit id="tx_t3monitoring_domain_model_client">
 				<source>Client</source>
 			</trans-unit>
diff --git a/Resources/Private/Templates/Client/Show.html b/Resources/Private/Templates/Client/Show.html
index 27a519e..f95dd74 100644
--- a/Resources/Private/Templates/Client/Show.html
+++ b/Resources/Private/Templates/Client/Show.html
@@ -98,7 +98,6 @@ <h1>
 		<table class="table table-striped table-hover">
 			<thead>
 			<tr>
-				<th>Avatar</th>
 				<th>User Name</th>
 				<th>Real Name</th>
 				<th>Email Address</th>
@@ -109,9 +108,6 @@ <h1>
 			<tbody>
 			<f:for each="{client.backendUsers}" as="backendUser">
 				<tr>
-					<td><f:if condition="{backendUser.avatar}">
-						<span class="avatar-image"><img src="{client.domain}{backendUser.avatar}" width="32" /></span>
-					</f:if></td>
 					<td>{backendUser.userName}</td>
 					<td>{backendUser.realName}</td>
 					<td>{backendUser.emailAddress}</td>
diff --git a/ext_tables.sql b/ext_tables.sql
index 15a9f13..59cfce4 100644
--- a/ext_tables.sql
+++ b/ext_tables.sql
@@ -9,7 +9,6 @@ CREATE TABLE tx_t3monitoring_domain_model_backend_user (
 	user_name varchar(255) DEFAULT '' NOT NULL,
 	real_name varchar(255) DEFAULT '' NOT NULL,
 	email_address varchar(255) DEFAULT '' NOT NULL,
-	avatar varchar(255) DEFAULT '' NOT NULL,
 	description text NOT NULL,
 	last_login int(11) DEFAULT '0' NOT NULL,
 

From 527652d676e0c5e646c5c80349909fc61c10341e Mon Sep 17 00:00:00 2001
From: Janek Ruessmann <janek.ruessmann@wmdb.de>
Date: Wed, 11 Oct 2017 23:25:59 +0200
Subject: [PATCH 4/5] cleanup and merge back missing functions from master

---
 Classes/Domain/Model/Client.php | 181 ++++++++++++++++++++++----------
 1 file changed, 124 insertions(+), 57 deletions(-)

diff --git a/Classes/Domain/Model/Client.php b/Classes/Domain/Model/Client.php
index 707073a..2c4bcb4 100644
--- a/Classes/Domain/Model/Client.php
+++ b/Classes/Domain/Model/Client.php
@@ -8,14 +8,17 @@
  * LICENSE.txt file that was distributed with this source code.
  */
 
+use T3Monitor\T3monitoring\Domain\Model\Backend\User;
+use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
+use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
+
 /**
  * Client
  */
-class Client extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
+class Client extends AbstractEntity
 {
 
     /**
-     * title
      *
      * @var string
      * @validate NotEmpty
@@ -23,143 +26,133 @@ class Client extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
     protected $title = '';
 
     /**
-     * domain
-     *
      * @var string
      * @validate NotEmpty
      */
     protected $domain = '';
 
     /**
-     * secret
-     *
+     * @var string
+     */
+    protected $basicAuthUsername = '';
+
+    /**
+     * @var string
+     */
+    protected $basicAuthPassword = '';
+
+    /**
      * @var string
      * @validate NotEmpty
      */
     protected $secret = '';
 
     /**
-     * email
-     *
      * @var string
      */
     protected $email = '';
 
     /**
-     * phpVersion
-     *
      * @var string
      */
     protected $phpVersion = '';
 
     /**
-     * mysqlVersion
-     *
      * @var string
      */
     protected $mysqlVersion = '';
 
     /**
-     * insecureCore
-     *
+     * @var int
+     */
+    protected $diskTotalSpace = 0;
+
+    /**
+     * @var int
+     */
+    protected $diskFreeSpace = 0;
+
+    /**
      * @var bool
      */
     protected $insecureCore = false;
 
     /**
-     * outdatedCore
-     *
      * @var bool
      */
     protected $outdatedCore = false;
 
     /**
-     * insecureExtensions
-     *
      * @var int
      */
     protected $insecureExtensions = 0;
 
     /**
-     * outdatedExtensions
-     *
      * @var int
      */
     protected $outdatedExtensions = 0;
 
     /**
-     * errorMessage
-     *
      * @var string
      */
     protected $errorMessage = '';
 
     /**
-     * extraInfo
-     *
      * @var string
      */
     protected $extraInfo = '';
 
     /**
-     * extraWarning
-     *
      * @var string
      */
     protected $extraWarning = '';
 
     /**
-     * extraDanger
-     *
      * @var string
      */
     protected $extraDanger = '';
 
     /**
-     * lastSuccessfulImport
-     *
      * @var \DateTime
      */
     protected $lastSuccessfulImport = null;
 
     /**
-     * extensions
-     *
-     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Monitor\T3monitoring\Domain\Model\Extension>
+     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Monitor\T3monitoring\Domain\Model\Backend\User>
      * @lazy
      */
-    protected $extensions = null;
+    protected $backendUsers = null;
 
     /**
-     * backendUsers
-     *
-     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Monitor\T3monitoring\Domain\Model\Backend\User>
+     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Monitor\T3monitoring\Domain\Model\Extension>
      * @lazy
      */
-    protected $backendUsers = null;
+    protected $extensions = null;
 
     /**
-     * core
-     *
      * @var \T3Monitor\T3monitoring\Domain\Model\Core
      * @lazy
      */
     protected $core = null;
 
     /**
-     * sla
-     *
      * @var \T3Monitor\T3monitoring\Domain\Model\Sla
      * @lazy
      */
     protected $sla = null;
 
+    /**
+     * @var \T3Monitor\T3monitoring\Domain\Model\Tag
+     * @lazy
+     */
+    protected $tag = null;
+
     /**
      * __construct
      */
     public function __construct()
     {
-        //Do not remove the next line: It would break the functionality
+        // Do not remove the next line: It would break the functionality
         $this->initStorageObjects();
     }
 
@@ -173,14 +166,14 @@ public function __construct()
      */
     protected function initStorageObjects()
     {
-        $this->extensions = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
-        $this->backendUsers = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
+        $this->extensions = new ObjectStorage();
+        $this->backendUsers = new ObjectStorage();
     }
 
     /**
      * Returns the title
      *
-     * @return string $title
+     * @return string
      */
     public function getTitle()
     {
@@ -201,7 +194,7 @@ public function setTitle($title)
     /**
      * Returns the domain
      *
-     * @return string $domain
+     * @return string
      */
     public function getDomain()
     {
@@ -219,10 +212,42 @@ public function setDomain($domain)
         $this->domain = $domain;
     }
 
+    /**
+     * @return string
+     */
+    public function getBasicAuthUsername()
+    {
+        return $this->basicAuthUsername;
+    }
+
+    /**
+     * @param string $basicAuthUsername
+     */
+    public function setBasicAuthUsername($basicAuthUsername)
+    {
+        $this->basicAuthUsername = $basicAuthUsername;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBasicAuthPassword()
+    {
+        return $this->basicAuthPassword;
+    }
+
+    /**
+     * @param string $basicAuthPassword
+     */
+    public function setBasicAuthPassword($basicAuthPassword)
+    {
+        $this->basicAuthPassword = $basicAuthPassword;
+    }
+
     /**
      * Returns the secret
      *
-     * @return string $secret
+     * @return string
      */
     public function getSecret()
     {
@@ -243,7 +268,7 @@ public function setSecret($secret)
     /**
      * Returns the email
      *
-     * @return string $email
+     * @return string
      */
     public function getEmail()
     {
@@ -264,7 +289,7 @@ public function setEmail($email)
     /**
      * Returns the phpVersion
      *
-     * @return string $phpVersion
+     * @return string
      */
     public function getPhpVersion()
     {
@@ -285,7 +310,7 @@ public function setPhpVersion($phpVersion)
     /**
      * Returns the mysqlVersion
      *
-     * @return string $mysqlVersion
+     * @return string
      */
     public function getMysqlVersion()
     {
@@ -303,10 +328,52 @@ public function setMysqlVersion($mysqlVersion)
         $this->mysqlVersion = $mysqlVersion;
     }
 
+    /**
+     * Returns the diskFreeSpace
+     *
+     * @return int
+     */
+    public function getDiskFreeSpace()
+    {
+        return $this->diskFreeSpace;
+    }
+
+    /**
+     * Sets the diskFreeSpace
+     *
+     * @param int $diskFreeSpace
+     * @return void
+     */
+    public function setDiskFreeSpace($diskFreeSpace)
+    {
+        $this->diskFreeSpace = $diskFreeSpace;
+    }
+
+    /**
+     * Returns the diskTotalSpace
+     *
+     * @return int
+     */
+    public function getDiskTotalSpace()
+    {
+        return $this->diskTotalSpace;
+    }
+
+    /**
+     * Sets the diskTotalSpace
+     *
+     * @param int $diskTotalSpace
+     * @return void
+     */
+    public function setDiskTotalSpace($diskTotalSpace)
+    {
+        $this->diskTotalSpace = $diskTotalSpace;
+    }
+
     /**
      * Returns the insecureCore
      *
-     * @return bool $insecureCore
+     * @return bool
      */
     public function getInsecureCore()
     {
@@ -558,10 +625,10 @@ public function setExtensions(ObjectStorage $extensions)
     /**
      * Adds a backend user
      *
-     * @param \T3Monitor\T3monitoring\Domain\Model\Backend\User $backendUser
+     * @param User $backendUser
      * @return void
      */
-    public function addBackendUser(\T3Monitor\T3monitoring\Domain\Model\Backend\User $backendUser)
+    public function addBackendUser(User $backendUser)
     {
         $this->backendUsers->attach($backendUser);
     }
@@ -569,10 +636,10 @@ public function addBackendUser(\T3Monitor\T3monitoring\Domain\Model\Backend\User
     /**
      * Removes a backend user
      *
-     * @param \T3Monitor\T3monitoring\Domain\Model\Backend\User $backendUserToRemove The backend user to be removed
+     * @param User $backendUserToRemove The backend user to be removed
      * @return void
      */
-    public function removeBackendUser(\T3Monitor\T3monitoring\Domain\Model\Backend\User $backendUserToRemove)
+    public function removeBackendUser(User $backendUserToRemove)
     {
         $this->backendUsers->detach($backendUserToRemove);
     }
@@ -593,7 +660,7 @@ public function getBackendUsers()
      * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\T3Monitor\T3monitoring\Domain\Model\Backend\User> $backendUsers
      * @return void
      */
-    public function setBackendUsers(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $backendUsers)
+    public function setBackendUsers(ObjectStorage $backendUsers)
     {
         $this->backendUsers = $backendUsers;
     }

From 420a23b217de677c407aa90358c59c2840b48830 Mon Sep 17 00:00:00 2001
From: Janek Ruessmann <janek.ruessmann@wmdb.de>
Date: Wed, 11 Oct 2017 23:56:18 +0200
Subject: [PATCH 5/5] remove $monitorIpAddress

---
 Classes/Controller/StatisticController.php | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/Classes/Controller/StatisticController.php b/Classes/Controller/StatisticController.php
index d7fea49..c0e6c97 100644
--- a/Classes/Controller/StatisticController.php
+++ b/Classes/Controller/StatisticController.php
@@ -83,9 +83,6 @@ public function indexAction(ClientFilterDemand $filter = null)
             $feedItems = $bulletinImport->start();
         }
 
-        $monitorIpAddress = null;
-
-
         $this->view->assignMultiple([
             'filter' => $filter,
             'clients' => $this->clientRepository->findByDemand($filter),
@@ -104,7 +101,6 @@ public function indexAction(ClientFilterDemand $filter = null)
             'slaVersions' => $this->slaRepository->findAll(),
             'tagVersions' => $this->tagRepository->findAll(),
             'feedItems' => $feedItems,
-            'monitorIpAddress' => $monitorIpAddress,
             'importTimes' => [
                 'client' => $this->registry->get('t3monitoring', 'importClient'),
                 'core' => $this->registry->get('t3monitoring', 'importCore'),