diff --git a/README.md b/README.md index 7939d80d545ca3c00f06ee82a4093e52d1aba47c..8a81fba2ef1426f18221848fa0a8761daeee22a8 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,10 @@ project and request to have your language added. Languages which reach 100% translated are are significantly reviewed will be made available on the osTicket download page. +The software can also be translated in place in our [JIPT site] +(http://jipt.i18n.osticket.com). Once you have a Crowdin account, login and +translate the software in your browser! + Localizing strings in new code requires usage of a [few rules](setup/doc/i18n.md). License diff --git a/WHATSNEW.md b/WHATSNEW.md index c580634d187b26330c7fcecc42b29e55386ca6fc..4523347765df7bf305e94ea25973092fae0b4518 100644 --- a/WHATSNEW.md +++ b/WHATSNEW.md @@ -1,3 +1,17 @@ +osTicket v1.9.5.1 +================= +### Improvements + * Fix file.php to serve files added to system before osTicket v1.9.1 + * Fix file.php to serve files if client panel or system is offline + * Fix popover download of inline images + * Avoid de-duplicating zero-length files + * Send new message alert to team members if not assigned to an agent + * Fix import of users to organization not setting the organization + * Fix redactor toolbar showing over the date picker (#1450, thanks @Chefkeks) + +### Performance and Security + * Fix XSS vulnerability in client language selection + osTicket v1.9.5 =============== ### Enhancements diff --git a/assets/default/css/theme.css b/assets/default/css/theme.css index b8ca14066d9c2c2188eeb23b997675659ea893b8..5b98eaee93d60bc9f6732c12cd2e3e39d24ca10d 100644 --- a/assets/default/css/theme.css +++ b/assets/default/css/theme.css @@ -300,9 +300,20 @@ body { height: 71px; padding: 0 20px; } -#header #logo { - width: 220px; - height: 71px; +#logo { + height: 100%; +} +#header #logo img { + max-height: 65px; + max-width: 380px; + width: auto; + height: auto; + vertical-align: middle; +} +.valign-helper { + height: 100%; + display: inline-block; + vertical-align: middle; } #header p { width: 400px; @@ -398,6 +409,7 @@ body { text-indent: -9999px; margin: 0 auto; background: url('../images/poweredby.png') top left no-repeat; + background-size: auto 20px; } .front-page-button { } diff --git a/assets/default/images/poweredby.png b/assets/default/images/poweredby.png index 18cfcdd4050cde428500032d52db74609ae9e10f..9b2915505a144a89e12338f081b30dcd032b4e40 100644 Binary files a/assets/default/images/poweredby.png and b/assets/default/images/poweredby.png differ diff --git a/client.inc.php b/client.inc.php index 2faee156f11c1c34aebffaf72d13bd15b3dd1655..0a572ed1cfb82278c620945c00d32fb60e712427 100644 --- a/client.inc.php +++ b/client.inc.php @@ -29,7 +29,7 @@ define('OSTCLIENTINC',TRUE); define('ASSETS_PATH',ROOT_PATH.'assets/default/'); //Check the status of the HelpDesk. -if (!in_array(strtolower(basename($_SERVER['SCRIPT_NAME'])), array('logo.php',)) +if (!in_array(strtolower(basename($_SERVER['SCRIPT_NAME'])), array('logo.php','file.php')) && !(is_object($ost) && $ost->isSystemOnline())) { include(ROOT_DIR.'offline.php'); exit; diff --git a/css/rtl.css b/css/rtl.css index c61f0b9fd1b494a4ffd1f6781ec307f102d915a5..64c4d086bb36824e3247659718138e4e78cebc01 100644 --- a/css/rtl.css +++ b/css/rtl.css @@ -86,7 +86,7 @@ border-left: none; border-right: 1px solid rgba(0,0,0,0.7); } -.rtl [class^="icon-"].pull-left, [class*=" icon-"].pull-left { +.rtl [class^="icon-"].pull-left, [class*=" icon-"].pull-right { margin-right: 0; margin-left: 0.3em; } diff --git a/include/ajax.orgs.php b/include/ajax.orgs.php index aa6937bc38f9c96312ee53be6da45737b795c4e6..7c849e6db88bd31267ebd2ab67a9aabb0e1d6e09 100644 --- a/include/ajax.orgs.php +++ b/include/ajax.orgs.php @@ -185,7 +185,8 @@ class OrgsAjaxAPI extends AjaxController { ); if ($_POST) { - $status = User::importFromPost($_POST['pasted']); + $status = User::importFromPost($_POST['pasted'], + array('org_id'=>$org_id)); if (is_string($status)) $info['error'] = $status; else diff --git a/include/class.api.php b/include/class.api.php index a1fed6764a7d7b9816243b22fa51c79ed2f4d6a7..c998cf244a6ddc314dfaa983a99cc03cfa7d81ce 100644 --- a/include/class.api.php +++ b/include/class.api.php @@ -345,7 +345,7 @@ class ApiXmlDataParser extends XmlDataParser { unset($value[":text"]); } if (isset($value['encoding'])) - $value['body'] = Format::utf8encode($value['body'], $value['encoding']); + $value['body'] = Charset::utf8($value['body'], $value['encoding']); if (!strcasecmp($value['type'], 'text/html')) $value = new HtmlThreadEntryBody($value['body']); diff --git a/include/class.charset.php b/include/class.charset.php new file mode 100644 index 0000000000000000000000000000000000000000..5411e6b4abcb1347a0e22998678b13d57fe119d3 --- /dev/null +++ b/include/class.charset.php @@ -0,0 +1,75 @@ +<?php +/********************************************************************* + class.charset.php + + Charset util class + + Copyright (c) 2015 osTicket + 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 Charset { + + const UTF8 = 'utf-8'; + + // Cleanup invalid charsets + // Thanks in part to https://github.com/mikel/mail/commit/88457e + static function normalize($charset) { + + $match = array(); + switch (true) { + // Windows charsets - force correct format + case preg_match('`^Windows-?(\d+)$`', $charset, $match): + return 'Windows-'.$match[1]; + // ks_c_5601-1987: Korean alias for cp949 + case preg_match('`^ks_c_5601-1987`', $charset): + return 'cp949'; + // Incorrect, bogus, ambiguous or empty charsets + // ISO-8859-1 is assumed + case preg_match('`^(default|x-user-defined|iso|us-ascii)`', $charset): + case preg_match('`^\s*$`', $charset): + return 'ISO-8859-1'; + } + + // Hmmmm + return $charset; + } + + // Translate characters ($text) from one encoding ($from) to another ($to) + static function transcode($text, $from, $to) { + + //Try auto-detecting charset/encoding + if (!$from && function_exists('mb_detect_encoding')) + $from = mb_detect_encoding($text); + + // Normalize bogus or ambiguous charsets + $from = self::normalize(trim($from)); + $to = self::normalize(trim($to)); + + $original = $text; + if (function_exists('iconv')) + $text = iconv($from, $to.'//IGNORE', $text); + elseif (function_exists('mb_convert_encoding')) + $text = mb_convert_encoding($text, $to, $from); + elseif (!strcasecmp($to, 'utf-8') + && function_exists('utf8_encode') + && !strcasecmp($from, 'ISO-8859-1')) + $text = utf8_encode($text); + + // If $text is false, then we have a (likely) invalid charset, use + // the original text and assume 8-bit (latin-1 / iso-8859-1) + // encoding + return (!$text && $original) ? $original : $text; + } + + //Wrapper for utf-8 transcoding. + function utf8($text, $charset=null) { + return self::transcode($text, $charset, self::UTF8); + } +} +?> diff --git a/include/class.config.php b/include/class.config.php index b8c35095396f5866b47e79b023338ce2289794a9..7ddc58855f0b68cb5f56f98ad893c43222e79e85 100644 --- a/include/class.config.php +++ b/include/class.config.php @@ -1096,6 +1096,13 @@ class OsticketConfig extends Config { return $this->getLogoId('client'); } + function getStaffLogoId() { + return $this->getLogoId('staff'); + } + function getStaffLogo() { + return $this->getLogo('staff'); + } + function updatePagesSettings($vars, &$errors) { global $ost; @@ -1139,6 +1146,9 @@ class OsticketConfig extends Config { 'client_logo_id' => ( (is_numeric($vars['selected-logo']) && $vars['selected-logo']) ? $vars['selected-logo'] : false), + 'staff_logo_id' => ( + (is_numeric($vars['selected-logo-scp']) && $vars['selected-logo-scp']) + ? $vars['selected-logo-scp'] : false), )); } diff --git a/include/class.file.php b/include/class.file.php index a540aebd2b986f4ebe8df6881303e8992f33f30c..fd787b627554fd83434a5e2556cb6f523c9d38e0 100644 --- a/include/class.file.php +++ b/include/class.file.php @@ -74,8 +74,10 @@ class AttachmentFile extends VerySimpleModel { return $this->key; } - function getSignature() { - return $this->signature ?: $this->getKey(); + function getSignature($cascade=false) { + $sig = $this->signature; + if (!$sig && $cascade) return $this->getKey(); + return $sig; } function lastModified() { @@ -127,7 +129,7 @@ class AttachmentFile extends VerySimpleModel { } function makeCacheable($ttl=86400) { - Http::cacheable($this->getSignature(), $this->lastModified(), $ttl); + Http::cacheable($this->getSignature(true), $this->lastModified(), $ttl); } function display($scale=false) { @@ -269,7 +271,7 @@ class AttachmentFile extends VerySimpleModel { } /* Function assumes the files types have been validated */ - static function upload($file, $ft='T') { + static function upload($file, $ft='T', $deduplicate=true) { if(!$file['name'] || $file['error'] || !is_uploaded_file($file['tmp_name'])) return false; @@ -285,10 +287,10 @@ class AttachmentFile extends VerySimpleModel { 'tmp_name'=>$file['tmp_name'], ); - return static::create($info, $ft); + return static::create($info, $ft, $deduplicate); } - static function uploadLogo($file, &$error, $aspect_ratio=3) { + static function uploadLogo($file, &$error, $aspect_ratio=2) { /* Borrowed in part from * http://salman-w.blogspot.com/2009/04/crop-to-fit-image-using-aspphp.html */ @@ -313,13 +315,13 @@ class AttachmentFile extends VerySimpleModel { $source_aspect_ratio = $source_width / $source_height; if ($source_aspect_ratio >= $aspect_ratio) - return self::upload($file, 'L'); + return self::upload($file, 'L', false); $error = __('Image is too square. Upload a wider image'); return false; } - static function create(&$file, $ft='T') { + static function create(&$file, $ft='T', $deduplicate=true) { if (isset($file['encoding'])) { switch ($file['encoding']) { case 'base64': @@ -338,18 +340,17 @@ class AttachmentFile extends VerySimpleModel { $file['key'] = $key; } - if (isset($file['size'])) { + if (isset($file['size']) && $file['size'] > 0) { // Check and see if the file is already on record $existing = static::objects()->filter(array( 'signature' => $file['signature'], 'size' => $file['size'] - )) - ->first(); + )); // If the record exists in the database already, a file with // the same hash and size is already on file -- just return // the file - if ($existing) { + if ($deduplicate && $existing->exists()) { $file['key'] = $existing->key; return $existing; } diff --git a/include/class.format.php b/include/class.format.php index f922a6c5ac3141f505c4aee36818063974637fe6..02402cf70c45f7739d103fa7d462f7e4bede45b0 100644 --- a/include/class.format.php +++ b/include/class.format.php @@ -14,6 +14,7 @@ vim: expandtab sw=4 ts=4 sts=4: **********************************************************************/ +include_once INCLUDE_DIR.'class.charset.php'; class Format { @@ -40,47 +41,13 @@ class Format { return $size; } - /* encode text into desired encoding - taking into accout charset when available. */ - function encode($text, $charset=null, $encoding='utf-8') { - - //Try auto-detecting charset/encoding - if (!$charset && function_exists('mb_detect_encoding')) - $charset = mb_detect_encoding($text); - - // Cleanup - incorrect, bogus, or ambiguous charsets - // ISO-8859-1 is assumed for empty charset. - if (!$charset || in_array(strtolower(trim($charset)), - array('default','x-user-defined','iso','us-ascii'))) - $charset = 'ISO-8859-1'; - - $original = $text; - if (function_exists('iconv')) - $text = iconv($charset, $encoding.'//IGNORE', $text); - elseif (function_exists('mb_convert_encoding')) - $text = mb_convert_encoding($text, $encoding, $charset); - elseif (!strcasecmp($encoding, 'utf-8') - && function_exists('utf8_encode') - && !strcasecmp($charset, 'ISO-8859-1')) - $text = utf8_encode($text); - - // If $text is false, then we have a (likely) invalid charset, use - // the original text and assume 8-bit (latin-1 / iso-8859-1) - // encoding - return (!$text && $original) ? $original : $text; - } - - //Wrapper for utf-8 encoding. - function utf8encode($text, $charset=null) { - return Format::encode($text, $charset, 'utf-8'); - } - function mimedecode($text, $encoding='UTF-8') { if(function_exists('imap_mime_header_decode') && ($parts = imap_mime_header_decode($text))) { $str =''; foreach ($parts as $part) - $str.= Format::encode($part->text, $part->charset, $encoding); + $str.= Charset::transcode($part->text, $part->charset, $encoding); $text = $str; } elseif($text[0] == '=' && function_exists('iconv_mime_decode')) { @@ -105,7 +72,7 @@ class Format { $filename, $match)) // XXX: Currently we don't care about the language component. // The encoding hint is sufficient. - return self::utf8encode(urldecode($match[3]), $match[1]); + return Charset::utf8(urldecode($match[3]), $match[1]); else return $filename; } @@ -679,7 +646,7 @@ class Format { $contents = base64_decode($contents); } if ($output_encoding && $charset) - $contents = Format::encode($contents, $charset, $output_encoding); + $contents = Charset::transcode($contents, $charset, $output_encoding); return array( 'data' => $contents, diff --git a/include/class.mailfetch.php b/include/class.mailfetch.php index 4e0e3c43059aac9c100ea390ffd3622551d5aba6..db9026228caa6f024c57c43f906fce5cae683eab 100644 --- a/include/class.mailfetch.php +++ b/include/class.mailfetch.php @@ -207,7 +207,7 @@ class MailFetcher { //Convert text to desired encoding..defaults to utf8 function mime_encode($text, $charset=null, $encoding='utf-8') { //Thank in part to afterburner - return Format::encode($text, $charset, $encoding); + return Charset::transcode($text, $charset, $encoding); } function mailbox_encode($mailbox) { @@ -241,7 +241,7 @@ class MailFetcher { if (function_exists('mb_detect_encoding')) if (($src_enc = mb_detect_encoding($text)) && (strcasecmp($src_enc, 'ASCII') !== 0)) - return Format::encode($text, $src_enc, $encoding); + return Charset::transcode($text, $src_enc, $encoding); // Handle ASCII text and RFC-2047 encoding $str = ''; diff --git a/include/class.mailparse.php b/include/class.mailparse.php index c2b51d7f07b46523bebc22292388d8bc494ecc62..5c9cdf4d636fd04b4cdb4d894ca06b036eae8b37 100644 --- a/include/class.mailparse.php +++ b/include/class.mailparse.php @@ -335,7 +335,7 @@ class Mail_Parse { $content = $struct->body; //Encode to desired encoding - ONLY if charset is known?? if (isset($struct->ctype_parameters['charset'])) - $content = Format::encode($content, + $content = Charset::transcode($content, $struct->ctype_parameters['charset'], $this->charset); return $content; @@ -358,7 +358,7 @@ class Mail_Parse { function mime_encode($text, $charset=null, $encoding='utf-8') { - return Format::encode($text, $charset, $encoding); + return Charset::transcode($text, $charset, $encoding); } function getAttachments($part=null){ diff --git a/include/class.misc.php b/include/class.misc.php index b515507c8610a30448ff10cb7246128360d672c9..df8eb6d7a6e35df50074c83b420e3280ddb1193c 100644 --- a/include/class.misc.php +++ b/include/class.misc.php @@ -16,14 +16,31 @@ class Misc { - function randCode($count=8, $chars=false) { - $chars = $chars ? $chars - : 'abcdefghijklmnopqrstuvwzyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.'; - $data = ''; - $m = strlen($chars) - 1; - for ($i=0; $i < $count; $i++) - $data .= $chars[mt_rand(0,$m)]; - return $data; + function randCode($len=8, $chars=false) { + $chars = $chars ?: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_='; + + // Determine the number of bits we need + $char_count = strlen($chars); + $bits_per_char = ceil(log($char_count, 2)); + $bytes = ceil(4 * $len / floor(32 / $bits_per_char)); + // Pad to 4 byte boundary + $bytes += (4 - ($bytes % 4)) % 4; + + // Fetch some random data blocks + $data = Crypto::random($bytes); + + $mask = (1 << $bits_per_char) - 1; + $loops = (int) (32 / $bits_per_char); + $output = ''; + $ints = unpack('V*', $data); + array_shift($ints); + foreach ($ints as $int) { + for ($i = $loops; $i > 0; $i--) { + $output .= $chars[($int & $mask) % $char_count]; + $int >>= $bits_per_char; + } + } + return substr($output, 0, $len); } function __rand_seed($value=0) { diff --git a/include/class.ostsession.php b/include/class.ostsession.php index 94df679d2792046fda2b7373e598851f147a501b..b300f16ec7a826443e3e1fb52530a7c88bd6486b 100644 --- a/include/class.ostsession.php +++ b/include/class.ostsession.php @@ -69,6 +69,23 @@ class osTicketSession { $this->destroy($oldId); } + static function destroyCookie() { + setcookie(session_name(), 'deleted', 1, + ini_get('session.cookie_path'), + ini_get('session.cookie_domain'), + ini_get('session.cookie_secure'), + ini_get('session.cookie_httponly')); + } + + static function renewCookie($baseTime=false, $window=false) { + setcookie(session_name(), session_id(), + ($baseTime ?: time()) + ($window ?: SESSION_TTL), + ini_get('session.cookie_path'), + ini_get('session.cookie_domain'), + ini_get('session.cookie_secure'), + ini_get('session.cookie_httponly')); + } + function open($save_path, $session_name){ return (true); } diff --git a/include/class.thread.php b/include/class.thread.php index 0dba7135cf4c7b455334a91e3f3f1c3ef568ae7f..048c7f4f755dc1140c6659a2e2509f46d686bee6 100644 --- a/include/class.thread.php +++ b/include/class.thread.php @@ -251,6 +251,13 @@ class Thread extends VerySimpleModel { return $deleted; } + function removeCollaborators() { + $sql='DELETE FROM '.TICKET_COLLABORATOR_TABLE + .' WHERE ticket_id='.db_input($this->getObjectId()); + + return (db_query($sql) && db_affected_rows()); + } + /** * Function: lookupByEmailHeaders * @@ -315,7 +322,6 @@ class Thread extends VerySimpleModel { return null; } - function delete() { //Self delete @@ -329,6 +335,7 @@ class Thread extends VerySimpleModel { // Mass delete entries $this->deleteAttachments(); + $this->removeCollaborators(); $this->entries->delete(); @@ -1274,15 +1281,18 @@ class TextThreadEntryBody extends ThreadEntryBody { if ($this->isEmpty()) return '(empty)'; + $escaped = Format::htmlchars($this->body); switch ($output) { case 'html': + return '<div style="white-space:pre-wrap">' + .Format::clickableurls($escaped).'</div>'; case 'email': return '<div style="white-space:pre-wrap">' - .Format::htmlchars($this->body).'</div>'; + .$escaped.'</div>'; case 'pdf': - return nl2br($this->body); + return nl2br($escaped); default: - return '<pre>'.$this->body.'</pre>'; + return '<pre>'.$escaped.'</pre>'; } } } diff --git a/include/class.ticket.php b/include/class.ticket.php index a7a91190af8d205e386d644f2624a84359fe574f..f55c97649eaa4b36888e846ef96262ac1d4bada4 100644 --- a/include/class.ticket.php +++ b/include/class.ticket.php @@ -2019,8 +2019,12 @@ implements RestrictedAccess, Threadable { //Assigned staff if any...could be the last respondent - if($this->isAssigned() && ($staff=$this->getStaff())) - $recipients[]=$staff; + if ($this->isAssigned()) { + if ($staff = $this->getStaff()) + $recipients[] = $staff; + elseif ($team = $this->getTeam()) + $recipients = array_merge($recipients, $team->getMembers()); + } //Dept manager if($cfg->alertDeptManagerONNewMessage() && $dept && ($manager=$dept->getManager())) @@ -2711,7 +2715,7 @@ implements RestrictedAccess, Threadable { * * $autorespond and $alertstaff overrides config settings... */ - static function create(&$vars, &$errors, $origin, $autorespond=true, + static function create($vars, &$errors, $origin, $autorespond=true, $alertstaff=true) { global $ost, $cfg, $thisclient, $_FILES; @@ -3213,16 +3217,10 @@ implements RestrictedAccess, Threadable { } $ticket->reload(); - $dept = $ticket->getDept(); - - // See if we need to skip auto-response. - $autorespond = isset($create_vars['autorespond']) - ? $create_vars['autorespond'] : true; - if (!$autorespond + if(!$cfg->notifyONNewStaffTicket() || !isset($vars['alertuser']) - || !$dept->autoRespONNewTicket() - || !$cfg->notifyONNewStaffTicket()) + || !($dept=$ticket->getDept())) return $ticket; //No alerts. //Send Notice to user --- if requested AND enabled!! diff --git a/include/class.translation.php b/include/class.translation.php index 67037d2c02fb979d2f3006c96a3733f32f8cc30f..cb8bcee9a3996bce4b494a870cc097690522c0ce 100644 --- a/include/class.translation.php +++ b/include/class.translation.php @@ -576,7 +576,7 @@ class Translation extends gettext_reader implements Serializable { if (!$this->encode) return $string; - return Format::encode($string, 'utf-8', $this->charset); + return Charset::transcode($string, 'utf-8', $this->charset); } static function buildHashFile($mofile, $outfile=false, $return=false) { @@ -626,9 +626,8 @@ class Translation extends gettext_reader implements Serializable { } if ($charset && strcasecmp($charset, 'utf-8') !== 0) { foreach ($table as $orig=>$trans) { - // Format::encode defaults to UTF-8 output - $table[Format::encode($orig, $charset)] = - Format::encode($trans, $charset); + $table[Charset::utf8($orig, $charset)] = + Charset::utf8($trans, $charset); unset($table[$orig]); } } diff --git a/include/class.usersession.php b/include/class.usersession.php index 1d0b8e0b1862b9c2ddfadac651074415ce6127b7..004eda9ee5e55ac7910990829102720eeaa42ae6 100644 --- a/include/class.usersession.php +++ b/include/class.usersession.php @@ -133,6 +133,8 @@ class ClientSession extends EndUser { } function refreshSession($force=false){ + global $cfg; + $time = $this->session->getLastUpdate($this->token); // Deadband session token updates to once / 30-seconds if (!$force && time() - $time < 30) @@ -140,6 +142,8 @@ class ClientSession extends EndUser { $this->token = $this->getSessionToken(); //TODO: separate expire time from hash?? + + osTicketSession::renewCookie($time, $cfg->getClientSessionTimeout()); } function getSession() { @@ -179,12 +183,16 @@ class StaffSession extends Staff { } function refreshSession($force=false){ + global $cfg; + $time = $this->session->getLastUpdate($this->token); // Deadband session token updates to once / 30-seconds if (!$force && time() - $time < 30) return; $this->token=$this->getSessionToken(); + + osTicketSession::renewCookie($time, $cfg->getStaffSessionTimeout()); } function getSession() { diff --git a/include/client/header.inc.php b/include/client/header.inc.php index 4a6324a58e3da655bcf47face2cbd7b5020857b1..34cd76f4056355f180c5af257cf9192f56cc7009 100644 --- a/include/client/header.inc.php +++ b/include/client/header.inc.php @@ -53,11 +53,6 @@ if (($lang = Internationalization::getCurrentLanguage()) <body> <div id="container"> <div id="header"> - <a class="pull-left" id="logo" href="<?php echo ROOT_PATH; ?>index.php" - title="<?php echo __('Support Center'); ?>"><img src="<?php - echo ROOT_PATH; ?>logo.php" border=0 alt="<?php - echo $ost->getConfig()->getTitle(); ?>" - style="height: 5em"></a> <div class="pull-right flush-right"> <p> <?php @@ -100,6 +95,12 @@ if (($all_langs = Internationalization::getConfiguredSystemLanguages()) } ?> </p> </div> + <a class="pull-left" id="logo" href="<?php echo ROOT_PATH; ?>index.php" + title="<?php echo __('Support Center'); ?>"> + <span class="valign-helper"></span> + <img src="<?php echo ROOT_PATH; ?>logo.php" border=0 alt="<?php + echo $ost->getConfig()->getTitle(); ?>"> + </a> </div> <div class="clear"></div> <?php diff --git a/include/i18n/en_US/file.yaml b/include/i18n/en_US/file.yaml index b6b9ac906fe09b8a61aa32c1c07f46138cc811ee..0464b6a23d6f2e600b2242880089133d65fdc214 100644 --- a/include/i18n/en_US/file.yaml +++ b/include/i18n/en_US/file.yaml @@ -14,220 +14,169 @@ type: image/png encoding: base64 data: | - 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 - -- key: 6fe1efdea357534d238b86e7860a7c5a - name: kangaroo.png - type: image/png - encoding: base64 - data: | - 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 + 2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/m + ft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8 + e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCd + KD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3 + S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1 + +Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9Uj + RiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscj + xx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVY + dFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADKGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAA + AAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4g + PHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENv + cmUgNS42LWMwMTQgNzkuMTU2Nzk3LCAyMDE0LzA4LzIwLTA5OjUzOjAyICAgICAgICAiPiA8cmRm + OlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1u + cyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5h + ZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8x + LjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jl + c291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoTWFj + aW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2RTJDOTVERUE2NzMxMUU0QkRDRERG + OTFGQUY5NERBNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2RTJDOTVERkE2NzMxMUU0QkRD + RERGOTFGQUY5NERBNSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAu + aWlkOkNGQTc0RTRGQTY3MTExRTRCRENEREY5MUZBRjk0REE1IiBzdFJlZjpkb2N1bWVudElEPSJ4 + bXAuZGlkOkNGQTc0RTUwQTY3MTExRTRCRENEREY5MUZBRjk0REE1Ii8+IDwvcmRmOkRlc2NyaXB0 + aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+i/72ygAAFwtJ + REFUeNrsXQmcU9XVPy97MslkZoBhcRiQXTY30M+tKCqoLQr287O2LvUr1taFuiButUoVwa32U4tS + tNU6VkRUpCwFZdEyqGyCoKyC7IsCM8zCTJKX992b/G9z5k6SyQxQccz5/Q4kk5f37rv3/M/5n3Pv + uzGGDx9OWTk2pNp00tju71Oxfy9RxP1da35LoZOF7hd6m9DtjT6DJTTfpNI1Hrr6rTyy2SyyGc1j + bG1Z887KEZILhJ4n9MdCr2j0t6NC80xauN5NP5sSpLAAXXMBmRRH1j6+1+ISWig0V6hdaA0i0r4m + RjQFmV2N/rY/SktEJBv6Rj5ZAmQtfVGKWlmgZeW7Ka2Enip0gNDThLYX6gXgJLuJCA0JPSh0ldDp + QmcJPZDBue34X4K0otGUUQBtxlYX7SuzU492YYpEm1fHZ4H2/ZCOQq8U+r9Cu2X4nd5CrxK6TOhI + oQvSHJsjdBgD87tCxwn9bUZXkhAVADt0yCBfjtnsQJbN0Zq/eITeLnQhDL9bE84hI+BcoffjfMnk + V4iSHDr3A9gNR7OgSbO3OemJ0hwqyo02y4HIAq35SmuhU4X+QehxR8BOHgGNvAA5naSbRULvTRO5 + fi00P+2ZnRbVfuOgSYt91Ca3eeVlWerY/OUEoW8K7XWEz3sucru9QmsBuNZpHHY/ipf6H0xHG7cd + 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 diff --git a/include/i18n/en_US/help/tips/staff.department.yaml b/include/i18n/en_US/help/tips/staff.department.yaml index 2d91cb5383194e81be920c328837ef031b6709cc..ec16a46a1f13e2ad790f2ca9216fe447b5654ad8 100644 --- a/include/i18n/en_US/help/tips/staff.department.yaml +++ b/include/i18n/en_US/help/tips/staff.department.yaml @@ -47,7 +47,7 @@ sla: Service Level Agreement for tickets routed to this Department. links: - title: Manage SLA Plans - href: /scp/slaplans.php + href: /scp/slas.php manager: title: Department Manager diff --git a/include/staff/header.inc.php b/include/staff/header.inc.php index b640573a569f9181e98a03a6ccbc90e10d7d79e8..b6afe4f38a37c1020426adc62c7da892b049a5c7 100644 --- a/include/staff/header.inc.php +++ b/include/staff/header.inc.php @@ -65,7 +65,6 @@ if (($lang = Internationalization::getCurrentLanguage()) echo sprintf('<div id="notice_bar">%s</div>', $ost->getNotice()); ?> <div id="header"> - <a href="index.php" class="no-pjax pull-left" id="logo">osTicket — <?php echo __('Customer Support System'); ?></a> <p id="info" class="pull-right"><?php echo sprintf(__('Welcome, %s.'), '<strong>'.$thisstaff->getFirstName().'</strong>'); ?> <?php if($thisstaff->isAdmin() && !defined('ADMINPAGE')) { ?> @@ -76,6 +75,10 @@ if (($lang = Internationalization::getCurrentLanguage()) | <a href="profile.php"><?php echo __('My Preferences'); ?></a> | <a href="logout.php?auth=<?php echo $ost->getLinkToken(); ?>" class="no-pjax"><?php echo __('Log Out'); ?></a> </p> + <a href="index.php" class="no-pjax" id="logo"> + <span class="valign-helper"></span> + <img src="logo.php" alt="osTicket — <?php echo __('Customer Support System'); ?>"/> + </a> </div> <div id="pjax-container" class="<?php if ($_POST) echo 'no-pjax'; ?>"> <?php } else { diff --git a/include/staff/login.tpl.php b/include/staff/login.tpl.php index a979d6a64e9114ad6ad65425c7dff3af4f98c5cc..cbb5b589499552516ea20f60b8bd90917ff2d445 100644 --- a/include/staff/login.tpl.php +++ b/include/staff/login.tpl.php @@ -3,7 +3,10 @@ include_once(INCLUDE_DIR.'staff/login.header.php'); $info = ($_POST && $errors)?Format::htmlchars($_POST):array(); ?> <div id="loginBox"> - <h1 id="logo"><a href="index.php">osTicket :: <?php echo __('Staff Control Panel');?></a></h1> + <h1 id="logo"><a href="index.php"> + <span class="valign-helper"></span> + <img src="logo.php?login" alt="osTicket :: <?php echo __('Staff Control Panel');?>" /> + </a></h1> <h3><?php echo Format::htmlchars($msg); ?></h3> <div class="banner"><small><?php echo ($content) ? Format::display($content->getLocalBody()) : ''; ?></small></div> <form action="login.php" method="post"> diff --git a/include/staff/settings-pages.inc.php b/include/staff/settings-pages.inc.php index 3bf1c78776adc2bc90b9604175591bd3ff969202..4d9910b4e2c9e04cd5d41fc40ddde1961f0e1abf 100644 --- a/include/staff/settings-pages.inc.php +++ b/include/staff/settings-pages.inc.php @@ -107,49 +107,74 @@ $pages = Page::getPages(); <tbody> <tr> <td colspan="2"> - <label style="display:block"> +<table style="width:100%"> + <thead><tr> + <th>Client</th> + <th>Staff</th> + <th>Logo</th> + </tr></thead> + <tbody> + <tr> + <td> <input type="radio" name="selected-logo" value="0" style="margin-left: 1em" <?php if (!$ost->getConfig()->getClientLogoId()) echo 'checked="checked"'; ?>/> - <img src="../assets/default/images/logo.png" + </td><td> + <input type="radio" name="selected-logo-scp" value="0" + style="margin-left: 1em" + <?php if (!$ost->getConfig()->getStaffLogoId()) + echo 'checked="checked"'; ?>/> + </td><td> + <img src="<?php echo ROOT_PATH; ?>assets/default/images/logo.png" alt="Default Logo" valign="middle" style="box-shadow: 0 0 0.5em rgba(0,0,0,0.5); margin: 0.5em; height: 5em; vertical-align: middle"/> - </label> - </td></tr> - <tr> - <th colspan="2"> - <em><?php echo __('Use a custom logo'); ?> <i class="help-tip icon-question-sign" href="#upload_a_new_logo"></i></em> - </th> + <img src="<?php echo ROOT_PATH; ?>scp/images/ost-logo.png" + alt="Default Logo" valign="middle" + style="box-shadow: 0 0 0.5em rgba(0,0,0,0.5); + margin: 0.5em; height: 5em; + vertical-align: middle"/> + </td> </tr> - <tr><td colspan="2"> - <?php - $current = $ost->getConfig()->getClientLogoId(); - foreach (AttachmentFile::allLogos() as $logo) { ?> - <div> - <label> + <tr><th colspan="3"> + <em><?php echo __('Use a custom logo'); ?> <i class="help-tip icon-question-sign" href="#upload_a_new_logo"></i></em> + </th></tr> + <?php + $current = $ost->getConfig()->getClientLogoId(); + $currentScp = $ost->getConfig()->getStaffLogoId(); + foreach (AttachmentFile::allLogos() as $logo) { ?> + <tr> + <td> <input type="radio" name="selected-logo" style="margin-left: 1em" value="<?php echo $logo->getId(); ?>" <?php if ($logo->getId() == $current) echo 'checked="checked"'; ?>/> + </td><td> + <input type="radio" name="selected-logo-scp" + style="margin-left: 1em" value="<?php + echo $logo->getId(); ?>" <?php + if ($logo->getId() == $currentScp) + echo 'checked="checked"'; ?>/> + </td><td> <img src="<?php echo $logo->getDownloadUrl(); ?>" alt="Custom Logo" valign="middle" style="box-shadow: 0 0 0.5em rgba(0,0,0,0.5); margin: 0.5em; height: 5em; vertical-align: middle;"/> - </label> - <?php if ($logo->getId() != $current) { ?> + <?php if ($logo->getId() != $current && $logo->getId() != $currentScp) { ?> <label> <input type="checkbox" name="delete-logo[]" value="<?php echo $logo->getId(); ?>"/> <?php echo __('Delete'); ?> </label> <?php } ?> - </div> - <?php } ?> - <br/> + </td> + </tr> +<?php } ?> + </tbody> +</table> <b><?php echo __('Upload a new logo'); ?>:</b> <input type="file" name="logo[]" size="30" value="" /> <font class="error"><br/><?php echo $errors['logo']; ?></font> diff --git a/include/staff/ticket-view.inc.php b/include/staff/ticket-view.inc.php index b954c49dcb78c081294149b7013a55d97931435f..09d50c8d6b62b81bd0f0d3714857d4b5bb14967a 100644 --- a/include/staff/ticket-view.inc.php +++ b/include/staff/ticket-view.inc.php @@ -439,7 +439,7 @@ $tcount = $ticket->getThreadEntries($types)->count(); </tr> <tr><td colspan="4" class="thread-body" id="thread-id-<?php echo $entry->getId(); ?>"><div><?php - echo Format::clickableurls($entry->getBody()->toHtml()); ?></div></td></tr> + echo $entry['body']->toHtml(); ?></div></td></tr> <?php $urls = null; if ($entry->has_attachments diff --git a/include/tnef_decoder.php b/include/tnef_decoder.php index e0f7869ba82b4ce554ada486efbfb1ae9cc4bb67..70e455851fc69d236f822ed033fdb7e731219f57 100644 --- a/include/tnef_decoder.php +++ b/include/tnef_decoder.php @@ -341,7 +341,7 @@ class TnefAttributeStreamReader extends TnefStreamReader { /* Read and truncate to length. */ $text = substr($this->_getx($datalen), 0, $length); if ($type == self::TypeUnicode) { - $text = Format::encode($text, 'ucs2'); + $text = Charset::utf8($text, 'ucs2'); } return $text; @@ -543,7 +543,7 @@ class TnefMessage extends AbstractTnefObject { // Transcode it if ($encoding && $charset) - $body = Format::encode($body, $charset, $encoding); + $body = Charset::transcode($body, $charset, $encoding); return $body; } diff --git a/logout.php b/logout.php index 74d73cc377b58049f286551771ff880dfc800fab..9fb8037acd458c9998c126d6d17ec533fbac7b57 100644 --- a/logout.php +++ b/logout.php @@ -19,6 +19,7 @@ require('client.inc.php'); if ($thisclient && $_GET['auth'] && $ost->validateLinkToken($_GET['auth'])) $thisclient->logOut(); +osTicketSession::destroyCookie(); Http::redirect('index.php'); ?> diff --git a/scp/css/login.css b/scp/css/login.css index 99f8f1220c1f388f52a37d8759c5ba5049566b9c..aef7b3a789b44c4d55bc0e7df0965cc7f1bc2247 100644 --- a/scp/css/login.css +++ b/scp/css/login.css @@ -69,12 +69,21 @@ h1 { #logo a { display:block; - width:180px; - height:72px; text-decoration:none; - text-indent:-9999px; - background:url(../images/login-logo.png); - margin:0 auto 1em auto; + height: 100px; +} + +#logo a img { + max-height:66px; + max-width: 300px; + height: auto; + width: auto; + vertical-align: middle; +} +.valign-helper { + height: 100%; + display: inline-block; + vertical-align: middle; } h3 { diff --git a/scp/css/scp.css b/scp/css/scp.css index 37979a2c7531d71f26910ea796fbbfbaa7a54f61..f9296da91eb1e9bf741a8cbd6e50bb44dccc8ae2 100644 --- a/scp/css/scp.css +++ b/scp/css/scp.css @@ -102,19 +102,31 @@ div#header a { #header { height:76px; - background:url(../images/header-bg.png) top left repeat-x; border-left:1px solid #aaa; border-right:1px solid #aaa; + background-color: rgb(248,248,248); + box-shadow: inset 0 -10px 8px -5px rgba(0,0,0,0.1); } #logo { display:block; - width:190px; - height:76px; text-decoration:none; outline:none; - text-indent:-9999px; - background:url(../images/ost-logo.png) top left no-repeat; + height: 64px; + max-width: 400px; + padding: 5px 0 7px 5px; +} +#logo img { + max-height: 66px; + max-width: 300px; + height: auto; + width: auto; + vertical-align: middle; +} +.valign-helper { + height: 100%; + display: inline-block; + vertical-align: middle; } #header p { diff --git a/scp/images/header-bg.png b/scp/images/header-bg.png deleted file mode 100644 index dc3e1d5c51f1a9c7b58c5a5b8c423a0152c72767..0000000000000000000000000000000000000000 Binary files a/scp/images/header-bg.png and /dev/null differ diff --git a/scp/images/login-logo.png b/scp/images/login-logo.png deleted file mode 100644 index 6526ebe0a15f393382e0339b38cef8422d7ff471..0000000000000000000000000000000000000000 Binary files a/scp/images/login-logo.png and /dev/null differ diff --git a/scp/images/ost-logo.png b/scp/images/ost-logo.png index 0cf40c72dc58b139663d8ba7bd0210ae5d2743f1..33b09d35aa8dfbc935e85e70ee17bc5c69d0567e 100644 Binary files a/scp/images/ost-logo.png and b/scp/images/ost-logo.png differ diff --git a/scp/logo.php b/scp/logo.php new file mode 100644 index 0000000000000000000000000000000000000000..0acbf430882b3690134e4048bb7c22ffc1cd697f --- /dev/null +++ b/scp/logo.php @@ -0,0 +1,32 @@ +<?php +/********************************************************************* + logo.php + + Simple logo to facilitate serving a customized client-side logo from + osTicet. The logo is configurable in Admin Panel -> Settings -> Pages + + Peter Rotich <peter@osticket.com> + Jared Hancock <jared@osticket.com> + Copyright (c) 2006-2013 osTicket + 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: +**********************************************************************/ + +// Don't update the session for inline image fetches +if (!function_exists('noop')) { function noop() {} } +session_set_save_handler('noop','noop','noop','noop','noop','noop'); +define('DISABLE_SESSION', true); + +require_once('../main.inc.php'); + +if (($logo = $ost->getConfig()->getStaffLogo())) { + $logo->display(); +} else { + header('Location: images/ost-logo.png'); +} + +?> diff --git a/scp/logout.php b/scp/logout.php index bdc697c78beceb7b4cf3185603f45afbcf8d2838..1007d985c0bb8509514f42d55d91103571b3f965 100644 --- a/scp/logout.php +++ b/scp/logout.php @@ -31,6 +31,8 @@ TicketLock::removeStaffLocks($thisstaff->getId()); session_unset(); session_destroy(); +osTicketSession::destroyCookie(); + @header('Location: login.php'); require('login.php'); ?>