* @param $suid the id of the administrator who has just su'd to the user
* @return session the session id
*/
- function writeSession($uid, $suid = null) {
+ function writeSession($uid, $suid = null)
+ {
$ip = $_SERVER['REMOTE_ADDR'];
$host = strtolower(gethostbyaddr($_SERVER['REMOTE_ADDR']));
$browser = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '');
+ @list($forward_ip,) = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
+ $forward_host = $forward_ip;
+ if ($forward_host) {
+ $forward_host = strtolower(gethostbyaddr($forward_host));
+ }
+ $proxy = '';
+ if ($forward_ip || @$_SERVER['HTTP_VIA']) {
+ $proxy = 'proxy';
+ }
+
XDB::execute("INSERT INTO logger.sessions
- SET uid={?}, host={?}, ip={?}, browser={?}, suid={?}",
- $uid, $host, $ip, $browser, $suid);
+ SET uid={?}, host={?}, ip={?}, forward_ip={?}, forward_host={?}, browser={?}, suid={?}, flags={?}",
+ $uid, $host, $ip, $forward_ip, $forward_host, $browser, $suid, $proxy);
return XDB::insertId();
}
function check_ip($level)
{
if (empty($_SERVER['REMOTE_ADDR'])) {
- return 0;
+ return false;
}
if (empty($_SESSION['check_ip'])) {
- $res = XDB::query('SELECT state FROM ip_watch WHERE ip = {?}', $_SERVER['REMOTE_ADDR']);
+ $ips = array();
+ if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
+ $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
+ }
+ $ips[] = $_SERVER['REMOTE_ADDR'];
+ foreach ($ips as &$ip) {
+ $ip = "ip='$ip'";
+ }
+ $res = XDB::query('SELECT state
+ FROM ip_watch
+ WHERE ' . implode(' OR ', $ips) . '
+ ORDER BY state DESC');
if ($res->numRows()) {
$_SESSION['check_ip'] = $res->fetchOneCell();
} else {
$page->assign('action', $action);
if ($action == 'list') {
- $sql = "SELECT w.ip, s.host, w.detection, w.state, a.alias AS forlife
+ $sql = "SELECT w.ip, IF(w.ip = s.ip, s.host, s.forward_host), w.detection, w.state, a.alias AS forlife
FROM ip_watch AS w
- LEFT JOIN logger.sessions AS s USING(ip)
+ LEFT JOIN logger.sessions AS s ON (s.ip = w.ip OR s.forward_ip = w.ip)
LEFT JOIN aliases AS a ON (a.id = s.uid AND a.type = 'a_vie')
GROUP BY w.ip, a.alias
ORDER BY w.state, w.ip, a.alias";
<td>{$session.username} {if $session.suer}(suid by {$session.suer}){/if}
[<a href="{$platal->ns}admin/logger/user/{$session.username}">user's log</a>]</td>
</tr>
+{if $session.forward_ip}
<tr class="pair">
<td class="titre">Hôte</td>
+ <td><em>{$session.forward_host}</em> <tt>IP: {$session.forward_ip}</tt></td>
+</tr>
+<tr class="pair">
+ <td class="titre">Proxy</td>
<td><em>{$session.host}</em> <tt>IP: {$session.ip}</tt></td>
</tr>
+{else}
+<tr class="pair">
+ <td class="titre">{if $session.flags}Proxy{else}Hôte{/if}</td>
+ <td><em>{$session.host}</em> <tt>IP: {$session.ip}</tt></td>
+</tr>
+{/if}
<tr class="impair">
<td class="titre">Navigateur</td>
<td>{$session.browser}</td>
`description` TEXT NOT NULL,
PRIMARY KEY(`ip`)
);
-use logger;
-alter table sessions add key(ip);
-insert into actions (text, description) values ('view_page', 'Consultation d\'une page');
-use x4dat;
# vim:set syntax=mysql:
--- /dev/null
+use logger;
+alter table sessions add column forward_ip varchar(64) default NULL;
+alter table sessions add column forward_host varchar(128) default NULL;
+alter table sessions add column set('proxy') NOT NULL default '';
+alter table sessions add key(forward_ip);
+alter table sessions add key(ip);
+insert into actions (text, description) values ('view_page', 'Consultation d\'une page');
+use x4dat;
+
+# vim:set syntax=mysql: