Changeset 221


Ignore:
Timestamp:
07/21/09 15:21:32 (8 years ago)
Author:
sander
Message:

Track IP addresses on requests

Location:
trunk/server/www/app
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/server/www/app/config/bootstrap.php

    r48 r221  
    2525 * @license       http://www.opensource.org/licenses/mit-license.php The MIT License 
    2626 */ 
     27 
    2728/** 
    2829 * 
     
    3233 * 
    3334 */ 
     35 
     36/** 
     37 * Convert an IP address from presentation to decimal(39,0) format suitable for storage in MySQL 
     38 * 
     39 * @param string $ip_address An IP address in IPv4, IPv6 or decimal notation 
     40 * @return string The IP address in decimal notation 
     41 */ 
     42function inet_ptod($ip_address) 
     43{ 
     44        // IPv4 address 
     45        if (strpos($ip_address, ':') === false && strpos($ip_address, '.') !== false) { 
     46                $ip_address = '::' . $ip_address; 
     47        } 
     48 
     49        // IPv6 address 
     50        if (strpos($ip_address, ':') !== false) { 
     51                $network = inet_pton($ip_address); 
     52                $parts = unpack('N*', $network); 
     53 
     54                foreach ($parts as &$part) { 
     55                        if ($part < 0) { 
     56                                $part = bcadd((string) $part, '4294967296'); 
     57                        } 
     58 
     59                        if (!is_string($part)) { 
     60                                $part = (string) $part; 
     61                        } 
     62                } 
     63 
     64                $decimal = $parts[4]; 
     65                $decimal = bcadd($decimal, bcmul($parts[3], '4294967296')); 
     66                $decimal = bcadd($decimal, bcmul($parts[2], '18446744073709551616')); 
     67                $decimal = bcadd($decimal, bcmul($parts[1], '79228162514264337593543950336')); 
     68 
     69                return $decimal; 
     70        } 
     71 
     72        // Decimal address 
     73        return $ip_address; 
     74} 
     75 
     76/** 
     77 * Convert an IP address from decimal format to presentation format 
     78 * 
     79 * @param string $decimal An IP address in IPv4, IPv6 or decimal notation 
     80 * @return string The IP address in presentation format 
     81 */ 
     82function inet_dtop($decimal) 
     83{ 
     84        // IPv4 or IPv6 format 
     85        if (strpos($decimal, ':') !== false || strpos($decimal, '.') !== false) { 
     86                return $decimal; 
     87        } 
     88 
     89        // Decimal format 
     90        $parts = array(); 
     91        $parts[1] = bcdiv($decimal, '79228162514264337593543950336', 0); 
     92        $decimal = bcsub($decimal, bcmul($parts[1], '79228162514264337593543950336')); 
     93        $parts[2] = bcdiv($decimal, '18446744073709551616', 0); 
     94        $decimal = bcsub($decimal, bcmul($parts[2], '18446744073709551616')); 
     95        $parts[3] = bcdiv($decimal, '4294967296', 0); 
     96        $decimal = bcsub($decimal, bcmul($parts[3], '4294967296')); 
     97        $parts[4] = $decimal; 
     98 
     99        foreach ($parts as &$part) { 
     100                if (bccomp($part, '2147483647') == 1) { 
     101                        $part = bcsub($part, '4294967296'); 
     102                } 
     103 
     104                $part = (int) $part; 
     105        } 
     106 
     107        $network = pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]); 
     108        $ip_address = inet_ntop($network); 
     109 
     110        // Turn IPv6 to IPv4 if it's IPv4 
     111        if (preg_match('/^::\d+.\d+.\d+.\d+$/', $ip_address)) { 
     112                return substr($ip_address, 2); 
     113        } 
     114 
     115        return $ip_address; 
     116} 
     117 
    34118/** 
    35119 * The settings below can be used to set additional paths to models, views and controllers. 
  • trunk/server/www/app/config/sql/schema.php

    r207 r221  
    11<?php  
    22/* SVN FILE: $Id$ */ 
    3 /* App schema generated on: 2009-06-22 11:06:42 : 1245663762*/ 
     3/* App schema generated on: 2009-07-21 15:07:35 : 1248182195*/ 
    44class AppSchema extends CakeSchema { 
    55        var $name = 'App'; 
     
    119119                        'id' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 36, 'key' => 'primary'), 
    120120                        'user_id' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 36), 
     121                        'ip_address' => array('type' => 'float', 'null' => false, 'default' => NULL, 'length' => 39, 'key' => 'index'), 
    121122                        'filename' => array('type' => 'string', 'null' => false, 'default' => NULL), 
    122123                        'path' => array('type' => 'string', 'null' => false, 'default' => NULL), 
     
    134135                        'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 
    135136                        'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 
    136                         'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)) 
     137                        'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'ip_address' => array('column' => 'ip_address', 'unique' => 0)) 
    137138                ); 
    138139        var $results = array( 
  • trunk/server/www/app/controllers/requests_controller.php

    r204 r221  
    2525{ 
    2626        /** @var array The components this controller uses */ 
    27         public $components = array('AuthCert'); 
     27        public $components = array('AuthCert', 'RequestHandler'); 
    2828         
    2929        /** @var array The helpers that will be available on the view */ 
     
    128128                        $this->Request->create(); 
    129129                        $this->data['Request']['user_id'] = (string) $this->AuthCert->user('id'); 
     130                        $this->data['Request']['ip_address'] = inet_ptod($this->RequestHandler->getClientIP()); 
    130131 
    131132                        // Add the jobs to the request 
     
    300301        { 
    301302                if (!empty($this->data)) { 
     303                        $this->data['Request']['ip_address'] = inet_ptod($this->data['Request']['ip_address']); 
    302304                        $this->Request->create(); 
    303305                        if ($this->Request->save($this->data)) { 
     
    311313                } 
    312314                $users = $this->Request->User->find('list'); 
    313                 $doctypes = $this->Request->Doctype->find('list'); 
    314                 $this->set(compact('users', 'doctypes')); 
     315                $mimetypes = $this->Request->Mimetype->find('list'); 
     316                $formats = $this->Request->Format->find('list'); 
     317                $this->set(compact('users','mimetypes','formats')); 
    315318        } 
    316319 
     
    328331                } 
    329332                if (!empty($this->data)) { 
     333                        $this->data['Request']['ip_address'] = inet_ptod($this->data['Request']['ip_address']); 
    330334                        if ($this->Request->save($this->data)) { 
    331335                                $this->Session->setFlash(__('The Request has been saved', true)); 
     
    339343                if (empty($this->data)) { 
    340344                        $this->data = $this->Request->read(null, $id); 
     345                        $this->data['Request']['ip_address'] = inet_dtop($this->data['Request']['ip_address']); 
    341346                } 
    342347                $users = $this->Request->User->find('list'); 
    343                 $doctypes = $this->Request->Doctype->find('list'); 
    344                 $this->set(compact('users','doctypes')); 
     348                $mimetypes = $this->Request->Mimetype->find('list'); 
     349                $formats = $this->Request->Format->find('list'); 
     350                $this->set(compact('users','mimetypes','formats')); 
    345351        } 
    346352 
  • trunk/server/www/app/views/requests/admin_add.ctp

    r31 r221  
    55        <?php 
    66                echo $form->input('user_id'); 
    7                 echo $form->input('doctype_id'); 
     7                echo $form->input('ip_address'); 
     8                echo $form->input('format_id', array('empty' => true)); 
    89                echo $form->input('filename'); 
    910                echo $form->input('path'); 
    10                 echo $form->input('mimetype'); 
     11                echo $form->input('mimetype_id'); 
    1112        ?> 
    1213        </fieldset> 
  • trunk/server/www/app/views/requests/admin_edit.ctp

    r31 r221  
    66                echo $form->input('id'); 
    77                echo $form->input('user_id'); 
    8                 echo $form->input('doctype_id'); 
     8                echo $form->input('ip_address'); 
     9                echo $form->input('format_id', array('empty' => true)); 
    910                echo $form->input('filename'); 
    1011                echo $form->input('path'); 
    11                 echo $form->input('mimetype'); 
     12                echo $form->input('mimetype_id'); 
    1213        ?> 
    1314        </fieldset> 
  • trunk/server/www/app/views/requests/admin_index.ctp

    r31 r221  
    1111        <th><?php echo $paginator->sort('id');?></th> 
    1212        <th><?php echo $paginator->sort('user_id');?></th> 
     13        <th><?php echo $paginator->sort('ip_address');?></th> 
    1314        <th><?php echo $paginator->sort('doctype_id');?></th> 
    1415        <th><?php echo $paginator->sort('filename');?></th> 
     
    3334                <td> 
    3435                        <?php echo $html->link($request['User']['email_address'], array('controller'=> 'users', 'action'=>'view', $request['User']['id'])); ?> 
     36                </td> 
     37                <td> 
     38                        <?php echo inet_dtop($request['Request']['ip_address']); ?> 
    3539                </td> 
    3640                <td> 
  • trunk/server/www/app/views/requests/admin_view.ctp

    r128 r221  
    1212                        &nbsp; 
    1313                </dd> 
    14                 <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Doctype'); ?></dt> 
     14                <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('IP address'); ?></dt> 
    1515                <dd<?php if ($i++ % 2 == 0) echo $class;?>> 
    16                         <?php echo $html->link($request['Doctype']['name'], array('controller'=> 'doctypes', 'action'=>'view', $request['Doctype']['id'])); ?> 
     16                        <?php echo inet_dtop($request['Request']['ip_address']); ?> 
     17                        &nbsp; 
     18                </dd> 
     19                <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Format'); ?></dt> 
     20                <dd<?php if ($i++ % 2 == 0) echo $class;?>> 
     21                        <?php echo $html->link($request['Format']['name'], array('controller'=> 'formats', 'action'=>'view', $request['Format']['id'])); ?> 
    1722                        &nbsp; 
    1823                </dd> 
     
    2934                <dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Mimetype'); ?></dt> 
    3035                <dd<?php if ($i++ % 2 == 0) echo $class;?>> 
    31                         <?php echo $request['Request']['mimetype']; ?> 
     36                        <?php echo $html->link($request['Mimetype']['name'], array('controller'=> 'mimetypes', 'action'=>'view', $request['Mimetype']['id'])); ?> 
    3237                        &nbsp; 
    3338                </dd> 
Note: See TracChangeset for help on using the changeset viewer.