GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( d30200...ba78f4 )
by Marco
02:14
created

function.php (11 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 5 and the first side effect is on line 3.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
3
ini_set('error_log', 'syslog');
4
5
function username() {
6
	if (isset ($_SERVER['REMOTE_USER'])) $user = $_SERVER['REMOTE_USER'];
7
        	else if (isset ($_SERVER['USER'])) $user = $_SERVER['USER'];
8
                	else $user='unknown';
9
	return $user;
10
}
11
12
13
function myConnect($host, $user, $pass, $db, $port, $tablelist, $typedesc, $loguser) {
14
        $db = ( $tablelist["$typedesc"]['milter'] ) ? $tablelist["$typedesc"]['name'] : $db;
15
	$mysqli = new mysqli($host, $user, $pass, $db, $port);
16
        if ($mysqli->connect_error) {
17
           	syslog (LOG_EMERG, $loguser.': Connect Error to DB <'.$db.'> (' . $mysqli->connect_errno . ') '
18
                    		. $mysqli->connect_error);
19
		return FALSE;
20
	}
21
	syslog(LOG_INFO, $loguser.': Successfully MySQL connected at DB <'.$db.'> to ' . $mysqli->host_info) ;
22
	return $mysqli;
23
}
24
25
function addtolist ($myconn,$user,$value,$tabledesc,$expUnit,$expQ,$myreason,&$err) {
26
// See MySQL manual for $expQ and $expUnit at
27
// https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timestampadd
28
29
	$result=FALSE;
30
	$sub=array();
31
	$type = $tabledesc['field'];
32
	$milt = $tabledesc['milter'];
33
	$table = ($milt) ? milterTable($type) : $tabledesc['name'];
34
35
	switch ($type) {
36
	  case 'ip':
37
		$query= sprintf("INSERT INTO `$table` (
38
			`$type` ,
39
			`date` ,
40
			`exp` ,
41
			`active` ,
42
			`user` ,
43
			`reason`
44
		)
45
		VALUES (
46
			INET_ATON( '%s' ) ,
47
			CURRENT_TIMESTAMP , TIMESTAMPADD(%s,%d,CURRENT_TIMESTAMP), '1', '%s', '%s'
48
		)" ,$value,$expUnit,$expQ,$user,$myreason);
49
		break;
50
51
	  case 'network':
52
		if (!$milt) {
53
			if ( netOverlap($myconn, $tabledesc, $value, $overlappedNet, $user) ) {
54
				$err = "<$value> overlaps the existing network <$overlappedNet>";
55
				return FALSE;
56
			}
57
		}
58
		list($sub['net'],$sub['mask'])=explode('/',$value);
59
                $query= sprintf("INSERT INTO `$table` (
60
                        `$type` ,
61
			`netmask`,
62
                        `date` ,
63
                        `exp` ,
64
                        `active` ,
65
                        `user` ,
66
                        `reason`
67
                )
68
                VALUES (
69
                        INET_ATON( '%s' ) , INET_ATON( '%s' ) ,
70
                        CURRENT_TIMESTAMP , TIMESTAMPADD(%s,%d,CURRENT_TIMESTAMP), '1', '%s', '%s'
71
                )" ,$sub['net'],$sub['mask'],$expUnit,$expQ,$user,$myreason);
72
                break;
73
74
	  default:
75
                $query= sprintf("INSERT INTO `$table` (
76
                        `$type` ,
77
                        `date` ,
78
                        `exp` ,
79
                        `active` ,
80
                        `user` ,
81
                        `reason`
82
                )
83
                VALUES (
84
                        '%s' ,
85
                        CURRENT_TIMESTAMP , TIMESTAMPADD(%s,%d,CURRENT_TIMESTAMP), '1', '%s', '%s'
86
                )" ,$value,$expUnit,$expQ,$user,$myreason);
87
	}
88
89 View Code Duplication
	if ($myconn->query($query) === TRUE) {
90
	    syslog(LOG_INFO, "$user: $type <$value> successfully listed on <$table> for $expQ $expUnit.");
91
	    $result=TRUE;
92
	}
93
	else syslog(LOG_ERR, "$user: Error: ".$myconn->error);
94
	return $result;
95
}
96
97
function relist ($myconn,$user,$value,$type,$table,$expUnit,$expQ,$myreason) {
98
99
	$result=FALSE;
100
101
        switch ($type) {
102
	  case 'ip':
103
                $query= sprintf("UPDATE `$table` SET
104
			`active` = '1',
105
			`user` = '%s',
106
			`exp` = TIMESTAMPADD(%s,%d,CURRENT_TIMESTAMP),
107
			`nlist` = `nlist` + 1,
108
			`reason` = '%s'
109
			WHERE `$table`.`$type` = INET_ATON('%s') LIMIT 1" ,$user,$expUnit,$expQ,$myreason,$value);
110
		break;
111
          case 'network':
112
		list($sub['net'],$sub['mask'])=explode('/',$value);
113
                $query= sprintf("UPDATE `$table` SET
114
                        `active` = '1',
115
                        `user` = '%s',
116
                        `exp` = TIMESTAMPADD(%s,%d,CURRENT_TIMESTAMP),
117
                        `nlist` = `nlist` + 1,
118
                        `reason` = '%s'
119
                        WHERE (`$table`.`$type` = INET_ATON('%s') AND `$table`.`netmask` = INET_ATON('%s')) LIMIT 1" ,$user,$expUnit,$expQ,$myreason,$sub['net'],$sub['mask']);
0 ignored issues
show
The variable $sub does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
120
		break;
121
	  default:
122
                $query= sprintf("UPDATE `$table` SET
123
                        `active` = '1',
124
                        `user` = '%s',
125
                        `exp` = TIMESTAMPADD(%s,%d,CURRENT_TIMESTAMP),
126
                        `nlist` = `nlist` + 1,
127
                        `reason` = '%s'
128
			WHERE `$table`.`$type` = '%s' LIMIT 1" ,$user,$expUnit,$expQ,$myreason,$value);
129
	}
130
131 View Code Duplication
        if ($myconn->query($query) === TRUE) {
132
            syslog(LOG_INFO, "$user: relist $type <$value> on <$table> for $expQ $expUnit.");
133
		$result=TRUE;
134
        }
135
        else syslog (LOG_ERR, "$user: Error: ". $myconn->error);
136
	return $result;
137
}
138
139
function remove ($myconn,$user,$value,$type,$table) {
140
141
        switch ($type) {
142
          case 'ip':
143
		$query = sprintf("DELETE FROM `$table` WHERE
144
                        `$table`.`$type` = INET_ATON('%s') LIMIT 1", $value);
145
		break;
146 View Code Duplication
	  case 'network':
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
147
		list($sub['net'],$sub['mask'])=explode('/',$value);
148
		$query = sprintf("DELETE FROM `$table` WHERE
149
			`$table`.`$type` = INET_ATON('%s') AND `$table`.`netmask` = INET_ATON('%s') LIMIT 1",
150
			$sub['net'],$sub['mask']);
0 ignored issues
show
The variable $sub does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
151
		break;
152
	  default:
153
		$query = sprintf("DELETE FROM `$table` WHERE
154
                        `$table`.`$type` = %s LIMIT 1", $value);
155
	}
156
157
158
        if ($return=$myconn->query($query) === TRUE) 
159
            syslog(LOG_INFO, "$user: permanently DELETED $type <$value> from <$table>.");
160
        else syslog(LOG_ERR, "$user: Error: ". $myconn->error);
161
162
        return $return;
163
}
164
165
166
function changestatus ($myconn,$user,$value,$status,$type,$table) {
167
168
	switch ($type) {
169
          case 'ip':
170
		$query= sprintf("UPDATE `$table` SET `active` = '$status', `user` = '%s' WHERE `$table`.`$type` = INET_ATON('%s') LIMIT 1" ,$user, $value);
171
		break;
172
	  case 'network':
173
		list($sub['net'],$sub['mask'])=explode('/',$value);
174
		$query= sprintf("UPDATE `$table` SET `active` = '$status', `user` = '%s' WHERE (`$table`.`$type` = INET_ATON('%s') AND `$table`.`netmask` = INET_ATON('%s')) LIMIT 1" ,$user, $sub['net'],$sub['mask']);
0 ignored issues
show
The variable $sub does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
175
		break;
176
	  default:
177
		$query= sprintf("UPDATE `$table` SET `active` = '$status', `user` = '%s' WHERE `$table`.`$type` = '%s' LIMIT 1" ,$user, $value);
178
	}
179
180
        if ($return=$myconn->query($query) === TRUE) {
181
            syslog(LOG_INFO, "$user: change status of $type <$value>. The status is now <$status>");
182
        }
183
        else syslog(LOG_ERR, "$user: Error: ". $myconn->error);
184
	return $return;	
185
}
186
187
188
function expire ($myconn,$user,$tables,$expireTime) {
189
        $return=TRUE;
190
	$log=array();
191
	$desc = array_keys($tables);
192
	foreach ($desc as $tdesc) { 
193
		/* QUERY */
194
		$query  = 'DELETE FROM `'.$tables["$tdesc"]['name']."` WHERE `exp` < DATE_SUB( NOW(), INTERVAL $expireTime YEAR);";
195
		$query .= 'DELETE FROM `'.$tables["$tdesc"]['name']."` WHERE `datemod` < DATE_SUB( NOW(), INTERVAL $expireTime YEAR) AND `active` = 0";
196
		/* END OF QUERY */
197
		$log[0] = 'expired for';
198
		$log[1] = 'disabled for';
199
        	if ($myconn->multi_query($query)) {
200
			$j = 0;
201
			do {
202
		    		$numdel = $myconn->affected_rows;
203
	            		syslog(LOG_INFO, "Expire job - <$user> Permanently DELETED $numdel records ".$log[$j]." $expireTime YEARS from <".$tables["$tdesc"]['name'].'>.');
204
				$j++;
205
206
			} while ($myconn->next_result());
207
		}
208
		else {
209
			syslog(LOG_ERR, "Expire job - Error: ". $myconn->error);
210
			$return = FALSE;
211
		}
212
	}
213
	if ( !($return) ) syslog(LOG_EMERG, 'End of Expire job with error. See above logs. SQL Connection terminated');
214
	else  syslog(LOG_INFO, 'Successfully End of Expire job. SQL Connection successfully terminated.');
215
        return $return;
216
}
217
218
219
function isListed($row) {
220
221
	$exp=new DateTime($row['exp']);
222
	$now=new DateTime('NOW');
223
	if (($exp > $now) and ($row['active'])) return true;
224
	else return false;
225
226
}
227
228
229
function askMilter($myconn,$id,$obj,$typedesc,$miltId,$value,$user,$adm)  {
230
	$milts = readMiltName($myconn,$user);
231
	$size = count($milts);
232
	if (in_array($user,array_keys($adm))) {
233
		$button = <<<END
234
		<form style="margin:0; display:inline;" name="Milter$id" enctype="text/plain" method="post" target="_self" action="changeMilter.php" onSubmit="xmlhttpPost('changeMilter.php', 'Milter$id', 'id$id', '<img src=\'/include/pleasewait.gif\'>'); return false;" />
235
		<input name="object" type="hidden" value="$obj" /><input name="oldvalues" type="hidden" value="$value" />
236
		<input name="type" type="hidden" value="$typedesc" />
237
		<input name="user" type="hidden" value="$user" />
238
		<input name="miltId" type="hidden" value="$miltId" />
239
		<div class="noscroll">
240
		<select class="input_text" name="newvalues[]" multiple size="$size">
241
END;
242
		$activeMilts = explode(',',$value);
243
		foreach ( $milts as $milter ) {
0 ignored issues
show
The expression $milts of type false|array is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
244
			if ( in_array($milter, $activeMilts) )
245
				$selected= 'selected';
246
			else
247
				$selected= NULL;
248
			$button .= sprintf('<option value="%s" %s>%s</option>', $milter, $selected, $milter);
249
		}	
250
		$button .= '</select></div><input class="button" name="Change" type="submit" value="Change" /></form>';
251
		return $button;
252
	}
253
	return $value;	
254
255
256
}
257
258
259
function ask($myconn,$id,$what,$alltables,$typedesc,$value,$lock,$user,$adm) {
260
261
	$whynot=NULL;
262
	switch ($what) {
263
		case 'Ok':
264
			if ($lock) return NULL;
265
			if (in_array($user,array_keys($adm)))
266
				if ( consistentListing($myconn,$alltables,$typedesc,$value,$whynot) ) return require('relistButton.php');
267
			return htmlspecialchars($whynot);
268
		case 'Listed':
269
		case 'WhiteListed':
270
			return require('delistButton.php');
271
	}
272
}
273
274
275
function consistentListing($myconn,$alltables,$typed,$value,&$warn) {
276
/* Check if there are no pending mislisting */
277
	$warn = NULL;
278
	if (! isset($alltables["$typed"]['depend']) ) return TRUE;
279
	foreach ($alltables["$typed"]['depend'] as $listdep) {
280
		if ($alltables["$typed"]['field'] != $alltables["$listdep"]['field'] ) {
281
			$warn = "Config ERROR: <$typed> and <$listdep> are of different types! I can't check consistency!";
282
			return FALSE;
283
		}
284
		$entry = searchentry($myconn,$value,$alltables["$listdep"]);
285
		if ( $entry->num_rows ) {
286
			if ( $entry->num_rows == 1 ) {
287
				$riga = $entry->fetch_array(MYSQLI_ASSOC);
288
                        	if (isListed($riga)) {
289
					$warn = "<$value> is already present in <$listdep> list!";
290
					$entry->free();
291
					return FALSE;
292
				}
293
			}
294
			if ( $entry->num_rows > 1 ) {$warn = "<$value> seems to be present more than once in <$listdep>. Contact a sysadmin NOW!";}
295
		}
296
		$entry->free();
297
	}
298
299
	return TRUE;
300
}
301
302
function searchentry ($myconn,$value,$tablelist) {
303
/* Make a MYSQL query and return result */
304
305
        $type = $tablelist['field'];
306
	
307
	if ( $tablelist['milter'] ) {
308
		$table = milterTable($type);
309
		if ($value == 'ALL')
310
			$query = sprintf('SELECT *, GROUP_CONCAT(milt.name) as miltnames FROM `%s` LEFT JOIN milt ON (%s.idmilt=milt.id) GROUP by idmilt',
311
				$table,$table);
312
		else {
313
			switch ($type) {
314 View Code Duplication
				case 'network':
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
315
					list($sub['net'],$sub['mask'])=explode('/',$value);
316
					$query = sprintf('SELECT * FROM (
317
							SELECT *, GROUP_CONCAT(milt.name) as miltnames FROM `%s` LEFT JOIN milt ON (%s.idmilt=milt.id)
318
				 				WHERE (
319
									inet_aton(\'%s\') >= network AND
320
									( inet_aton(\'%s\') | ( inet_aton(\'%s\') ^ (power(2,32)-1) ) )
321
										<= network | ( netmask ^ (power(2,32)-1) )
322
								)
323
				 				GROUP by idmilt
324
							) AS val WHERE val.network IS NOT null', $table, $table, $sub['net'], $sub['net'], $sub['mask']);
0 ignored issues
show
The variable $sub does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
325
					break;
326
				case 'ip':
327
					$query = sprintf('SELECT * FROM (
328
							SELECT *, GROUP_CONCAT(milt.name) as miltnames FROM `%s` LEFT JOIN milt ON (%s.idmilt=milt.id)' .
329
                                                		'WHERE `ip` =  INET_ATON(\'%s\')
330
							 ) AS val WHERE val.ip IS NOT null', $table, $table, $value);
331
					break;
332
				default:
333
					syslog(LOG_EMERG, 'ALERT: The type <'.$type.'> is not allowed for milter lists.' );
334
					return FALSE;
335
			}
336
		}
337
	}
338
339
	else {
340
	        $table = $tablelist['name'];
341
	        if ($value == 'ALL') $query = 'select * from '.$table;
342
	        else {
343
	                switch ($type) {
344
	                  case 'ip':
345
	                        $query= "select * from $table where $type =  INET_ATON('$value')";
346
	                        break;
347 View Code Duplication
	                  case 'network':
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
348
	                        list($sub['net'],$sub['mask'])=explode('/',$value);
349
	                        $query= sprintf('select * from `%s`
350
						WHERE (
351
							inet_aton(\'%s\') >= network AND
352
							( inet_aton(\'%s\') | ( inet_aton(\'%s\') ^ (power(2,32)-1) ) )
353
								<= network | ( netmask ^ (power(2,32)-1) )
354
						)', $table, $sub['net'], $sub['net'], $sub['mask']);
355
;
356
	                        break;
357
	                  default:
358
	                        $query= "select * from $table where $type = '$value'";
359
	                }
360
	        }
361
	}
362
363
	$result = $myconn->query($query);
364
	if($result === false)
365
		syslog(LOG_EMERG, "ALERT: Query <$query> failed: ".$myconn->error);
366
        return $result;
367
}
368
369
function countListed ($myconn,$table) {
370
/* Return number of current listed items into a rbl table */
371
	$query = "SELECT COUNT(*) as `count` FROM `$table` WHERE (`active`=1 AND TIMESTAMPDIFF(MICROSECOND,NOW(),`exp`)>0) GROUP BY `active` ORDER BY `count` DESC LIMIT 1";
372
	$row = $myconn->query($query);
373
	$number = $row->fetch_array(MYSQLI_ASSOC);
374
	$number = $number['count'];
375
	$row->free();
376
	return $number;
377
}
378
379
380
function isFull($myconn,$typedesc,$alltables) {
381
        if (isset($alltables["$typedesc"]['limit'])) {
382
		if ( $alltables["$typedesc"]['milter'] )
383
			$tab = 'net';
384
		else
385
			$tab = $alltables["$typedesc"]['name'];
386
                if ( countListed($myconn,$tab) >= $alltables["$typedesc"]['limit'] ) 
387
                        return TRUE;
388
        }
389
	return FALSE;
390
}
391
392
function rlookup ($myconn,$user,$adm,$value,$typedesc,$tables) {
393
394
	$type = $tables["$typedesc"]['field'];
395
	$whynot=NULL;
396
397
	$tabhtm = <<<END
398
	<table><thead><tr><th>$type</th><th title="The date this object has been listed for the first time">DateAdd</th><th>DateMod</th><th>Exp</th><th>Status</th><th title="Number of times this object has been listed">#List</th>
399
END;
400
	if ( $tables["$typedesc"]['milter'] )
401
		$tabhtm .= '<th title="Milter active for this object">Milters</th>';
402
	$tabhtm .= '<th>Authored by</th><th width="250">Reason</th><th>Action</th></tr></thead><tfoot><tr></tr></tfoot><tbody>'."\n";
403
404
	$result = searchentry ($myconn,$value,$tables["$typedesc"]);
405
	if ($result) {
406
		printf("<pre>Your request for $type &lt;$value&gt; returned %d items.\n</pre>", $result->num_rows);
407
408
        /* Check for limit in number of listed items */
409
	$full = isFull($myconn,$typedesc,$tables);
410
	if ($full) print '<p>'.htmlspecialchars("$typedesc has reached maximum value of ".$tables["$typedesc"]['limit'].' listed items.').'</p>';
411
412
		if ($result->num_rows) {
413
			print $tabhtm;
414
			$i=0;
415
        		while ($riga = $result->fetch_array(MYSQLI_ASSOC)) {
416
				if (isListed($riga)) {
417
					if ($tables["$typedesc"]['bl']) $listed='Listed';
418
					else $listed='WhiteListed';
419
				}	
420
				else
421
					$listed='Ok';
422
423
				switch ($type) {
424
				  case 'ip':
425
					$element = long2ip($riga['ip']);
426
					break;
427 View Code Duplication
				  case 'network':
428
					$element = long2ip($riga['network']).'/'.long2ip($riga['netmask']);
429
					break;
430
				  default:
431
					$element = $riga["$type"];
432
				}
433
434
				if ( $tables["$typedesc"]['milter'] AND checkMilterConf($tables["$typedesc"]) )
0 ignored issues
show
Comprehensibility Best Practice introduced by
Using logical operators such as and instead of && is generally not recommended.

PHP has two types of connecting operators (logical operators, and boolean operators):

  Logical Operators Boolean Operator
AND - meaning and &&
OR - meaning or ||

The difference between these is the order in which they are executed. In most cases, you would want to use a boolean operator like &&, or ||.

Let’s take a look at a few examples:

// Logical operators have lower precedence:
$f = false or true;

// is executed like this:
($f = false) or true;


// Boolean operators have higher precedence:
$f = false || true;

// is executed like this:
$f = (false || true);

Logical Operators are used for Control-Flow

One case where you explicitly want to use logical operators is for control-flow such as this:

$x === 5
    or die('$x must be 5.');

// Instead of
if ($x !== 5) {
    die('$x must be 5.');
}

Since die introduces problems of its own, f.e. it makes our code hardly testable, and prevents any kind of more sophisticated error handling; you probably do not want to use this in real-world code. Unfortunately, logical operators cannot be combined with throw at this point:

// The following is currently a parse error.
$x === 5
    or throw new RuntimeException('$x must be 5.');

These limitations lead to logical operators rarely being of use in current PHP code.

Loading history...
435
					printf ("<tr id=id$i><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td nowrap id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td>%s</td></tr>\n",
436
					$element, $riga['date'], $riga['datemod'], $riga['exp'], $riga['active'], $riga['nlist'], askMilter($myconn,$i,$element,$typedesc,$riga['idmilt'],$riga['miltnames'],$user,$adm), $riga['user'],htmlspecialchars($riga['reason']),ask($myconn,$i,$listed,$tables,$typedesc,$element,$full,$user,$adm));
437
				else
438
					 printf ("<tr id=id$i><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td id='status$listed'>%s</td><td>%s</td></tr>\n",
439
					$element, $riga['date'], $riga['datemod'], $riga['exp'], $riga['active'], $riga['nlist'], $riga['user'],htmlspecialchars($riga['reason']),ask($myconn,$i,$listed,$tables,$typedesc,$element,$full,$user,$adm));
440
				$i++;
441
        		}
442
			print '</tbody></table>';
443
		}
444
		else {
445
			print "<pre>$type &lt;$value&gt; is not listed!\n</pre>";
446
			if ( in_array($user,array_keys($adm)) AND ($value != 'ALL') )
447
				if ( (!$full) AND (consistentListing($myconn,$tables,$typedesc,$value,$whynot)) ) require_once('listForm.php');
448
									else print '<p>'.htmlspecialchars($whynot).'</p>';
449
				
450
		}
451
		$result->free();
452
	}
453
	else print '<pre>Query error or something wrong in DB schema'."\n</pre>";
454
}
455
456
457
458
        
459
function sendEmailWarn($tplf,$from,$to,$sbj,$emailListed,$intervalToExpire,$detail) {
460
	$now = time();
461
        setlocale (LC_TIME, 'it_IT');
462
        $date = date("r",$now);
463
	$messageID = md5(uniqid($now,1)) . '@' . $_SERVER["HOSTNAME"];
464
	$mua = 'PHP/' . phpversion();
465
466
	/* Parsing headers */
467 View Code Duplication
	if (!file_exists($tplf['header'])) {
468
    		syslog(LOG_ERR, 'Sending email... template file <'.$tplf['header'].'> not found!');
469
    		exit;
470
	}
471
472
	$head_tmpl = file_get_contents($tplf['header']);
473
	$arr_tpl_vars = array('{from}','{to}','{date}','{messageID}','{mua}');
474
	$arr_tpl_data = array($from,$to,$date,$messageID,$mua);
475
	$headers = str_replace($arr_tpl_vars, $arr_tpl_data, $head_tmpl);
476
	$headers = preg_replace( '/\r|\n/', "\r\n", $headers );
477
478
        /* Parsing body */
479
480 View Code Duplication
        if (!file_exists($tplf['body'])) {
481
                syslog(LOG_ERR, 'Sending email... template file <'.$tplf['body'].'> not found!');
482
                exit;
483
        }
484
485
        $body_tmpl = file_get_contents($tplf['body']);
486
        $arr_tpl_vars = array('{emailListed}','{expInterval}','{reason}');
487
        $arr_tpl_data = array($emailListed,$intervalToExpire,$detail);
488
        $body = str_replace($arr_tpl_vars, $arr_tpl_data, $body_tmpl);
489
        $body = preg_replace( "/\r|\n/", "\r\n", $body );
490
	$body = wordwrap ( $body, 75 , "\r\n" );	
491
492
	/* Send the mail! */
493
        if ( strlen(ini_get("safe_mode"))< 1) {
494
                $old_mailfrom = ini_get("sendmail_from");
495
                ini_set("sendmail_from", $from);
496
                $params = sprintf("-oi -f %s", '<>');
497 View Code Duplication
                if (!(mail($to,$sbj, $body,$headers,$params))) $flag=FALSE;
498
                else $flag=TRUE;
499
                if (isset($old_mailfrom))
500
                        ini_set("sendmail_from", $old_mailfrom);
501
        }
502 View Code Duplication
        else {
503
                if (!(mail($to,$sbj, $body,$headers))) $flag=FALSE;
504
                else $flag=TRUE;
505
        }
506
        return $flag;
507
}
508
509
function emailToNotify($notify_file,$dom) {
510
	$ini_array = parse_ini_file($notify_file);
511
	if (in_array($dom,array_keys($ini_array)))
512
		return $ini_array["$dom"];
513
	else return FALSE;
514
}
515
516
517
function searchAndList ($myconn,$loguser,$tables,$typedesc,$value,$unit,&$quantity,$reason) {
518
519
/* Search and list value */
520
        $type = $tables["$typedesc"]['field'];
521
        $table = $tables["$typedesc"]['name'];
522
        $result = searchentry ($myconn,$value,$tables["$typedesc"]);
523
524
        /* Manage abnormal conditions */
525
        /* Value already present in db more than once. This is absurd. Panic! */
526
        if ($result->num_rows > 1) {
527
                syslog(LOG_EMERG,"$loguser: PANIC! Select for $type '$value' returned ". $result->num_rows ." items instead of one. Abnormal. Contact a sysadmin or a developer.");
528
                $result->free();
529
                return FALSE;
530
        }
531
532
        /* Value already present in db or not present: to list anyway */
533
        if ($result->num_rows >= 0) {
534
                /* First, check for limit in number of listed items */
535
                if (isFull($myconn,$typedesc,$tables)) {
536
                        syslog(LOG_EMERG,"$loguser: $typedesc has reached maximum value of ".$tables["$typedesc"]['limit'].' listed items. Abnormal exit.');
537
                        $result->free();
538
                        return FALSE;
539
                }
540
                /* Second, check if the (re)list would be consistent now */
541
                if (! consistentListing($myconn,$tables,$typedesc,$value,$whynot) ) {
542
                        syslog(LOG_ERR, $loguser.': '.$whynot);
543
                        $result->free();
544
                        return FALSE;
545
                }
546
        }
547
        /* End of abnormal conditions */
548
549
550
        /* Finally, here I can list the value! */
551
	$thisentry = $result->fetch_array(MYSQLI_ASSOC);
552
        switch ($result->num_rows) {
553
                /* Relist value if already present */
554
                case 1:
555
                        /* Entry already listed */
556
                        if ( isListed($thisentry) ) {
557
                                syslog(LOG_INFO, $loguser.': '.$value.' already listed. Nothing to do.');
558
                                $result->free();
559
                                return FALSE;
560
                        }
561
562
                        /* Entry delisted */
563
                        $result->free();
564
			$quantity *= $thisentry['nlist'];
565
                        return relist ($myconn,$loguser,$value,$type,$table,$unit,$quantity,$reason);
566
567
568
                /* First time list value */
569
                case 0:
570
                        $result->free();
571
                        return addtolist ($myconn,$loguser,$value,$type,$table,$unit,$quantity,$reason);
572
        }
573
}
574
575
576
/*************** Functions to check if two net overlap each other ********************/
577
578
function ipRange ($range) {
579
/* List IP in range */
580
	return array_map('long2ip', range( ip2long($range[0]), ip2long($range[1]) ) );
581
}
582
583
function isIn($netA, $netB) {
584
/* TRUE if an IP of $netA is contained in netB */
585
	list($addressA,$maskA) = explode('/', $netA);
586
	list($addressB,$maskB) = explode('/', $netB);
587
	require_once 'vendor/autoload.php';
588
	$net = new \dautkom\ipv4\IPv4();
589
	$range = $net->address($addressA)->mask($maskA)->getRange();
590
	$ips = ipRange($range);
591
	foreach ( $ips as $ip )
592
		if ( $net->address($addressB)->mask($maskB)->has($ip) )
593
			return TRUE;
594
	return FALSE;
595
}
596
597
function netOverlap($myconn, $tabletype, $net, &$thisNet, $loguser) {
598
/* return TRUE if $net overlap an existing network into DB */
599
	$thisNet = NULL;
600
	if ($tabletype['field'] != 'network') {
601
		syslog(LOG_ERR, $loguser.': '.$tabletype['name'].' is not a network list.');
602
		return FALSE;
603
	}
604
	$result = searchentry ($myconn,'ALL',$tabletype);
605
        if ($result->num_rows) {
606
		while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
607
			$thisNet = long2ip($row['network']).'/'.long2ip($row['netmask']);
608
			if ( isIn($thisNet, $net) ) {
609
				$result->free();
610
				syslog(LOG_INFO, "$loguser: the net <$net> overlaps the existing network <$thisNet>.");
611
				return TRUE;
612
			}
613
		}
614
	}
615
	$result->free();
616
	return FALSE;
617
}
618
619
/*********************************************************************************************/
620
621
622
/* For miltermap */
623
function checkMilterConf($table) {
624
	if (isset($table['milter'])) {
625
        	if ($table['milter'] ===  TRUE) {
626
			switch ( $table['field'] ) {
627
				case 'network':
628
				case 'ip':
629
					return TRUE;
630
			}
631
		}
632
	}
633
	return FALSE;
634
}			
635
636
/*
637
function enterDBMilt($myconn,$tables,$loguser) {
638
        if (!($myconn->select_db($tables('name')))) {
639
                syslog(LOG_ERR, $loguser.': Can\'t enter into DB '.$tables('name'));
640
                return FALSE;
641
        }
642
	return TRUE;
643
}
644
*/
645
646
function milterTable($t) {
647
	/* Return the milter object table for type t  or FALSE on error */
648
        switch ($t) {
649
                case 'network':
650
                        return 'net';
651
                case 'ip':
652
                        return 'ips';
653
                default:
654
			syslog(LOG_EMERG, "ALERT: type <$t> not allowed in configuration. ");
655
                        return FALSE;
656
        }
657
}
658
659
660
function readMiltName($myconn,$loguser) {
661
	$milters=array();
662
	$query = 'SELECT `name` FROM `config`';
663
664
        $result = $myconn->query($query);
665
        if($result === false) {
666
                syslog(LOG_EMERG, "$loguser: ALERT: Query <$query> failed: ".$myconn->error);
667
		return FALSE;
668
	}
669
	if ($result->num_rows) {
670
		while ($milt = $result->fetch_array(MYSQLI_ASSOC))
671
			$milters[] = $milt['name'];
672
	}
673
	$result->free();
674
	return $milters;
675
}
676
677
function changeMilter ($myconn,$loguser,$miltVal,$table,$miltID) {
678
	$query = array();
679
	foreach ( $miltVal as $value => $action ) {
680
		switch ( $action ) {
681
			case 'keep':
682
				break;
683
			case 'add':
684
				$query[] = sprintf( "INSERT INTO `milt` (
685
                		        	`id` ,
686
                        			`name` 
687
                			)
688
                			VALUES (
689
                        			%d ,
690
						'%s'
691
					)",$miltID,$value);
692
				break;
693
			case 'del':
694
				$query[] = "DELETE FROM  `milt` WHERE (`id` = '$miltID' AND `name` = '$value')";
695
		}
696
	}
697
	if ( count($query) ) /* This "if" is redundant, because if I call this I already checked there is a change */
698
		/* I update datemod because the user couldn't change */
699
		$query[] = sprintf('UPDATE `%s` SET
700
						`user`=\'%s\',
701
						`datemod`= CURRENT_TIMESTAMP
702
					 WHERE `idmilt`=%d', $table, $loguser, $miltID);
703
704
705
	/* Start a safe transaction: it commits only if all queries happen */
706
	$myconn->autocommit(FALSE);
707
	$myconn->begin_transaction(MYSQLI_TRANS_START_READ_ONLY);
708
	$ok = TRUE;
709
	foreach ( $query as $q ) {
710
		if ($myconn->query($q) !== TRUE) {
711
			$ok = FALSE;
712
			syslog(LOG_ERR, "$loguser: Error: ".$myconn->error);
713
		}
714
	}
715
	if ( $ok ) {
716
		if ( $myconn->commit() )
717
			syslog(LOG_INFO, "$loguser: Milter setting changed successfully.");
718
		else {
719
			syslog(LOG_ERR, "$loguser: Milter setting NOT changed for an unpredictable COMMIT error.");
720
			if ( $myconn->rollback() )
721
				syslog(LOG_INFO, "$loguser: rollback succeeded.");
722
			else
723
				syslog(LOG_ERR, "$loguser: rollback failed. Your db could be compromized. Check it!");
724
			$ok = FALSE;
725
		}
726
	}
727
	else
728
		syslog(LOG_ERR, "$loguser: Error: Milter setting NOT changed. See at above errors.");
729
	return $ok;
730
		
731
}
732
	
733
734
/*
0 ignored issues
show
Unused Code Comprehensibility introduced by
56% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
735
function checkEmailAddress($email) {
736
	if(preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/", $email))
737
		return true;
738
	return false;
739
}
740
741
function checkIP($ip)
742
{
743
	$cIP = ip2long($ip);
744
	$fIP = long2ip($cIP);
745
	if ($fIP == '0.0.0.0') return FALSE;
746
	return TRUE;
747
}
748
*/
749
750
?>
751
752