Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 57
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
InstallKey
0.00% covered (danger)
0.00%
0 / 57
0.00% covered (danger)
0.00%
0 / 6
240
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
20
 create
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
20
 useKey
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 generateKey
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 crypto_rand_secure
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
6
 getToken
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace BuyerKiosk\Core;
4
5class InstallKey extends Store {
6    private $db;
7    public $id;
8    private $log;
9
10    public $key;
11    public $used;
12    public $generateDate;
13
14    public function __construct($key = null)
15    {
16        $this->log = new \KLogger("/home/kiosk/logs/install_keys.txt", \KLogger::DEBUG);
17        global $db_name;
18        $this->db = dbConnectByName($db_name);
19        $this->log->LogDebug($key);
20        if($key !== null) {
21            $stmt = $this->db->query("SELECT * FROM installKeys WHERE `key` = '".$key."'");
22            if($stmt) {
23                $row = $stmt->fetch(\PDO::FETCH_ASSOC);
24                if($row['id'] > 0) {
25                    $this->id = $row['id'];
26                    $this->key = $row['key'];
27                    $this->used = $row['used'];
28                    $this->generateDate = $row['generatedDate'];
29                    $this->createStore($row['typeNum']);
30                } else {
31                    $this->log->LogDebug("No Row Returned");
32                    return false;
33                }
34            } else {
35                $this->log->LogDebug("STMT didn't work");
36                return false;
37            }
38        } else {
39            $this->log->LogDebug("Key is NULL");
40            return false;
41        }
42        return true;
43    }
44    public function create($typeNum) {
45        $this->createStore($typeNum);
46        $this->db->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );
47        try{
48            if($this->getTypeNum() !== null) {
49                $this->db->query("UPDATE installKeys SET used = 1 WHERE typeNum = '".$typeNum."'");
50                $stmt = $this->db->prepare("INSERT INTO installKeys (`key`, `typeNum`, `generatedDate`, `used`) VALUES (:key, :typeNum, CURRENT_TIMESTAMP, 0)");
51                $stmt->bindValue(":key", $this->generateKey());
52                $stmt->bindValue(':typeNum', $this->getTypeNum());
53                if($stmt->execute()) {
54                    return true;
55                } else {
56                    $this->log->LogError($this->db->errorCode());
57                }
58            }
59        } catch(\PDOException $e) {
60            $this->log->LogError($e->getMessage());
61
62        }
63        return false;
64    }
65    public function useKey() {
66        $stmt = $this->db->prepare("UPDATE installKeys SET used = 1 WHERE id = :id");
67        $stmt->bindValue(":id", $this->id);
68        if($stmt->execute()) {
69            return true;
70        }
71        return false;
72    }
73    private function generateKey() {
74        return $this->key = $this->getToken(16);
75    }
76
77    private function crypto_rand_secure($min, $max)
78    {
79        $range = $max - $min;
80        if ($range < 1) return $min; // not so random...
81        $log = ceil(log($range, 2));
82        $bytes = (int) ($log / 8) + 1; // length in bytes
83        $bits = (int) $log + 1; // length in bits
84        $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
85        do {
86            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
87            $rnd = $rnd & $filter; // discard irrelevant bits
88        } while ($rnd > $range);
89        return $min + $rnd;
90    }
91
92    private function getToken($length)
93    {
94        $token = "";
95        $codeAlphabet = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
96        $codeAlphabet.= "123456789";
97        $max = strlen($codeAlphabet); // edited
98
99        for ($i=0; $i < $length; $i++) {
100            $token .= $codeAlphabet[$this->crypto_rand_secure(0, $max-1)];
101        }
102
103        return $token;
104    }
105}