Browse Source

* Add new User class
* Add new UserRoles

Giancarlo Voci 8 years ago
parent
commit
4ea2edbe72

+ 1 - 1
build.js

@@ -5,7 +5,7 @@ if (process.argv.length != 3) {
   return;
 }
 
-var compressor = require('node-minify');
+const compressor = require('node-minify');
 
 compressor.minify({
     compressor: 'clean-css',

+ 1 - 1
cfg/config - lamborghini.bin

@@ -1 +1 @@
-eJx1Ultv2jAUfrfk/xAhHjZNDQ6BlA5ZWggphIaY5dJ2Q1VlghsinDjkQosq/vscuqlPs2TJts53Od/xOuFiQ3n1BIEZhcQl5hR3qjLudSCwTGtuK1gJ/ciGIHJwk/YgmNqTaIZ1CGzPIlPHm+FOFN5ejSRg7szmrtwhfpGUDIKF6avsrUhLht/f6zRjX75+07WhbiCEzmfJNQnsMJQcAe5kp+rAv+9EVWMuYsrb07gQZY11HRnj7SanGcMi42m+l1rbTVOxEpdC1O2loFWFk5TmMS25gACCsbKi9Q6CiRnYke/i3gcUgsAJbc9c2pgsr1z5okxoxRRLlNKwS2bk2YqCkCxtX3r+8Rd9Pvdk82lGE1b1XJptRJns0jx1RSLUIk8gcCziPbfwKPwfjsvipv4ob/0FjLO4Vl53abxT4qaqRcZKJeayFYXldMOloX9eLob5p3DLsLaIb6svGzm7S2zaTV/VjJGKVG2AILhkN0SDgZzVnp2whT6XJofQ1w1D0w1Z2GbnH5fDB4+I/iOduoZZFREl18RZNo+H5Ma5DS6CbeTtVxkromAlrWVmmtJTtrLBmsV9pI0gWJlB8ED86Ro94W7/1NVQ9y3e5yv/tl7o5TFFU3Ux8EREFvcNKX+nR45Wwzv153WwKn69uiQ+3PPBPrmD4A/5R8po
+eJx1UV1r2zAUfRfoP4g8bYz6I068dkEwx3ETF9sa/qCFUorsqrapbLmS3a6U/PfJ6UafJhDoinPOPffc25qLknJ1B4FX5CQi3g4vlKzMBQS+5x8ChFGeFgEERYin1oRgF2yLPXYgCBKf7MJkjxdFfnl2rgmHcH+I9M3xo5ZkEFx5qcF+D61k+P19bDv25es3x147rmVZx6PWyhK86N7UM//RCDViLirK59dmEHLEjmO5m4eypx3DouNt/6SbPJSTYhJLIca5GKhSuG5pX1HJBQQQbNAvOjYQbL0sKNIImx9UCLIwDxIvDjCJzyL9g7ZUMeQLqZ1GZE/u/SLLSRyk2uzPv+zj0dRTtx2tmTIj2pVC1k3bt5GohTH0NQShT5L7mV7k/+NxDZ7GD/jsL2OcVSN6bdqqQdWkRtExiSquR0GspyXXhv55ORnmn41nhVufpIHxWOqlnWKzL5aG7Z4blmGvLAhO2a2t1Uov6Ym9Yd/6PLZOf+m4ru24Gjhnl77E6+uEiOUN3UWup4aCku8kjKeb5/oivMwg+APrl6Wd

+ 1 - 5
cfg/config - lamborghini.ini

@@ -6,7 +6,7 @@ DEBUG=3
 ENCODING="UTF-8"
 HIGHLIGHT=false
 JAR.expire={{time()+31536000}}
-DBSETTINGS="mysql:host=localhost;port=3306;dbname=omlink"
+DSN="mysql:host=localhost;port=3306;dbname=omlink"
 dbuser=root
 dbpass=giancarlo
 
@@ -24,7 +24,3 @@ host=192.168.0.140
 port=50443
 key=C0000000000011532366136
 pass=RvM5WNOo2XaDL6AspUaO7OIMuXqg9IFS
-
-[users]
-; operatore1 / dimatec2018
-PASSWORD[0]=$2y$10$xcknPRFtJ3rvi0D.J4NoUOJVuOrZivl0P5K.Q7SPpYwLOcqVl4kgK

+ 1 - 1
cfg/config.bin

@@ -1 +1 @@
-eJx1kl9vmzAUxd8t+TtYUR82TeVPaGi6yNIIOCkRxC2Gpms1VQ5xCStgCqRdW+W7z6Td9jQkhI3uuefcn32bFXLNi/YHBE4S04A6Hh60TaoPIHAd95wgjOIoIRAkPt7lOgQemSZzbEFAli71/OUcD5J4djxWgnN/fh6oN8b3qqWAYOFEmvhV543Ab29dXopPn79Y5siyDcPY71WvKSNxrHowPChf2sfi61a2HS5kyot+Nall02HLMuzJZl3xUmBZFnn1oLw2610rGtxI2fWbmrctznJepbwpJAQQTNAF77YQTB1GkijA+rsUAubHZOmEBNPwOFB/0JS3ArmyUYEDOqd3bsJiGpJIZf72od7vdTV8XvJMtLqnvp1IA5lJra4yCHyXLu96aRL/T1Oo4l33Xt5nY6IQaYeet3m6Remu7WQpGpQWagwkKr4uVJg/OQ5hN++mvfrWpRHR7tfqzA64zLOhZtpjzdTMEwOCA7ORcXKizuhBvGDX+PeYCv7Qsm3TslVhzyx6CkerJZXDa+4FttPWCaen1A9314/ZmT9jB8MedX9FJkjWouGdYmUiHX1kGhrmGIILh7EVjbxb4wc+Gr4cmcZRfsOquay3lyvyPVzMwnE1rE/p4oHJ7OxylOijx+c6mjrrxc9VuaHZzf3zjPGD4RWJYt91AgUgcubkYB3yjL++5pVET6LpcnVFBFI1IQTh1Z3jeRFh7C+L4cjSTEvR+A2329vh
+eJx1kV1vmzAUhu8t+T+gXG2axkdIWLvI0ii4hAnwxEdXqaoiQ1yCajAF062t8t9n0na7miVLtvS+5zznPTc1FyXl4y0EbpGTiLg+WoxDZSwg8FxvizWk5WmBIShCNDUGBD6+KAJkQ4ATj/hhEqBFkV9+PlOGbRhsI3VzdKdKMgi+u6nOfvfNwNDLi2xa9uHjJ9ta245pmsejqpUlaNE+jQ/860GMEnFRUT6/Nr0YJLJt09nsy462DImWN929arIvp5ENaBBCzp+ejiOqG9pVdOACAgg22g8qDxBcuBku0ggZr1YIsjDHiRtj5DctlayCICIB2XlFlpMYpwrx25vneDTUrEpVs9F4U0eiFnrf1RCEHkl2s7XI/+fhSjzJV/lMlDHOKqn9OjTVQaumUYqWDVrFFbzGOlpyFdY7xwlx/44IwY1HUqzflWpFp5Cs86VuOWe6pVsrE4JTUmtztVIruWdPyDP/HUtlvbQdx7IdJZyTSh/j9c+EiOU19SPHHfuCki8kjKfrh/o8vMxODa9wmoeeGyme1A3w7TxBTGv6/Nx0Qntkg2zUnpimNDEE8dXO9f0UZ9lftOXa1i1bwf0BLRu0Lw==

+ 2 - 6
cfg/config.ini

@@ -6,13 +6,13 @@ DEBUG=3
 ENCODING="UTF-8"
 HIGHLIGHT=false
 JAR.expire={{time()+31536000}}
-DBSETTINGS="mysql:host=localhost;port=3306;dbname=omlink"
+DSN="mysql:host=localhost;port=3306;dbname=omlink"
 dbuser=root
 dbpass=giancarlo
 
 ; Path
 BASEURL=/omlink
-SITENAME=OM-Link Base Core
+SITENAME=Dimatec
 LOGO_CUSTOMER={{@BASEURL}}/ui/images/DimatecLogo.png
 ICON_LOGOUT={{@BASEURL}}/ui/images/logout.png
 
@@ -25,10 +25,6 @@ port=50443
 key=C0000000000011532366136
 pass=RvM5WNOo2XaDL6AspUaO7OIMuXqg9IFS
 
-[users]
-; operatore1 / dimatec2018
-PASSWORD[0]=$2y$10$iZSnGophQWEYMJFM8n2p7OJkSog9Q5U/5qwpRBAbJjWmdOgZfwFSa
-
 [VERTICALSTORAGE]
 ; Magazzino verticale ICAM
 MV_ADDRESS=192.168.253.130

+ 2 - 0
cfg/packconfig.php

@@ -1,5 +1,7 @@
 <?php
 /**
+ * Compile with:
+ * php packconfig.php <ini file>
  * @author Open Mind
  * @date 12/04/2018
  * @time 15:43

+ 2 - 1
index.php

@@ -11,8 +11,9 @@
 require_once 'lib/f3/base.php';
 $f3 = \Base::instance();
 
+
 // Initialize App Menu
-$f3->set('GLOBALMENU', []);
+$f3->set('GLOBALMENU', array());
 
 // Load Utility Class
 require_once "src\OpenMind\System\OMUtils.php";

+ 3 - 1
src/Modules/Dimatec/Distinta.php

@@ -19,8 +19,10 @@ class Distinta
 
   public function __construct()
   {
+    $a = get_declared_classes();
+
     $this->dbHandle = \F3::get('DB');
-    $this->userId = \F3::get('USERID');
+    $this->userId = \F3::get('USER')->id;
   }
 
   /**

+ 2 - 1
src/Modules/Dimatec/Pages.php

@@ -9,8 +9,9 @@ namespace Modules\Dimatec;
 
 use OpenMind\FindBox\FindBoxCoreSystem;
 use OpenMind\FindBox\SmartESL;
+use OpenMind\Web\Controller;
 
-class Pages extends \OpenMind\Web\Controller
+class Pages extends Controller
 {
   private $CORE_SETTINGS;
   private $findBoxCore;

+ 4 - 2
src/Modules/KittingDynamic/Distinta.php

@@ -17,8 +17,9 @@ class Distinta
 
   public function __construct()
   {
-    $this->dbHandle = \F3::get('DB');
-    $this->userId = \F3::get('USERID');
+    global $f3;
+    $this->dbHandle = $f3->get('DB');
+    $this->userId = $f3->get('USER')->id;
   }
 
   public function CleanDistintaTable()
@@ -56,6 +57,7 @@ EOF;
    * @param string $maxArticles the LIMIT mysql query parameter
    * @param bool $blink true if need to blink
    * @param int $iterations
+   * @throws \Exception
    */
   public function SaveProductsToFindBox(string $maxArticles, bool $blink, int $iterations = 20)
   {

+ 21 - 0
src/OpenMind/Backend/Backend.php

@@ -0,0 +1,21 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Giancarlo
+ * Date: 31/07/2018
+ * Time: 10:38
+ */
+
+namespace OpenMind\Backend;
+
+use OpenMind\System\PluginStrategy;
+
+class Backend extends PluginStrategy
+{
+  public function __construct()
+  {
+  }
+}
+
+/** @var \OpenMind\Backend $Backend*/
+Global $Backend;

+ 1 - 1
src/OpenMind/DataManager/CSVImporter.php

@@ -39,7 +39,7 @@ class CSVImporter
 
   public function __construct(string $folderPath)
   {
-    $this->user = (int)\F3::get('USERID');
+    $this->user = (int)\F3::get('USER')->id;
     $this->folderToWatch = $folderPath;
     $this->dbMysql = \F3::get('DB');
   }

+ 4 - 0
src/OpenMind/System/OMUtils.php

@@ -70,9 +70,13 @@ class OMUtils
    * Load an encrypted file with the method "base64_encode(gzcompress(<path to config.ini>))", save it in a temporary file in temp folder of system and load with F3::config()
    *
    * @param string $path
+   * @throws \Exception
    */
   public function LoadEncryptedConfig(string $path)
   {
+    if(!file_exists($path))
+      throw new \Exception('Config file not found');
+
     $tmpFilepath = tempnam(sys_get_temp_dir(), 'om');
     $config = gzuncompress(base64_decode(file_get_contents($path)));
     file_put_contents($tmpFilepath, $config);

+ 12 - 4
src/OpenMind/System/PluginStrategy.php

@@ -98,18 +98,26 @@ class PluginStrategy implements IPluginStrategy
    */
   public function AddMenuItem(string $menuName, array $options)
   {
-    // TODO: to implement
+    global $f3;
+
     $defaults = [
       'url' => '',
       'isDisabled' => false,
-      'image' => ''
+      'image' => '',
+      'permissionName' => null
     ];
 
     $newMenu = array_merge($defaults, $options);
 
-    $globalMenuUpdated = \F3::get('GLOBALMENU');
+    $globalMenuUpdated = $f3->get('GLOBALMENU');
     $globalMenuUpdated[$menuName] = $newMenu;
 
-    \F3::set('GLOBALMENU', $globalMenuUpdated);
+    $user = User::Restore();
+
+    $hasMenuPermissionRequirements = !is_null($newMenu['permissionName']);
+
+    if (!$hasMenuPermissionRequirements || ($hasMenuPermissionRequirements && $user->hasPermission($newMenu['permissionName']))) {
+      $f3->set('GLOBALMENU', $globalMenuUpdated);
+    }
   }
 }

+ 6 - 5
src/OpenMind/System/System.php

@@ -15,8 +15,9 @@ class System extends PluginStrategy
 
   public function __construct()
   {
+    global $f3;
     // Set Error Handler
-    \F3::set('ONERROR', __NAMESPACE__ . '\ErrorHandlers->Handler');
+    $f3->set('ONERROR', __NAMESPACE__ . '\ErrorHandlers->Handler');
 
     $this->cache = \Cache::instance();
 
@@ -24,11 +25,11 @@ class System extends PluginStrategy
 
     // Set Database connection
     try {
-      \F3::set('DB',
+      $f3->set('DB',
         new \DB\SQL(
-          \F3::get('DBSETTINGS'),
-          \F3::get('dbuser'),
-          \F3::get('dbpass'),
+          $f3->get('DSN'),
+          $f3->get('dbuser'),
+          $f3->get('dbpass'),
           array(
             \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
             \PDO::ATTR_PERSISTENT => TRUE

+ 42 - 26
src/OpenMind/System/User.php

@@ -8,48 +8,64 @@
 
 namespace OpenMind\System;
 
-class User
-{
-  private $p_id;
-  private $p_username;
+use DB\SQL\Mapper;
 
-  public function __construct(int $id, string $username)
-  {
-    $this->p_id = $id;
-    $this->p_username = $username;
-  }
+/**
+ * Class User
+ *
+ * @property int $id
+ * @property string $username
+ * @property string $saltedpassword
+ * @property string $roles
+ * @package OpenMind\System
+ */
+class User extends Mapper
+{
+  private $userRoles;
 
   /**
-   * @param int $p_id
+   * User constructor.
+   * @param string/array $where
    */
-  public function setId(int $p_id)
+  public function __construct($where)
   {
-    $this->p_id = $p_id;
+    global $f3;
+    parent::__construct($f3->get('DB'), 'users', NULL, 3600);
+
+    $this->load($where);
+    if (!$d = $this->dry())
+      $this->userRoles = unserialize($this->roles);
   }
 
   /**
-   * @return int
+   * Reload user from $_SESSION
    */
-  public function getId(): int
+  public static function Restore()
   {
-    return $this->p_id;
+    global $f3;
+
+    $userId = $f3->get('SESSION.user');
+    return new User(['id=?', $userId]);
+
   }
 
   /**
-   * @return string
+   * Save user in $_SESSION
    */
-  public function getUsername(): string
+  public function Store()
   {
-    return $this->p_username;
+    global $f3;
+    $f3->set('SESSION.user', $this->id);
   }
 
-  public static function Load()
-  {
-    return \F3::get('SESSION.user');
-  }
-
-  public function Save()
+  /**
+   * Check if user can do <$permissionName>
+   *
+   * @param string $permissionName
+   * @return bool
+   */
+  public function hasPermission(string $permissionName): bool
   {
-    \F3::set('SESSION.user', $this);
+    return in_array($permissionName, $this->userRoles);
   }
-}
+}

+ 58 - 0
src/OpenMind/System/UserRoles.php

@@ -0,0 +1,58 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Giancarlo
+ * Date: 01/08/2018
+ * Time: 15:52
+ */
+
+namespace OpenMind\System;
+
+
+class UserRoles
+{
+  public function __construct()
+  {
+    global $f3;
+    // Define global array is doesn't exists
+    if (is_null($f3->get('USERROLES')))
+      $f3->set('USERROLES', array());
+  }
+
+  /**
+   * Get all defined user roles
+   *
+   * @return array
+   */
+  public static function getAllRoles(): array
+  {
+    global $f3;
+    return $f3->get('USERROLES');
+  }
+
+  /**
+   * Retrieve permission value
+   *
+   * @param string $permissionName
+   * @return mixed
+   */
+  public function get(string $permissionName)
+  {
+    global $f3;
+    return $f3->get('USERROLES')[$permissionName];
+  }
+
+  /**
+   * Add new permission to roles
+   *
+   * @param string $permissionName
+   */
+  public function add(string $permissionName)
+  {
+    global $f3;
+
+    $roles = &$f3->ref('USERROLES');
+
+    array_push($roles, $permissionName);
+  }
+}

+ 3 - 5
src/OpenMind/Web/Controller.php

@@ -24,15 +24,13 @@ class Controller
     $this->sanitizedPostRequest = $f3->clean($f3->get('POST'));
     $this->dbHandle = $f3->get('DB');
 
-    if (!$f3->exists('SESSION.user_id') && !in_array($f3->get('PATTERN'), ['/loginform', '/'])) {
+    if (!$f3->exists('SESSION.user') && !in_array($f3->get('PATTERN'), ['/loginform', '/'])) {
       $f3->reroute('/');
       return;
     }
 
-    if ($f3->exists('SESSION.user_id')) {
-      $f3->set('USERID', $f3->get('SESSION.user_id'));
-      \F3::get('SESSION.user')->setId(1123);
-      $user = User::Load();
+    if ($f3->exists('SESSION.user')) {
+      $f3->set('USER', User::Restore());
     }
 
     return;

+ 16 - 17
src/OpenMind/Web/Login.php

@@ -14,12 +14,12 @@ class Login extends Controller
 {
   public function Login($f3)
   {
-    if ($f3->exists('SESSION.user_id')) {
+    if ($f3->exists('SESSION.user')) {
       $f3->reroute('/homemenu');
       return;
     }
 
-    $f3->clear('SESSION');
+    $f3->clear('SESSION.user');
     $f3->clear('COOKIE.username');
 
     $f3->set('CONTENT', 'login.tpl');
@@ -31,15 +31,16 @@ class Login extends Controller
    *
    * @param string $username
    * @param string $password
-   * @return int|null
+   * @return int|\OpenMind\System\User
    */
-  private function checkLogin(string $username, string $password): ?int
+  private function checkLogin(string $username, string $password): ?User
   {
-    $accounts = \F3::get('users.PASSWORD');
-    foreach ($accounts as $index => $account) {
-      $exist = password_verify("{$username}|{$password}", $account);
+    $user = new User(['username=?', $username]);
+
+    if (!$user->dry()) {
+      $exist = password_verify("{$username}|{$password}", $user->saltedpassword);
       if ($exist)
-        return $index;
+        return $user;
     }
     return null;
   }
@@ -48,23 +49,21 @@ class Login extends Controller
    * Check if username and password are correct
    *
    * @param $f3
+   * @throws \Exception
    */
   public function LoginForm($f3)
   {
     $accountData = $this->getSanitizedPostRequest();
 
-    $userId = $this->checkLogin($accountData['username'], $accountData['password']);
+    $user = $this->checkLogin($accountData['username'], $accountData['password']);
 
-    if (is_null($userId)) {
+    if (is_null($user)) {
       http_response_code(500);
-      echo "Dati di accesso non corretti";
-      return;
+      throw new \Exception("Dati di accesso non corretti");
     }
 
-    $f3->set('SESSION.user_id', $userId);
-    $user = new User($userId, $accountData['username']);
-    $user->Save();
-    $f3->set('USERID', $userId);
+    $user->Store();
+
     $f3->set('COOKIE.username', $accountData['username']);
 
     $f3->reroute('/homemenu');
@@ -72,7 +71,7 @@ class Login extends Controller
 
   public function Logout($f3)
   {
-    $f3->clear('SESSION');
+    $f3->clear('SESSION.user');
     $f3->clear('COOKIE.username');
     $f3->reroute('/');
   }

+ 27 - 13
src/OpenMind/Web/Web.php

@@ -8,21 +8,10 @@
 namespace OpenMind\Web;
 
 use OpenMind\System\PluginStrategy;
+use OpenMind\System\UserRoles;
 
-class Web extends PluginStrategy
+class Pages extends Controller
 {
-  public function __construct()
-  {
-    // Services
-    $this->AddRoute('GET /importdata', __NAMESPACE__ . '\Web->Import');
-    $this->AddRoute('GET /homemenu', __NAMESPACE__ . '\Web->HomeMenu');
-    $this->AddRoute('GET /', __NAMESPACE__ . '\Login->Login');
-    $this->AddRoute("POST /loginform", __NAMESPACE__ . '\Login->LoginForm');
-    $this->AddRoute("GET /logout", __NAMESPACE__ . '\Login->Logout');
-
-    $this->AddMenuItem('genericimport', ['url' => 'importdata', 'imgClass' => 'shadow p-3 rounded bg-white', 'image' => 'ui/images/import.png']);
-  }
-
   public function HomeMenu($f3)
   {
     $f3->set('CONTENT', 'homemenu.tpl');
@@ -51,5 +40,30 @@ class Web extends PluginStrategy
   }
 }
 
+class Web extends PluginStrategy
+{
+  public function __construct()
+  {
+    // Services
+    $this->AddRoute('GET /importdata', __NAMESPACE__ . '\Pages->Import');
+    $this->AddRoute('GET /homemenu', __NAMESPACE__ . '\Pages->HomeMenu');
+    $this->AddRoute('GET /', __NAMESPACE__ . '\Login->Login');
+    $this->AddRoute("POST /loginform", __NAMESPACE__ . '\Login->LoginForm');
+    $this->AddRoute("GET /logout", __NAMESPACE__ . '\Login->Logout');
+
+    // Menu
+    $this->AddMenuItem('genericimport', [
+      'url' => 'importdata',
+      'imgClass' => 'shadow p-3 rounded bg-white',
+      'image' => 'ui/images/import.png',
+      'permissionName' => 'importdata'
+    ]);
+
+    // Add permission roles
+    $roles = new UserRoles();
+    $roles->add('importdata');
+  }
+}
+
 /** @var \OpenMind\Web\Web $Web */
 Global $Web;

+ 1 - 1
ui/bind.tpl

@@ -1,5 +1,5 @@
 <div class="row h-100 justify-content-center w-100">
-	<div class="col-md-5 align-self-center">
+	<div class="col-xs-12 col-md-9 col-lg-5 align-self-center">
 		<div>
 
 			{*Tabella elenco commesse*}

+ 4 - 3
watcher.js

@@ -1,7 +1,8 @@
-var fs = require('fs');
-var { exec } = require('child_process');
+const fs = require('fs');
+const { exec } = require('child_process');
 
-var twiceFix = false;
+// this is for fix because the event fire twice
+let twiceFix = false;
 
 function compileAll(event, fname) {
   console.log(`${fname} as changed`);