DataObjects/Core_setting.php
[Pman.Core] / DataObjects / Core_setting.php
1 <?php
2
3 class_exists('DB_DataObject') ? '' : require_once 'DB/DataObject.php';
4
5 class Pman_Core_DataObjects_Core_setting extends DB_DataObject
6 {
7     public $__table = 'core_setting';
8     
9     function initKeys()
10     {
11         // return false when fail
12         
13         $dir = $this->getKeyDirectory();
14         
15         if(
16             file_exists("{$dir}/pub.key") ||
17             file_exists("{$dir}/pri.key")
18         ){
19             return true;
20         }
21         
22         $ssl = openssl_pkey_new(array(
23             "digest_alg" => "sha512",  
24             "private_key_bits" => 1024, //returns cipher in 128 char
25             "private_key_type" => OPENSSL_KEYTYPE_RSA
26         ));
27         
28         openssl_pkey_export($ssl, $pri_key);
29         $pub_key = openssl_pkey_get_details($ssl);
30         $pub_key = $pub_key["key"];
31         
32         file_put_contents("{$dir}/pub.key",$pub_key);
33         file_put_contents("{$dir}/pri.key",$pri_key);
34         return true;
35     }
36     
37     function lookup($m,$n)
38     {
39         $s = DB_DataObject::factory('core_setting');
40         $s->setFrom(array(
41             'module' => $m,
42             'name' => $n
43         ));
44         if($s->find(true)) {
45             return $s;
46         }
47         return false;
48     }
49     
50     function beforeInsert($q, $roo)
51     {
52         exit;
53     }
54     
55     function getKeyDirectory()
56     {
57         $client_dir = HTML_FlexyFramework::get()->Pman['storedir'];
58         $key_dir = $client_dir.'/keys';
59         if(!file_exists($key_dir)) {
60             $this->checkWritable(get_class($this),__FUNCTION__,$client_dir);
61             mkdir($key_dir, 0775);
62         }
63         return $key_dir;
64     }
65     
66     // FIXME  - this needs to go in beforeInsert/beforeUpdate
67     // should not be sending this the values..
68     function initSetting($a)
69     {
70         if(empty($a)) {
71             return;
72         }
73         
74         $c = $this->lookup($a['module'], $a['name']);
75         if($c) {
76             return;
77         }
78         
79         $this->initKeys();
80         
81         $s = DB_DataObject::factory('core_setting');
82         
83         $s->setFrom(array(
84             'module'        =>     $a['module'],
85             'name'          =>       $a['name'],
86             'description'   => $a['description'],
87             'val' => (!isset($a['is_encrypt']) || $a['is_encrypt'] == 1) ?
88                 $this->encrypt($a['val']) : $a['val'],
89             'is_encrypt' => isset($a['is_encrypt']) ? $a['is_encrypt'] : 1
90         ));
91         
92         $s->insert();
93     }
94     
95     //one key for encrypting all the settings
96     function encrypt($v)
97     {
98         $key_dir = "{$this->getKeyDirectory()}/pub.key";
99         
100         if(!file_exists($key_dir)) {
101             print_r("Cannot find {$key_dir}");
102             exit;
103         }
104         
105         $pub_key = file_get_contents($key_dir);
106         if(!$pub_key) {
107             return;
108         }
109         openssl_public_encrypt($v, $ciphertext, $pub_key);
110         return $ciphertext;
111     }
112     
113     function decrypt($v)
114     {
115         $key_dir = "{$this->getKeyDirectory()}/pri.key";
116         
117         if(!file_exists($key_dir)) {
118             print_r("Cannot find {$key_dir}");
119             exit;
120         }
121         
122         $pri_key = file_get_contents($key_dir);
123         if(!$pri_key) {
124             return;
125         }
126         
127         openssl_private_decrypt($v, $plaintext, $pri_key);
128         return $plaintext;
129     }
130     
131     function checkWritable($cls_name,$func_name,$dir)
132     {
133         if(!is_writable($dir)) {
134             print_r("Cannot run {$cls_name} :: {$func_name}\n");
135             print_r("Directory: {$dir} is not writable by current user\n");
136             exit;
137         }
138         
139         return true;
140     }
141 }