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