Newer
Older
<?php
/*********************************************************************
class.config.php
http://www.osticket.com
Released under the GNU General Public License WITHOUT ANY WARRANTY.
See LICENSE.TXT for details.
vim: expandtab sw=4 ts=4 sts=4:
**********************************************************************/
class Config {
Peter Rotich
committed
var $config = array();
var $section = null; # Default namespace ('core')
var $table = CONFIG_TABLE; # Table name (with prefix)
var $section_column = 'namespace'; # namespace column name
var $session = null; # Session-backed configuration
# Defaults for this configuration. If settings don't exist in the
# database yet, the ->getInfo() method will not include the (default)
# values in the returned array. $defaults allows developers to define
# new settings and the corresponding default values.
var $defaults = array(); # List of default values
$this->section = $section;
if ($this->section === null)
if (!isset($_SESSION['cfg:'.$this->section]))
$_SESSION['cfg:'.$this->section] = array();
$this->session = &$_SESSION['cfg:'.$this->section];
$sql='SELECT id, `key`, value, `updated` FROM '.$this->table
.' WHERE `'.$this->section_column.'` = '.db_input($this->section);
if(($res=db_query($sql)) && db_num_rows($res))
while ($row = db_fetch_array($res))
$this->config[$row['key']] = $row;
function getNamespace() {
return $this->section;
}
foreach ($this->config as $key=>$setting)
$info[$key] = $setting['value'];
return $info;
}
function get($key, $default=null) {
if (isset($this->session[$key]))
elseif (isset($this->config[$key]))
return $this->config[$key]['value'];
elseif (isset($this->defaults[$key]))
return $this->defaults[$key];
function exists($key) {
return $this->get($key, null) ? true : false;
}
function set($key, $value) {
return ($this->update($key, $value)) ? $value : null;
function persist($key, $value) {
$this->session[$key] = $value;
return true;
}
function lastModified($key) {
if (isset($this->config[$key]))
return $this->config[$key]['updated'];
else
return false;
}
function create($key, $value) {
.' SET `'.$this->section_column.'`='.db_input($this->section)
.', `key`='.db_input($key)
.', value='.db_input($value);
if (!db_query($sql) || !($id=db_insert_id()))
$this->config[$key] = array('key'=>$key, 'value'=>$value, 'id'=>$id);
return true;
}
function update($key, $value) {
if (!$key)
return false;
elseif (!isset($this->config[$key]))
return $this->create($key, $value);
$setting = &$this->config[$key];
if ($setting['value'] == $value)
return true;
if (!db_query('UPDATE '.$this->table.' SET updated=NOW(), value='
.db_input($value).' WHERE id='.db_input($setting['id'])))
$setting['value'] = $value;
return true;
}
function updateAll($updates) {
if (!$this->update($key, $value))
$sql='DELETE FROM '.$this->table
.' WHERE `'.$this->section_column.'` = '.db_input($this->section);
db_query($sql);
unset($this->session);
}
}
class OsticketConfig extends Config {
var $table = CONFIG_TABLE;
var $section = 'core';
var $defaultDept; //Default Department
var $defaultSLA; //Default SLA
var $defaultEmail; //Default Email
var $alertEmail; //Alert Email
var $defaultSMTPEmail; //Default SMTP Email
var $defaults = array(
'allow_pw_reset' => true,
'enable_html_thread' => true,
'allow_attachments' => true,
'allow_email_attachments' => true,
'allow_online_attachments' => true,
'allow_online_attachments_onlogin' => false,
'name_format' => 'full', # First Last
'auto_claim_tickets'=> true,
'message_autoresponder_collabs' => true,
'add_email_collabs' => true,
'clients_only' => false,
'client_registration' => 'closed',
'accept_unregistered_email' => true,
function OsticketConfig($section=null) {
parent::Config($section);
if (count($this->config) == 0) {
// Fallback for osticket < 1.7@852ca89e
$sql='SELECT * FROM '.$this->table.' WHERE id = 1';
if (($res=db_query($sql)) && db_num_rows($res))
foreach (db_fetch_array($res) as $key=>$value)
$this->config[$key] = array('value'=>$value);
}
//Get the default time zone
// We can't JOIN timezone table above due to upgrade support.
if ($this->get('default_timezone_id')) {
if (!$this->exists('tz_offset'))
$this->persist('tz_offset',
Timezone::getOffsetById($this->get('default_timezone_id')));
} else
// Previous osTicket versions saved the offset value instead of
// a timezone instance. This is compatibility for the upgrader
$this->persist('tz_offset', 0);
return true;
}
function lastModified($key=false) {
return max(array_map(array('parent', 'lastModified'),
array_keys($this->config)));
}
return !$this->isOnline();
function isHelpDeskOnline() {
return $this->isOnline();
function isOnline() {
function isKnowledgebaseEnabled() {
return ($this->get('enable_kb') && FAQ::countPublishedFAQs());
return THIS_VERSION;
function getSchemaSignature($section=null) {
if ((!$section || $section == $this->section)
&& ($v=$this->get('schema_signature')))
return $v;
// 1.7 after namespaced configuration, other namespace
if ($section) {
$sql='SELECT value FROM '.$this->table
.' WHERE `key` = "schema_signature" and namespace='.db_input($section);
if (($res=db_query($sql, false)) && db_num_rows($res))
return db_result($res);
}
$sql='SELECT `schema_signature` FROM '.$this->table
if (($res=db_query($sql, false)) && db_num_rows($res))
return db_result($res);
Peter Rotich
committed
function getDBTZoffset() {
$sql='SELECT (TIME_TO_SEC(TIMEDIFF(NOW(), UTC_TIMESTAMP()))/3600) as db_tz_offset';
if(($res=db_query($sql)) && db_num_rows($res))
$this->persist('db_tz_offset', db_result($res));
function getDefaultTimezoneId() {
return $this->get('default_timezone_id');
}
/* Date & Time Formats */
function observeDaylightSaving() {
return ($this->get('enable_daylight_saving'));
return $this->get('daydatetime_format');
function getConfigInfo() {
function getBaseUrl() { //Same as above with no trailing slash.
return rtrim($this->getUrl(),'/');
}
function getTZOffset() {
return $this->get('overdue_grace_period');
return $this->get('passwd_reset_period');
function isHtmlThreadEnabled() {
return $this->get('enable_html_thread');
}
function allowClientUpdates() {
return $this->get('allow_client_updates');
}
function getClientTimeout() {
return $this->getClientSessionTimeout();
}
return $this->get('client_session_timeout')*60;
return $this->get('client_login_timeout')*60;
}
function getStaffTimeout() {
return $this->getStaffSessionTimeout();
}
function getStaffSessionTimeout() {
return $this->get('staff_session_timeout')*60;
return $this->get('staff_login_timeout')*60;
function getDefaultNameFormat() {
return $this->get('name_format');
}
}
function getDefaultDept() {
if(!$this->defaultDept && $this->getDefaultDeptId())
$this->defaultDept=Dept::lookup($this->getDefaultDeptId());
return $this->defaultDept;
}
function getDefaultEmail() {
if(!$this->defaultEmail && $this->getDefaultEmailId())
$this->defaultEmail = Email::lookup($this->getDefaultEmailId());
return $this->defaultEmail;
}
function getDefaultEmailAddress() {
return ($email=$this->getDefaultEmail()) ? $email->getAddress() : null;
}
function getDefaultSLA() {
if(!$this->defaultSLA && $this->getDefaultSLAId())
$this->defaultSLA = SLA::lookup($this->getDefaultSLAId());
return $this->defaultSLA;
}
function getAlertEmailId() {
if(!$this->alertEmail)
if(!($this->alertEmail = Email::lookup($this->getAlertEmailId())))
$this->alertEmail = $this->getDefaultEmail();
return $this->alertEmail;
}
function getDefaultSMTPEmail() {
if(!$this->defaultSMTPEmail && $this->get('default_smtp_id'))
$this->defaultSMTPEmail = Email::lookup($this->get('default_smtp_id'));
return $this->defaultSMTPEmail;
}
function getDefaultPriorityId() {
return $this->get('default_priority_id');
return $this->get('default_template_id');
if(!$this->defaultTemplate && $this->getDefaultTemplateId())
$this->defaultTemplate = EmailTemplateGroup::lookup($this->getDefaultTemplateId());
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
function getLandingPageId() {
return $this->get('landing_page_id');
}
function getLandingPage() {
if(!$this->landing_page && $this->getLandingPageId())
$this->landing_page = Page::lookup($this->getLandingPageId());
return $this->landing_page;
}
function getOfflinePageId() {
return $this->get('offline_page_id');
}
function getOfflinePage() {
if(!$this->offline_page && $this->getOfflinePageId())
$this->offline_page = Page::lookup($this->getOfflinePageId());
return $this->offline_page;
}
function getThankYouPageId() {
return $this->get('thank-you_page_id');
}
function getThankYouPage() {
if(!$this->thankyou_page && $this->getThankYouPageId())
$this->thankyou_page = Page::lookup($this->getThankYouPageId());
return $this->thankyou_page;
}
function getDefaultPages() {
/* Array of ids...as opposed to objects */
return array(
$this->getLandingPageId(),
$this->getOfflinePageId(),
$this->getThankYouPageId(),
);
}
function getStaffMaxFileUploads() {
return $this->get('max_staff_file_uploads');
function getClientMaxFileUploads() {
//TODO: change max_user_file_uploads to max_client_file_uploads
return $this->get('max_user_file_uploads');
return ($this->get('staff_ip_binding'));
/**
* Configuration: allow_pw_reset
*
* TRUE if the <a>Forgot my password</a> link and system should be
* enabled, and FALSE otherwise.
*/
function allowPasswordReset() {
return $this->get('allow_pw_reset');
}
/**
* Configuration: pw_reset_window
*
* Number of minutes for which the password reset token is valid.
*
* Returns: Number of seconds the password reset token is valid. The
* number of minutes from the database is automatically converted
* to seconds here.
*/
function getPwResetWindow() {
// pw_reset_window is stored in minutes. Return value in seconds
return $this->get('pw_reset_window') * 60;
}
function isClientLoginRequired() {
return $this->get('clients_only');
}
function isClientRegistrationEnabled() {
return in_array($this->getClientRegistrationMode(),
array('public', 'auto'));
}
function getClientRegistrationMode() {
return $this->get('client_registration');
}
function isCaptchaEnabled() {
return (extension_loaded('gd') && function_exists('gd_info') && $this->get('enable_captcha'));
function isAutoCronEnabled() {
return ($this->get('enable_auto_cron'));
function isEmailPollingEnabled() {
return ($this->get('enable_mail_polling'));
return ($this->get('use_email_priority'));
function acceptUnregisteredEmail() {
return $this->get('accept_unregistered_email');
}
function addCollabsViaEmail() {
return ($this->get('add_email_collabs'));
}
return ($this->get('strip_quoted_reply'));
}
function saveEmailHeaders() {
return true; //No longer an option...hint: big plans for headers coming!!
}
return ($this->get('random_ticket_ids'));
}
/* autoresponders & Alerts */
function autoRespONNewTicket() {
return ($this->get('ticket_autoresponder'));
return ($this->get('message_autoresponder'));
function notifyCollabsONNewMessage() {
return ($this->get('message_autoresponder_collabs'));
}
return ($this->get('ticket_notice_active'));
return ($this->get('message_alert_active'));
}
function alertLastRespondentONNewMessage() {
return ($this->get('message_alert_laststaff'));
return ($this->get('message_alert_assigned'));
return ($this->get('message_alert_dept_manager'));
function alertAcctManagerONNewMessage() {
return ($this->get('message_alert_acct_manager'));
}
return ($this->get('note_alert_active'));
}
function alertLastRespondentONNewNote() {
return ($this->get('note_alert_laststaff'));
return ($this->get('note_alert_assigned'));
}
function alertDeptManagerONNewNote() {
return ($this->get('note_alert_dept_manager'));
return ($this->get('ticket_alert_active'));
return ($this->get('ticket_alert_admin'));
return ($this->get('ticket_alert_dept_manager'));
}
function alertDeptMembersONNewTicket() {
return ($this->get('ticket_alert_dept_members'));
function alertAcctManagerONNewTicket() {
return ($this->get('ticket_alert_acct_manager'));
}
return ($this->get('transfer_alert_active'));
}
function alertAssignedONTransfer() {
return ($this->get('transfer_alert_assigned'));
return ($this->get('transfer_alert_dept_manager'));
return ($this->get('transfer_alert_dept_members'));
return ($this->get('assigned_alert_active'));
return ($this->get('assigned_alert_staff'));
}
function alertTeamLeadONAssignment() {
return ($this->get('assigned_alert_team_lead'));
}
function alertTeamMembersONAssignment() {
return ($this->get('assigned_alert_team_members'));
}
function alertONOverdueTicket() {
return ($this->get('overdue_alert_active'));
}
function alertAssignedONOverdueTicket() {
return ($this->get('overdue_alert_assigned'));
}
function alertDeptManagerONOverdueTicket() {
return ($this->get('overdue_alert_dept_manager'));
}
function alertDeptMembersONOverdueTicket() {
return ($this->get('overdue_alert_dept_members'));
function autoClaimTickets() {
return $this->get('auto_claim_tickets');
return ($this->get('show_assigned_tickets'));
return ($this->get('show_answered_tickets'));
return ($this->get('overlimit_notice_active'));
/* Error alerts sent to admin email when enabled */
function alertONSQLError() {
return ($this->get('send_login_errors'));
function getAllowedFileTypes() {
return trim($this->get('allowed_filetypes'));
return ($this->get('email_attachments'));
return ($this->get('allow_attachments'));
return ($this->allowAttachments() && $this->get('allow_online_attachments'));
}
function allowAttachmentsOnlogin() {
return ($this->allowOnlineAttachments() && $this->get('allow_online_attachments_onlogin'));
return ($this->allowAttachments() && $this->get('allow_email_attachments'));
function getSystemLanguage() {
return $this->get('system_language');
}
//TODO: change db field to allow_api_attachments - which will include email/json/xml attachments
// terminology changed on the UI
function allowAPIAttachments() {
return $this->allowEmailAttachments();
}
/* Needed by upgrader on 1.6 and older releases upgrade - not not remove */
function getDefaultStorageBackendChar() {
return $this->get('default_storage_bk');
}
function getVar($name) {
return $this->get($name);
}
function updateSettings($vars, &$errors) {
case 'system':
return $this->updateSystemSettings($vars, $errors);
return $this->updateTicketsSettings($vars, $errors);
return $this->updateEmailsSettings($vars, $errors);
case 'pages':
return $this->updatePagesSettings($vars, $errors);
break;
case 'access':
return $this->updateAccessSettings($vars, $errors);
break;
case 'autoresp':
return $this->updateAutoresponderSettings($vars, $errors);
return $this->updateAlertsSettings($vars, $errors);
return $this->updateKBSettings($vars, $errors);
break;
default:
$errors['err']='Unknown setting option. Get technical support.';
}
return false;
}
function updateSystemSettings($vars, &$errors) {
$f=array();
$f['helpdesk_url']=array('type'=>'string', 'required'=>1, 'error'=>'Helpdesk URl required');
$f['helpdesk_title']=array('type'=>'string', 'required'=>1, 'error'=>'Helpdesk title required');
$f['default_dept_id']=array('type'=>'int', 'required'=>1, 'error'=>'Default Dept. required');
//Date & Time Options
$f['time_format']=array('type'=>'string', 'required'=>1, 'error'=>'Time format required');
$f['date_format']=array('type'=>'string', 'required'=>1, 'error'=>'Date format required');
$f['datetime_format']=array('type'=>'string', 'required'=>1, 'error'=>'Datetime format required');
$f['daydatetime_format']=array('type'=>'string', 'required'=>1, 'error'=>'Day, Datetime format required');
$f['default_timezone_id']=array('type'=>'int', 'required'=>1, 'error'=>'Default Timezone required');
if(!Validator::process($f, $vars, $errors) || $errors)
return $this->updateAll(array(
'isonline'=>$vars['isonline'],
'helpdesk_title'=>$vars['helpdesk_title'],
'helpdesk_url'=>$vars['helpdesk_url'],
'default_dept_id'=>$vars['default_dept_id'],
'max_page_size'=>$vars['max_page_size'],
'log_level'=>$vars['log_level'],
'log_graceperiod'=>$vars['log_graceperiod'],
'name_format'=>$vars['name_format'],
'time_format'=>$vars['time_format'],
'date_format'=>$vars['date_format'],
'datetime_format'=>$vars['datetime_format'],
'daydatetime_format'=>$vars['daydatetime_format'],
'default_timezone_id'=>$vars['default_timezone_id'],
'enable_daylight_saving'=>isset($vars['enable_daylight_saving'])?1:0,
));
}
function updateAccessSettings($vars, &$errors) {
$f=array();
$f['staff_session_timeout']=array('type'=>'int', 'required'=>1, 'error'=>'Enter idle time in minutes');
$f['client_session_timeout']=array('type'=>'int', 'required'=>1, 'error'=>'Enter idle time in minutes');
$f['pw_reset_window']=array('type'=>'int', 'required'=>1, 'min'=>1,
'error'=>'Valid password reset window required');
if(!Validator::process($f, $vars, $errors) || $errors)
return false;
return $this->updateAll(array(
'passwd_reset_period'=>$vars['passwd_reset_period'],
'staff_max_logins'=>$vars['staff_max_logins'],
'staff_login_timeout'=>$vars['staff_login_timeout'],
'staff_session_timeout'=>$vars['staff_session_timeout'],
'staff_ip_binding'=>isset($vars['staff_ip_binding'])?1:0,
'client_max_logins'=>$vars['client_max_logins'],
'client_login_timeout'=>$vars['client_login_timeout'],
'client_session_timeout'=>$vars['client_session_timeout'],
'allow_pw_reset'=>isset($vars['allow_pw_reset'])?1:0,
'pw_reset_window'=>$vars['pw_reset_window'],
'clients_only'=>isset($vars['clients_only'])?1:0,
'client_registration'=>$vars['client_registration'],
function updateTicketsSettings($vars, &$errors) {
$f=array();
$f['default_sla_id']=array('type'=>'int', 'required'=>1, 'error'=>'Selection required');
$f['default_priority_id']=array('type'=>'int', 'required'=>1, 'error'=>'Selection required');
$f['max_open_tickets']=array('type'=>'int', 'required'=>1, 'error'=>'Enter valid numeric value');
$f['autolock_minutes']=array('type'=>'int', 'required'=>1, 'error'=>'Enter lock time in minutes');
if($vars['enable_captcha']) {
if (!extension_loaded('gd'))
$errors['enable_captcha']='The GD extension required';
elseif(!function_exists('imagepng'))
$errors['enable_captcha']='PNG support required for Image Captcha';
}
if($vars['allow_attachments']) {
if(!ini_get('file_uploads'))
$errors['err']='The \'file_uploads\' directive is disabled in php.ini';
if(!is_numeric($vars['max_file_size']))
$errors['max_file_size']='Maximum file size required';
if(!$vars['allowed_filetypes'])
$errors['allowed_filetypes']='Allowed file extentions required';
if(!($maxfileuploads=ini_get('max_file_uploads')))
$maxfileuploads=DEFAULT_MAX_FILE_UPLOADS;
if(!$vars['max_user_file_uploads'] || $vars['max_user_file_uploads']>$maxfileuploads)
$errors['max_user_file_uploads']='Invalid selection. Must be less than '.$maxfileuploads;
if(!$vars['max_staff_file_uploads'] || $vars['max_staff_file_uploads']>$maxfileuploads)
$errors['max_staff_file_uploads']='Invalid selection. Must be less than '.$maxfileuploads;
}
if(!Validator::process($f, $vars, $errors) || $errors)
if (isset($vars['default_storage_bk']))
$this->update('default_storage_bk', $vars['default_storage_bk']);
return $this->updateAll(array(
'random_ticket_ids'=>$vars['random_ticket_ids'],
'default_priority_id'=>$vars['default_priority_id'],
'default_sla_id'=>$vars['default_sla_id'],
'max_open_tickets'=>$vars['max_open_tickets'],
'autolock_minutes'=>$vars['autolock_minutes'],
'enable_captcha'=>isset($vars['enable_captcha'])?1:0,
'auto_claim_tickets'=>isset($vars['auto_claim_tickets'])?1:0,
'show_assigned_tickets'=>isset($vars['show_assigned_tickets'])?0:1,
'show_answered_tickets'=>isset($vars['show_answered_tickets'])?0:1,
'show_related_tickets'=>isset($vars['show_related_tickets'])?1:0,
'hide_staff_name'=>isset($vars['hide_staff_name'])?1:0,
'enable_html_thread'=>isset($vars['enable_html_thread'])?1:0,
'allow_client_updates'=>isset($vars['allow_client_updates'])?1:0,
'allow_attachments'=>isset($vars['allow_attachments'])?1:0,
'allowed_filetypes'=>strtolower(preg_replace("/\n\r|\r\n|\n|\r/", '',trim($vars['allowed_filetypes']))),
'max_file_size'=>$vars['max_file_size'],
'max_user_file_uploads'=>$vars['max_user_file_uploads'],
'max_staff_file_uploads'=>$vars['max_staff_file_uploads'],
'email_attachments'=>isset($vars['email_attachments'])?1:0,
'allow_email_attachments'=>isset($vars['allow_email_attachments'])?1:0,
'allow_online_attachments'=>isset($vars['allow_online_attachments'])?1:0,
'allow_online_attachments_onlogin'=>isset($vars['allow_online_attachments_onlogin'])?1:0,
function updateEmailsSettings($vars, &$errors) {
$f['default_template_id']=array('type'=>'int', 'required'=>1, 'error'=>'You must select template.');
$f['default_email_id']=array('type'=>'int', 'required'=>1, 'error'=>'Default email required');
$f['alert_email_id']=array('type'=>'int', 'required'=>1, 'error'=>'Selection required');
$f['admin_email']=array('type'=>'email', 'required'=>1, 'error'=>'System admin email required');
if($vars['strip_quoted_reply'] && !trim($vars['reply_separator']))
$errors['reply_separator']='Reply separator required to strip quoted reply.';
if($vars['admin_email'] && Email::getIdByEmail($vars['admin_email'])) //Make sure admin email is not also a system email.
$errors['admin_email']='Email already setup as system email';
if(!Validator::process($f,$vars,$errors) || $errors)
return false;
'default_template_id'=>$vars['default_template_id'],
'default_email_id'=>$vars['default_email_id'],
'alert_email_id'=>$vars['alert_email_id'],
'default_smtp_id'=>$vars['default_smtp_id'],
'admin_email'=>$vars['admin_email'],
'enable_auto_cron'=>isset($vars['enable_auto_cron'])?1:0,
'enable_mail_polling'=>isset($vars['enable_mail_polling'])?1:0,
'strip_quoted_reply'=>isset($vars['strip_quoted_reply'])?1:0,
'use_email_priority'=>isset($vars['use_email_priority'])?1:0,
'accept_unregistered_email'=>isset($vars['accept_unregistered_email'])?1:0,
'add_email_collabs'=>isset($vars['add_email_collabs'])?1:0,
'reply_separator'=>$vars['reply_separator'],
function getLogo($site) {
$id = $this->get("{$site}_logo_id", false);
return ($id) ? AttachmentFile::lookup($id) : null;
}
function getClientLogo() {
return $this->getLogo('client');
}
function getLogoId($site) {
return $this->get("{$site}_logo_id", false);
}