6209290c675ebce5d74d5bc840a19b59947906f8
[certwatch.git/.git] / functions.php
1 <?php
2
3 include('dbconfig.php');
4
5 $conn = mysql_connect (DBHOST, DBUSER, DBPASSWD);
6 mysql_select_db(DBNAME, $conn);
7
8 $errorMessages = array(
9     "mail" => array(
10         "invalid_address" => "Please provide a valid e-mail address.",
11     ),
12     "cert" => array(
13         "invalid_cert" => "This certificate cannot be read.",
14         "already_in" => "This certificate is already in our database.",
15         "not_valid_yet" => "This certificate is not valid yet.",
16         "expired" => "This certificate has been already expired.",
17     )
18 );
19
20 function formatCert($cert) {
21     $cert = ltrim(rtrim($cert));
22     if (strlen($cert)>1) {
23         if (!preg_match("/-----BEGIN CERTIFICATE-----/", $cert)) {
24             $cert = "-----BEGIN CERTIFICATE-----\n" . $cert;
25         }
26         if (!preg_match("/-----END CERTIFICATE-----/", $cert)) {
27             $cert = $cert . "\n-----END CERTIFICATE-----";
28         }
29     }
30     return $cert;
31 }
32
33 function checkCert($string) {
34
35     $cert = ltrim(rtrim($string));
36     return openssl_x509_parse($cert);
37
38 }
39
40 function getX509Field($cert, $field = 'subject') {
41     $descriptorspec = array(
42             0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
43             1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
44             2 => array("pipe", "r") // stderr is a file to write to
45     );
46
47
48     // Check field
49     if (
50     $field != 'subject'
51             && $field != 'serial'
52             && $field != 'fingerprint'
53             && $field != 'startdate'
54             && $field != 'issuer'
55             && $field != 'enddate'
56             && $field != 'clean'
57     ) {
58         return false;
59     }
60
61     // Set switches
62     if ($field == 'fingerprint') {
63         $field .= ' -sha1';
64     }
65
66     if ($field == 'clean') {
67         $process = proc_open('/usr/bin/openssl x509', $descriptorspec, $pipes);
68     } else {
69         $process = proc_open('/usr/bin/openssl x509 -noout -'.$field, $descriptorspec, $pipes);
70     }
71
72     if (is_resource($process)) {
73         // $pipes now looks like this:
74         // 0 => writeable handle connected to child stdin
75         // 1 => readable handle connected to child stdout
76         // Any error output will be appended to /tmp/error-output.txt
77
78         fwrite($pipes[0],  $cert);
79         fclose($pipes[0]);
80
81         $result = '';
82         while ($i = fgets($pipes[1])) {
83             $result .= $i;
84         }
85         fclose($pipes[1]);
86
87         // It is important that you close any pipes before calling
88         // proc_close in order to avoid a deadlock
89         $return_value = proc_close($process);
90
91
92         // Returns false on error or the data part after the = in
93         // e.g. Fingerprint=D6:E7:7D:94:51:8C:3E:7C:62:BD:FE:77:E4:CB:B0:0F
94         if(!$return_value && $field == 'clean') {
95             return trim($result);
96         } else if(!$return_value) {
97             return trim(substr($result, (strpos($result, '=')+1)));
98         } else {
99             return false;
100         }
101     }
102 }
103
104 function getCertNR(){
105     global $conn;
106     $query = mysql_query("SELECT fingerprint FROM main",$conn);
107     return mysql_num_rows($query);
108 }
109
110 function mailEncode($in_str, $charset) {
111     $out_str = $in_str;
112     if ($out_str && $charset) {
113
114         // define start delimimter, end delimiter and spacer
115         $end = "?=";
116         $start = "=?" . $charset . "?B?";
117         $spacer = $end . "\r\n " . $start;
118
119         // determine length of encoded text within chunks
120         // and ensure length is even
121         $length = 200 - strlen($start) - strlen($end);
122         $length = floor($length/2) * 2;
123
124         // encode the string and split it into chunks
125         // with spacers after each chunk
126         $out_str = base64_encode($out_str);
127         $out_str = chunk_split($out_str, $length, $spacer);
128
129         // remove trailing spacer and
130         // add start and end delimiters
131         $spacer = preg_quote($spacer);
132         $out_str = preg_replace("/" . $spacer . "$/", "", $out_str);
133         $out_str = $start . $out_str . $end;
134     }
135     return $out_str;
136 }
137
138 function sendReminder($email,$fingerprint,$dn,$expire){
139     
140     $eol="\n";
141
142     $headers .= 'From: certwatch <no-reply@niif.hu>' . $eol;
143     $headers .= 'MIME-Version: 1.0' . $eol;
144     $headers .= 'Reply-To: no-reply@niif.hu' . $eol;
145     $headers .= 'Content-type: text/plain; charset=UTF-8' . $eol;
146     $headers .= 'Content-Transfer-Encoding: 8bit' . $eol;
147
148     $subject = "Certificate expiration";
149
150     $body = "Hello,
151
152 your certificate (fingerprint: $fingerprint, dn: $dn) will be expired in $expire. After expiring it will be purged form our database.
153
154 Cheers,
155 certwatch.niif.hu
156
157 This is an automatically generated message, please, do not reply.
158     ";
159
160     mail($email,$subject,$body,$headers);
161
162 }
163
164 function expireDays($dayNR){
165     return ($dayNR==1) ? $dayNR . " day" : $dayNR . " days";
166 }
167
168
169 function certWrap($attrs){
170         $attrs=preg_replace("/\n|\t| /","",$attrs);
171         if (strlen($attrs)>256){
172                 $i=0;
173                 $attr="";
174                 while ($i<strlen($attrs)){
175                         $attr.=substr($attrs,$i,64)."\n";
176                         $i=$i+64;
177                 }
178         } else {
179                 $attr=$attrs;
180         }
181         return $attr;
182 }
183
184
185 ?>