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:
**********************************************************************/
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
function __construct($section=null, $defaults=array()) {
$this->section = $section;
if ($this->section === null)
if (isset($_SESSION['cfg:'.$this->section]))
$this->session = &$_SESSION['cfg:'.$this->section];
foreach ($this->items() as $I)
$this->config[$I->key] = $I;
function getNamespace() {
return $this->section;
}
foreach ($this->config as $key=>$item)
$info[$key] = $item->value;
function get($key, $default=null) {
if (isset($this->session) && isset($this->session[$key]))
elseif (isset($this->config[$key]))
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;
if (!isset($this->session)) {
$this->session = &$_SESSION['cfg:'.$this->section];
$this->session = array();
}
$this->session[$key] = $value;
return true;
}
function lastModified($key) {
if (isset($this->config[$key]))
return $this->config[$key]->updated;
return false;
function create($key, $value) {
$this->section_column => $this->section,
'key' => $key,
'value' => $value,
]);
if (!$item->save())
return true;
}
function update($key, $value) {
if (!$key)
return false;
elseif (!isset($this->config[$key]))
return $this->create($key, $value);
$item = $this->config[$key];
$item->value = $value;
return $item->save();
function updateAll($updates) {
if (!$this->update($key, $value))
return $this->items()->delete() > 0;
return ConfigItem::items($this->section, $this->section_column);
}
}
class ConfigItem
extends VerySimpleModel {
static $meta = array(
'table' => CONFIG_TABLE,
'pk' => array('id'),
);
static function items($namespace, $column='namespace') {
try {
count($items);
}
catch (InconsistentModelException $ex) {
// Pending upgrade ??
$items = array();
}
return $items;
}
function save($refetch=false) {
if ($this->dirty)
$this->updated = SqlFunction::NOW();
return parent::save($this->dirty || $refetch);
// Clean password reset tokens that have expired
static function cleanPwResets() {
global $cfg;
if (!$cfg || !($period = $cfg->getPwResetWindow())) // In seconds
return false;
return ConfigItem::objects()
->filter(array(
'namespace' => 'pwreset',
'updated__lt' => SqlFunction::NOW()->minus(SqlInterval::SECOND($period)),
))->delete();
}
}
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_richtext' => true,
'agent_name_format' => 'full', # First Last
'client_name_format' => 'original', # As entered
'auto_claim_tickets'=> true,
'message_autoresponder_collabs' => true,
'add_email_collabs' => true,
'clients_only' => false,
'client_registration' => 'closed',
'accept_unregistered_email' => true,
'default_help_topic' => 0,
'help_topic_sort_mode' => 'a',
'client_verify_email' => 1,
'verify_email_addrs' => 1,
'client_avatar' => 'gravatar.mm',
'agent_avatar' => 'gravatar.mm',
'ticket_lock' => 2, // Lock on activity
'files_req_auth' => 1,
function __construct($section=null) {
parent::__construct($section);
if (count($this->config) == 0) {
// Fallback for osticket < 1.7@852ca89e
$sql='SELECT * FROM '.$this->table.' WHERE id = 1';
$meta = ConfigItem::getMeta();
if (($res=db_query($sql)) && db_num_rows($res))
foreach (db_fetch_array($res) as $key=>$value)
$this->config[$key] = $meta->newInstance(array('value'=>$value));
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() {
global $thisclient;
if ($this->get('restrict_kb', false)
&& (!$thisclient || $thisclient->isGuest())
) {
return false;
}
return ($this->get('enable_kb') && FAQ::countPublishedFAQs());
function isCannedResponseEnabled() {
return $this->get('enable_premade');
}
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);
if (!$this->exists('db_timezone')) {
require_once INCLUDE_DIR . 'class.timezone.php';
$this->persist('db_timezone', DbTimezone::determine());
return $this->get('db_timezone');
function getDefaultTimezone() {
return $this->get('default_timezone');
}
function getTimezone($user=false) {
global $thisstaff, $thisclient;
$user = $user ?: $thisstaff;
if (!$user && $thisclient && is_callable(array($thisclient, 'getTimezone')))
$user = $thisclient;
if ($user)
$zone = $user->getTimezone();
if (!$zone)
$zone = $this->get('default_timezone');
if (!$zone)
$zone = ini_get('date.timezone');
return $zone;
}
function getDefaultLocale() {
return $this->get('default_locale');
/* Date & Time Formats */
function getTimeFormat() {
if ($this->get('date_formats') == 'custom')
return $this->get('time_format');
return '';
}
function isForce24HourTime() {
return $this->get('date_formats') == '24';
}
/**
* getDateFormat
*
* Retrieve the current date format for the system, as a string, and in
* the intl (icu) format.
*
* Parameters:
* $propogate - (boolean:default=false), if set and the configuration
* indicates default date and time formats (ie. not custom), then
* the intl date formatter will be queried to find the pattern used
* internally for the current locale settings.
*/
function getDateFormat($propogate=false) {
if ($this->get('date_formats') == 'custom')
return $this->get('date_format');
if ($propogate) {
if (class_exists('IntlDateFormatter')) {
$formatter = new IntlDateFormatter(
Internationalization::getCurrentLocale(),
IntlDateFormatter::SHORT,
IntlDateFormatter::NONE,
$this->getTimezone(),
IntlDateFormatter::GREGORIAN
);
return $formatter->getPattern();
}
else {
// Use a standard
return 'y-M-d';
}
}
return '';
if ($this->get('date_formats') == 'custom')
return $this->get('datetime_format');
return '';
if ($this->get('date_formats') == 'custom')
return $this->get('daydatetime_format');
return '';
function getConfigInfo() {
function getBaseUrl() { //Same as above with no trailing slash.
return rtrim($this->getUrl(),'/');
}
function getPageSize() {
return $this->get('overdue_grace_period');
return $this->get('passwd_reset_period');
function isRichTextEnabled() {
return $this->get('enable_richtext');
function isAvatarsEnabled() {
return $this->get('enable_avatars');
}
function isTicketLockEnabled() {
return (($this->getTicketLockMode() != Lock::MODE_DISABLED)
&& $this->getLockTime());
}
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 getStaffAvatarSource() {
require_once INCLUDE_DIR . 'class.avatar.php';
list($source, $mode) = explode('.', $this->get('agent_avatar'), 2);
return AvatarSource::lookup($source, $mode);
}
function getClientAvatarSource() {
require_once INCLUDE_DIR . 'class.avatar.php';
list($source, $mode) = explode('.', $this->get('client_avatar'), 2);
return AvatarSource::lookup($source, $mode);
}
function getTicketLockMode() {
return $this->get('ticket_lock');
}
function getAgentNameFormat() {
return $this->get('agent_name_format');
}
function getClientNameFormat() {
return $this->get('client_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 getDefaultTicketStatusId() {
return $this->get('default_ticket_status_id', 1);
}
}
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');
function getDefaultPriority() {
if (!isset($this->defaultPriority))
$this->defaultPriority = Priority::lookup($this->getDefaultPriorityId());
return $this->defaultPriority;
}
function getDefaultTopicId() {
return $this->get('default_help_topic');
}
function getDefaultTopic() {
return Topic::lookup($this->getDefaultTopicId());
}
function getTopicSortMode() {
return $this->get('help_topic_sort_mode');
}
function setTopicSortMode($mode) {
$modes = static::allTopicSortModes();
if (!isset($modes[$mode]))
throw new InvalidArgumentException(sprintf(
'%s: Unsupported help topic sort mode', $mode));
$this->update('help_topic_sort_mode', $mode);
}
static function allTopicSortModes() {
return array(
Topic::SORT_ALPHA => __('Alphabetically'),
Topic::SORT_MANUAL => __('Manually'),
return $this->get('default_template_id');
if(!$this->defaultTemplate && $this->getDefaultTemplateId())
$this->defaultTemplate = EmailTemplateGroup::lookup($this->getDefaultTemplateId());
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
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(),
);
}
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 isClientEmailVerificationRequired() {
return $this->get('client_verify_email');
}
function isAuthTokenEnabled() {
return $this->get('allow_auth_tokens');
}
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'));
}
function verifyEmailAddrs() {
return (bool) $this->get('verify_email_addrs');
}
return ($this->get('strip_quoted_reply'));
}
function saveEmailHeaders() {
return true; //No longer an option...hint: big plans for headers coming!!
}
function getDefaultTicketSequence() {
if ($this->get('ticket_sequence_id'))
$sequence = Sequence::lookup($this->get('ticket_sequence_id'));
if (!$sequence)
$sequence = new RandomSequence();
return $sequence;
}
function getDefaultTicketNumberFormat() {
return $this->get('ticket_number_format');
function getNewTicketNumber() {
$s = $this->getDefaultTicketSequence();
return $s->next($this->getDefaultTicketNumberFormat(),
array('Ticket', 'isTicketNumberUnique'));
// Task sequence
function getDefaultTaskSequence() {
if ($this->get('task_sequence_id'))
$sequence = Sequence::lookup($this->get('task_sequence_id'));
if (!$sequence)
$sequence = new RandomSequence();
return $sequence;
}
function getDefaultTaskNumberFormat() {
return $this->get('task_number_format');
}
function getNewTaskNumber() {
$s = $this->getDefaultTaskSequence();
return $s->next($this->getDefaultTaskNumberFormat(),
array('Task', 'isNumberUnique'));
}
/* 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'));
}
//TODO: change note_alert to activity_alert
function alertONNewActivity() {
return ($this->get('note_alert_active'));
return ($this->get('note_alert_laststaff'));
return ($this->get('note_alert_assigned'));
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');
function collaboratorTicketsVisibility() {
return $this->get('collaborator_ticket_visibility');
}
function requireTopicToClose() {
return $this->get('require_topic_to_close');
}
function getDefaultTicketQueueId() {
return $this->get('default_ticket_queue');
}
return ($this->get('overlimit_notice_active'));
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* Tasks */
function alertONNewTask() {
return ($this->get('task_alert_active'));
}
function alertAdminONNewTask() {
return ($this->get('task_alert_admin'));
}
function alertDeptManagerONNewTask() {
return ($this->get('task_alert_dept_manager'));
}
function alertDeptMembersONNewTask() {
return ($this->get('task_alert_dept_members'));
}
function alertONTaskActivity() {
return ($this->get('task_activity_alert_active'));
}
function alertLastRespondentONTaskActivity() {
return ($this->get('task_activity_alert_laststaff'));
}
function alertAssignedONTaskActivity() {
return ($this->get('task_activity_alert_assigned'));
}
function alertDeptManagerONTaskActivity() {
return ($this->get('task_activity_alert_dept_manager'));
}
function alertONTaskTransfer() {
return ($this->get('task_transfer_alert_active'));
}
function alertAssignedONTaskTransfer() {
return ($this->get('task_transfer_alert_assigned'));
}
function alertDeptManagerONTaskTransfer() {
return ($this->get('task_transfer_alert_dept_manager'));
}
function alertDeptMembersONTaskTransfer() {
return ($this->get('task_transfer_alert_dept_members'));
}
function alertONTaskAssignment() {
return ($this->get('task_assignment_alert_active'));
}