/** * @param array $logs */ protected function processLogs($logs) { $auditLogs = array(); $auditRequestId = $this->getAuditRequestId(); $userId = Yii::app()->hasComponent('user') ? Yii::app()->user->id : 0; $audit = Yii::app()->getModule('audit'); $commandBuilder = $audit->getDbConnection()->getCommandBuilder(); foreach ($logs as $log) { $message = explode("\n", $log[0]); $file = count($message) > 1 ? array_pop($message) : ''; $message = implode("\n", $message); $auditLogs[] = array('level' => $log[1], 'category' => $log[2], 'message' => AuditHelper::pack($message), 'file' => $file, 'audit_request_id' => $auditRequestId, 'user_id' => $userId, 'created' => (int) $log[3]); // save 100 rows at a time, more than this causes an issue if (count($auditLogs) > 100) { $commandBuilder->createMultipleInsertCommand(AuditLog::model()->tableName(), $auditLogs)->execute(); $auditLogs = array(); } } if ($auditLogs) { $commandBuilder->createMultipleInsertCommand(AuditLog::model()->tableName(), $auditLogs)->execute(); } }
<?php /** * @var $this AuditErrorController * @var $auditError AuditError * * @author Brett O'Donnell <*****@*****.**> * @author Zain Ul abidin <*****@*****.**> * @copyright 2013 Mr PHP * @link https://github.com/cornernote/yii-audit-module * @license BSD-3-Clause https://raw.github.com/cornernote/yii-audit-module/master/LICENSE * * @package yii-audit-module */ $errorHandler = Yii::app()->getErrorHandler(); $cs = Yii::app()->clientScript; $cs->registerCssFile($this->module->getAssetsUrl() . '/css/error.css'); $cs->registerScriptFile($this->module->getAssetsUrl() . '/js/error.js'); $this->pageTitle = Yii::t('audit', 'Error ID-:id', array(':id' => $auditError->id)); $details = CHtml::tag('small', array(), Yii::t('audit', ':type on :date by :user with :auditRequest:', array(':date' => Yii::app()->format->formatDatetime($auditError->created), ':type' => $auditError->type, ':user' => $this->module->userViewLink($auditError->auditRequest->user_id, 'User ID-'), ':auditRequest' => CHtml::link(Yii::t('audit', 'Request ID-') . $auditError->audit_request_id, array('request/view', 'id' => $auditError->audit_request_id))))); echo CHtml::tag('p', array('class' => 'message'), $details . Yii::app()->format->formatNtext("\n" . $auditError->message)); echo CHtml::tag('div', array('class' => 'source'), CHtml::tag('p', array('class' => 'file'), htmlspecialchars($auditError->file, ENT_QUOTES, Yii::app()->charset) . '(' . $auditError->line . ')') . AuditHelper::unpack($auditError->source_code)); if ($auditError->stack_trace) { echo CHtml::tag('div', array('class' => 'traces'), CHtml::tag('h2', array(), Yii::t('audit', 'Stack Trace')) . AuditHelper::unpack($auditError->stack_trace)); }
/** * Callback to update the AuditRequest at the end of the Yii request. * @see getAuditRequest() */ public function endAuditRequest() { $auditRequest = $this->getAuditRequest(); if (function_exists('headers_list')) { $auditRequest->response_headers = headers_list(); } if ($auditRequest->response_headers) { foreach ($auditRequest->response_headers as $header) { if (strpos(strtolower($header), 'location:') === 0) { $auditRequest->redirect = trim(substr($header, 9)); } } } $auditRequest->response_headers = $this->removeValuesWithPasswordKeys($auditRequest->response_headers); $auditRequest->response_headers = AuditHelper::pack($auditRequest->response_headers); $auditRequest->memory_usage = memory_get_usage(); $auditRequest->memory_peak = memory_get_peak_usage(); $auditRequest->audit_field_count = $auditRequest->auditFieldCount; $auditRequest->end_time = microtime(true); $auditRequest->total_time = $auditRequest->end_time - $auditRequest->start_time; $auditRequest->save(false); }
/** * @return string */ public function getFileAlias() { return AuditHelper::replaceFileWithAlias(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->file)); }
if (isset($_GET['AuditField'])) { $auditField->attributes = $_GET['AuditField']; } $auditField->audit_request_id = $auditRequest->id; $this->renderPartial('/field/_grid', array('auditField' => $auditField)); echo '<h2>' . Yii::t('audit', 'Logs') . '</h2>'; $auditLog = new AuditLog('search'); if (isset($_GET['AuditLog'])) { $auditLog->attributes = $_GET['AuditLog']; } $auditLog->audit_request_id = $auditRequest->id; $this->renderPartial('/log/_grid', array('auditLog' => $auditLog)); echo '<h2>' . Yii::t('audit', 'Page Variables') . '</h2>'; $this->widget(Yii::app()->getModule('audit')->detailViewWidget, array('data' => $auditRequest, 'attributes' => array(array('label' => '$_GET', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->get), true) . '</pre>', 'type' => 'raw'), array('label' => '$_POST', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->post), true) . '</pre>', 'type' => 'raw'), array('label' => '$_FILES', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->files), true) . '</pre>', 'type' => 'raw'), array('label' => 'php://input', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->php_input), true) . '</pre>', 'type' => 'raw')), 'htmlOptions' => array('class' => 'table table-condensed table-striped'))); echo '<h2>' . Yii::t('audit', 'Headers') . '</h2>'; $this->widget(Yii::app()->getModule('audit')->detailViewWidget, array('data' => $auditRequest, 'attributes' => array(array('name' => 'request_headers', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->request_headers), true) . '</pre>', 'type' => 'raw'), array('name' => 'response_headers', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->response_headers), true) . '</pre>', 'type' => 'raw')), 'htmlOptions' => array('class' => 'table table-condensed table-striped'))); $onClick = "\$('#session_detail').toggle(); \$(this).html(\$(this).html()=='[+]' ? '[-]' : '[+]');"; echo '<h2><small><a href="javascript:void(0)" onclick="' . $onClick . '">[+]</a></small> ' . Yii::t('audit', 'Session and Cookies') . '</h2>'; echo '<div id="session_detail" style="display: none;">'; $this->widget(Yii::app()->getModule('audit')->detailViewWidget, array('data' => $auditRequest, 'attributes' => array(array('label' => '$_SESSION', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->session), true) . '</pre>', 'type' => 'raw'), array('label' => '$_COOKIE', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->cookie), true) . '</pre>', 'type' => 'raw')), 'htmlOptions' => array('class' => 'table table-condensed table-striped'))); echo '</div>'; $onClick = "\$('#server_detail').toggle(); \$(this).html(\$(this).html()=='[+]' ? '[-]' : '[+]');"; echo '<h2><small><a href="javascript:void(0)" onclick="' . $onClick . '">[+]</a></small> ' . Yii::t('audit', 'Server Data') . '</h2>'; echo '<div id="server_detail" style="display: none;">'; $this->widget(Yii::app()->getModule('audit')->detailViewWidget, array('data' => $auditRequest, 'attributes' => array(array('label' => '$_SERVER', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->server), true) . '</pre>', 'type' => 'raw')), 'htmlOptions' => array('class' => 'table table-condensed table-striped'))); echo '</div>'; $onClick = "\$('#config_detail').toggle(); \$(this).html(\$(this).html()=='[+]' ? '[-]' : '[+]');"; echo '<h2><small><a href="javascript:void(0)" onclick="' . $onClick . '">[+]</a></small> ' . Yii::t('audit', 'Config Data') . '</h2>'; echo '<div id="config_detail" style="display: none;">'; $this->widget(Yii::app()->getModule('audit')->detailViewWidget, array('data' => $auditRequest, 'attributes' => array(array('label' => 'Yii::config', 'value' => '<pre>' . print_r(AuditHelper::unpack($auditRequest->config), true) . '</pre>', 'type' => 'raw')), 'htmlOptions' => array('class' => 'table table-condensed table-striped'))); echo '</div>';
/** * Generates and saves the AuditRequest data. */ private function recordAuditRequest() { // create new Audit $auditRequest = new AuditRequest(); // get info $auditRequest->created = time(); $auditRequest->user_id = Yii::app()->hasComponent('user') ? Yii::app()->user->id : 0; $auditRequest->link = $this->getCurrentLink(); $auditRequest->start_time = YII_BEGIN_TIME; $auditRequest->get = $_GET; $auditRequest->post = $_POST; $auditRequest->files = $_FILES; $auditRequest->session = $this->getShrinkedSession(); $auditRequest->cookie = $_COOKIE; $auditRequest->server = $_SERVER; $auditRequest->config = $this->getYiiConfig(); $auditRequest->ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null; $auditRequest->referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null; // remove passwords $auditRequest->get = $this->removeValuesWithPasswordKeys($auditRequest->get, $passwordRemovedFromGet); $auditRequest->post = $this->removeValuesWithPasswordKeys($auditRequest->post, $passwordRemovedFromPost); $auditRequest->server = $this->removeValuesWithPasswordKeys($auditRequest->server); $auditRequest->config = $this->removeValuesWithPasswordKeys($auditRequest->config); if ($passwordRemovedFromGet || $passwordRemovedFromPost) { $auditRequest->server = null; } if ($passwordRemovedFromGet) { $auditRequest->link = null; } // pack all $auditRequest->get = AuditHelper::pack($auditRequest->get); $auditRequest->post = AuditHelper::pack($auditRequest->post); $auditRequest->files = AuditHelper::pack($auditRequest->files); $auditRequest->session = AuditHelper::pack($auditRequest->session); $auditRequest->cookie = AuditHelper::pack($auditRequest->cookie); $auditRequest->server = AuditHelper::pack($auditRequest->server); $auditRequest->config = AuditHelper::pack($auditRequest->config); // set the closing data incase we are already in an endRequest $headers = headers_list(); foreach ($headers as $header) { if (strpos(strtolower($header), 'location:') === 0) { $auditRequest->redirect = trim(substr($header, 9)); } } // save $auditRequest->save(false); // add an event callback to update the audit at the end Yii::app()->onEndRequest = array($this, 'endAuditRequest'); return $auditRequest; }
<?php /** * @var $this AuditErrorController * @var $auditError AuditError * * @author Brett O'Donnell <*****@*****.**> * @author Zain Ul abidin <*****@*****.**> * @copyright 2013 Mr PHP * @link https://github.com/cornernote/yii-audit-module * @license BSD-3-Clause https://raw.github.com/cornernote/yii-audit-module/master/LICENSE * * @package yii-audit-module */ $errorHandler = Yii::app()->getErrorHandler(); $cs = Yii::app()->clientScript; $cs->registerCssFile($this->module->getAssetsUrl() . '/css/error.css'); $cs->registerScriptFile($this->module->getAssetsUrl() . '/js/error.js'); $this->pageTitle = Yii::t('audit', 'Error ID-:id', array(':id' => $auditError->id)); $details = CHtml::tag('small', array(), Yii::t('audit', ':type on :date by :user with :auditRequest:', array(':date' => Yii::app()->format->formatDatetime($auditError->created), ':type' => $auditError->type, ':user' => $this->module->userViewLink($auditError->auditRequest->user_id, 'User ID-'), ':auditRequest' => CHtml::link(Yii::t('audit', 'Request ID-') . $auditError->audit_request_id, array('request/view', 'id' => $auditError->audit_request_id))))); echo CHtml::tag('p', array('class' => 'message'), $details . Yii::app()->format->formatNtext("\n" . $auditError->message)); echo CHtml::tag('div', array('class' => 'source'), CHtml::tag('p', array('class' => 'file'), htmlspecialchars($auditError->file, ENT_QUOTES, Yii::app()->charset) . '(' . $auditError->line . ')') . AuditHelper::unpack($auditError->source_code)); if ($auditError->stack_trace) { echo CHtml::tag('div', array('class' => 'traces'), CHtml::tag('h2', array(), Yii::t('audit', 'Stack Trace')) . AuditHelper::unpack($auditError->stack_trace)); } if ($auditError->extra) { echo CHtml::tag('div', array('class' => 'extra'), CHtml::tag('h2', array(), Yii::t('audit', 'Extra')) . '<pre>' . print_r(AuditHelper::unpack($auditError->extra), true) . '</pre>'); }
<?php /** * @var $this AuditErrorController * @var $auditError AuditError * * @author Brett O'Donnell <*****@*****.**> * @author Zain Ul abidin <*****@*****.**> * @copyright 2013 Mr PHP * @link https://github.com/cornernote/yii-audit-module * @license BSD-3-Clause https://raw.github.com/cornernote/yii-audit-module/master/LICENSE * * @package yii-audit-module */ $errorHandler = Yii::app()->getErrorHandler(); $cs = Yii::app()->clientScript; $cs->registerCssFile($this->module->getAssetsUrl() . '/css/error.css'); $cs->registerScriptFile($this->module->getAssetsUrl() . '/js/error.js'); $this->pageTitle = Yii::t('audit', 'Error ID-:id', array(':id' => $auditError->id)); $details = CHtml::tag('small', array(), Yii::t('audit', ':type on :date by :user with :auditRequest:', array(':date' => Yii::app()->format->formatDatetime($auditError->created), ':type' => $auditError->type, ':user' => $this->module->userViewLink($auditError->auditRequest->user_id, 'User ID-'), ':auditRequest' => CHtml::link(Yii::t('audit', 'Request ID-') . $auditError->audit_request_id, array('request/view', 'id' => $auditError->audit_request_id))))); echo CHtml::tag('p', array('class' => 'message'), $details . Yii::app()->format->formatNtext("\n" . $auditError->message)); echo CHtml::tag('div', array('class' => 'source'), CHtml::tag('p', array('class' => 'file'), htmlspecialchars($auditError->file, ENT_QUOTES, Yii::app()->charset) . '(' . $auditError->line . ')') . AuditHelper::unpack($auditError->source_code)); if ($auditError->stack_trace) { echo CHtml::tag('div', array('class' => 'traces'), CHtml::tag('h2', array(), Yii::t('audit', 'Stack Trace')) . AuditHelper::unpack($auditError->stack_trace)); } if ($auditError->extra) { echo CHtml::tag('div', array('class' => 'extra'), CHtml::tag('h2', array(), Yii::t('audit', 'Extra')) . AuditHelper::unpack($auditError->extra)); }