Skip to content
Snippets Groups Projects
Commit 566a1605 authored by Peter Rotich's avatar Peter Rotich
Browse files

Merge branch 'develop' into feature/reports-access

parents c363b010 92379f2e
No related branches found
No related tags found
No related merge requests found
Showing
with 1300 additions and 433 deletions
......@@ -3,3 +3,5 @@ php53.cgi
include/ost-config.php
*.sw[a-z]
.DS_Store
.vagrant
Vagrantfile
Customizng Your Theme
====
When modifying the default theme, it is recommended that you do not
edit the CSS files directly. Instead, you should use the included
LESS files and recompile the CSS file with your edits.
Even if you decide to edit the CSS directly, we recommend that you
keep the LESS files, so that you can quickly rebuild the default
theme should you need to recover it, or for upgrade purposes.
*Please do not submit any CSS edits to the official branch, unless
they are done within the LESS files.*
#header, #nav, #meta, #footer, #reply, #pagination, .reload, .refresh, form, .thread, hr, #kbAttachments, .back {
display: none;
}
th {
text-align: left;
}
a {
color: #000;
text-decoration: none;
}
caption {
text-align: left;
padding-bottom: 10px;
font-weight: bold;
}
.message, .response {
border-bottom: 1px solid #000;
margin-bottom: 20px;
padding-bottom: 10px;
}
.message th, .response th {
font-size: 12pt;
font-weight: bold;
padding-bottom: 5px;
}
#header,#nav,#meta,#footer,#reply,#pagination,.reload,.refresh,form,.thread,hr,#kbAttachments,.back{display:none}th{text-align:left}a{color:#000;text-decoration:none}caption{text-align:left;padding-bottom:10px;font-weight:bold}.message,.response{border-bottom:1px solid #000;margin-bottom:20px;padding-bottom:10px}.message th,.response th{font-size:12pt;font-weight:bold;padding-bottom:5px}
\ No newline at end of file
This diff is collapsed.
html{font-size:100%;overflow-y:scroll;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0;font-size:13px;line-height:1.231;padding:0}body,input,select,textarea{font-family:sans-serif;color:#000}b,strong{font-weight:bold}blockquote{margin:1em 40px}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}small{font-size:85%}ul,ol{margin:1em 0;padding:0 0 0 30px}img{border:0;vertical-align:middle}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}input{line-height:normal;*overflow:visible}table input{*overflow:auto}input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="checkbox"],input[type="radio"]{box-sizing:border-box}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}th,td{vertical-align:top}th{text-align:left;font-weight:normal}h1,h2,h3,h4,h5,h6,form,fieldset{margin:0;padding:0}a{color:#0072bc;text-decoration:none}h1{color:#00aeef;font-weight:normal;font-size:20px}h3{font-size:16px}h2{font-size:16px;color:#999}.centered{text-align:center}.clear{clear:both;height:1px;visibility:none}.hidden{display:none}.faded{color:#666}#pagination{border:0;margin:0 0 40px 0;padding:0}#pagination li{border:0;margin:0;padding:0;font-size:11px;list-style:none;display:inline}#pagination li a{margin-right:2px;display:block;float:left;padding:3px 6px;text-decoration:none}#pagination li a:hover{color:#ff0084}#pagination .previousOff,#pagination .nextOff{color:#666;display:block;float:left;font-weight:bold;padding:3px 4px}#pagination .next a,#pagination .previous a{font-weight:bold}#pagination .active{color:#000;font-weight:bold;margin-right:2px;display:block;float:left;padding:3px 6px;text-decoration:none}#msg_notice{margin:0;padding:5px 10px 5px 36px;height:16px;line-height:16px;margin-bottom:10px;border:1px solid #0a0;background:url('../images/icons/ok.png') 10px 50% no-repeat #e0ffe0}#msg_warning{margin:0;padding:5px 10px 5px 36px;height:16px;line-height:16px;margin-bottom:10px;border:1px solid #f26522;background:url('../images/icons/alert.png') 10px 50% no-repeat #ffd}#msg_error{margin:0;padding:5px 10px 5px 36px;height:16px;line-height:16px;margin-bottom:10px;border:1px solid #a00;background:url('../images/icons/error.png') 10px 50% no-repeat #fff0f0}.warning{background:#ffc;font-style:italic}.warning strong{text-transform:uppercase;color:#a00;font-style:normal}.error{color:#f00}.error input{border:1px solid #f00}.button,.button:visited{background:#222;display:inline-block;font-size:16px;padding:8px 16px 6px 16px;width:160px;text-align:center;color:#fff;font-weight:bold;text-decoration:none;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 1px 3px rgba(0,0,0,0.5);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.5);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.5);text-shadow:0 -1px 1px rgba(0,0,0,0.25);border-bottom:1px solid rgba(0,0,0,0.25);position:relative;cursor:pointer;font-family:helvetica,arial,sans-serif}.button:hover{background-color:#111;color:#fff}.button:active{top:1px;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}.button,.button:visited,.green.button,.green.button:visited{background-color:#91bd09}.green.button:hover{background-color:#749a02}.blue.button,.blue.button:visited{background-color:#00aeef}.blue.button:hover{background-color:#0299d2}body{background:url('../images/page_bg.png') top left repeat-x #c8c8c8}#container{background:#fff;width:840px;margin:0 auto;box-shadow:0 0 6px rgba(0,0,0,0.5);-moz-box-shadow:0 0 6px rgba(0,0,0,0.5);-webkit-box-shadow:0 0 6px rgba(0,0,0,0.5)}#header{position:relative;height:71px;padding:0 20px}#header #logo{width:220px;height:71px;float:left}#header p{width:400px;text-align:right;margin:0;padding:10px 0;float:right}#nav{margin:0 20px;padding:2px 10px;height:20px;background:url('../images/nav_bg.png') top left repeat-x;border-top:1px solid #aaa;box-shadow:0 3px 2px rgba(0,0,0,0.4);-moz-box-shadow:0 3px 2px rgba(0,0,0,0.4);-webkit-box-shadow:0 3px 2px rgba(0,0,0,0.4)}#nav li{margin:0;padding:0;list-style:none;display:inline}#nav li a{display:block;width:auto;float:left;height:20px;line-height:20px;text-align:center;padding:0 10px 0 32px;margin-left:10px;color:#333;border-radius:20px;-webkit-border-radius:20px;-moz-border-radius:20px;background-position:10px 50%;background-repeat:no-repeat}#nav li a.active,#nav li a:hover{background-color:#dbefff;color:#000}#nav li a:hover{background-color:#ededed;color:#0054a6}#nav li a.home{background-image:url('../images/icons/home.png')}#nav li a.kb{background-image:url('../images/icons/kb.png')}#nav li a.new{background-image:url('../images/icons/new.png')}#nav li a.status{background-image:url('../images/icons/status.png')}#nav li a.tickets{background-image:url('../images/icons/tix.png')}#content{padding:20px 0;margin:0 20px;height:auto!important;height:350px;min-height:350px}#footer{text-align:center;font-size:11px;color:#333}#footer a{color:#333}#footer p{margin:10px 0 0 0}#footer #poweredBy{display:block;width:126px;height:23px;outline:0;text-indent:-9999px;margin:0 auto;background:url('../images/poweredby.png') top left no-repeat}#landing_page #new_ticket{margin-top:40px;width:295px;padding-left:75px;float:left;background:url('../images/new_ticket_icon.png') top left no-repeat}#landing_page #check_status{margin-top:40px;width:295px;padding-left:75px;float:right;background:url('../images/check_status_icon.png') top left no-repeat}#faq{clear:both;margin:0;padding:5px}#faq ol{font-size:15px;margin-left:0;padding-left:0;border-top:1px solid #ddd}#faq ol li{list-style:none;margin:0;padding:0;color:#999}#faq ol li a{display:block;padding:5px 0;height:auto!important;overflow:hidden;margin:0;border-bottom:1px solid #ddd;line-height:16px;padding-left:24px;background:url('../images/icons/page.png') 0 50% no-repeat}#faq ol li a:hover{background-color:#e9f5ff}#faq .article-meta{padding:5px;background:#fafafa}#kb{margin:2px 0;padding:5px;overflow:hidden}#kb>li{padding:10px;height:auto!important;overflow:hidden;margin:0;background:url(../images/kb_category_bg.png) bottom left repeat-x;border-bottom:1px solid #ddd}#kb>li h4{padding-bottom:3px;margin-bottom:3px}#kb>li h4 span{color:#666}#kb>li h4 a{font-size:14px}#kb li i{display:block;width:32px;height:32px;float:left;margin-right:6px;background:url(../images/kb_large_folder.png) top left no-repeat}#kb-search{padding:10px 0;overflow:hidden}#kb-search div{clear:both;overflow:hidden;padding-top:5px}#kb-search #query{margin:0;display:inline-block;float:left;width:200px;margin-right:5px}#kb-search #cid{margin:0;display:inline-block;float:left;width:200px;margin-right:5px;position:relative;top:2px}#kb-search #topic-id{margin:0;display:inline-block;float:left;width:410px}#kb-search #searchSubmit{margin:0;display:inline-block;float:left;position:relative;top:2px}#kb-search #breadcrumbs{color:#333;margin-bottom:15px}#kb-search #breadcrumbs #breadcrumbs a{color:#555}#ticketForm div,#clientLogin div{clear:both;padding:3px 0;overflow:hidden}#ticketForm div label,#clientLogin div label{display:block;width:140px;float:left}#ticketForm div label.required,#clientLogin div label.required{font-weight:bold;text-align:left}#ticketForm div input,#clientLogin div input,#ticketForm div textarea,#clientLogin div textarea{width:auto;border:1px solid #aaa;background:#fff;margin-right:10px;display:block;float:left}#ticketForm div input[type=file],#clientLogin div input[type=file]{border:0}#ticketForm div select,#clientLogin div select{display:block;float:left}#ticketForm div div.captchaRow,#clientLogin div div.captchaRow{line-height:31px}#ticketForm div div.captchaRow input,#clientLogin div div.captchaRow input{position:relative;top:6px}#ticketForm td textarea,#clientLogin td textarea,#ticketForm div textarea,#clientLogin div textarea{width:600px}#ticketForm td em,#clientLogin td em,#ticketForm div em,#clientLogin div em{color:#777}#ticketForm td .captcha,#clientLogin td .captcha,#ticketForm div .captcha,#clientLogin div .captcha{width:88px;height:31px;background:#000;display:block;float:left;margin-right:20px}#ticketForm td label.inline,#clientLogin td label.inline,#ticketForm div label.inline,#clientLogin div label.inline{width:auto;padding:0 10px}#ticketForm div.error input,#clientLogin div.error input{border:1px solid #a00}#ticketForm div.error label,#clientLogin div.error label{color:#a00}#ticketTable th{width:160px;font-weight:normal;text-align:left}#ticketTable th.required,#ticketTable td.required{font-weight:bold;text-align:left}#clientLogin{width:400px;margin-top:20px;padding:10px 100px 10px 10px;border:1px solid #ccc;background:url('../images/lock.png?1319655200') 440px 50% no-repeat #f6f6f6}#clientLogin p{clear:both;text-align:center}#clientLogin strong{font-size:11px;color:#d00;display:block;padding-left:140px}#clientLogin #email{width:250px;margin-right:0}#clientLogin #ticketno{width:120px;margin-right:0}#reply{margin-top:20px;padding:10px 5px;background:#f9f9f9;border:1px solid #ccc}#reply h2{margin-bottom:10px}#reply table{width:800px}#reply table td{vertical-align:top}#reply textarea{width:628px!important}#reply input[type=text],#reply #response_options textarea{border:1px solid #aaa;background:#fff}#reply .attachments .uploads div{display:inline-block;padding-right:20px}#reply .file{display:inline-block;padding-left:20px;margin-right:20px;background:url('../images/icons/file.gif') 0 50% no-repeat}.uploads{display:inline-block;padding-right:20px}.uploads label{padding:3px;padding-right:10px;width:auto!important}.Icon{width:auto;padding-left:20px;background-position:top left;background-repeat:no-repeat;color:#069;text-decoration:none}.Icon.Ticket{background-image:url('../images/icons/ticket.gif')}.Icon.webTicket{background-image:url('../images/icons/ticket_source_web.gif')}.Icon.emailTicket{background-image:url('../images/icons/ticket_source_email.gif')}.Icon.phoneTicket{background-image:url('../images/icons/ticket_source_phone.gif')}.Icon.otherTicket{background-image:url('../images/icons/ticket_source_other.gif')}.Icon.attachment{background-image:url('../images/icons/attachment.gif')}.Icon.file{background-image:url('../images/icons/attachment.gif')}.Icon.refresh{background-image:url('../images/icons/refresh.gif')}.Icon.thread{font-weight:bold;font-size:1em;background-image:url('../images/icons/thread.gif?1319556657')}.Icon:hover{text-decoration:underline}#ticketTable{border:1px solid #aaa;border-left:none;border-bottom:0}#ticketTable caption{padding:5px;text-align:left;color:#000;background:#ddd;border:1px solid #aaa;border-bottom:0;font-weight:bold}#ticketTable th{height:24px;line-height:24px;background:#e1f2ff;border:1px solid #aaa;border-right:0;border-top:0}#ticketTable th a{color:#000}#ticketTable td{padding:2px;border:1px solid #aaa;border-right:0;border-top:0}#ticketTable tr.alt td{background:#f9f9f9}#ticketSearchForm{display:inline-block;float:left;padding:0 0 5px 0}a.refresh{display:block;width:auto;float:right;height:20px;line-height:20px;text-align:center;padding:0 10px 0 28px;border:1px solid #aaa;margin-left:10px;color:#333;background-position:5px 50%;background-repeat:no-repeat;background-image:url('../images/icons/refresh.png')}.infoTable{background:#f4faff}.infoTable th{text-align:left}#ticketThread table{margin-top:10px;border:1px solid #aaa;border-bottom:2px solid #aaa}#ticketThread table th{text-align:left;border-bottom:1px solid #aaa;font-size:12px;padding:5px}#ticketThread table th span{font-weight:normal;color:#888;padding-left:20px}#ticketThread table td{padding:5px}#ticketThread .message th{background:#d8efff}#ticketThread .response th{background:#ddd}#ticketThread .info{padding:2px;background:#f9f9f9;border-top:1px solid #ddd;height:16px;line-height:16px}#ticketThread .info a{display:inline-block;margin:5px 10px 5px 0;padding-left:24px;height:16px;line-height:16px;background-position:0 50%;background-repeat:no-repeat}
\ No newline at end of file
/* Typography */
a {
color: #0072bc;
text-decoration: none;
}
h1 {
color: #00AEEF;
font-weight: normal;
font-size: 20px;
}
h3 {
font-size: 16px;
}
h2 {
font-size: 16px;
color: #999;
}
/* Helpers */
.centered { text-align: center;}
.clear { clear:both; height: 1px; visibility: none;}
.hidden { display: none;}
.faded { color:#666;}
/* Pagination */
#pagination {
border: 0;
margin: 0 0 40px 0;
padding: 0;
li {
border: 0;
margin: 0;
padding: 0;
font-size: 11px;
list-style: none;
display: inline;
a {
margin-right: 2px;
display: block;
float: left;
padding: 3px 6px;
text-decoration: none;
}
a:hover {
color: #ff0084;
}
}
.previousOff, .nextOff {
color: #666;
display: block;
float: left;
font-weight: bold;
padding: 3px 4px;
}
.next a, .previous a {
font-weight: bold;
}
.active {
color: #000;
font-weight: bold;
margin-right: 2px;
display: block;
float: left;
padding: 3px 6px;
text-decoration: none;
}
}
/* Alerts & Notices */
#msg_notice { margin: 0; padding: 5px 10px 5px 36px; height: 16px; line-height: 16px; margin-bottom: 10px; border: 1px solid #0a0; background: url('../images/icons/ok.png') 10px 50% no-repeat #e0ffe0; }
#msg_warning { margin: 0; padding: 5px 10px 5px 36px; height: 16px; line-height: 16px; margin-bottom: 10px; border: 1px solid #f26522; background: url('../images/icons/alert.png') 10px 50% no-repeat #ffffdd; }
#msg_error { margin: 0; padding: 5px 10px 5px 36px; height: 16px; line-height: 16px; margin-bottom: 10px; border: 1px solid #a00; background: url('../images/icons/error.png') 10px 50% no-repeat #fff0f0; }
.warning {
background: #ffc;
font-style: italic;
strong {
text-transform: uppercase;
color: #a00;
font-style: normal;
}
}
.error {
color:#f00;
input {
border:1px solid #f00;
}
}
.button, .button:visited {
background: #222;
display: inline-block;
font-size: 16px;
padding: 8px 16px 6px 16px;
width:160px;
text-align:center;
color: #fff;
font-weight:bold;
text-decoration: none;
border-radius: 5px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
box-shadow: 0 1px 3px rgba(0,0,0,0.5);
-moz-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
text-shadow: 0 -1px 1px rgba(0,0,0,0.25);
border-bottom: 1px solid rgba(0,0,0,0.25);
position: relative;
cursor: pointer;
font-family:helvetica, arial, sans-serif;
}
.button:hover { background-color: #111; color: #fff; }
.button:active { top: 1px; box-shadow:none; -moz-box-shadow:none; -webkit-box-shadow:none; }
.button, .button:visited,
.green.button, .green.button:visited { background-color: #91bd09; }
.green.button:hover { background-color: #749a02; }
.blue.button, .blue.button:visited { background-color: #00AEEF; }
.blue.button:hover { background-color: #0299d2; }
#kb {
margin: 2px 0;
padding: 5px;
overflow: hidden;
> li {
padding:10px;
height:auto !important;
overflow:hidden;
margin:0;
background:url(../images/kb_category_bg.png) bottom left repeat-x;
border-bottom:1px solid #ddd;
h4 {
padding-bottom:3px;
margin-bottom:3px;
span {
color:#666;
}
a {
font-size: 14px;
}
}
}
li {
i {
display:block;
width:32px;
height:32px;
float:left;
margin-right:6px;
background:url(../images/kb_large_folder.png) top left no-repeat;
}
}
}
#kb-search {
padding:10px 0;
overflow:hidden;
div {
clear:both;
overflow:hidden;
padding-top:5px;
}
#query {
margin:0;
display:inline-block;
float:left;
width:200px;
margin-right:5px;
}
#cid {
margin:0;
display:inline-block;
float:left;
width:200px;
margin-right:5px;
position:relative;
top:2px;
}
#topic-id {
margin:0;
display:inline-block;
float:left;
width:410px;
}
#searchSubmit {
margin:0;
display:inline-block;
float:left;
position:relative;
top:2px;
}
#breadcrumbs {
color: #333;
margin-bottom: 15px;
#breadcrumbs a {
color: #555;
}
}
}
#landing_page {
#new_ticket {
margin-top: 40px;
width: 295px;
padding-left: 75px;
float: left;
background: url('../images/new_ticket_icon.png') top left no-repeat;
}
#check_status {
margin-top: 40px;
width: 295px;
padding-left: 75px;
float: right;
background: url('../images/check_status_icon.png') top left no-repeat;
}
}
/* Landing page FAQ not yet implemented. */
#faq {
clear: both;
margin: 0;
padding: 5px;
ol {
font-size: 15px;
margin-left: 0;
padding-left: 0;
border-top:1px solid #ddd;
li {
list-style: none;
margin: 0;
padding:0;
color: #999;
a {
display:block;
padding:5px 0;
height:auto !important;
overflow:hidden;
margin:0;
border-bottom:1px solid #ddd;
line-height: 16px;
padding-left: 24px;
background: url('../images/icons/page.png') 0 50% no-repeat;
}
a:hover {
background-color:#e9f5ff;
}
}
}
.article-meta {
padding:5px;
background:#fafafa;
}
}
body {
background: url('../images/page_bg.png') top left repeat-x #c8c8c8;
}
#container {
background: #fff;
width: 840px;
margin: 0 auto;
box-shadow: 0 0 6px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 0 0 6px rgba(0, 0, 0, 0.5);
-webkit-box-shadow: 0 0 6px rgba(0, 0, 0, 0.5);
}
#header {
position: relative;
height: 71px;
padding: 0 20px;
#logo {
width: 220px;
height: 71px;
float: left;
}
p {
width: 400px;
text-align: right;
margin: 0;
padding: 10px 0;
float: right;
}
}
#nav {
margin: 0 20px;
padding: 2px 10px;
height: 20px;
background: url('../images/nav_bg.png') top left repeat-x;
border-top: 1px solid #aaa;
box-shadow:0 3px 2px rgba(0, 0, 0, 0.4);
-moz-box-shadow:0 3px 2px rgba(0, 0, 0, 0.4);
-webkit-box-shadow:0 3px 2px rgba(0, 0, 0, 0.4);
li {
margin: 0;
padding: 0;
list-style: none;
display: inline;
a {
display: block;
width: auto;
float: left;
height: 20px;
line-height: 20px;
text-align: center;
padding: 0 10px 0 32px;
margin-left: 10px;
color: #333;
border-radius: 20px;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
background-position: 10px 50%;
background-repeat: no-repeat;
}
a.active, a:hover {
background-color: #dbefff;
color: #000;
}
a:hover {
background-color: #ededed;
color: #0054a6;
}
a.home { background-image: url('../images/icons/home.png'); }
a.kb { background-image: url('../images/icons/kb.png'); }
a.new { background-image: url('../images/icons/new.png'); }
a.status { background-image: url('../images/icons/status.png'); }
a.tickets { background-image: url('../images/icons/tix.png'); }
}
}
#content {
padding: 20px 0;
margin: 0 20px;
height: auto !important;
height: 350px;
min-height: 350px;
}
#footer {
text-align: center;
font-size: 11px;
color: #333;
a {
color: #333;
}
p {
margin: 10px 0 0 0;
}
#poweredBy {
display: block;
width: 126px;
height: 23px;
outline: none;
text-indent: -9999px;
margin: 0 auto;
background: url('../images/poweredby.png') top left no-repeat;
}
}
\ No newline at end of file
#header, #nav, #meta, #footer, #reply, #pagination, .reload, .refresh, form, .thread, hr, #kbAttachments, .back {
display: none;
}
th {
text-align: left;
}
a {
color: #000;
text-decoration: none;
}
caption {
text-align: left;
padding-bottom: 10px;
font-weight: bold;
}
.message, .response {
border-bottom: 1px solid #000;
margin-bottom: 20px;
padding-bottom: 10px;
th {
font-size: 12pt;
font-weight: bold;
padding-bottom: 5px;
}
}
html {
font-size: 100%;
overflow-y: scroll;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
body {
margin: 0;
font-size: 13px;
line-height: 1.231;
padding: 0;
}
body, input, select, textarea {
font-family: sans-serif;
color: #000;
}
b, strong {
font-weight: bold;
}
blockquote {
margin: 1em 40px;
}
hr {
display: block;
height: 1px;
border: 0;
border-top: 1px solid #ccc;
margin: 1em 0;
padding: 0;
}
small {
font-size: 85%;
}
ul, ol {
margin: 1em 0;
padding: 0 0 0 30px;
}
img {
border: 0;
vertical-align: middle;
}
form {
margin: 0;
}
fieldset {
border: 0;
margin: 0;
padding: 0;
}
label {
cursor: pointer;
}
input, select, textarea {
font-size: 100%;
margin: 0;
vertical-align: baseline;
*vertical-align: middle;
}
input {
line-height: normal;
*overflow: visible;
}
table input {
*overflow: auto;
}
input[type="button"], input[type="reset"], input[type="submit"] {
cursor: pointer;
-webkit-appearance: button;
}
input[type="checkbox"], input[type="radio"] {
box-sizing: border-box;
}
input[type="search"] {
-webkit-appearance: textfield;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
textarea {
overflow: auto;
vertical-align: top;
resize: vertical;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
th, td {
vertical-align: top;
}
th { text-align: left; font-weight: normal; }
h1, h2, h3, h4, h5, h6, form, fieldset {
margin: 0;
padding: 0;
}
\ No newline at end of file
@import 'reset';
@import 'base';
@import 'main-layout';
@import 'landing-page';
@import 'kb';
@import 'ticket-forms';
@import 'ticket';
#ticketForm, #clientLogin {
div {
clear: both;
padding: 3px 0;
overflow: hidden;
label {
display: block;
width: 140px;
float: left;
}
label.required {
font-weight: bold;
text-align: left;
}
input, textarea {
width: auto;
border: 1px solid #aaa;
background: #fff;
margin-right: 10px;
display: block;
float: left;
}
input[type=file] {
border: 0;
}
select {
display: block;
float: left;
}
div.captchaRow {
line-height: 31px;
input {
position: relative;
top: 6px;
}
}
}
td, div {
textarea {
width: 600px;
}
em {
color: #777;
}
.captcha {
width: 88px;
height: 31px;
background: #000;
display: block;
float: left;
margin-right: 20px;
}
label.inline {
width: auto;
padding: 0 10px;
}
}
div.error {
input {
border: 1px solid #a00;
}
label {
color: #a00;
}
}
}
#ticketTable {
th {
width: 160px;
font-weight: normal;
text-align: left;
}
th.required, td.required {
font-weight: bold;
text-align: left;
}
}
#clientLogin {
width: 400px;
margin-top: 20px;
padding: 10px 100px 10px 10px;
border: 1px solid #ccc;
background: url('../images/lock.png?1319655200') 440px 50% no-repeat #f6f6f6;
p {
clear: both;
text-align: center;
}
strong {
font-size: 11px;
color: #d00;
display: block;
padding-left: 140px;
}
#email {
width: 250px;
margin-right: 0;
}
#ticketno {
width: 120px;
margin-right: 0;
}
}
#reply {
margin-top: 20px;
padding: 10px 5px;
background: #f9f9f9;
border: 1px solid #ccc;
h2 {
margin-bottom: 10px;
}
table {
width: 800px;
td {
vertical-align: top;
}
}
textarea {
width: 628px !important;
}
input[type=text], #response_options textarea {
border: 1px solid #aaa;
background: #fff;
}
.attachments .uploads div {
display: inline-block;
padding-right: 20px;
}
.file {
display: inline-block;
padding-left: 20px;
margin-right: 20px;
background: url('../images/icons/file.gif') 0 50% no-repeat;
}
}
.uploads {
display:inline-block;
padding-right:20px;
label {
padding:3px;
padding-right:10px;
width: auto !important
}
}
\ No newline at end of file
/* Ticket icons */
.Icon {
width: auto;
padding-left: 20px;
background-position: top left;
background-repeat: no-repeat;
color: #006699;
text-decoration: none;
}
.Icon.Ticket { background-image: url('../images/icons/ticket.gif') }
.Icon.webTicket { background-image: url('../images/icons/ticket_source_web.gif'); }
.Icon.emailTicket { background-image: url('../images/icons/ticket_source_email.gif'); }
.Icon.phoneTicket { background-image: url('../images/icons/ticket_source_phone.gif'); }
.Icon.otherTicket { background-image: url('../images/icons/ticket_source_other.gif'); }
.Icon.attachment { background-image: url('../images/icons/attachment.gif'); }
.Icon.file { background-image: url('../images/icons/attachment.gif'); }
.Icon.refresh { background-image: url('../images/icons/refresh.gif'); }
.Icon.thread {
font-weight: bold;
font-size: 1em;
background-image: url('../images/icons/thread.gif?1319556657');
}
.Icon:hover {
text-decoration: underline;
}
#ticketTable {
border: 1px solid #aaa;
border-left: none;
border-bottom: none;
caption {
padding: 5px;
text-align: left;
color: #000;
background: #ddd;
border: 1px solid #aaa;
border-bottom: none;
font-weight: bold;
}
th {
height: 24px;
line-height: 24px;
background: #e1f2ff;
border: 1px solid #aaa;
border-right: none;
border-top: none;
a {
color: #000;
}
}
td {
padding: 2px;
border: 1px solid #aaa;
border-right: none;
border-top: none;
}
tr.alt td {
background: #f9f9f9;
}
}
#ticketSearchForm {
display: inline-block;
float: left;
padding: 0 0 5px 0;
}
a.refresh {
display: block;
width: auto;
float: right;
height: 20px;
line-height: 20px;
text-align: center;
padding: 0 10px 0 28px;
border: 1px solid #aaa;
margin-left: 10px;
color: #333;
background-position: 5px 50%;
background-repeat: no-repeat;
background-image: url('../images/icons/refresh.png');
}
.infoTable {
background: #F4FAFF;
th {
text-align: left;
}
}
#ticketThread {
table {
margin-top: 10px;
border: 1px solid #aaa;
border-bottom: 2px solid #aaa;
th {
text-align: left;
border-bottom: 1px solid #aaa;
font-size: 12px;
padding: 5px;
span {
font-weight:normal;
color:#888;
padding-left:20px;
}
}
td {
padding: 5px;
}
}
.message th { background: #d8efff; }
.response th { background: #ddd; }
.info {
padding: 2px;
background: #f9f9f9;
border-top: 1px solid #ddd;
height: 16px;
line-height: 16px;
a {
display: inline-block;
margin: 5px 10px 5px 0;
padding-left: 24px;
height: 16px;
line-height: 16px;
background-position: 0 50%;
background-repeat: no-repeat;
}
}
}
Deny from all
......@@ -37,42 +37,46 @@ class ContentAjaxAPI extends AjaxController {
function ticket_variables() {
$content='
<div style="width:600px;">
<div style="width:680px;">
<h2>Ticket Variables</h2>
Please note that non-base variables depends on the context of use.
Please note that non-base variables depends on the context of use. Visit osTicket Wiki for up to date documentation.
<br/>
<table width="100%" border="0" cellspacing=1 cellpadding=2>
<tr><td width="50%" valign="top"><b>Base Variables</b></td><td><b>Other Variables</b></td></tr>
<tr><td width="55%" valign="top"><b>Base Variables</b></td><td><b>Other Variables</b></td></tr>
<tr>
<td width="50%" valign="top">
<td width="55%" valign="top">
<table width="100%" border="0" cellspacing=1 cellpadding=1>
<tr><td width="100">%id</td><td>Ticket ID (internal ID)</td></tr>
<tr><td>%ticket</td><td>Ticket number (external ID)</td></tr>
<tr><td>%email</td><td>Email address</td></tr>
<tr><td>%name</td><td>Full name</td></tr>
<tr><td>%subject</td><td>Subject</td></tr>
<tr><td>%topic</td><td>Help topic (web only)</td></tr>
<tr><td>%phone</td><td>Phone number | ext</td></tr>
<tr><td>%status</td><td>Status</td></tr>
<tr><td>%priority</td><td>Priority</td></tr>
<tr><td>%dept</td><td>Department</td></tr>
<tr><td>%assigned</td><td>Assigned staff or team (if any)</td></tr>
<tr><td>%createdate</td><td>Date created</td></tr>
<tr><td>%duedate</td><td>Due date</td></tr>
<tr><td>%closedate</td><td>Date closed</td></tr>
<tr><td width="130">%{ticket.id}</td><td>Ticket ID (internal ID)</td></tr>
<tr><td>%{ticket.number}</td><td>Ticket number (external ID)</td></tr>
<tr><td>%{ticket.email}</td><td>Email address</td></tr>
<tr><td>%{ticket.name}</td><td>Full name</td></tr>
<tr><td>%{ticket.subject}</td><td>Subject</td></tr>
<tr><td>%{ticket.phone}</td><td>Phone number | ext</td></tr>
<tr><td>%{ticket.status}</td><td>Status</td></tr>
<tr><td>%{ticket.priority}</td><td>Priority</td></tr>
<tr><td>%{ticket.assigned}</td><td>Assigned staff and/or team</td></tr>
<tr><td>%{ticket.create_date}</td><td>Date created</td></tr>
<tr><td>%{ticket.due_date}</td><td>Due date</td></tr>
<tr><td>%{ticket.close_date}</td><td>Date closed</td></tr>
<tr><td>%{ticket.auth_token}</td><td>Auth. token used for auto-login</td></tr>
<tr><td>%{ticket.client_link}</td><td>Client\'s ticket view link</td></tr>
<tr><td>%{ticket.staff_link}</td><td>Staff\'s ticket view link</td></tr>
<tr><td colspan="2" style="padding:5px 0 5px 0;"><em>Expandable Variables (See Wiki)</em></td></tr>
<tr><td>%{ticket.<b>topic</b>}</td><td>Help topic</td></tr>
<tr><td>%{ticket.<b>dept</b>}</td><td>Department</td></tr>
<tr><td>%{ticket.<b>staff</b>}</td><td>Assigned/closing staff</td></tr>
<tr><td>%{ticket.<b>team</b>}</td><td>Assigned/closing team</td></tr>
</table>
</td>
<td valign="top">
<table width="100%" border="0" cellspacing=1 cellpadding=1>
<tr><td width="100">%message</td><td>Message (incoming)</td></tr>
<tr><td>%response</td><td>Response (outgoing)</td></tr>
<tr><td>%note</td><td>Internal/transfer note</td></tr>
<tr><td>%staff</td><td>Staff\'s name (alert/notices)</td></tr>
<tr><td>%assignee</td><td>Assigned staff</td></tr>
<tr><td>%assigner</td><td>Staff assigning the ticket</td></tr>
<tr><td>%url</td><td>osTicket\'s base url (FQDN)</td></tr>
<tr><td>%auth</td><td>Client authentication token</td></tr>
<tr><td>%clientlink</td><td>Client auto-login link</td></tr>
<tr><td width="100">%{message}</td><td>Incoming message</td></tr>
<tr><td>%{response}</td><td>Outgoing response</td></tr>
<tr><td>%{comments}</td><td>Assign/transfer comments</td></tr>
<tr><td>%{note}</td><td>Internal note <em>(expandable)</em></td></tr>
<tr><td>%{assignee}</td><td>Assigned staff/team</td></tr>
<tr><td>%{assigner}</td><td>Staff assigning the ticket</td></tr>
<tr><td>%{url}</td><td>osTicket\'s base url (FQDN)</td></tr>
</table>
</td>
</tr>
......
......@@ -36,7 +36,7 @@ class KbaseAjaxAPI extends AjaxController {
case 'json':
$resp['id'] = $canned->getId();
$resp['ticket'] = $canned->getTitle();
$resp['response'] = $ticket?$ticket->replaceTemplateVars($canned->getResponse()):$canned->getResponse();
$resp['response'] = $ticket?$ticket->replaceVars($canned->getResponse()):$canned->getResponse();
$resp['files'] = $canned->getAttachments();
......@@ -44,7 +44,7 @@ class KbaseAjaxAPI extends AjaxController {
break;
case 'txt':
default:
$response =$ticket?$ticket->replaceTemplateVars($canned->getResponse()):$canned->getResponse();
$response =$ticket?$ticket->replaceVars($canned->getResponse()):$canned->getResponse();
}
......
......@@ -27,7 +27,7 @@ class Banlist {
}
function isbanned($email) {
return EmailFilter::isBanned($email);
return TicketFilter::isBanned($email);
}
function includes($email) {
......@@ -50,7 +50,7 @@ class Banlist {
'name' => 'SYSTEM BAN LIST',
'isactive' => 1,
'match_all_rules' => false,
'reject_email' => true,
'reject_ticket' => true,
'rules' => array(),
'notes' => 'Internal list for email banning. Do not remove'
), $errors);
......
......@@ -35,8 +35,10 @@ class Canned {
.' count(filter.id) as filters '
.' FROM '.CANNED_TABLE.' canned '
.' LEFT JOIN '.CANNED_ATTACHMENT_TABLE.' attach ON (attach.canned_id=canned.canned_id) '
.' LEFT JOIN '.EMAIL_FILTER_TABLE.' filter ON (canned.canned_id = filter.canned_response_id) '
.' WHERE canned.canned_id='.db_input($id);
.' LEFT JOIN '.FILTER_TABLE.' filter ON (canned.canned_id = filter.canned_response_id) '
.' WHERE canned.canned_id='.db_input($id)
.' GROUP BY canned.canned_id';
if(!($res=db_query($sql)) || !db_num_rows($res))
return false;
......@@ -100,7 +102,7 @@ class Canned {
if (!$this->_filters) {
$this->_filters = array();
$res = db_query(
'SELECT name FROM '.EMAIL_FILTER_TABLE
'SELECT name FROM '.FILTER_TABLE
.' WHERE canned_response_id = '.db_input($this->getId())
.' ORDER BY name');
while ($row = db_fetch_row($res))
......
......@@ -4,7 +4,7 @@
Handles everything about client
NOTE: Please note that osTicket uses email address and ticket ID to authenticate the user*!
XXX: Please note that osTicket uses email address and ticket ID to authenticate the user*!
Client is modeled on the info of the ticket used to login .
Peter Rotich <peter@osticket.com>
......@@ -134,72 +134,94 @@ class Client {
return (($id=self::getLastTicketIdByEmail($email)))?self::lookup($id, $email):null;
}
/* static */ function tryLogin($ticketID, $email, $auth=null) {
/* static */ function login($ticketID, $email, $auth=null, &$errors=array()) {
global $ost;
$cfg = $ost->getConfig();
$auth = trim($auth);
$email = trim($email);
$ticketID = trim($ticketID);
# Only consider auth token for GET requests, and for GET requests,
# REQUIRE the auth token
$auto_login = $_SERVER['REQUEST_METHOD'] == 'GET';
$auto_login = ($_SERVER['REQUEST_METHOD'] == 'GET');
//Check time for last max failed login attempt strike.
$loginmsg='Invalid login';
# XXX: SECURITY: Max attempts is enforced client-side via the PHP
# session cookie.
if($_SESSION['_client']['laststrike']) {
if((time()-$_SESSION['_client']['laststrike'])<$cfg->getClientLoginTimeout()) {
$loginmsg='Excessive failed login attempts';
$errors['err']='You\'ve reached maximum failed login attempts allowed. Try again later or <a href="open.php">open a new ticket</a>';
}else{ //Timeout is over.
$errors['login'] = 'Excessive failed login attempts';
$errors['err'] = 'You\'ve reached maximum failed login attempts allowed. Try again later or <a href="open.php">open a new ticket</a>';
$_SESSION['_client']['laststrike'] = time(); //renew the strike.
} else { //Timeout is over.
//Reset the counter for next round of attempts after the timeout.
$_SESSION['_client']['laststrike']=null;
$_SESSION['_client']['strikes']=0;
$_SESSION['_client']['laststrike'] = null;
$_SESSION['_client']['strikes'] = 0;
}
}
if($auto_login && !$auth)
$errors['login'] = 'Invalid method';
elseif(!$ticketID || !Validator::is_email($email))
$errors['login'] = 'Valid email and ticket number required';
//Bail out on error.
if($errors) return false;
//See if we can fetch local ticket id associated with the ID given
if(!$errors && is_numeric($ticketID) && Validator::is_email($email) && ($ticket=Ticket::lookupByExtId($ticketID))) {
//At this point we know the ticket is valid.
if(($ticket=Ticket::lookupByExtId($ticketID, $email)) && $ticket->getId()) {
//At this point we know the ticket ID is valid.
//TODO: 1) Check how old the ticket is...3 months max?? 2) Must be the latest 5 tickets??
//Check the email given.
# Require auth token for automatic logins
if (!$auto_login || $auth === $ticket->getAuthToken()) {
if($ticket->getId() && strcasecmp($ticket->getEmail(),$email)==0){
//valid match...create session goodies for the client.
$user = new ClientSession($email,$ticket->getId());
$_SESSION['_client']=array(); //clear.
$_SESSION['_client']['userID'] =$ticket->getEmail(); //Email
$_SESSION['_client']['key'] =$ticket->getExtId(); //Ticket ID --acts as password when used with email. See above.
$_SESSION['_client']['token'] =$user->getSessionToken();
$_SESSION['TZ_OFFSET']=$cfg->getTZoffset();
$_SESSION['TZ_DST']=$cfg->observeDaylightSaving();
//Log login info...
$msg=sprintf("%s/%s logged in [%s]",$ticket->getEmail(),$ticket->getExtId(),$_SERVER['REMOTE_ADDR']);
$ost->logDebug('User login', $msg);
//Redirect tickets.php
session_write_close();
session_regenerate_id();
@header("Location: tickets.php?id=".$ticket->getExtId());
require_once('tickets.php'); //Just incase. of header already sent error.
exit;
}
}
# Require auth token for automatic logins (GET METHOD).
if (!strcasecmp($ticket->getEmail(), $email) && (!$auto_login || $auth === $ticket->getAuthToken())) {
//valid match...create session goodies for the client.
$user = new ClientSession($email,$ticket->getExtId());
$_SESSION['_client'] = array(); //clear.
$_SESSION['_client']['userID'] = $ticket->getEmail(); //Email
$_SESSION['_client']['key'] = $ticket->getExtId(); //Ticket ID --acts as password when used with email. See above.
$_SESSION['_client']['token'] = $user->getSessionToken();
$_SESSION['TZ_OFFSET'] = $cfg->getTZoffset();
$_SESSION['TZ_DST'] = $cfg->observeDaylightSaving();
//Log login info...
$msg=sprintf('%s/%s logged in [%s]', $ticket->getEmail(), $ticket->getExtId(), $_SERVER['REMOTE_ADDR']);
$ost->logDebug('User login', $msg);
//Regenerate session ID.
$sid=session_id(); //Current session id.
session_regenerate_id(TRUE); //get new ID.
if(($session=$ost->getSession()) && is_object($session) && $sid)
$session->destroy($sid);
session_write_close();
return $user;
}
}
//If we get to this point we know the login failed.
$errors['login'] = 'Invalid login';
$_SESSION['_client']['strikes']+=1;
if(!$errors && $_SESSION['_client']['strikes']>$cfg->getClientMaxLogins()) {
$loginmsg='Access Denied';
$errors['err']='Forgot your login info? Please <a href="open.php">open a new ticket</a>.';
$_SESSION['_client']['laststrike']=time();
$alert='Excessive login attempts by a client?'."\n".
'Email: '.$_POST['lemail']."\n".'Ticket#: '.$_POST['lticket']."\n".
$errors['login'] = 'Access Denied';
$errors['err'] = 'Forgot your login info? Please <a href="open.php">open a new ticket</a>.';
$_SESSION['_client']['laststrike'] = time();
$alert='Excessive login attempts by a user.'."\n".
'Email: '.$email."\n".'Ticket#: '.$ticketID."\n".
'IP: '.$_SERVER['REMOTE_ADDR']."\n".'Time:'.date('M j, Y, g:i a T')."\n\n".
'Attempts #'.$_SESSION['_client']['strikes'];
$ost->logError('Excessive login attempts (client)', $alert, ($cfg->alertONLoginError()));
}elseif($_SESSION['_client']['strikes']%2==0){ //Log every other failed login attempt as a warning.
$alert='Email: '.$_POST['lemail']."\n".'Ticket #: '.$_POST['lticket']."\n".'IP: '.$_SERVER['REMOTE_ADDR'].
$ost->logError('Excessive login attempts (user)', $alert, ($cfg->alertONLoginError()));
} elseif($_SESSION['_client']['strikes']%2==0) { //Log every other failed login attempt as a warning.
$alert='Email: '.$email."\n".'Ticket #: '.$ticketID."\n".'IP: '.$_SERVER['REMOTE_ADDR'].
"\n".'TIME: '.date('M j, Y, g:i a T')."\n\n".'Attempts #'.$_SESSION['_client']['strikes'];
$ost->logWarning('Failed login attempt (client)', $alert);
$ost->logWarning('Failed login attempt (user)', $alert);
}
return false;
}
}
?>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment