2012-09-20 11:34:41 +02:00
< ? php
App :: import ( 'Lib' , 'SysLog.SysLog' ); // Audit, syslogd, extra
class SysLogLogableBehavior extends LogableBehavior {
2013-11-06 10:35:51 +01:00
function afterSave ( Model $Model , $created , $options = array ()) {
2012-09-20 11:34:41 +02:00
if ( ! $this -> settings [ $Model -> alias ][ 'enabled' ]) {
return true ;
}
if ( isset ( $this -> settings [ $Model -> alias ][ 'skip' ][ 'add' ]) && $this -> settings [ $Model -> alias ][ 'skip' ][ 'add' ] && $created ) {
return true ;
} elseif ( isset ( $this -> settings [ $Model -> alias ][ 'skip' ][ 'edit' ]) && $this -> settings [ $Model -> alias ][ 'skip' ][ 'edit' ] && ! $created ) {
return true ;
}
$keys = array_keys ( $Model -> data [ $Model -> alias ]);
$diff = array_diff ( $keys , $this -> settings [ $Model -> alias ][ 'ignore' ]);
if ( sizeof ( $diff ) == 0 && empty ( $Model -> logableAction )) {
return false ;
}
if ( $Model -> id ) {
$id = $Model -> id ;
} elseif ( $Model -> insertId ) {
$id = $Model -> insertId ;
}
if ( isset ( $this -> schema [ $this -> settings [ $Model -> alias ][ 'foreignKey' ]])) {
$logData [ 'Log' ][ $this -> settings [ $Model -> alias ][ 'foreignKey' ]] = $id ;
}
if ( isset ( $this -> schema [ 'description' ])) {
$logData [ 'Log' ][ 'description' ] = $Model -> alias . ' ' ;
if ( isset ( $Model -> data [ $Model -> alias ][ $Model -> displayField ]) && $Model -> displayField != $Model -> primaryKey ) {
$logData [ 'Log' ][ 'description' ] .= '"' . $Model -> data [ $Model -> alias ][ $Model -> displayField ] . '" ' ;
}
if ( $this -> settings [ $Model -> alias ][ 'description_ids' ]) {
$logData [ 'Log' ][ 'description' ] .= '(' . $id . ') ' ;
}
if ( $created ) {
$logData [ 'Log' ][ 'description' ] .= __ ( 'added' , TRUE );
} else {
$logData [ 'Log' ][ 'description' ] .= __ ( 'updated' , TRUE );
}
}
if ( isset ( $this -> schema [ 'action' ])) {
if ( $created ) {
$logData [ 'Log' ][ 'action' ] = 'add' ;
} else {
$logData [ 'Log' ][ 'action' ] = 'edit' ;
2016-05-06 23:48:01 +02:00
if ( $Model -> alias === 'Attribute' && isset ( $Model -> data [ $Model -> alias ][ 'deleted' ]) && $Model -> data [ $Model -> alias ][ 'deleted' ]) {
$logData [ 'Log' ][ 'action' ] = 'delete' ;
unset ( $this -> schema [ 'change' ]);
}
2016-05-10 10:31:56 +02:00
if ( $Model -> alias === 'Attribute' && isset ( $Model -> data [ $Model -> alias ][ 'deleted' ]) && ! $Model -> data [ $Model -> alias ][ 'deleted' ] && $this -> old [ $Model -> alias ][ 'deleted' ]) {
$logData [ 'Log' ][ 'action' ] = 'undelete' ;
unset ( $this -> schema [ 'change' ]);
}
2012-09-20 11:34:41 +02:00
}
}
if ( isset ( $this -> schema [ 'change' ])) {
$logData [ 'Log' ][ 'change' ] = '' ;
$db_fields = array_keys ( $Model -> schema ());
$changed_fields = array ();
foreach ( $Model -> data [ $Model -> alias ] as $key => $value ) {
if ( isset ( $Model -> data [ $Model -> alias ][ $Model -> primaryKey ]) && ! empty ( $this -> old ) && isset ( $this -> old [ $Model -> alias ][ $key ])) {
$old = $this -> old [ $Model -> alias ][ $key ];
} else {
$old = '' ;
}
// TODO Audit, removed 'revision' as well
2014-01-29 15:52:09 +01:00
if ( $key != 'lastpushedid' && $key != 'timestamp' && $key != 'revision' && $key != 'modified' && ! in_array ( $key , $this -> settings [ $Model -> alias ][ 'ignore' ]) && $value != $old && in_array ( $key , $db_fields )) {
2012-09-20 11:34:41 +02:00
if ( $this -> settings [ $Model -> alias ][ 'change' ] == 'full' ) {
2012-10-31 09:03:05 +01:00
if (( $key != 'published' ) || (( $key == 'published' ) && ( $value == '1' ))) { // remove (un-)published from edit
$changed_fields [] = $key . ' (' . $old . ') => (' . $value . ')' ;
}
2012-09-20 11:34:41 +02:00
} else if ( $this -> settings [ $Model -> alias ][ 'change' ] == 'serialize' ) {
$changed_fields [ $key ] = array (
'old' => $old ,
'value' => $value );
} else {
$changed_fields [] = $key ;
}
2012-10-31 09:03:05 +01:00
if (( $key == 'published' ) && ( $value == '1' )) { // published action correction
$logData [ 'Log' ][ 'action' ] = 'publish' ;
}
2012-09-20 11:34:41 +02:00
}
}
$changes = sizeof ( $changed_fields );
if ( $changes == 0 ) {
return true ;
}
if ( $this -> settings [ $Model -> alias ][ 'change' ] == 'serialize' ) {
$logData [ 'Log' ][ 'change' ] = serialize ( $changed_fields );
} else {
$logData [ 'Log' ][ 'change' ] = implode ( ', ' , $changed_fields );
}
$logData [ 'Log' ][ 'changes' ] = $changes ;
}
$this -> _saveLog ( $Model , $logData );
}
function _saveLog ( & $Model , $logData , $title = null ) {
if ( $title !== NULL ) {
$logData [ 'Log' ][ 'title' ] = $title ;
} elseif ( $Model -> displayField == $Model -> primaryKey ) {
$logData [ 'Log' ][ 'title' ] = $Model -> alias . ' (' . $Model -> id . ')' ;
} elseif ( isset ( $Model -> data [ $Model -> alias ][ $Model -> displayField ])) {
2012-10-31 15:34:43 +01:00
if (( $Model -> alias == " User " ) && ( $logData [ 'Log' ][ 'action' ] != 'edit' )) {
$logData [ 'Log' ][ 'title' ] = 'User (' . $Model -> data [ $Model -> alias ][ $Model -> primaryKey ] . '): ' . $Model -> data [ $Model -> alias ][ $Model -> displayField ];
} else {
$logData [ 'Log' ][ 'title' ] = $Model -> data [ $Model -> alias ][ $Model -> displayField ];
}
2012-09-20 11:34:41 +02:00
} else {
$logData [ 'Log' ][ 'title' ] = $Model -> field ( $Model -> displayField );
}
if ( isset ( $this -> schema [ $this -> settings [ $Model -> alias ][ 'classField' ]])) {
// by miha nahtigal
$logData [ 'Log' ][ $this -> settings [ $Model -> alias ][ 'classField' ]] = $Model -> name ;
}
if ( isset ( $this -> schema [ $this -> settings [ $Model -> alias ][ 'foreignKey' ]]) && ! isset ( $logData [ 'Log' ][ $this -> settings [ $Model -> alias ][ 'foreignKey' ]])) {
if ( $Model -> id ) {
$logData [ 'Log' ][ $this -> settings [ $Model -> alias ][ 'foreignKey' ]] = $Model -> id ;
} elseif ( $Model -> insertId ) {
$logData [ 'Log' ][ $this -> settings [ $Model -> alias ][ 'foreignKey' ]] = $Model -> insertId ;
}
}
if ( ! isset ( $this -> schema [ 'action' ])) {
unset ( $logData [ 'Log' ][ 'action' ]);
} elseif ( isset ( $Model -> logableAction ) && ! empty ( $Model -> logableAction )) {
$logData [ 'Log' ][ 'action' ] = implode ( ',' , $Model -> logableAction ); // . ' ' . $logData['Log']['action'];
unset ( $Model -> logableAction );
}
if ( isset ( $this -> schema [ 'version_id' ]) && isset ( $Model -> version_id )) {
$logData [ 'Log' ][ 'version_id' ] = $Model -> version_id ;
unset ( $Model -> version_id );
}
2016-06-04 01:08:16 +02:00
2012-09-20 11:34:41 +02:00
if ( isset ( $this -> schema [ $this -> settings [ $Model -> alias ][ 'userKey' ]]) && $this -> user ) {
$logData [ 'Log' ][ $this -> settings [ $Model -> alias ][ 'userKey' ]] = $this -> user [ $this -> UserModel -> alias ][ $this -> UserModel -> primaryKey ];
}
if ( isset ( $this -> schema [ 'description' ])) {
if ( $this -> user && $this -> UserModel ) {
$logData [ 'Log' ][ 'description' ] .= ' by ' . $this -> settings [ $Model -> alias ][ 'userModel' ] . ' "' . $this -> user [ $this -> UserModel -> alias ][ $this -> UserModel -> displayField ] . '"' ;
if ( $this -> settings [ $Model -> alias ][ 'description_ids' ]) {
$logData [ 'Log' ][ 'description' ] .= ' (' . $this -> user [ $this -> UserModel -> alias ][ $this -> UserModel -> primaryKey ] . ')' ;
}
} else {
// UserModel is active, but the data hasnt been set. Assume system action.
$logData [ 'Log' ][ 'description' ] .= ' by System' ;
}
$logData [ 'Log' ][ 'description' ] .= '.' ;
}
if ( isset ( $this -> schema [ 'email' ])) { // TODO Audit, LogableBehevior email
if ( $this -> user && $this -> UserModel ) {
$logData [ 'Log' ][ 'email' ] = $this -> user [ $this -> UserModel -> alias ][ $this -> UserModel -> displayField ];
} else {
// UserModel is active, but the data hasnt been set. Assume system action.
$logData [ 'Log' ][ 'email' ] = 'SYS' ;
}
}
if ( isset ( $this -> schema [ 'org' ])) { // TODO Audit, LogableBehevior org CHECK!!!
if ( $this -> user && $this -> UserModel ) {
2015-11-08 23:26:19 +01:00
$logData [ 'Log' ][ 'org' ] = $this -> user [ $this -> UserModel -> alias ][ 'Organisation' ][ 'name' ];
2012-09-20 11:34:41 +02:00
} else {
// UserModel is active, but the data hasnt been set. Assume system action.
$logData [ 'Log' ][ 'org' ] = 'SYS' ;
}
}
if ( isset ( $this -> schema [ 'title' ])) { // TODO LogableBehevior title
if ( $this -> user && $this -> UserModel ) { // $Model->data[$Model->alias][$Model->displayField]
switch ( $Model -> alias ) {
case " Attribute " :
if ( isset ( $Model -> combinedKeys )) {
if ( is_array ( $Model -> combinedKeys )) {
$title = 'Attribute (' . $Model -> data [ $Model -> alias ][ 'id' ] . ') ' . 'from Event (' . $Model -> data [ $Model -> alias ][ 'event_id' ] . '): ' . $Model -> data [ $Model -> alias ][ $Model -> combinedKeys [ 1 ]] . '/' . $Model -> data [ $Model -> alias ][ $Model -> combinedKeys [ 2 ]] . ' ' . $Model -> data [ $Model -> alias ][ 'value1' ];
2014-01-28 16:27:58 +01:00
$logData [ 'Log' ][ 'title' ] = $title ;
}
}
break ;
2015-04-20 11:46:55 +02:00
case " Event " :
$title = 'Event (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'info' ];
$logData [ 'Log' ][ 'title' ] = $title ;
break ;
case " Organisation " :
$title = 'Organisation (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'name' ];
break ;
case " Post " :
$title = 'Post (' . $Model -> data [ $Model -> alias ][ 'id' ] . ')' ;
break ;
case " Regexp " :
$title = 'Regexp (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'regexp' ];
$logData [ 'Log' ][ 'title' ] = $title ;
break ;
case " Role " :
$title = 'Role (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'name' ];
$logData [ 'Log' ][ 'title' ] = $title ;
break ;
case " Server " :
$title = 'Server (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'url' ];
$logData [ 'Log' ][ 'title' ] = $title ;
break ;
2014-01-28 16:27:58 +01:00
case " ShadowAttribute " :
if ( isset ( $Model -> combinedKeys )) {
if ( is_array ( $Model -> combinedKeys )) {
2015-04-20 11:46:55 +02:00
$title = 'Proposal (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . 'to Event (' . $Model -> data [ $Model -> alias ][ 'event_id' ] . '): ' . $Model -> data [ $Model -> alias ][ $Model -> combinedKeys [ 1 ]] . '/' . $Model -> data [ $Model -> alias ][ $Model -> combinedKeys [ 2 ]] . ' ' . $Model -> data [ $Model -> alias ][ 'value1' ];
2012-09-20 11:34:41 +02:00
$logData [ 'Log' ][ 'title' ] = $title ;
}
}
break ;
2015-04-20 11:46:55 +02:00
case " SharingGroup " :
$title = 'SharingGroup (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'name' ];
2012-09-20 11:34:41 +02:00
break ;
2015-04-20 11:46:55 +02:00
case " Tag " :
$title = 'Tag (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'name' ];
break ;
case " Thread " :
$title = 'Thread (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'title' ];
break ;
case " User " : // TODO Audit, not used here but done in UsersController
if (( $logData [ 'Log' ][ 'action' ] == 'edit' ) || ( $logData [ 'Log' ][ 'action' ] == 'delete' )) {
return ; // handle in model itself
}
$title = 'User (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'email' ];
2013-03-07 11:51:43 +01:00
break ;
case " Whitelist " :
$title = 'Whitelist (' . $Model -> data [ $Model -> alias ][ 'id' ] . '): ' . $Model -> data [ $Model -> alias ][ 'name' ];
$logData [ 'Log' ][ 'title' ] = $title ;
break ;
2012-09-20 11:34:41 +02:00
default :
if ( isset ( $Model -> combinedKeys )) {
if ( is_array ( $Model -> combinedKeys )) {
$title = '' ;
foreach ( $Model -> combinedKeys as $combinedKey ) {
$title .= '/' . $Model -> data [ $Model -> alias ][ $combinedKey ];
}
$title = substr ( $title , 1 );
$logData [ 'Log' ][ 'title' ] = $title ;
}
}
}
}
}
$this -> Log -> create ( $logData );
$this -> Log -> save ( null , array (
2015-11-08 22:35:46 +01:00
'validate' => false ));
2016-06-04 01:08:16 +02:00
2012-09-20 11:34:41 +02:00
// write to syslogd as well
$syslog = new SysLog ();
if ( isset ( $logData [ 'Log' ][ 'change' ])) {
$syslog -> write ( 'notice' , $logData [ 'Log' ][ 'description' ] . ' -- ' . $logData [ 'Log' ][ 'change' ]);
} else {
$syslog -> write ( 'notice' , $logData [ 'Log' ][ 'description' ]);
}
}
2016-06-04 01:08:16 +02:00
2015-10-06 01:16:48 +02:00
function setup ( Model $Model , $config = array ()) {
2016-06-04 01:08:16 +02:00
2015-10-06 01:16:48 +02:00
if ( ! is_array ( $config )) {
$config = array ();
}
$this -> settings [ $Model -> alias ] = array_merge ( $this -> defaults , $config );
$this -> settings [ $Model -> alias ][ 'ignore' ][] = $Model -> primaryKey ;
2016-06-04 01:08:16 +02:00
2015-10-06 01:16:48 +02:00
$this -> Log = ClassRegistry :: init ( 'Log' );
if ( $this -> settings [ $Model -> alias ][ 'userModel' ] != $Model -> alias ) {
$this -> UserModel = ClassRegistry :: init ( $this -> settings [ $Model -> alias ][ 'userModel' ]);
} else {
$this -> UserModel = $Model ;
}
$this -> schema = $this -> Log -> schema ();
App :: import ( 'Component' , 'Auth' );
2015-10-18 23:10:25 +02:00
$user = AuthComponent :: user ();
if ( ! empty ( $user )) $this -> user [ $this -> settings [ $Model -> alias ][ 'userModel' ]] = AuthComponent :: user ();
2015-10-06 01:16:48 +02:00
else $this -> user [ 'User' ] = array ( 'email' => 'SYSTEM' , 'Organisation' => array ( 'name' => 'SYSTEM' ), 'id' => 0 );
}
2015-10-18 23:10:25 +02:00
}