Index: trunk/otrs/patches/30-wm-brand.patch |
— | — | @@ -0,0 +1,159 @@ |
| 2 | +Index: trunk/Kernel/Output/HTML/Standard/AgentNavigationBar.dtl |
| 3 | +=================================================================== |
| 4 | +--- trunk.orig/Kernel/Output/HTML/Standard/AgentNavigationBar.dtl 2009-01-27 14:54:35.000000000 +1100 |
| 5 | +@@ -67,6 +67,22 @@ |
| 6 | + </td> |
| 7 | + <!-- dtl:block:ItemPersonal --> |
| 8 | + |
| 9 | ++<!-- Wikimedia patch start --> |
| 10 | ++<td valign="bottom" align="center" class="nav"><span onmouseover="this.T_OPACITY=95; |
| 11 | ++ this.T_SHADOWCOLOR='#aaaacc'; |
| 12 | ++ this.T_TITLE='OTRS on meta.wikimedia.org'; |
| 13 | ++ this.T_BORDERCOLOR='#222266'; |
| 14 | ++ return escape('The OTRS page on meta has the public information about the OTRS system, including a list of queues and the people processing those queues.');"> |
| 15 | ++<a href="http://meta.wikimedia.org/wiki/OTRS"><img src="/otrs-web/22px-Wikimedia_Community_Logo.svg.png" border="0" width="22" height="22"><br>Meta</a></span></td> |
| 16 | ++<td valign="bottom" align="center" class="nav"> |
| 17 | ++<span onmouseover="this.T_OPACITY=95; |
| 18 | ++ this.T_SHADOWCOLOR='#aaaacc'; |
| 19 | ++ this.T_TITLE='OTRS wiki'; |
| 20 | ++ this.T_BORDERCOLOR='#222266'; |
| 21 | ++ return escape('The OTRS wiki is a private wiki. It contains informations and discussions that will help you to handle tickets.');"> |
| 22 | ++<a href="http://otrs-wiki.wikimedia.org/wiki/Main_Page"><img src="/otrs-web/22px-Wikimedia-logo.svg.png" border="0" width="22" height="22"><br>Wiki</a></span></td> |
| 23 | ++<!-- Wikimedia patch end --> |
| 24 | ++ |
| 25 | + <!-- Ticket number search patch start --> |
| 26 | + <td valign="bottom" align="center" class="nav"> |
| 27 | + <a href="javascript:ticketNumberSearch();"><img src="$Env{"Images"}searchX.gif" border="0" width="22"><br>Ticket#</a> |
| 28 | +Index: trunk/Kernel/Output/HTML/Standard/Login.dtl |
| 29 | +=================================================================== |
| 30 | +--- trunk.orig/Kernel/Output/HTML/Standard/Login.dtl 2009-01-27 14:51:08.000000000 +1100 |
| 31 | +@@ -23,6 +23,14 @@ |
| 32 | + <title>$Config{"ProductName"} :: $Text{"$Data{"Title"}"}</title> |
| 33 | + # include css.dtl file |
| 34 | + $Include{"css"} |
| 35 | ++<style> |
| 36 | ++.singleboxhead { |
| 37 | ++ -moz-border-radius-bottomleft:0; |
| 38 | ++ -moz-border-radius-bottomright:0; |
| 39 | ++ -moz-border-radius-topleft:1em; |
| 40 | ++ -moz-border-radius-topright:1em; |
| 41 | ++} |
| 42 | ++</style> |
| 43 | + </head> |
| 44 | + <!-- end header --> |
| 45 | + <body onLoad="document.login.User.focus();"> |
| 46 | +@@ -49,6 +57,7 @@ |
| 47 | + </script> |
| 48 | + |
| 49 | + <center> |
| 50 | ++ |
| 51 | + <p> |
| 52 | + <font color="red">$Text{"$Data{"Message"}"}</font> |
| 53 | + </p> |
| 54 | +@@ -58,7 +67,7 @@ |
| 55 | + <input type="hidden" name="RequestedURL" value="$QData{"RequestedURL"}"/> |
| 56 | + <input type="hidden" name="Lang" value="$Env{"UserLanguage"}"/> |
| 57 | + <input type="hidden" name="TimeOffset" value=""/> |
| 58 | +- <table border="0" cellspacing="0" cellpadding="3" width="280"> |
| 59 | ++ <table border="0" cellspacing="0" cellpadding="3" width="370" style="margin-right: 220px;"> |
| 60 | + <tr> |
| 61 | + <td align="center" class="singleboxhead">$Text{"Welcome to %s", "$Config{"ProductName"}"}</td> |
| 62 | + </tr> |
| 63 | +@@ -80,6 +89,11 @@ |
| 64 | + </table> |
| 65 | + </form> |
| 66 | + </p> |
| 67 | ++ |
| 68 | ++<div style="position:absolute; top: 1em; right: 0.5em; width: 220px; float:right; border: solid 1px silver; padding:6px; height: 95%; background: #EEEEFF;-moz-border-radius:2em;"> |
| 69 | ++ |
| 70 | ++<img src="/otrs-web/120px-Wikimedia_logo_text_RGB.svg.png"> |
| 71 | ++ |
| 72 | + # -- |
| 73 | + # language |
| 74 | + # -- |
| 75 | +@@ -87,18 +101,14 @@ |
| 76 | + <form action="$Env{"CGIHandle"}" method="post" enctype="application/x-www-form-urlencoded"> |
| 77 | + <input type="hidden" name="Action" value=""/> |
| 78 | + <input type="hidden" name="RequestedURL" value="$QData{"RequestedURL"}"/> |
| 79 | +- <table border="0" cellspacing="0" cellpadding="3" width="280"> |
| 80 | ++ <table border="0" cellspacing="0" cellpadding="3" width="220"> |
| 81 | + <tr> |
| 82 | + <td align="center" class="singleboxhead">$Text{"Language"}</td> |
| 83 | + </tr> |
| 84 | + <tr> |
| 85 | + <td align="center" class="singleboxbody"> |
| 86 | +- <table cellspacing="8" cellpadding="2"> |
| 87 | +- <tr> |
| 88 | +- <td class="singleboxkey">$Text{"Language"}:</td> |
| 89 | +- <td class="singleboxvalue">$Data{"Language"}</td> |
| 90 | +- </tr> |
| 91 | +- </table> |
| 92 | ++ $Text{"Language"}:<br/> |
| 93 | ++ $Data{"Language"}<br/> |
| 94 | + <input class="button" type="submit" value="$Text{"Submit"}"/> |
| 95 | + </td> |
| 96 | + </tr> |
| 97 | +@@ -107,8 +117,8 @@ |
| 98 | + </p> |
| 99 | + <!-- dtl:block:LostPassword --> |
| 100 | + <p> |
| 101 | +- <center> |
| 102 | +- <table border="0" cellspacing="0" cellpadding="3" width="280"> |
| 103 | ++ <!--<center>--> |
| 104 | ++ <table border="0" cellspacing="0" cellpadding="3" width="220"> |
| 105 | + <tr> |
| 106 | + <td align="center" class="singleboxhead">$Text{"Lost your password?"}</td> |
| 107 | + </tr> |
| 108 | +@@ -129,12 +139,20 @@ |
| 109 | + </td> |
| 110 | + </tr> |
| 111 | + </table> |
| 112 | +- </center> |
| 113 | ++ <!--</center>--> |
| 114 | + </p> |
| 115 | + <!-- dtl:block:LostPassword --> |
| 116 | ++</div> |
| 117 | ++ |
| 118 | + # -- |
| 119 | + # Message of the day data! |
| 120 | + # -- |
| 121 | ++<table border="0" cellspacing="0" cellpadding="3" width="370" style="margin-top: 5%; margin-right: 220px;"> |
| 122 | ++<tr><td align="center" class="singleboxhead">News</td></tr> |
| 123 | ++<tr><td align="center" class="singleboxbody"> |
| 124 | ++$Include{"Motd"} |
| 125 | ++</td></tr></table> |
| 126 | ++ |
| 127 | + $Data{"Motd"} |
| 128 | + </center> |
| 129 | + <!-- start footer --> |
| 130 | +Index: trunk/Kernel/Output/HTML/Standard/Motd.dtl |
| 131 | +=================================================================== |
| 132 | +--- trunk.orig/Kernel/Output/HTML/Standard/Motd.dtl 2009-01-27 14:51:08.000000000 +1100 |
| 133 | +@@ -9,4 +9,23 @@ |
| 134 | + # did not receive this file, see http://www.gnu.org/licenses/gpl-2.0.txt. |
| 135 | + # -- |
| 136 | + |
| 137 | +-<p>This is the message of the day. You can edit this in Kernel/Output/HTML/Standard/Motd.dtl.</p> |
| 138 | ++<p style="border: none;"> |
| 139 | ++ September 23, 2008: Due to more pressing concerns, the scheduled maintenance outage of OTRS set for this past Monday did not occur.<p> |
| 140 | ++ The downtime will now occur this coming Thursday, Sept. 25th, 2008 at approximately 18:00 GMT.<p> |
| 141 | ++ We apologize for any issues this may cause. The outage is necessary to setup database replication. |
| 142 | ++</p><p> |
| 143 | ++ September 18, 2008: OTRS will be shutdown for database replication on Monday, September 22nd at approx. 14:00 EST. This downtime should be minimal. |
| 144 | ++</p><p> |
| 145 | ++ September 04, 2008: The databases has been moved from srv179 to db9. |
| 146 | ++</p><p> |
| 147 | ++ April 07, 2008: Due to an urgent security update, OTRS has been upgraded to the newest version. |
| 148 | ++ Wikimedia-specific patches have not yet been migrated completely ("undo" of one-click-spam requires |
| 149 | ++ manual action). |
| 150 | ++</p> |
| 151 | ++<p> |
| 152 | ++ December 22, 2007: Migrated to a new database server with more disk space |
| 153 | ++</p> |
| 154 | ++<p> |
| 155 | ++ January 6, 2007: Upgraded to OTRS-2.1.3, and running on a new pair of DB servers. |
| 156 | ++</p> |
| 157 | ++ |
Property changes on: trunk/otrs/patches/30-wm-brand.patch |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 158 | + native |
Index: trunk/otrs/patches/40-user-tooltips.patch |
— | — | @@ -0,0 +1,101 @@ |
| 2 | +Index: trunk/Kernel/Output/HTML/NotificationAgentOnline.pm |
| 3 | +=================================================================== |
| 4 | +--- trunk.orig/Kernel/Output/HTML/NotificationAgentOnline.pm 2009-01-28 11:34:27.000000000 +1100 |
| 5 | +@@ -15,6 +15,7 @@ |
| 6 | + use warnings; |
| 7 | + |
| 8 | + use Kernel::System::AuthSession; |
| 9 | ++use CGI; |
| 10 | + |
| 11 | + use vars qw($VERSION); |
| 12 | + $VERSION = qw($Revision: 1.7 $) [1]; |
| 13 | +@@ -52,10 +53,33 @@ |
| 14 | + && $Data{UserLastname} |
| 15 | + ) |
| 16 | + { |
| 17 | +- $Online{ $Data{UserID} } = "$Data{UserFirstname} $Data{UserLastname}"; |
| 18 | ++ my $sleep = int( (time() - $Data{UserLastRequest}) / 60 ); |
| 19 | ++ my $images = $Self->{LayoutObject}->{Images}; |
| 20 | ++ my $encName = CGI::escapeHTML("$Data{UserFirstname} $Data{UserLastname}"); |
| 21 | ++ my $encLogin = CGI::escapeHTML($Data{UserLogin}); |
| 22 | ++ my $encEmail = CGI::escapeHTML($Data{UserEmail}); |
| 23 | ++ my $tooltip = <<EOF; |
| 24 | ++ <div style=\'float:right;\'> |
| 25 | ++ <img src=\'$images/clock.gif\' align=\'top\'/> $sleep min |
| 26 | ++ </div> |
| 27 | ++ <img src=\'$images/user.gif\' align=\'top\'/> |
| 28 | ++ <b>$encLogin</b> |
| 29 | ++ <br/> |
| 30 | ++ $encName |
| 31 | ++EOF |
| 32 | + if ( $Param{Config}->{ShowEmail} ) { |
| 33 | +- $Online{ $Data{UserID} } .= " ($Data{UserEmail})"; |
| 34 | ++ $tooltip .= "<br/>\n$encEmail\n"; |
| 35 | + } |
| 36 | ++ my $quoteTooltip = $Self->quoteJs($tooltip); |
| 37 | ++ my $js = <<EOF; |
| 38 | ++ this.T_OPACITY=95; |
| 39 | ++ this.T_SHADOWCOLOR='#aaaacc'; |
| 40 | ++ this.T_TITLE='User info'; |
| 41 | ++ this.T_BORDERCOLOR='#222266'; |
| 42 | ++ return escape($quoteTooltip); |
| 43 | ++EOF |
| 44 | ++ my $encJs = CGI::escapeHTML($js); |
| 45 | ++ $Online{ $Data{UserID} } = "<span onmouseover=\"$encJs\">$encName</span>"; |
| 46 | + } |
| 47 | + } |
| 48 | + for ( sort { $Online{$a} cmp $Online{$b} } keys %Online ) { |
| 49 | +@@ -65,11 +89,38 @@ |
| 50 | + $Param{Message} .= "$Online{$_}"; |
| 51 | + } |
| 52 | + if ( $Param{Message} ) { |
| 53 | +- return $Self->{LayoutObject}->Notify( Info => 'Online Agent: %s", "' . $Param{Message} ); |
| 54 | ++ return $Self->{LayoutObject}->Notify( Info => 'Online Agent: ' . $Param{Message} ); |
| 55 | + } |
| 56 | + else { |
| 57 | + return ''; |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | ++sub quoteJs { |
| 62 | ++ # Based on MediaWiki's Xml::escapeJsString() |
| 63 | ++ |
| 64 | ++ # See ECMA 262 section 7.8.4 for string literal format |
| 65 | ++ my ( $Self, $s ) = @_; |
| 66 | ++ $_ = $s; |
| 67 | ++ s/\\/\\\\/; |
| 68 | ++ s/\"/\\"/; |
| 69 | ++ s/\'/\\'/; |
| 70 | ++ s/\n/\\n/; |
| 71 | ++ s/\r/\\r/; |
| 72 | ++ |
| 73 | ++ # To avoid closing the element or CDATA section |
| 74 | ++ s/</\\x3c/; |
| 75 | ++ s/>/\\x3e/; |
| 76 | ++ |
| 77 | ++ # To avoid any complaints about bad entity refs |
| 78 | ++ s/&/\\x26/; |
| 79 | ++ |
| 80 | ++ # Work around https://bugzilla.mozilla.org/show_bug.cgi?id=274152 |
| 81 | ++ # Encode certain Unicode formatting chars so affected |
| 82 | ++ # versions of Gecko don't misinterpret our strings; |
| 83 | ++ # this is a common problem with Farsi text. |
| 84 | ++ s/\xe2\x80\x8c/\\u200c/; # ZERO WIDTH NON-JOINER |
| 85 | ++ s/\xe2\x80\x8d/\\u200d/; # ZERO WIDTH JOINER |
| 86 | ++ return "\"$_\""; |
| 87 | ++} |
| 88 | + 1; |
| 89 | +Index: trunk/Kernel/Output/HTML/Standard/Notify.dtl |
| 90 | +=================================================================== |
| 91 | +--- trunk.orig/Kernel/Output/HTML/Standard/Notify.dtl 2009-01-28 11:34:27.000000000 +1100 |
| 92 | +@@ -25,7 +25,7 @@ |
| 93 | + <a href="$Data{"LinkStart"}"> |
| 94 | + <!-- dtl:block:LinkStart --> |
| 95 | + <!-- dtl:block:Text --> |
| 96 | +- $Text{"$Data{"Info"}"} |
| 97 | ++ $Data{"Info"} |
| 98 | + <!-- dtl:block:Text --> |
| 99 | + <!-- dtl:block:Data --> |
| 100 | + $Data{"Data"} |
Property changes on: trunk/otrs/patches/40-user-tooltips.patch |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 101 | + native |
Index: trunk/otrs/patches/10-tooltips.patch |
— | — | @@ -0,0 +1,524 @@ |
| 2 | +diff -ru trunk/Kernel/Output/HTML/Standard/Footer.dtl trunk-tooltips/Kernel/Output/HTML/Standard/Footer.dtl |
| 3 | +--- trunk/Kernel/Output/HTML/Standard/Footer.dtl 2008-02-12 20:08:07.000000000 +1100 |
| 4 | +@@ -33,6 +33,7 @@ |
| 5 | + </tr> |
| 6 | + </table> |
| 7 | + <a name="end"></a> |
| 8 | ++<script language="JavaScript" type="text/javascript" src="/otrs-web/wz_tooltip.js"></script> |
| 9 | + </body> |
| 10 | + </html> |
| 11 | + <!-- end footer --> |
| 12 | +diff -ru trunk/var/httpd/htdocs/wz_tooltip.js trunk-tooltips/var/httpd/htdocs/wz_tooltip.js |
| 13 | +--- trunk/var/httpd/htdocs/wz_tooltip.js 2009-01-27 12:35:58.000000000 +1100 |
| 14 | +@@ -0,0 +1,509 @@ |
| 15 | ++/* This notice must be untouched at all times. |
| 16 | ++ |
| 17 | ++wz_tooltip.js v. 3.45 |
| 18 | ++ |
| 19 | ++The latest version is available at |
| 20 | ++http://www.walterzorn.com |
| 21 | ++or http://www.devira.com |
| 22 | ++or http://www.walterzorn.de |
| 23 | ++ |
| 24 | ++Copyright (c) 2002-2005 Walter Zorn. All rights reserved. |
| 25 | ++Created 1. 12. 2002 by Walter Zorn (Web: http://www.walterzorn.com ) |
| 26 | ++Last modified: 17. 2. 2007 |
| 27 | ++ |
| 28 | ++Cross-browser tooltips working even in Opera 5 and 6, |
| 29 | ++as well as in NN 4, Gecko-Browsers, IE4+, Opera 7+ and Konqueror. |
| 30 | ++No onmouseouts required. |
| 31 | ++Appearance of tooltips can be individually configured |
| 32 | ++via commands within the onmouseovers. |
| 33 | ++ |
| 34 | ++LICENSE: LGPL |
| 35 | ++ |
| 36 | ++This library is free software; you can redistribute it and/or |
| 37 | ++modify it under the terms of the GNU Lesser General Public |
| 38 | ++License (LGPL) as published by the Free Software Foundation; either |
| 39 | ++version 2.1 of the License, or (at your option) any later version. |
| 40 | ++ |
| 41 | ++This library is distributed in the hope that it will be useful, |
| 42 | ++but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 43 | ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| 44 | ++ |
| 45 | ++For more details on the GNU Lesser General Public License, |
| 46 | ++see http://www.gnu.org/copyleft/lesser.html |
| 47 | ++*/ |
| 48 | ++ |
| 49 | ++ |
| 50 | ++ |
| 51 | ++//////////////// GLOBAL TOOPTIP CONFIGURATION ///////////////////// |
| 52 | ++var ttAbove = false; // tooltip above mousepointer? Alternative: true |
| 53 | ++var ttBgColor = "#e6ecff"; |
| 54 | ++var ttBgImg = ""; // path to background image; |
| 55 | ++var ttBorderColor = "#003399"; |
| 56 | ++var ttBorderWidth = 1; |
| 57 | ++var ttClickClose = false; |
| 58 | ++var ttDelay = 500; // time span until tooltip shows up [milliseconds] |
| 59 | ++var ttFontColor = "#000066"; |
| 60 | ++var ttFontFace = "arial,helvetica,sans-serif"; |
| 61 | ++var ttFontSize = "11px"; |
| 62 | ++var ttFontWeight = "normal"; // alternative: "bold"; |
| 63 | ++var ttLeft = false; // tooltip on the left of the mouse? Alternative: true |
| 64 | ++var ttOffsetX = 12; // horizontal offset of left-top corner from mousepointer |
| 65 | ++var ttOffsetY = 15; // vertical offset " |
| 66 | ++var ttOpacity = 100; // opacity of tooltip in percent (must be integer between 0 and 100) |
| 67 | ++var ttPadding = 3; // spacing between border and content |
| 68 | ++var ttShadowColor = ""; |
| 69 | ++var ttShadowWidth = 0; |
| 70 | ++var ttStatic = false; // tooltip NOT move with the mouse? Alternative: true |
| 71 | ++var ttSticky = false; // do NOT hide tooltip on mouseout? Alternative: true |
| 72 | ++var ttTemp = 0; // time span after which the tooltip disappears; 0 (zero) means "infinite timespan" |
| 73 | ++var ttTextAlign = "left"; |
| 74 | ++var ttTitleColor = "#ffffff"; // color of caption text |
| 75 | ++var ttWidth = 300; |
| 76 | ++//////////////////// END OF TOOLTIP CONFIG //////////////////////// |
| 77 | ++ |
| 78 | ++ |
| 79 | ++ |
| 80 | ++////////////// TAGS WITH TOOLTIP FUNCTIONALITY //////////////////// |
| 81 | ++// List may be extended or shortened: |
| 82 | ++var tt_tags = new Array("a","area","b","big","caption","center","code","dd","div","dl","dt","em","h1","h2","h3","h4","h5","h6","i","img","input","li","map","ol","p","pre","s", "select", "small","span","strike","strong","sub","sup","table","td","textarea","th","tr","tt","u","var","ul","layer"); |
| 83 | ++///////////////////////////////////////////////////////////////////// |
| 84 | ++ |
| 85 | ++ |
| 86 | ++ |
| 87 | ++///////// DON'T CHANGE ANYTHING BELOW THIS LINE ///////////////////// |
| 88 | ++var tt_obj = null, // current tooltip |
| 89 | ++tt_ifrm = null, // iframe to cover windowed controls in IE |
| 90 | ++tt_objW = 0, tt_objH = 0, // width and height of tt_obj |
| 91 | ++tt_objX = 0, tt_objY = 0, |
| 92 | ++tt_offX = 0, tt_offY = 0, |
| 93 | ++xlim = 0, ylim = 0, // right and bottom borders of visible client area |
| 94 | ++tt_sup = false, // true if T_ABOVE cmd |
| 95 | ++tt_sticky = false, // tt_obj sticky? |
| 96 | ++tt_wait = false, |
| 97 | ++tt_act = false, // tooltip visibility flag |
| 98 | ++tt_sub = false, // true while tooltip below mousepointer |
| 99 | ++tt_u = "undefined", |
| 100 | ++tt_mf = null, // stores previous mousemove evthandler |
| 101 | ++// Opera: disable href when hovering <a> |
| 102 | ++tt_tag = null; // stores hovered dom node, href and previous statusbar txt |
| 103 | ++ |
| 104 | ++ |
| 105 | ++var tt_db = (document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body? document.body : null, |
| 106 | ++tt_n = navigator.userAgent.toLowerCase(), |
| 107 | ++tt_nv = navigator.appVersion; |
| 108 | ++// Browser flags |
| 109 | ++var tt_op = !!(window.opera && document.getElementById), |
| 110 | ++tt_op6 = tt_op && !document.defaultView, |
| 111 | ++tt_op7 = tt_op && !tt_op6, |
| 112 | ++tt_ie = tt_n.indexOf("msie") != -1 && document.all && tt_db && !tt_op, |
| 113 | ++tt_ie7 = tt_ie && typeof document.body.style.maxHeight != tt_u, |
| 114 | ++tt_ie6 = tt_ie && !tt_ie7 && parseFloat(tt_nv.substring(tt_nv.indexOf("MSIE")+5)) >= 5.5, |
| 115 | ++tt_n4 = (document.layers && typeof document.classes != tt_u), |
| 116 | ++tt_n6 = (!tt_op && document.defaultView && typeof document.defaultView.getComputedStyle != tt_u), |
| 117 | ++tt_w3c = !tt_ie && !tt_n6 && !tt_op && document.getElementById, |
| 118 | ++tt_ce = document.captureEvents && !tt_n6; |
| 119 | ++ |
| 120 | ++function tt_Int(t_x) |
| 121 | ++{ |
| 122 | ++ var t_y; |
| 123 | ++ return isNaN(t_y = parseInt(t_x))? 0 : t_y; |
| 124 | ++} |
| 125 | ++function wzReplace(t_x, t_y) |
| 126 | ++{ |
| 127 | ++ var t_ret = "", |
| 128 | ++ t_str = this, |
| 129 | ++ t_xI; |
| 130 | ++ while((t_xI = t_str.indexOf(t_x)) != -1) |
| 131 | ++ { |
| 132 | ++ t_ret += t_str.substring(0, t_xI) + t_y; |
| 133 | ++ t_str = t_str.substring(t_xI + t_x.length); |
| 134 | ++ } |
| 135 | ++ return t_ret+t_str; |
| 136 | ++} |
| 137 | ++String.prototype.wzReplace = wzReplace; |
| 138 | ++function tt_N4Tags(tagtyp, t_d, t_y) |
| 139 | ++{ |
| 140 | ++ t_d = t_d || document; |
| 141 | ++ t_y = t_y || new Array(); |
| 142 | ++ var t_x = (tagtyp=="a")? t_d.links : t_d.layers; |
| 143 | ++ for(var z = t_x.length; z--;) t_y[t_y.length] = t_x[z]; |
| 144 | ++ for(z = t_d.layers.length; z--;) t_y = tt_N4Tags(tagtyp, t_d.layers[z].document, t_y); |
| 145 | ++ return t_y; |
| 146 | ++} |
| 147 | ++function tt_Htm(tt, t_id, txt) |
| 148 | ++{ |
| 149 | ++ var t_bgc = (typeof tt.T_BGCOLOR != tt_u)? tt.T_BGCOLOR : ttBgColor, |
| 150 | ++ t_bgimg = (typeof tt.T_BGIMG != tt_u)? tt.T_BGIMG : ttBgImg, |
| 151 | ++ t_bc = (typeof tt.T_BORDERCOLOR != tt_u)? tt.T_BORDERCOLOR : ttBorderColor, |
| 152 | ++ t_bw = (typeof tt.T_BORDERWIDTH != tt_u)? tt.T_BORDERWIDTH : ttBorderWidth, |
| 153 | ++ t_ff = (typeof tt.T_FONTFACE != tt_u)? tt.T_FONTFACE : ttFontFace, |
| 154 | ++ t_fc = (typeof tt.T_FONTCOLOR != tt_u)? tt.T_FONTCOLOR : ttFontColor, |
| 155 | ++ t_fsz = (typeof tt.T_FONTSIZE != tt_u)? tt.T_FONTSIZE : ttFontSize, |
| 156 | ++ t_fwght = (typeof tt.T_FONTWEIGHT != tt_u)? tt.T_FONTWEIGHT : ttFontWeight, |
| 157 | ++ t_opa = (typeof tt.T_OPACITY != tt_u)? tt.T_OPACITY : ttOpacity, |
| 158 | ++ t_padd = (typeof tt.T_PADDING != tt_u)? tt.T_PADDING : ttPadding, |
| 159 | ++ t_shc = (typeof tt.T_SHADOWCOLOR != tt_u)? tt.T_SHADOWCOLOR : (ttShadowColor || 0), |
| 160 | ++ t_shw = (typeof tt.T_SHADOWWIDTH != tt_u)? tt.T_SHADOWWIDTH : (ttShadowWidth || 0), |
| 161 | ++ t_algn = (typeof tt.T_TEXTALIGN != tt_u)? tt.T_TEXTALIGN : ttTextAlign, |
| 162 | ++ t_tit = (typeof tt.T_TITLE != tt_u)? tt.T_TITLE : "", |
| 163 | ++ t_titc = (typeof tt.T_TITLECOLOR != tt_u)? tt.T_TITLECOLOR : ttTitleColor, |
| 164 | ++ t_w = (typeof tt.T_WIDTH != tt_u)? tt.T_WIDTH : ttWidth; |
| 165 | ++ if(t_shc || t_shw) |
| 166 | ++ { |
| 167 | ++ t_shc = t_shc || "#c0c0c0"; |
| 168 | ++ t_shw = t_shw || 5; |
| 169 | ++ } |
| 170 | ++ if(tt_n4 && (t_fsz == "10px" || t_fsz == "11px")) t_fsz = "12px"; |
| 171 | ++ |
| 172 | ++ var t_optx = (tt_n4? '' : tt_n6? ('-moz-opacity:'+(t_opa/100.0)) : tt_ie? ('filter:Alpha(opacity='+t_opa+')') : ('opacity:'+(t_opa/100.0))) + ';'; |
| 173 | ++ var t_y = '<div id="'+t_id+'" style="position:absolute;z-index:1010;'; |
| 174 | ++ t_y += 'left:0px;top:0px;width:'+(t_w+t_shw)+'px;visibility:'+(tt_n4? 'hide' : 'hidden')+';'+t_optx+'">' + |
| 175 | ++ '<table border="0" cellpadding="0" cellspacing="0"'+(t_bc? (' bgcolor="'+t_bc+'" style="background:'+t_bc+';"') : '')+' width="'+t_w+'">'; |
| 176 | ++ if(t_tit) |
| 177 | ++ { |
| 178 | ++ t_y += '<tr><td style="padding-left:3px;padding-right:3px;" align="'+t_algn+'"><font color="'+t_titc+'" face="'+t_ff+'" ' + |
| 179 | ++ 'style="color:'+t_titc+';font-family:'+t_ff+';font-size:'+t_fsz+';"><b>' + |
| 180 | ++ (tt_n4? ' ' : '')+t_tit+'</b></font></td></tr>'; |
| 181 | ++ } |
| 182 | ++ t_y += '<tr><td><table border="0" cellpadding="'+t_padd+'" cellspacing="'+t_bw+'" width="100%">' + |
| 183 | ++ '<tr><td'+(t_bgc? (' bgcolor="'+t_bgc+'"') : '')+(t_bgimg? ' background="'+t_bgimg+'"' : '')+' style="text-align:'+t_algn+';'; |
| 184 | ++ if(tt_n6) t_y += 'padding:'+t_padd+'px;'; |
| 185 | ++ t_y += '" align="'+t_algn+'"><font color="'+t_fc+'" face="'+t_ff+'"' + |
| 186 | ++ ' style="color:'+t_fc+';font-family:'+t_ff+';font-size:'+t_fsz+';font-weight:'+t_fwght+';">'; |
| 187 | ++ if(t_fwght == 'bold') t_y += '<b>'; |
| 188 | ++ t_y += txt; |
| 189 | ++ if(t_fwght == 'bold') t_y += '</b>'; |
| 190 | ++ t_y += '</font></td></tr></table></td></tr></table>'; |
| 191 | ++ if(t_shw) |
| 192 | ++ { |
| 193 | ++ var t_spct = Math.round(t_shw*1.3); |
| 194 | ++ if(tt_n4) |
| 195 | ++ { |
| 196 | ++ t_y += '<layer bgcolor="'+t_shc+'" left="'+t_w+'" top="'+t_spct+'" width="'+t_shw+'" height="0"></layer>' + |
| 197 | ++ '<layer bgcolor="'+t_shc+'" left="'+t_spct+'" align="bottom" width="'+(t_w-t_spct)+'" height="'+t_shw+'"></layer>'; |
| 198 | ++ } |
| 199 | ++ else |
| 200 | ++ { |
| 201 | ++ t_optx = tt_n6? '-moz-opacity:0.85;' : tt_ie? 'filter:Alpha(opacity=85);' : 'opacity:0.85;'; |
| 202 | ++ t_y += '<div id="'+t_id+'R" style="position:absolute;background:'+t_shc+';left:'+t_w+'px;top:'+t_spct+'px;width:'+t_shw+'px;height:1px;overflow:hidden;'+t_optx+'"></div>' + |
| 203 | ++ '<div style="position:relative;background:'+t_shc+';left:'+t_spct+'px;top:0px;width:'+(t_w-t_spct)+'px;height:'+t_shw+'px;overflow:hidden;'+t_optx+'"></div>'; |
| 204 | ++ } |
| 205 | ++ } |
| 206 | ++ return(t_y+'</div>'); |
| 207 | ++} |
| 208 | ++function tt_EvX(t_e) |
| 209 | ++{ |
| 210 | ++ var t_y = tt_Int(t_e.pageX || t_e.clientX || 0) + |
| 211 | ++ tt_Int(tt_ie? tt_db.scrollLeft : 0) + |
| 212 | ++ tt_offX; |
| 213 | ++ if(t_y > xlim) t_y = xlim; |
| 214 | ++ var t_scr = tt_Int(window.pageXOffset || (tt_db? tt_db.scrollLeft : 0) || 0); |
| 215 | ++ if(t_y < t_scr) t_y = t_scr; |
| 216 | ++ return t_y; |
| 217 | ++} |
| 218 | ++function tt_EvY(t_e) |
| 219 | ++{ |
| 220 | ++ var t_y2; |
| 221 | ++ |
| 222 | ++ var t_y = tt_Int(t_e.pageY || t_e.clientY || 0) + |
| 223 | ++ tt_Int(tt_ie? tt_db.scrollTop : 0); |
| 224 | ++ if(tt_sup && (t_y2 = t_y - (tt_objH + tt_offY - 15)) >= tt_Int(window.pageYOffset || (tt_db? tt_db.scrollTop : 0) || 0)) |
| 225 | ++ t_y -= (tt_objH + tt_offY - 15); |
| 226 | ++ else if(t_y > ylim || !tt_sub && t_y > ylim-24) |
| 227 | ++ { |
| 228 | ++ t_y -= (tt_objH + 5); |
| 229 | ++ tt_sub = false; |
| 230 | ++ } |
| 231 | ++ else |
| 232 | ++ { |
| 233 | ++ t_y += tt_offY; |
| 234 | ++ tt_sub = true; |
| 235 | ++ } |
| 236 | ++ return t_y; |
| 237 | ++} |
| 238 | ++function tt_ReleasMov() |
| 239 | ++{ |
| 240 | ++ if(document.onmousemove == tt_Move) |
| 241 | ++ { |
| 242 | ++ if(!tt_mf && tt_ce) document.releaseEvents(Event.MOUSEMOVE); |
| 243 | ++ document.onmousemove = tt_mf; |
| 244 | ++ } |
| 245 | ++} |
| 246 | ++function tt_ShowIfrm(t_x) |
| 247 | ++{ |
| 248 | ++ if(!tt_obj || !tt_ifrm) return; |
| 249 | ++ if(t_x) |
| 250 | ++ { |
| 251 | ++ tt_ifrm.style.width = tt_objW+'px'; |
| 252 | ++ tt_ifrm.style.height = tt_objH+'px'; |
| 253 | ++ tt_ifrm.style.display = "block"; |
| 254 | ++ } |
| 255 | ++ else tt_ifrm.style.display = "none"; |
| 256 | ++} |
| 257 | ++function tt_GetDiv(t_id) |
| 258 | ++{ |
| 259 | ++ return( |
| 260 | ++ tt_n4? (document.layers[t_id] || null) |
| 261 | ++ : tt_ie? (document.all[t_id] || null) |
| 262 | ++ : (document.getElementById(t_id) || null) |
| 263 | ++ ); |
| 264 | ++} |
| 265 | ++function tt_GetDivW() |
| 266 | ++{ |
| 267 | ++ return tt_Int( |
| 268 | ++ tt_n4? tt_obj.clip.width |
| 269 | ++ : (tt_obj.offsetWidth || tt_obj.style.pixelWidth) |
| 270 | ++ ); |
| 271 | ++} |
| 272 | ++function tt_GetDivH() |
| 273 | ++{ |
| 274 | ++ return tt_Int( |
| 275 | ++ tt_n4? tt_obj.clip.height |
| 276 | ++ : (tt_obj.offsetHeight || tt_obj.style.pixelHeight) |
| 277 | ++ ); |
| 278 | ++} |
| 279 | ++ |
| 280 | ++// Compat with DragDrop Lib: Ensure that z-index of tooltip is lifted beyond toplevel dragdrop element |
| 281 | ++function tt_SetDivZ() |
| 282 | ++{ |
| 283 | ++ var t_i = tt_obj.style || tt_obj; |
| 284 | ++ if(t_i) |
| 285 | ++ { |
| 286 | ++ if(window.dd && dd.z) |
| 287 | ++ t_i.zIndex = Math.max(dd.z+1, t_i.zIndex); |
| 288 | ++ if(tt_ifrm) tt_ifrm.style.zIndex = t_i.zIndex-1; |
| 289 | ++ } |
| 290 | ++} |
| 291 | ++function tt_SetDivPos(t_x, t_y) |
| 292 | ++{ |
| 293 | ++ var t_i = tt_obj.style || tt_obj; |
| 294 | ++ var t_px = (tt_op6 || tt_n4)? '' : 'px'; |
| 295 | ++ t_i.left = (tt_objX = t_x) + t_px; |
| 296 | ++ t_i.top = (tt_objY = t_y) + t_px; |
| 297 | ++ // window... to circumvent the FireFox Alzheimer Bug |
| 298 | ++ if(window.tt_ifrm) |
| 299 | ++ { |
| 300 | ++ tt_ifrm.style.left = t_i.left; |
| 301 | ++ tt_ifrm.style.top = t_i.top; |
| 302 | ++ } |
| 303 | ++} |
| 304 | ++function tt_ShowDiv(t_x) |
| 305 | ++{ |
| 306 | ++ tt_ShowIfrm(t_x); |
| 307 | ++ if(tt_n4) tt_obj.visibility = t_x? 'show' : 'hide'; |
| 308 | ++ else tt_obj.style.visibility = t_x? 'visible' : 'hidden'; |
| 309 | ++ tt_act = t_x; |
| 310 | ++} |
| 311 | ++function tt_DeAlt(t_tag) |
| 312 | ++{ |
| 313 | ++ if(t_tag) |
| 314 | ++ { |
| 315 | ++ if(t_tag.alt) t_tag.alt = ""; |
| 316 | ++ if(t_tag.title) t_tag.title = ""; |
| 317 | ++ var t_c = t_tag.children || t_tag.childNodes || null; |
| 318 | ++ if(t_c) |
| 319 | ++ { |
| 320 | ++ for(var t_i = t_c.length; t_i; ) |
| 321 | ++ tt_DeAlt(t_c[--t_i]); |
| 322 | ++ } |
| 323 | ++ } |
| 324 | ++} |
| 325 | ++function tt_OpDeHref(t_e) |
| 326 | ++{ |
| 327 | ++ var t_tag; |
| 328 | ++ if(t_e) |
| 329 | ++ { |
| 330 | ++ t_tag = t_e.target; |
| 331 | ++ while(t_tag) |
| 332 | ++ { |
| 333 | ++ if(t_tag.hasAttribute("href")) |
| 334 | ++ { |
| 335 | ++ tt_tag = t_tag |
| 336 | ++ tt_tag.t_href = tt_tag.getAttribute("href"); |
| 337 | ++ tt_tag.removeAttribute("href"); |
| 338 | ++ tt_tag.style.cursor = "hand"; |
| 339 | ++ tt_tag.onmousedown = tt_OpReHref; |
| 340 | ++ tt_tag.stats = window.status; |
| 341 | ++ window.status = tt_tag.t_href; |
| 342 | ++ break; |
| 343 | ++ } |
| 344 | ++ t_tag = t_tag.parentElement; |
| 345 | ++ } |
| 346 | ++ } |
| 347 | ++} |
| 348 | ++function tt_OpReHref() |
| 349 | ++{ |
| 350 | ++ if(tt_tag) |
| 351 | ++ { |
| 352 | ++ tt_tag.setAttribute("href", tt_tag.t_href); |
| 353 | ++ window.status = tt_tag.stats; |
| 354 | ++ tt_tag = null; |
| 355 | ++ } |
| 356 | ++} |
| 357 | ++function tt_Show(t_e, t_id, t_sup, t_clk, t_delay, t_fix, t_left, t_offx, t_offy, t_static, t_sticky, t_temp) |
| 358 | ++{ |
| 359 | ++ if(tt_obj) tt_Hide(); |
| 360 | ++ tt_mf = document.onmousemove || null; |
| 361 | ++ if(window.dd && (window.DRAG && tt_mf == DRAG || window.RESIZE && tt_mf == RESIZE)) return; |
| 362 | ++ var t_sh, t_h; |
| 363 | ++ |
| 364 | ++ tt_obj = tt_GetDiv(t_id); |
| 365 | ++ if(tt_obj) |
| 366 | ++ { |
| 367 | ++ t_e = t_e || window.event; |
| 368 | ++ tt_sub = !(tt_sup = t_sup); |
| 369 | ++ tt_sticky = t_sticky; |
| 370 | ++ tt_objW = tt_GetDivW(); |
| 371 | ++ tt_objH = tt_GetDivH(); |
| 372 | ++ tt_offX = t_left? -(tt_objW+t_offx) : t_offx; |
| 373 | ++ tt_offY = t_offy; |
| 374 | ++ if(tt_op7) tt_OpDeHref(t_e); |
| 375 | ++ if(tt_n4) |
| 376 | ++ { |
| 377 | ++ if(tt_obj.document.layers.length) |
| 378 | ++ { |
| 379 | ++ t_sh = tt_obj.document.layers[0]; |
| 380 | ++ t_sh.clip.height = tt_objH - Math.round(t_sh.clip.width*1.3); |
| 381 | ++ } |
| 382 | ++ } |
| 383 | ++ else |
| 384 | ++ { |
| 385 | ++ t_sh = tt_GetDiv(t_id+'R'); |
| 386 | ++ if(t_sh) |
| 387 | ++ { |
| 388 | ++ t_h = tt_objH - tt_Int(t_sh.style.pixelTop || t_sh.style.top || 0); |
| 389 | ++ if(typeof t_sh.style.pixelHeight != tt_u) t_sh.style.pixelHeight = t_h; |
| 390 | ++ else t_sh.style.height = t_h+'px'; |
| 391 | ++ } |
| 392 | ++ } |
| 393 | ++ |
| 394 | ++ xlim = tt_Int((tt_db && tt_db.clientWidth)? tt_db.clientWidth : window.innerWidth) + |
| 395 | ++ tt_Int(window.pageXOffset || (tt_db? tt_db.scrollLeft : 0) || 0) - |
| 396 | ++ tt_objW - |
| 397 | ++ (tt_n4? 21 : 0); |
| 398 | ++ ylim = tt_Int(window.innerHeight || tt_db.clientHeight) + |
| 399 | ++ tt_Int(window.pageYOffset || (tt_db? tt_db.scrollTop : 0) || 0) - |
| 400 | ++ tt_objH - tt_offY; |
| 401 | ++ |
| 402 | ++ tt_SetDivZ(); |
| 403 | ++ if(t_fix) tt_SetDivPos(tt_Int((t_fix = t_fix.split(','))[0]), tt_Int(t_fix[1])); |
| 404 | ++ else tt_SetDivPos(tt_EvX(t_e), tt_EvY(t_e)); |
| 405 | ++ |
| 406 | ++ var t_txt = 'tt_ShowDiv(\'true\');'; |
| 407 | ++ if(t_sticky) t_txt += '{'+ |
| 408 | ++ 'tt_ReleasMov();'+ |
| 409 | ++ (t_clk? ('window.tt_upFunc = document.onmouseup || null;'+ |
| 410 | ++ 'if(tt_ce) document.captureEvents(Event.MOUSEUP);'+ |
| 411 | ++ 'document.onmouseup = new Function("window.setTimeout(\'tt_Hide();\', 10);");') : '')+ |
| 412 | ++ '}'; |
| 413 | ++ else if(t_static) t_txt += 'tt_ReleasMov();'; |
| 414 | ++ if(t_temp > 0) t_txt += 'window.tt_rtm = window.setTimeout(\'tt_sticky = false; tt_Hide();\','+t_temp+');'; |
| 415 | ++ window.tt_rdl = window.setTimeout(t_txt, t_delay); |
| 416 | ++ |
| 417 | ++ if(!t_fix) |
| 418 | ++ { |
| 419 | ++ if(tt_ce) document.captureEvents(Event.MOUSEMOVE); |
| 420 | ++ document.onmousemove = tt_Move; |
| 421 | ++ } |
| 422 | ++ } |
| 423 | ++} |
| 424 | ++var tt_area = false; |
| 425 | ++function tt_Move(t_ev) |
| 426 | ++{ |
| 427 | ++ if(!tt_obj) return; |
| 428 | ++ if(tt_n6 || tt_w3c) |
| 429 | ++ { |
| 430 | ++ if(tt_wait) return; |
| 431 | ++ tt_wait = true; |
| 432 | ++ setTimeout('tt_wait = false;', 5); |
| 433 | ++ } |
| 434 | ++ var t_e = t_ev || window.event; |
| 435 | ++ tt_SetDivPos(tt_EvX(t_e), tt_EvY(t_e)); |
| 436 | ++ if(window.tt_op6) |
| 437 | ++ { |
| 438 | ++ if(tt_area && t_e.target.tagName != 'AREA') tt_Hide(); |
| 439 | ++ else if(t_e.target.tagName == 'AREA') tt_area = true; |
| 440 | ++ } |
| 441 | ++} |
| 442 | ++function tt_Hide() |
| 443 | ++{ |
| 444 | ++ if(window.tt_obj) |
| 445 | ++ { |
| 446 | ++ if(window.tt_rdl) window.clearTimeout(tt_rdl); |
| 447 | ++ if(!tt_sticky || !tt_act) |
| 448 | ++ { |
| 449 | ++ if(window.tt_rtm) window.clearTimeout(tt_rtm); |
| 450 | ++ tt_ShowDiv(false); |
| 451 | ++ tt_SetDivPos(-tt_objW, -tt_objH); |
| 452 | ++ tt_obj = null; |
| 453 | ++ if(typeof window.tt_upFunc != tt_u) document.onmouseup = window.tt_upFunc; |
| 454 | ++ } |
| 455 | ++ tt_sticky = false; |
| 456 | ++ if(tt_op6 && tt_area) tt_area = false; |
| 457 | ++ tt_ReleasMov(); |
| 458 | ++ if(tt_op7) tt_OpReHref(); |
| 459 | ++ } |
| 460 | ++} |
| 461 | ++function tt_Init() |
| 462 | ++{ |
| 463 | ++ if(!(tt_op || tt_n4 || tt_n6 || tt_ie || tt_w3c)) return; |
| 464 | ++ |
| 465 | ++ var htm = tt_n4? '<div style="position:absolute;"></div>' : '', |
| 466 | ++ tags, |
| 467 | ++ t_tj, |
| 468 | ++ over, |
| 469 | ++ t_b, |
| 470 | ++ esc = 'return escape('; |
| 471 | ++ for(var i = tt_tags.length; i;) |
| 472 | ++ {--i; |
| 473 | ++ tags = tt_ie? (document.all.tags(tt_tags[i]) || 1) |
| 474 | ++ : document.getElementsByTagName? (document.getElementsByTagName(tt_tags[i]) || 1) |
| 475 | ++ : (!tt_n4 && tt_tags[i]=="a")? document.links |
| 476 | ++ : 1; |
| 477 | ++ if(tt_n4 && (tt_tags[i] == "a" || tt_tags[i] == "layer")) tags = tt_N4Tags(tt_tags[i]); |
| 478 | ++ for(var j = tags.length; j;) |
| 479 | ++ {--j; |
| 480 | ++ if(typeof (t_tj = tags[j]).onmouseover == "function" && t_tj.onmouseover.toString().indexOf(esc) != -1 && !tt_n6 || tt_n6 && (over = t_tj.getAttribute("onmouseover")) && over.indexOf(esc) != -1) |
| 481 | ++ { |
| 482 | ++ if(over) t_tj.onmouseover = new Function(over); |
| 483 | ++ var txt = unescape(t_tj.onmouseover()); |
| 484 | ++ htm += tt_Htm( |
| 485 | ++ t_tj, |
| 486 | ++ "tOoLtIp"+i+""+j, |
| 487 | ++ txt.wzReplace("& ","&") |
| 488 | ++ ); |
| 489 | ++ // window. to circumvent the FF Alzheimer Bug |
| 490 | ++ t_tj.onmouseover = new Function('e', |
| 491 | ++ 'if(window.tt_Show && tt_Show) tt_Show(e,'+ |
| 492 | ++ '"tOoLtIp' +i+''+j+ '",'+ |
| 493 | ++ ((typeof t_tj.T_ABOVE != tt_u)? t_tj.T_ABOVE : ttAbove)+','+ |
| 494 | ++ ((typeof t_tj.T_CLICKCLOSE != tt_u)? t_tj.T_CLICKCLOSE : ttClickClose)+','+ |
| 495 | ++ ((typeof t_tj.T_DELAY != tt_u)? t_tj.T_DELAY : ttDelay)+','+ |
| 496 | ++ ((typeof t_tj.T_FIX != tt_u)? '"'+t_tj.T_FIX+'"' : '""')+','+ |
| 497 | ++ ((typeof t_tj.T_LEFT != tt_u)? t_tj.T_LEFT : ttLeft)+','+ |
| 498 | ++ ((typeof t_tj.T_OFFSETX != tt_u)? t_tj.T_OFFSETX : ttOffsetX)+','+ |
| 499 | ++ ((typeof t_tj.T_OFFSETY != tt_u)? t_tj.T_OFFSETY : ttOffsetY)+','+ |
| 500 | ++ ((typeof t_tj.T_STATIC != tt_u)? t_tj.T_STATIC : ttStatic)+','+ |
| 501 | ++ ((typeof t_tj.T_STICKY != tt_u)? t_tj.T_STICKY : ttSticky)+','+ |
| 502 | ++ ((typeof t_tj.T_TEMP != tt_u)? t_tj.T_TEMP : ttTemp)+ |
| 503 | ++ ');' |
| 504 | ++ ); |
| 505 | ++ t_tj.onmouseout = tt_Hide; |
| 506 | ++ tt_DeAlt(t_tj); |
| 507 | ++ } |
| 508 | ++ } |
| 509 | ++ } |
| 510 | ++ if(tt_ie6) htm += '<iframe id="TTiEiFrM" src="javascript:false" scrolling="no" frameborder="0" style="filter:Alpha(opacity=0);position:absolute;top:0px;left:0px;display:none;"></iframe>'; |
| 511 | ++ t_b = document.getElementsByTagName? document.getElementsByTagName("body")[0] : tt_db; |
| 512 | ++ if(t_b && t_b.insertAdjacentHTML) t_b.insertAdjacentHTML("AfterBegin", htm); |
| 513 | ++ else if(t_b && typeof t_b.innerHTML != tt_u && document.createElement && t_b.appendChild) |
| 514 | ++ { |
| 515 | ++ var t_el = document.createElement("div"); |
| 516 | ++ t_b.appendChild(t_el); |
| 517 | ++ t_el.innerHTML = htm; |
| 518 | ++ } |
| 519 | ++ else |
| 520 | ++ document.write(htm); |
| 521 | ++ if(document.getElementById) tt_ifrm = document.getElementById("TTiEiFrM"); |
| 522 | ++} |
| 523 | ++tt_Init(); |
Property changes on: trunk/otrs/patches/10-tooltips.patch |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 524 | + native |
Index: trunk/otrs/patches/20-ticket-number-search.patch |
— | — | @@ -0,0 +1,26 @@ |
| 2 | +Index: trunk/Kernel/Output/HTML/Standard/AgentNavigationBar.dtl |
| 3 | +=================================================================== |
| 4 | +--- trunk.orig/Kernel/Output/HTML/Standard/AgentNavigationBar.dtl 2009-01-27 14:51:08.000000000 +1100 |
| 5 | +@@ -66,6 +66,21 @@ |
| 6 | + </div> |
| 7 | + </td> |
| 8 | + <!-- dtl:block:ItemPersonal --> |
| 9 | ++ |
| 10 | ++<!-- Ticket number search patch start --> |
| 11 | ++<td valign="bottom" align="center" class="nav"> |
| 12 | ++<a href="javascript:ticketNumberSearch();"><img src="$Env{"Images"}searchX.gif" border="0" width="22"><br>Ticket#</a> |
| 13 | ++<script language="JavaScript" type="text/javascript"><!-- |
| 14 | ++function ticketNumberSearch() { |
| 15 | ++ x=prompt("Ticket#"); |
| 16 | ++ if ( x!='' && x != null ) { |
| 17 | ++ window.location="$Env{"CGIHandle"}?Action=AgentTicketSearch&Subaction=Search&TicketNumber="+x; |
| 18 | ++ } |
| 19 | ++} |
| 20 | ++--> |
| 21 | ++</script></td> |
| 22 | ++<!-- Ticket number search patch end --> |
| 23 | ++ |
| 24 | + <!-- dtl:block:Classic --> |
| 25 | + <!-- dtl:block:Modern --> |
| 26 | + <!-- dtl:block:ItemPre --> |
Property changes on: trunk/otrs/patches/20-ticket-number-search.patch |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 27 | + native |
Index: trunk/otrs/patches/series |
— | — | @@ -0,0 +1,6 @@ |
| 2 | +10-tooltips.patch |
| 3 | +20-ticket-number-search.patch |
| 4 | +30-wm-brand.patch |
| 5 | +40-user-tooltips.patch |
| 6 | +50-one-click-spam.patch |
| 7 | +60-really-secure-mode.patch |
Property changes on: trunk/otrs/patches/series |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 8 | + native |
Index: trunk/otrs/patches/60-really-secure-mode.patch |
— | — | @@ -0,0 +1,961 @@ |
| 2 | +Index: trunk/.fetchmailrc.dist |
| 3 | +=================================================================== |
| 4 | +--- trunk.orig/.fetchmailrc.dist 2009-01-28 15:43:49.000000000 +1100 |
| 5 | +@@ -1,31 +0,0 @@ |
| 6 | +-# -- |
| 7 | +-# .fetchmailrc - fetchmailrc of the OTRS user |
| 8 | +-# Copyright (C) 2001-2008 OTRS AG, http://otrs.org/ |
| 9 | +-# -- |
| 10 | +-# $Id: .fetchmailrc.dist,v 1.3 2008/03/07 17:00:14 martin Exp $ |
| 11 | +-# -- |
| 12 | +-# This software comes with ABSOLUTELY NO WARRANTY. For details, see |
| 13 | +-# the enclosed file COPYING for license information (GPL). If you |
| 14 | +-# did not receive this file, see http://www.gnu.org/licenses/gpl-2.0.txt. |
| 15 | +-# -- |
| 16 | +-# Note: Continue lines with whitespace at the beginning of each newline |
| 17 | +-# -- |
| 18 | +- |
| 19 | +-#-----------------# |
| 20 | +-# simple example: |
| 21 | +-#-----------------# |
| 22 | +- |
| 23 | +-#poll <MAIL_SERVER> protocol POP3 user <MAIL_USERNAME> pass <MAIL_PASSWORD> is <LOCAL_OTRS_USERNAME> here |
| 24 | +- |
| 25 | +-#-------------------------------------------------# |
| 26 | +-# example for polling from an IMAP-Server via SSL. |
| 27 | +-#-------------------------------------------------# |
| 28 | +- |
| 29 | +-#poll <MAIL_SERVER> protocol IMAP port 993 plugin "openssl s_client -connect %h:%p" user <MAIL_USERNAME> pass <MAIL_PASSWORD> is <LOCAL_OTRS_USERNAME> here |
| 30 | +- |
| 31 | +-#--------------------------------------------------------# |
| 32 | +-# The openssl command has to be installed and accessible |
| 33 | +-# for the otrs user. |
| 34 | +-# If the otrs user cannot find openssl, try: |
| 35 | +-# plugin "/path/to/openssl s_client -connect %h:%p" |
| 36 | +-#--------------------------------------------------------# |
| 37 | +Index: trunk/.mailfilter.dist |
| 38 | +=================================================================== |
| 39 | +--- trunk.orig/.mailfilter.dist 2009-01-28 15:46:53.000000000 +1100 |
| 40 | +@@ -1,79 +0,0 @@ |
| 41 | +-# -- |
| 42 | +-# .mailfilter - mailfilter of the OTRS user |
| 43 | +-# Copyright (C) 2003 Wiktor Wodecki <wiktor.wodecki@net-m.de> |
| 44 | +-# -- |
| 45 | +-# $Id: .mailfilter.dist,v 1.3 2007/02/06 16:01:13 tr Exp $ |
| 46 | +-# -- |
| 47 | +-# This software comes with ABSOLUTELY NO WARRANTY. For details, see |
| 48 | +-# the enclosed file COPYING for license information (GPL). If you |
| 49 | +-# did not receive this file, see http://www.gnu.org/licenses/gpl.txt. |
| 50 | +-# -- |
| 51 | +- |
| 52 | +-#SYS_HOME=/opt/otrs |
| 53 | +-SYS_HOME=$HOME |
| 54 | +- |
| 55 | +-import DEFAULT |
| 56 | +-LOCALDEFAULT=$DEFAULT |
| 57 | +-DEFAULT=${SYS_HOME}/var/spool/`date +%s`${FROM}${SIZE} |
| 58 | +-MONTHFOLDER=`date +%Y-%m` |
| 59 | +-YEARFOLDER=`date +%Y` |
| 60 | +- |
| 61 | +- |
| 62 | +-# Remove all X-OTRS Header (allow this only for trusted email) |
| 63 | +-# e. g. from *@example.com |
| 64 | +- |
| 65 | +-if (/^To:.*@example.com/) |
| 66 | +-{ |
| 67 | +- xfilter "grep -vi '^X-OTRS-'" |
| 68 | +-} |
| 69 | +- |
| 70 | +-# or just not emails with "X-OTRS-Ident: ahfiw2Fw32r230dddl2foeo3r" header! |
| 71 | +-#if (/^X-OTRS-Ident: ahfiw2Fw32r230dddl2foeo3r/) |
| 72 | +-#{ |
| 73 | +-# xfilter "grep -vi '^X-OTRS-'" |
| 74 | +-#} |
| 75 | +- |
| 76 | +- |
| 77 | +- |
| 78 | +-# Examples for queue presorting. |
| 79 | +- |
| 80 | +-if (/^To:.*@example.com/) |
| 81 | +-{ |
| 82 | +- xfilter "formail -I \"X-OTRS-Queue: example\"" |
| 83 | +-} |
| 84 | +- |
| 85 | +-if (/^List-Id:.*OpenAntiVirus/) |
| 86 | +-{ |
| 87 | +- xfilter "formail -I \"X-OTRS-Queue: OpenAntiVirus\"" |
| 88 | +-} |
| 89 | +- |
| 90 | +- |
| 91 | +-# Example for add free form key and value (max 3). |
| 92 | +- |
| 93 | +-if (/^To:.*@example.com/) |
| 94 | +-{ |
| 95 | +- xfilter "formail -I \"X-OTRS-ArticleKey1: Test\"" |
| 96 | +- xfilter "formail -I \"X-OTRS-ArticleValue1: True!\"" |
| 97 | +-} |
| 98 | +- |
| 99 | +- |
| 100 | +-# Backup of all incoming emails. |
| 101 | +-# It's always better to have a backup of all incoming emails! |
| 102 | +- |
| 103 | +-cc ${SYS_HOME}/var/INBOX.Backup.${MONTHFOLDER} |
| 104 | +- |
| 105 | +- |
| 106 | +-# Pipe all email into the PostMaster process. |
| 107 | +- |
| 108 | +-xfilter "${SYS_HOME}/bin/PostMaster.pl" |
| 109 | +- |
| 110 | +- |
| 111 | +-# spool all the rest (which the PostMaster.pl can't process!) |
| 112 | +-# If the database is down or the PostMaster.pl exit was not '0'! |
| 113 | +- |
| 114 | +-to $DEFAULT |
| 115 | +- |
| 116 | +- |
| 117 | +-# end of .mailfilter |
| 118 | +- |
| 119 | +- |
| 120 | +Index: trunk/.procmailrc.dist |
| 121 | +=================================================================== |
| 122 | +--- trunk.orig/.procmailrc.dist 2009-01-28 15:46:53.000000000 +1100 |
| 123 | +@@ -1,86 +0,0 @@ |
| 124 | +-# -- |
| 125 | +-# .procmailrc - procmailrc of the OTRS user |
| 126 | +-# Copyright (C) 2001-2008 OTRS AG, http://otrs.org/ |
| 127 | +-# -- |
| 128 | +-# $Id: .procmailrc.dist,v 1.4 2008/10/15 17:19:21 martin Exp $ |
| 129 | +-# -- |
| 130 | +-# This software comes with ABSOLUTELY NO WARRANTY. For details, see |
| 131 | +-# the enclosed file COPYING for license information (GPL). If you |
| 132 | +-# did not receive this file, see http://www.gnu.org/licenses/gpl-2.0.txt. |
| 133 | +-# -- |
| 134 | +- |
| 135 | +-#SYS_HOME=/opt/otrs/ |
| 136 | +-SYS_HOME=$HOME |
| 137 | +- |
| 138 | +-SHELL=/bin/sh |
| 139 | +-PATH=/bin:/usr/bin:/usr/local/bin |
| 140 | +-MONTHFOLDER=`date +%Y-%m` |
| 141 | +-YEARFOLDER=`date +%Y` |
| 142 | +-LOGFILE=$SYS_HOME/var/log/procmail-$MONTHFOLDER.log |
| 143 | +-VERBOSE=on |
| 144 | +- |
| 145 | +- |
| 146 | +-# Remove all X-OTRS Header (allow this only for trusted email) |
| 147 | +-# e. g. from *@example.com |
| 148 | +- |
| 149 | +-:0 fhw : |
| 150 | +-* !^From.*@example.com |
| 151 | +-| grep -vi '^X-OTRS-' |
| 152 | +- |
| 153 | +-# or just not emails with "X-OTRS-Ident: ahfiw2Fw32r230dddl2foeo3r" header! |
| 154 | +-#:0 fhw : |
| 155 | +-#* !^X-OTRS-Ident: ahfiw2Fw32r230dddl2foeo3r |
| 156 | +-#| grep -vi '^X-OTRS-' |
| 157 | +- |
| 158 | +- |
| 159 | +- |
| 160 | +-# Examples for queue presorting. |
| 161 | +- |
| 162 | +-:0 fhw : |
| 163 | +-* TO:.*@example.com |
| 164 | +-| formail -I "X-OTRS-Queue: example" |
| 165 | +- |
| 166 | +-:0 fhw : |
| 167 | +-* ^List-Id:.*OpenAntiVirus |
| 168 | +-| formail -I "X-OTRS-Queue: OpenAntiVirus" |
| 169 | +- |
| 170 | +- |
| 171 | +-# Example for add free form key and value (max 3). |
| 172 | +- |
| 173 | +-:0 fhw : |
| 174 | +-* TO:.*@example.com |
| 175 | +-| formail -I "X-OTRS-ArticleKey1: Test" | formail -I "X-OTRS-ArticleValue1: True!" |
| 176 | +- |
| 177 | +- |
| 178 | +-# Example for assigning the "email domain as customer ID" automaticaly. |
| 179 | +- |
| 180 | +-#:0hc |
| 181 | +-#CUSTOMERID=|formail -X "From:"|perl -e '$i=<STDIN>; $i=~s/^From: //;$i=~s/\(.*?\)//;$i=~s/<(.*?)>/$1/;$i=~s/ //g;$i=~s/.*@(.*)/$1/;print $i' |
| 182 | +-# |
| 183 | +-#:0 fhw : |
| 184 | +-#| formail -I "X-OTRS-CustomerNo: $CUSTOMERID" |
| 185 | +- |
| 186 | +- |
| 187 | +-# Backup of all incoming emails. |
| 188 | +-# It's always better to have a backup of all incoming emails! |
| 189 | +- |
| 190 | +-#:0 c : |
| 191 | +-#$SYS_HOME/var/INBOX.Backup.$MONTHFOLDER |
| 192 | +- |
| 193 | +- |
| 194 | +-# Pipe all email into the PostMaster process. |
| 195 | +- |
| 196 | +-:0 : |
| 197 | +-| $SYS_HOME/bin/PostMaster.pl |
| 198 | +- |
| 199 | +- |
| 200 | +-# spool all the rest (which the PostMaster.pl can't process!) |
| 201 | +-# If the database is down or the PostMaster.pl exit was not '0'! |
| 202 | +- |
| 203 | +-:0 : |
| 204 | +-$SYS_HOME/var/spool/. |
| 205 | +- |
| 206 | +- |
| 207 | +-# end of .procmailrc |
| 208 | +- |
| 209 | +- |
| 210 | +Index: trunk/INSTALL |
| 211 | +=================================================================== |
| 212 | +--- trunk.orig/INSTALL 2009-01-28 15:44:01.000000000 +1100 |
| 213 | +@@ -74,7 +74,7 @@ |
| 214 | + ------------ |
| 215 | + Add user: |
| 216 | + --------- |
| 217 | +- $shell: useradd -d /opt/otrs/ -c 'OTRS user' otrs |
| 218 | ++ $shell: useradd -d /opt/otrs/home/ -c 'OTRS user' otrs |
| 219 | + |
| 220 | + Add user to webserver group (if the webserver is not running with OTRS user): |
| 221 | + ----------------------------------------------------------------------------- |
| 222 | +@@ -115,12 +115,26 @@ |
| 223 | + |
| 224 | + 7. File Permissions: |
| 225 | + ----------------- |
| 226 | +- Set the file permissions with |
| 227 | +- "$HOME/bin/SetPermissions.sh <OTRS_HOME> <OTRS_USER> <WEBSERVER_USER> [OTRS_GROUP] [WEB_GROUP]" |
| 228 | +- e. g. |
| 229 | +- Webserver with OTRS user: "SetPermissions.sh /opt/otrs otrs otrs" |
| 230 | +- Webserver with wwwrun user (e. g. SuSE): "SetPermissions.sh /opt/otrs otrs wwwrun" |
| 231 | +- Webserver with apache user (e. g. Redhat): "SetPermissions.sh /opt/otrs otrs apache apache apache" |
| 232 | ++ To set the file permissions with a functional package manager: |
| 233 | ++ "$HOME/bin/SetPermissions.pl --otrs-user=<OTRS_USER> --web-user=<WEBSERVER_USER> [--otrs-group=<OTRS_GROUP>] [--web-group=<WEB_GROUP>] <OTRS_HOME>" |
| 234 | ++ |
| 235 | ++ e. g. |
| 236 | ++ Webserver with OTRS user: |
| 237 | ++ "SetPermissions.pl --otrs-user=otrs --web-user=otrs /opt/otrs" |
| 238 | ++ Webserver with wwwrun user (e. g. SuSE): |
| 239 | ++ "SetPermissions.pl --otrs-user=otrs --web-user=wwwrun /opt/otrs" |
| 240 | ++ Webserver with apache user (e. g. Redhat): |
| 241 | ++ "SetPermissions.pl --otrs-user=otrs --web-user=apache --otrs-group=apache --web-group=apache /opt/otrs" |
| 242 | ++ |
| 243 | ++ To set the file permissions with package manager disabled: |
| 244 | ++ "$HOME/bin/SetPermissions.pl --secure --otrs-user=<OTRS_USER> --web-user=<WEBSERVER_USER> --admin-user=<ADMIN_USER> [--otrs-group=<OTRS_GROUP>] [--web-group=<WEB_GROUP>] [--admin-group=<ADMIN_GROUP] <OTRS_HOME>" |
| 245 | ++ |
| 246 | ++ e.g. |
| 247 | ++ "SetPermissions.pl --secure --otrs-user=otrs --web-user=otrs --admin-user=root /opt/otrs" |
| 248 | ++ |
| 249 | ++ You will also need to add the following to Kernel/Config.pm: |
| 250 | ++ |
| 251 | ++ $Self->{SecureMode} = 1; |
| 252 | + |
| 253 | + 8. Database setup: |
| 254 | + --------------- |
| 255 | +Index: trunk/Kernel/Modules/AdminGenericAgent.pm |
| 256 | +=================================================================== |
| 257 | +--- trunk.orig/Kernel/Modules/AdminGenericAgent.pm 2009-01-28 15:46:53.000000000 +1100 |
| 258 | +@@ -533,6 +533,11 @@ |
| 259 | + } |
| 260 | + } |
| 261 | + |
| 262 | ++ # Secure mode |
| 263 | ++ if ( !$Self->{ConfigObject}->Get( 'SecureMode' ) ) { |
| 264 | ++ $Self->{LayoutObject}->Block( Name => 'InsecureOptions' ); |
| 265 | ++ } |
| 266 | ++ |
| 267 | + # html search mask output |
| 268 | + my $Output = $Self->{LayoutObject}->Header( Title => 'Affected Tickets' ); |
| 269 | + $Output .= $Self->{LayoutObject}->NavigationBar(); |
| 270 | +@@ -1106,6 +1111,11 @@ |
| 271 | + } |
| 272 | + } |
| 273 | + |
| 274 | ++ # Secure mode |
| 275 | ++ if ( !$Self->{ConfigObject}->Get( 'SecureMode' ) ) { |
| 276 | ++ $Self->{LayoutObject}->Block( Name => 'InsecureOptions' ); |
| 277 | ++ } |
| 278 | ++ |
| 279 | + # generate search mask |
| 280 | + my $Output = $Self->{LayoutObject}->Header( Title => 'Edit' ); |
| 281 | + $Output .= $Self->{LayoutObject}->NavigationBar(); |
| 282 | +Index: trunk/Kernel/Modules/AdminSelectBox.pm |
| 283 | +=================================================================== |
| 284 | +--- trunk.orig/Kernel/Modules/AdminSelectBox.pm 2009-01-28 15:46:53.000000000 +1100 |
| 285 | +@@ -35,6 +35,11 @@ |
| 286 | + sub Run { |
| 287 | + my ( $Self, %Param ) = @_; |
| 288 | + |
| 289 | ++ if ( $Self->{ConfigObject}->Get( 'SecureMode' ) ) { |
| 290 | ++ $Self->{LayoutObject}->FatalError( Message => "The SQL box is disabled in secure mode." ); |
| 291 | ++ return; |
| 292 | ++ } |
| 293 | ++ |
| 294 | + # ------------------------------------------------------------ # |
| 295 | + # print form |
| 296 | + # ------------------------------------------------------------ # |
| 297 | +Index: trunk/Kernel/Modules/AdminSysConfig.pm |
| 298 | +=================================================================== |
| 299 | +--- trunk.orig/Kernel/Modules/AdminSysConfig.pm 2009-01-28 15:46:53.000000000 +1100 |
| 300 | +@@ -45,6 +45,11 @@ |
| 301 | + my $Group = ''; |
| 302 | + my $Anker = ''; |
| 303 | + |
| 304 | ++ if ( $Self->{ConfigObject}->Get( 'SecureMode' ) ) { |
| 305 | ++ $Self->{LayoutObject}->FatalError( Message => "SysConfig is disabled in secure mode." ); |
| 306 | ++ return; |
| 307 | ++ } |
| 308 | ++ |
| 309 | + # write default file |
| 310 | + if ( !$Self->{ParamObject}->GetParam( Param => 'DontWriteDefault' ) ) { |
| 311 | + if ( !$Self->{SysConfigObject}->WriteDefault() ) { |
| 312 | +Index: trunk/Kernel/Output/HTML/NavBarModuleAdmin.pm |
| 313 | +=================================================================== |
| 314 | +--- trunk.orig/Kernel/Output/HTML/NavBarModuleAdmin.pm 2009-01-28 15:46:53.000000000 +1100 |
| 315 | +@@ -88,6 +88,17 @@ |
| 316 | + } |
| 317 | + |
| 318 | + } |
| 319 | ++ |
| 320 | ++ # Disable modules disabled by SecureMode |
| 321 | ++ if ( $Self->{ConfigObject}->Get( 'SecureMode' ) ) { |
| 322 | ++ for my $BlacklistedModule ( qw'AdminPackageManager AdminSelectBox AdminSysConfig' ) { |
| 323 | ++ if ( $Module eq $BlacklistedModule ) { |
| 324 | ++ $Shown = 0; |
| 325 | ++ last; |
| 326 | ++ } |
| 327 | ++ } |
| 328 | ++ } |
| 329 | ++ |
| 330 | + next if !$Shown; |
| 331 | + |
| 332 | + my $Key = sprintf( "%07d", $Hash{NavBarModule}->{Prio} || 0 ); |
| 333 | +Index: trunk/Kernel/Output/HTML/Standard/AdminGenericAgent.dtl |
| 334 | +=================================================================== |
| 335 | +--- trunk.orig/Kernel/Output/HTML/Standard/AdminGenericAgent.dtl 2009-01-28 15:46:53.000000000 +1100 |
| 336 | +@@ -476,14 +476,14 @@ |
| 337 | + </td> |
| 338 | + </tr> |
| 339 | + <tr> |
| 340 | +- <td class="mainhead" width="50%">$Text{"CMD"}</td> |
| 341 | ++ <td class="mainhead" width="50%">$Text{"Send Notification"}</td> |
| 342 | + <td class="mainhead" width="50%">$Text{"Delete"}</td> |
| 343 | + </tr> |
| 344 | +- <tr> |
| 345 | + <td class="contentbody"> |
| 346 | +- <input type="text" name="NewCMD" value="$QData{"NewCMD"}" size="40"/> |
| 347 | ++ $Text{"Send no notifications"}: $Data{"SendNoNotificationOption"} |
| 348 | + <br/> |
| 349 | +- ($Text{"This command will be executed. ARG[0] will be the ticket number. ARG[1] the ticket id."}) |
| 350 | ++ $Text{"Yes means, send no agent and customer notifications on changes."} |
| 351 | ++ $Text{"No means, send agent and customer notifications on changes."} |
| 352 | + </td> |
| 353 | + <td class="contentbody"> |
| 354 | + $Text{"Delete tickets"}: $Data{"DeleteOption"} |
| 355 | +@@ -492,13 +492,20 @@ |
| 356 | + <b>($Text{"Warning! This tickets will be removed from the database! This tickets are lost!"})</b> |
| 357 | + </font> |
| 358 | + </td> |
| 359 | ++ <tr> |
| 360 | + </tr> |
| 361 | ++<!-- dtl:block:InsecureOptions --> |
| 362 | + <tr> |
| 363 | ++ <td class="mainhead" width="50%">$Text{"CMD"}</td> |
| 364 | + <td class="mainhead" width="50%">$Text{"Module"}</td> |
| 365 | +- <td class="mainhead" width="50%">$Text{"Send Notification"}</td> |
| 366 | + </tr> |
| 367 | + <tr> |
| 368 | + <td class="contentbody"> |
| 369 | ++ <input type="text" name="NewCMD" value="$QData{"NewCMD"}" size="40"/> |
| 370 | ++ <br/> |
| 371 | ++ ($Text{"This command will be executed. ARG[0] will be the ticket number. ARG[1] the ticket id."}) |
| 372 | ++ </td> |
| 373 | ++ <td class="contentbody"> |
| 374 | + <table> |
| 375 | + <tr> |
| 376 | + <td valign="top">$Text{"Module"}:</td> |
| 377 | +@@ -548,13 +555,8 @@ |
| 378 | + </tr> |
| 379 | + </table> |
| 380 | + </td> |
| 381 | +- <td class="contentbody"> |
| 382 | +- $Text{"Send no notifications"}: $Data{"SendNoNotificationOption"} |
| 383 | +- <br/> |
| 384 | +- $Text{"Yes means, send no agent and customer notifications on changes."} |
| 385 | +- $Text{"No means, send agent and customer notifications on changes."} |
| 386 | +- </td> |
| 387 | + </tr> |
| 388 | ++<!-- dtl:block:InsecureOptions --> |
| 389 | + <tr> |
| 390 | + <td colspan="2" class="contentfooter"> |
| 391 | + <input class="button" type="submit" value="$Text{"Save"}"/> |
| 392 | +Index: trunk/Kernel/System/GenericAgent.pm |
| 393 | +=================================================================== |
| 394 | +--- trunk.orig/Kernel/System/GenericAgent.pm 2009-01-28 15:46:53.000000000 +1100 |
| 395 | +@@ -273,6 +273,18 @@ |
| 396 | + } |
| 397 | + } |
| 398 | + |
| 399 | ++ # Check security |
| 400 | ++ if ( $Self->{ConfigObject}->Get( 'SecureMode' ) ) { |
| 401 | ++ if ( $Job{New}->{Module} ) { |
| 402 | ++ $Self->{LogObject}->Log( Priority => 'error', Message => "Cannot run modules in secure mode.\n" ); |
| 403 | ++ return; |
| 404 | ++ } |
| 405 | ++ if ( $Job{New}->{CMD} ) { |
| 406 | ++ $Self->{LogObject}->Log( Priority => 'error', Message => "Cannot run commands in secure mode.\n" ); |
| 407 | ++ return; |
| 408 | ++ } |
| 409 | ++ } |
| 410 | ++ |
| 411 | + my %Tickets = (); |
| 412 | + |
| 413 | + # escalation tickets |
| 414 | +Index: trunk/Kernel/System/Package.pm |
| 415 | +=================================================================== |
| 416 | +--- trunk.orig/Kernel/System/Package.pm 2009-01-28 15:46:53.000000000 +1100 |
| 417 | +@@ -125,9 +125,9 @@ |
| 418 | + $Self->{Home} = $Self->{ConfigObject}->Get('Home'); |
| 419 | + |
| 420 | + # permission check |
| 421 | +- if ( !$Self->_FileSystemCheck() ) { |
| 422 | ++ if ( !$Self->{ConfigObject}->Get( 'SecureMode' ) && !$Self->_FileSystemCheck() ) { |
| 423 | + die "ERROR: Need write permission in OTRS home\n" |
| 424 | +- . "Try: \$OTRS_HOME/bin/SetPermissions.sh !!!\n"; |
| 425 | ++ . "Try: \$OTRS_HOME/bin/SetPermissions.pl !!!\n"; |
| 426 | + } |
| 427 | + |
| 428 | + return $Self; |
| 429 | +@@ -2310,21 +2310,7 @@ |
| 430 | + |
| 431 | + # create test files in following directories |
| 432 | + for (qw(/bin/ /Kernel/ /Kernel/System/ /Kernel/Output/ /Kernel/Output/HTML/ /Kernel/Modules/)) { |
| 433 | +- my $Location = "$Home/$_/check_permissons.$$"; |
| 434 | +- my $FH; |
| 435 | +- my $Content = 'test'; |
| 436 | +- |
| 437 | +- # create test file |
| 438 | +- my $Write = $Self->{MainObject}->FileWrite( |
| 439 | +- Location => $Location, |
| 440 | +- Content => \$Content, |
| 441 | +- ); |
| 442 | +- |
| 443 | +- # return false if not created |
| 444 | +- return if !$Write; |
| 445 | +- |
| 446 | +- # delete test file |
| 447 | +- $Self->{MainObject}->FileDelete( Location => $Location ); |
| 448 | ++ return if ! -w "$Home/$_"; |
| 449 | + } |
| 450 | + return 1; |
| 451 | + } |
| 452 | +Index: trunk/Kernel/System/Ticket/ArticleStorageFS.pm |
| 453 | +=================================================================== |
| 454 | +--- trunk.orig/Kernel/System/Ticket/ArticleStorageFS.pm 2009-01-28 15:46:53.000000000 +1100 |
| 455 | +@@ -55,10 +55,10 @@ |
| 456 | + $Self->{LogObject}->Log( |
| 457 | + Priority => 'notice', |
| 458 | + Message => "Can't create $Self->{ArticleDataDir}/check_permissions_$$: $Error, " |
| 459 | +- . "Try: \$OTRS_HOME/bin/SetPermissions.sh !", |
| 460 | ++ . "Try: \$OTRS_HOME/bin/SetPermissions.pl !", |
| 461 | + ); |
| 462 | + die "Error: Can't create $Self->{ArticleDataDir}/check_permissions_$$: $Error \n\n " |
| 463 | +- . "Try: \$OTRS_HOME/bin/SetPermissions.sh !!!\n"; |
| 464 | ++ . "Try: \$OTRS_HOME/bin/SetPermissions.pl !!!\n"; |
| 465 | + } |
| 466 | + return 1; |
| 467 | + } |
| 468 | +Index: trunk/README.webserver |
| 469 | +=================================================================== |
| 470 | +--- trunk.orig/README.webserver 2009-01-28 15:46:53.000000000 +1100 |
| 471 | +@@ -48,11 +48,21 @@ |
| 472 | + because you have other applications running on this server, you can |
| 473 | + also work with group permissions (more tricky). |
| 474 | + |
| 475 | +- Use "$HOME/bin/SetPermissions.sh <OTRS_HOME> <OTRS_USER> <WEBSERVER_USER> [OTRS_GROUP] [WEB_GROUP]" |
| 476 | ++ Use "$HOME/bin/SetPermissions.pl --otrs-user=<OTRS_USER> --web-user=<WEBSERVER_USER> [--otrs-group=<OTRS_GROUP>] [--web-group=<WEB_GROUP>] <OTRS_HOME>" |
| 477 | + e. g. |
| 478 | +- Webserver with otrs user: "SetPermissions.sh /opt/otrs otrs otrs" |
| 479 | +- Webserver with wwwrun user (e. g. SuSE): "SetPermissions.sh /opt/otrs otrs wwwrun" |
| 480 | +- Webserver with apache user (e. g. Redhat): "SetPermissions.sh /opt/otrs otrs apache" |
| 481 | ++ Webserver with OTRS user: |
| 482 | ++ "SetPermissions.pl --otrs-user=otrs --web-user=otrs /opt/otrs" |
| 483 | ++ Webserver with wwwrun user (e. g. SuSE): |
| 484 | ++ "SetPermissions.pl --otrs-user=otrs --web-user=wwwrun /opt/otrs" |
| 485 | ++ Webserver with apache user (e. g. Redhat): |
| 486 | ++ "SetPermissions.pl --otrs-user=otrs --web-user=apache --otrs-group=apache --web-group=apache /opt/otrs" |
| 487 | ++ |
| 488 | ++ To set the file permissions with package manager disabled: |
| 489 | ++ "$HOME/bin/SetPermissions.pl --secure --otrs-user=<OTRS_USER> --web-user=<WEBSERVER_USER> --admin-user=<ADMIN_USER> [--otrs-group=<OTRS_GROUP>] [--web-group=<WEB_GROUP>] [--admin-group=<ADMIN_GROUP] <OTRS_HOME>" |
| 490 | ++ |
| 491 | ++ You will also need to add the following to Kernel/Config.pm: |
| 492 | ++ |
| 493 | ++ $Self->{SecureMode} = 1; |
| 494 | + |
| 495 | + b) |
| 496 | + *) |
| 497 | +Index: trunk/UPGRADING |
| 498 | +=================================================================== |
| 499 | +--- trunk.orig/UPGRADING 2009-01-28 15:51:30.000000000 +1100 |
| 500 | +@@ -48,7 +48,7 @@ |
| 501 | + PostgreSQL: |
| 502 | + cat $OTRS_HOME/scripts/DBUpdate-to-2.3-post.postgresql.sql | psql otrs |
| 503 | + |
| 504 | +-*) If _no_ RPM is used, execute $OTRS_HOME/bin/SetPermissions.sh! |
| 505 | ++*) If _no_ RPM is used, execute $OTRS_HOME/bin/SetPermissions.pl! |
| 506 | + |
| 507 | + *) Restart your services (e. g. rcotrs restart-force or each service manually) |
| 508 | + |
| 509 | +Index: trunk/bin/SetPermissions.sh |
| 510 | +=================================================================== |
| 511 | +--- trunk.orig/bin/SetPermissions.sh 2009-01-28 15:43:30.000000000 +1100 |
| 512 | +@@ -20,9 +20,6 @@ |
| 513 | + # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 514 | + # -- |
| 515 | + |
| 516 | +-echo "SetPermissions.sh <\$Revision: 1.32 $> - set OTRS file permissions" |
| 517 | +-echo "Copyright (C) 2001-2008 OTRS AG, http://otrs.org/" |
| 518 | +- |
| 519 | + if ! test $1 || ! test $2 || ! test $3; then |
| 520 | + # check required options |
| 521 | + echo "" |
| 522 | +@@ -42,92 +39,12 @@ |
| 523 | + [ "$5" != "" ]&& WEBGROUP=$5 |
| 524 | + fi |
| 525 | + |
| 526 | +-# set permission |
| 527 | +-echo "Setting file permissions... " |
| 528 | +-# set all files writeabel for webserver user (needed for package manager) |
| 529 | +-echo "chown -R $WEBUSER:$OTRSGROUP $OTRSDEST" |
| 530 | +-chown $WEBUSER:$OTRSGROUP $OTRSDEST |
| 531 | +-chown -R $WEBUSER:$OTRSGROUP $OTRSDEST |
| 532 | +-echo "chmod -R og+rw $OTRSDEST" |
| 533 | +-chmod 755 $OTRSDEST |
| 534 | +-chmod -R ug+wr $OTRSDEST/* |
| 535 | +- |
| 536 | +-# set the $HOME to the OTRS user |
| 537 | +-echo "chown $OTRSUSER:$OTRSGROUP $OTRSDEST" |
| 538 | +-chown $OTRSUSER:$OTRSGROUP $OTRSDEST |
| 539 | +- |
| 540 | +-# set the fetchmail rc to OTRS user |
| 541 | +-if test -e $OTRSDEST/.fetchmailrc; then |
| 542 | +- echo "chown $OTRSUSER:$OTRSGROUP $OTRSDEST/.fetchmailrc" |
| 543 | +- chown $OTRSUSER:$OTRSGROUP $OTRSDEST/.fetchmailrc |
| 544 | +- echo "chmod 0600 $OTRSDEST/.fetchmailrc" |
| 545 | +- chmod 0600 $OTRSDEST/.fetchmailrc |
| 546 | +-fi |
| 547 | +- |
| 548 | +-# set procmailrc |
| 549 | +-if test -e $OTRSDEST/.procmailrc; then |
| 550 | +- echo "chown $OTRSUSER:$OTRSGROUP $OTRSDEST/.procmailrc" |
| 551 | +- chown $OTRSUSER:$OTRSGROUP $OTRSDEST/.procmailrc |
| 552 | +- echo "chmod 0644 $OTRSDEST/.procmailrc" |
| 553 | +- chmod 0644 $OTRSDEST/.procmailrc |
| 554 | +-fi |
| 555 | +- |
| 556 | +-# set mailfilter |
| 557 | +-if test -e $OTRSDEST/.mailfilter; then |
| 558 | +- echo "chown $OTRSUSER:$OTRSGROUP $OTRSDEST/.mailfilter" |
| 559 | +- chown $OTRSUSER:$OTRSGROUP $OTRSDEST/.mailfilter |
| 560 | +- echo "chmod 0600 $OTRSDEST/.mailfilter" |
| 561 | +- chmod 0600 $OTRSDEST/.mailfilter |
| 562 | +-fi |
| 563 | +- |
| 564 | +-# set forward (just for Exim) |
| 565 | +-if test -e $OTRSDEST/.forward; then |
| 566 | +- echo "chown $OTRSUSER:$OTRSGROUP $OTRSDEST/.forward" |
| 567 | +- chown $OTRSUSER:$OTRSGROUP $OTRSDEST/.forward |
| 568 | +-fi |
| 569 | +- |
| 570 | +-# var/* |
| 571 | +- |
| 572 | +-# set the var directory to OTRS and webserver user |
| 573 | +-echo "chown -R $OTRSUSER:$WEBGROUP $OTRSDEST/var/" |
| 574 | +-chown -R $OTRSUSER:$WEBGROUP $OTRSDEST/var/ |
| 575 | +-chmod -R 2775 $OTRSDEST/var/article/ |
| 576 | +-chmod -R 2775 $OTRSDEST/var/log/ |
| 577 | +-chmod -R 2775 $OTRSDEST/var/tmp/ |
| 578 | +- |
| 579 | +-# set the var/sessions directory to OTRS and webserver user |
| 580 | +-echo "chown -R $WEBUSER:$WEBGROUP $OTRSDEST/var/sessions/" |
| 581 | +-chown -R $WEBUSER:$WEBGROUP $OTRSDEST/var/sessions/ |
| 582 | +- |
| 583 | +-# set the var/log/TicketCounter.log file to OTRS and webserver user |
| 584 | +-echo "touch && chown $OTRSUSER:$WEBGROUP $OTRSDEST/var/log/TicketCounter.log" |
| 585 | +-touch $OTRSDEST/var/log/TicketCounter.log |
| 586 | +-chown $OTRSUSER:$WEBGROUP $OTRSDEST/var/log/TicketCounter.log |
| 587 | +-chmod 664 $OTRSDEST/var/log/TicketCounter.log |
| 588 | +- |
| 589 | +- |
| 590 | +-# bin/* |
| 591 | +- |
| 592 | +-# set all bin/* as executable |
| 593 | +-echo "chmod -R 775 $OTRSDEST/bin/" |
| 594 | +-chmod -R 775 $OTRSDEST/bin/ |
| 595 | +- |
| 596 | +-# set the DeleteSessionIDs.pl just to OTRS user |
| 597 | +-echo "(chown && chmod 700) $OTRSUSER:0 $OTRSDEST/bin/DeleteSessionIDs.pl" |
| 598 | +-chmod 700 $OTRSDEST/bin/DeleteSessionIDs.pl |
| 599 | +-chown $OTRSUSER:0 $OTRSDEST/bin/DeleteSessionIDs.pl |
| 600 | +- |
| 601 | +-# set the UnlockTickets.pl just to OTRS user |
| 602 | +-echo "(chown && chmod 700) $OTRSUSER:0 $OTRSDEST/bin/UnlockTickets.pl" |
| 603 | +-chmod 700 $OTRSDEST/bin/UnlockTickets.pl |
| 604 | +-chown $OTRSUSER:0 $OTRSDEST/bin/UnlockTickets.pl |
| 605 | +- |
| 606 | +-# set the bin/otrs.getConfig just to OTRS user |
| 607 | +-echo "(chown && chmod 700) $OTRSUSER:0 $OTRSDEST/bin/otrs.getConfig" |
| 608 | +-chmod 700 $OTRSDEST/bin/otrs.getConfig |
| 609 | +-chown $OTRSUSER:0 $OTRSDEST/bin/otrs.getConfig |
| 610 | + |
| 611 | +-# set write permission for web installer |
| 612 | +-chown $WEBUSER $OTRSDEST/Kernel/Config.pm |
| 613 | ++`dirname "$0"`/SetPermissions.pl \ |
| 614 | ++ --web-user="$WEBUSER" \ |
| 615 | ++ --otrs-user="$OTRSUSER" \ |
| 616 | ++ --web-group="$WEBGROUP" \ |
| 617 | ++ --otrs-group="$OTRSGROUP" \ |
| 618 | ++ "$OTRSDEST" |
| 619 | + |
| 620 | + exit; |
| 621 | +Index: trunk/home/.fetchmailrc.dist |
| 622 | +=================================================================== |
| 623 | +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 |
| 624 | +@@ -0,0 +1,31 @@ |
| 625 | ++# -- |
| 626 | ++# .fetchmailrc - fetchmailrc of the OTRS user |
| 627 | ++# Copyright (C) 2001-2008 OTRS AG, http://otrs.org/ |
| 628 | ++# -- |
| 629 | ++# $Id: .fetchmailrc.dist,v 1.3 2008/03/07 17:00:14 martin Exp $ |
| 630 | ++# -- |
| 631 | ++# This software comes with ABSOLUTELY NO WARRANTY. For details, see |
| 632 | ++# the enclosed file COPYING for license information (GPL). If you |
| 633 | ++# did not receive this file, see http://www.gnu.org/licenses/gpl-2.0.txt. |
| 634 | ++# -- |
| 635 | ++# Note: Continue lines with whitespace at the beginning of each newline |
| 636 | ++# -- |
| 637 | ++ |
| 638 | ++#-----------------# |
| 639 | ++# simple example: |
| 640 | ++#-----------------# |
| 641 | ++ |
| 642 | ++#poll <MAIL_SERVER> protocol POP3 user <MAIL_USERNAME> pass <MAIL_PASSWORD> is <LOCAL_OTRS_USERNAME> here |
| 643 | ++ |
| 644 | ++#-------------------------------------------------# |
| 645 | ++# example for polling from an IMAP-Server via SSL. |
| 646 | ++#-------------------------------------------------# |
| 647 | ++ |
| 648 | ++#poll <MAIL_SERVER> protocol IMAP port 993 plugin "openssl s_client -connect %h:%p" user <MAIL_USERNAME> pass <MAIL_PASSWORD> is <LOCAL_OTRS_USERNAME> here |
| 649 | ++ |
| 650 | ++#--------------------------------------------------------# |
| 651 | ++# The openssl command has to be installed and accessible |
| 652 | ++# for the otrs user. |
| 653 | ++# If the otrs user cannot find openssl, try: |
| 654 | ++# plugin "/path/to/openssl s_client -connect %h:%p" |
| 655 | ++#--------------------------------------------------------# |
| 656 | +Index: trunk/home/.mailfilter.dist |
| 657 | +=================================================================== |
| 658 | +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 |
| 659 | +@@ -0,0 +1,79 @@ |
| 660 | ++# -- |
| 661 | ++# .mailfilter - mailfilter of the OTRS user |
| 662 | ++# Copyright (C) 2003 Wiktor Wodecki <wiktor.wodecki@net-m.de> |
| 663 | ++# -- |
| 664 | ++# $Id: .mailfilter.dist,v 1.3 2007/02/06 16:01:13 tr Exp $ |
| 665 | ++# -- |
| 666 | ++# This software comes with ABSOLUTELY NO WARRANTY. For details, see |
| 667 | ++# the enclosed file COPYING for license information (GPL). If you |
| 668 | ++# did not receive this file, see http://www.gnu.org/licenses/gpl.txt. |
| 669 | ++# -- |
| 670 | ++ |
| 671 | ++#SYS_HOME=/opt/otrs |
| 672 | ++SYS_HOME="$HOME/.." |
| 673 | ++ |
| 674 | ++import DEFAULT |
| 675 | ++LOCALDEFAULT=$DEFAULT |
| 676 | ++DEFAULT=${SYS_HOME}/var/spool/`date +%s`${FROM}${SIZE} |
| 677 | ++MONTHFOLDER=`date +%Y-%m` |
| 678 | ++YEARFOLDER=`date +%Y` |
| 679 | ++ |
| 680 | ++ |
| 681 | ++# Remove all X-OTRS Header (allow this only for trusted email) |
| 682 | ++# e. g. from *@example.com |
| 683 | ++ |
| 684 | ++if (/^To:.*@example.com/) |
| 685 | ++{ |
| 686 | ++ xfilter "grep -vi '^X-OTRS-'" |
| 687 | ++} |
| 688 | ++ |
| 689 | ++# or just not emails with "X-OTRS-Ident: ahfiw2Fw32r230dddl2foeo3r" header! |
| 690 | ++#if (/^X-OTRS-Ident: ahfiw2Fw32r230dddl2foeo3r/) |
| 691 | ++#{ |
| 692 | ++# xfilter "grep -vi '^X-OTRS-'" |
| 693 | ++#} |
| 694 | ++ |
| 695 | ++ |
| 696 | ++ |
| 697 | ++# Examples for queue presorting. |
| 698 | ++ |
| 699 | ++if (/^To:.*@example.com/) |
| 700 | ++{ |
| 701 | ++ xfilter "formail -I \"X-OTRS-Queue: example\"" |
| 702 | ++} |
| 703 | ++ |
| 704 | ++if (/^List-Id:.*OpenAntiVirus/) |
| 705 | ++{ |
| 706 | ++ xfilter "formail -I \"X-OTRS-Queue: OpenAntiVirus\"" |
| 707 | ++} |
| 708 | ++ |
| 709 | ++ |
| 710 | ++# Example for add free form key and value (max 3). |
| 711 | ++ |
| 712 | ++if (/^To:.*@example.com/) |
| 713 | ++{ |
| 714 | ++ xfilter "formail -I \"X-OTRS-ArticleKey1: Test\"" |
| 715 | ++ xfilter "formail -I \"X-OTRS-ArticleValue1: True!\"" |
| 716 | ++} |
| 717 | ++ |
| 718 | ++ |
| 719 | ++# Backup of all incoming emails. |
| 720 | ++# It's always better to have a backup of all incoming emails! |
| 721 | ++ |
| 722 | ++cc ${SYS_HOME}/var/INBOX.Backup.${MONTHFOLDER} |
| 723 | ++ |
| 724 | ++ |
| 725 | ++# Pipe all email into the PostMaster process. |
| 726 | ++ |
| 727 | ++xfilter "${SYS_HOME}/bin/PostMaster.pl" |
| 728 | ++ |
| 729 | ++ |
| 730 | ++# spool all the rest (which the PostMaster.pl can't process!) |
| 731 | ++# If the database is down or the PostMaster.pl exit was not '0'! |
| 732 | ++ |
| 733 | ++to $DEFAULT |
| 734 | ++ |
| 735 | ++ |
| 736 | ++# end of .mailfilter |
| 737 | ++ |
| 738 | ++ |
| 739 | +Index: trunk/home/.procmailrc.dist |
| 740 | +=================================================================== |
| 741 | +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 |
| 742 | +@@ -0,0 +1,86 @@ |
| 743 | ++# -- |
| 744 | ++# .procmailrc - procmailrc of the OTRS user |
| 745 | ++# Copyright (C) 2001-2008 OTRS AG, http://otrs.org/ |
| 746 | ++# -- |
| 747 | ++# $Id: .procmailrc.dist,v 1.4 2008/10/15 17:19:21 martin Exp $ |
| 748 | ++# -- |
| 749 | ++# This software comes with ABSOLUTELY NO WARRANTY. For details, see |
| 750 | ++# the enclosed file COPYING for license information (GPL). If you |
| 751 | ++# did not receive this file, see http://www.gnu.org/licenses/gpl-2.0.txt. |
| 752 | ++# -- |
| 753 | ++ |
| 754 | ++#SYS_HOME=/opt/otrs/ |
| 755 | ++SYS_HOME="$HOME/.." |
| 756 | ++ |
| 757 | ++SHELL=/bin/sh |
| 758 | ++PATH=/bin:/usr/bin:/usr/local/bin |
| 759 | ++MONTHFOLDER=`date +%Y-%m` |
| 760 | ++YEARFOLDER=`date +%Y` |
| 761 | ++LOGFILE=$SYS_HOME/var/log/procmail-$MONTHFOLDER.log |
| 762 | ++VERBOSE=on |
| 763 | ++ |
| 764 | ++ |
| 765 | ++# Remove all X-OTRS Header (allow this only for trusted email) |
| 766 | ++# e. g. from *@example.com |
| 767 | ++ |
| 768 | ++:0 fhw : |
| 769 | ++* !^From.*@example.com |
| 770 | ++| grep -vi '^X-OTRS-' |
| 771 | ++ |
| 772 | ++# or just not emails with "X-OTRS-Ident: ahfiw2Fw32r230dddl2foeo3r" header! |
| 773 | ++#:0 fhw : |
| 774 | ++#* !^X-OTRS-Ident: ahfiw2Fw32r230dddl2foeo3r |
| 775 | ++#| grep -vi '^X-OTRS-' |
| 776 | ++ |
| 777 | ++ |
| 778 | ++ |
| 779 | ++# Examples for queue presorting. |
| 780 | ++ |
| 781 | ++:0 fhw : |
| 782 | ++* TO:.*@example.com |
| 783 | ++| formail -I "X-OTRS-Queue: example" |
| 784 | ++ |
| 785 | ++:0 fhw : |
| 786 | ++* ^List-Id:.*OpenAntiVirus |
| 787 | ++| formail -I "X-OTRS-Queue: OpenAntiVirus" |
| 788 | ++ |
| 789 | ++ |
| 790 | ++# Example for add free form key and value (max 3). |
| 791 | ++ |
| 792 | ++:0 fhw : |
| 793 | ++* TO:.*@example.com |
| 794 | ++| formail -I "X-OTRS-ArticleKey1: Test" | formail -I "X-OTRS-ArticleValue1: True!" |
| 795 | ++ |
| 796 | ++ |
| 797 | ++# Example for assigning the "email domain as customer ID" automaticaly. |
| 798 | ++ |
| 799 | ++#:0hc |
| 800 | ++#CUSTOMERID=|formail -X "From:"|perl -e '$i=<STDIN>; $i=~s/^From: //;$i=~s/\(.*?\)//;$i=~s/<(.*?)>/$1/;$i=~s/ //g;$i=~s/.*@(.*)/$1/;print $i' |
| 801 | ++# |
| 802 | ++#:0 fhw : |
| 803 | ++#| formail -I "X-OTRS-CustomerNo: $CUSTOMERID" |
| 804 | ++ |
| 805 | ++ |
| 806 | ++# Backup of all incoming emails. |
| 807 | ++# It's always better to have a backup of all incoming emails! |
| 808 | ++ |
| 809 | ++#:0 c : |
| 810 | ++#$SYS_HOME/var/INBOX.Backup.$MONTHFOLDER |
| 811 | ++ |
| 812 | ++ |
| 813 | ++# Pipe all email into the PostMaster process. |
| 814 | ++ |
| 815 | ++:0 : |
| 816 | ++| $SYS_HOME/bin/PostMaster.pl |
| 817 | ++ |
| 818 | ++ |
| 819 | ++# spool all the rest (which the PostMaster.pl can't process!) |
| 820 | ++# If the database is down or the PostMaster.pl exit was not '0'! |
| 821 | ++ |
| 822 | ++:0 : |
| 823 | ++$SYS_HOME/var/spool/. |
| 824 | ++ |
| 825 | ++ |
| 826 | ++# end of .procmailrc |
| 827 | ++ |
| 828 | ++ |
| 829 | +Index: trunk/scripts/DBUpdate-to-2.3.pl |
| 830 | +=================================================================== |
| 831 | +--- trunk.orig/scripts/DBUpdate-to-2.3.pl 2009-01-28 15:46:53.000000000 +1100 |
| 832 | +@@ -82,7 +82,7 @@ |
| 833 | + |
| 834 | + # error handling |
| 835 | + if ( !$Success ) { |
| 836 | +- print STDOUT "Can't write config files! Please run the SetPermissions.sh and try it again."; |
| 837 | ++ print STDOUT "Can't write config files! Please run the SetPermissions.pl and try it again."; |
| 838 | + exit 0; |
| 839 | + } |
| 840 | + |
| 841 | +Index: trunk/var/cron/aaa_base.dist |
| 842 | +=================================================================== |
| 843 | +--- trunk.orig/var/cron/aaa_base.dist 2009-01-28 15:51:30.000000000 +1100 |
| 844 | +@@ -11,4 +11,5 @@ |
| 845 | + |
| 846 | + # Who gets the cron emails? |
| 847 | + MAILTO="root@localhost" |
| 848 | ++OTRS_HOME=/opt/otrs |
| 849 | + |
| 850 | +Index: trunk/var/cron/generic_agent-database.dist |
| 851 | +=================================================================== |
| 852 | +--- trunk.orig/var/cron/generic_agent-database.dist 2009-01-28 15:51:30.000000000 +1100 |
| 853 | +@@ -10,5 +10,5 @@ |
| 854 | + # -- |
| 855 | + |
| 856 | + # start generic agent every 10 minutes |
| 857 | +-*/10 * * * * $HOME/bin/GenericAgent.pl -c db >> /dev/null |
| 858 | ++*/10 * * * * $OTRS_HOME/bin/GenericAgent.pl -c db >> /dev/null |
| 859 | + |
| 860 | +Index: trunk/var/cron/generic_agent.dist |
| 861 | +=================================================================== |
| 862 | +--- trunk.orig/var/cron/generic_agent.dist 2009-01-28 15:51:30.000000000 +1100 |
| 863 | +@@ -10,9 +10,9 @@ |
| 864 | + # -- |
| 865 | + |
| 866 | + # start generic agent every 20 minutes |
| 867 | +-*/20 * * * * $HOME/bin/GenericAgent.pl >> /dev/null |
| 868 | ++*/20 * * * * $OTRS_HOME/bin/GenericAgent.pl >> /dev/null |
| 869 | + |
| 870 | + # example to execute GenericAgent.pl on 23:00 with |
| 871 | + # Kernel::Config::GenericAgentMove job file |
| 872 | +-#0 23 * * * $HOME/bin/GenericAgent.pl -c "Kernel::Config::GenericAgentMove" >> /dev/null |
| 873 | ++#0 23 * * * $OTRS_HOME/bin/GenericAgent.pl -c "Kernel::Config::GenericAgentMove" >> /dev/null |
| 874 | + |
| 875 | +Index: trunk/var/cron/pending_jobs.dist |
| 876 | +=================================================================== |
| 877 | +--- trunk.orig/var/cron/pending_jobs.dist 2009-01-28 15:51:30.000000000 +1100 |
| 878 | +@@ -10,5 +10,5 @@ |
| 879 | + # -- |
| 880 | + |
| 881 | + # check every 120 min the pending jobs |
| 882 | +-45 */2 * * * $HOME/bin/PendingJobs.pl >> /dev/null |
| 883 | ++45 */2 * * * $OTRS_HOME/bin/PendingJobs.pl >> /dev/null |
| 884 | + |
| 885 | +Index: trunk/var/cron/postmaster.dist |
| 886 | +=================================================================== |
| 887 | +--- trunk.orig/var/cron/postmaster.dist 2009-01-28 15:51:30.000000000 +1100 |
| 888 | +@@ -11,5 +11,5 @@ |
| 889 | + |
| 890 | + # check daily the spool directory of OTRS |
| 891 | + #10 0 * * * * [ -e /etc/init.d/otrs ] && /etc/init.d/otrs cleanup >> /dev/null; [ -e /etc/rc.d/init.d/otrs ] && /etc/rc.d/init.d/otrs cleanup >> /dev/null |
| 892 | +-10 0 * * * $HOME/bin/otrs.cleanup >> /dev/null |
| 893 | ++10 0 * * * $OTRS_HOME/bin/otrs.cleanup >> /dev/null |
| 894 | + |
| 895 | +Index: trunk/var/cron/postmaster_mailbox.dist |
| 896 | +=================================================================== |
| 897 | +--- trunk.orig/var/cron/postmaster_mailbox.dist 2009-01-28 15:51:30.000000000 +1100 |
| 898 | +@@ -10,5 +10,5 @@ |
| 899 | + # -- |
| 900 | + |
| 901 | + # fetch emails every 10 minutes |
| 902 | +-*/10 * * * * $HOME/bin/PostMasterMailbox.pl >> /dev/null |
| 903 | ++*/10 * * * * $OTRS_HOME/bin/PostMasterMailbox.pl >> /dev/null |
| 904 | + |
| 905 | +Index: trunk/var/cron/rebuild_ticket_index.dist |
| 906 | +=================================================================== |
| 907 | +--- trunk.orig/var/cron/rebuild_ticket_index.dist 2009-01-28 15:51:30.000000000 +1100 |
| 908 | +@@ -10,5 +10,5 @@ |
| 909 | + # -- |
| 910 | + |
| 911 | + # just every day |
| 912 | +-01 01 * * * $HOME/bin/RebuildTicketIndex.pl >> /dev/null |
| 913 | ++01 01 * * * $OTRS_HOME/bin/RebuildTicketIndex.pl >> /dev/null |
| 914 | + |
| 915 | +Index: trunk/var/cron/session.dist |
| 916 | +=================================================================== |
| 917 | +--- trunk.orig/var/cron/session.dist 2009-01-28 15:51:30.000000000 +1100 |
| 918 | +@@ -10,5 +10,5 @@ |
| 919 | + # -- |
| 920 | + |
| 921 | + # delete every 120 minutes old/idle session ids |
| 922 | +-55 */2 * * * $HOME/bin/DeleteSessionIDs.pl --expired >> /dev/null |
| 923 | ++55 */2 * * * $OTRS_HOME/bin/DeleteSessionIDs.pl --expired >> /dev/null |
| 924 | + |
| 925 | +Index: trunk/var/cron/unlock.dist |
| 926 | +=================================================================== |
| 927 | +--- trunk.orig/var/cron/unlock.dist 2009-01-28 15:51:30.000000000 +1100 |
| 928 | +@@ -10,5 +10,5 @@ |
| 929 | + # -- |
| 930 | + |
| 931 | + # unlock every hour old locked tickets |
| 932 | +-35 * * * * $HOME/bin/UnlockTickets.pl --timeout >> /dev/null |
| 933 | ++35 * * * * $OTRS_HOME/bin/UnlockTickets.pl --timeout >> /dev/null |
| 934 | + |
Property changes on: trunk/otrs/patches/60-really-secure-mode.patch |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 935 | + native |
Index: trunk/otrs/patches/50-one-click-spam.patch |
— | — | @@ -0,0 +1,176 @@ |
| 2 | +Index: trunk/var/httpd/htdocs/oneclick.js |
| 3 | +=================================================================== |
| 4 | +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 |
| 5 | +@@ -0,0 +1,91 @@ |
| 6 | ++var TicketCount = 0; |
| 7 | ++ |
| 8 | ++function createXMLHttpRequest() { |
| 9 | ++ try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {} |
| 10 | ++ try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} |
| 11 | ++ try { return new XMLHttpRequest(); } catch(e) {} |
| 12 | ++ alert("XMLHttpRequest is not supported by your browser."); |
| 13 | ++ return null; |
| 14 | ++} |
| 15 | ++ |
| 16 | ++function moveTicket( ticketdiv, DestQueueID ) { |
| 17 | ++ function a( statusbar, xhReq, RevertURL ) { |
| 18 | ++ var i=3; |
| 19 | ++ return function() { |
| 20 | ++ if ( xhReq.readyState != 4 ) { |
| 21 | ++ statusbar.innerHTML+='<img src="' + ImagePath + 'notready.png" alt="."> '; |
| 22 | ++ return; |
| 23 | ++ } else { |
| 24 | ++ statusbar.innerHTML = '<img src="' + ImagePath + 'ready.png" alt="OK">'+ |
| 25 | ++ ' <a href="' + RevertURL + '">Undo</a>'; |
| 26 | ++ TicketCount --; |
| 27 | ++ if ( TicketCount == 0 ) { |
| 28 | ++ document.firstChild.innerHTML = xhReq.responseText; |
| 29 | ++ makeOneclickVisible(); |
| 30 | ++ } |
| 31 | ++ } |
| 32 | ++ } |
| 33 | ++ } |
| 34 | ++ var FormDivs = ticketdiv.getElementsByTagName( 'form' ); |
| 35 | ++ var MoveForm; |
| 36 | ++ for( var i=0; i<FormDivs.length; i++ ) { |
| 37 | ++ if ( FormDivs[i].name == "ChangeQueue" ) { |
| 38 | ++ MoveForm = FormDivs[i]; |
| 39 | ++ break; |
| 40 | ++ } |
| 41 | ++ } |
| 42 | ++ // Read variables from the "ChangeQueue" form |
| 43 | ++ var Action = MoveForm.elements["Action"].value; |
| 44 | ++ var TicketID = MoveForm.elements["TicketID"].value; |
| 45 | ++ var QueueID = MoveForm.elements["QueueID"].value; |
| 46 | ++ var ActionURL = MoveForm.action + |
| 47 | ++ '?Action=' + Action + |
| 48 | ++ '&QueueID=' + QueueID + |
| 49 | ++ '&TicketID=' + TicketID + |
| 50 | ++ '&DestQueueID=' + DestQueueID; |
| 51 | ++ var RevertURL = MoveForm.action + |
| 52 | ++ '?Action=' + Action + |
| 53 | ++ '&QueueID=' + DestQueueID + |
| 54 | ++ '&TicketID=' + TicketID + |
| 55 | ++ '&DestQueueID=' + QueueID; |
| 56 | ++ // hide the ticket display, but keep the first, black, bar |
| 57 | ++ p = ticketdiv.firstChild; |
| 58 | ++ while ( p.className != 'ticketview2' ) { |
| 59 | ++ p = p.nextSibling; |
| 60 | ++ } |
| 61 | ++ p.style.display='none'; |
| 62 | ++ while ( p.className != 'ticketview3' ) { |
| 63 | ++ p = p.nextSibling; |
| 64 | ++ } |
| 65 | ++ var newnode = document.createElement("div"); |
| 66 | ++ newnode.setAttribute( "style", "-moz-border-radius:0 0 1em 1em; background-color:white;padding-left:1em;" ); |
| 67 | ++ newnode.innerHTML='<img src="' + ImagePath + 'notready.png" alt=".">' |
| 68 | ++ ticketdiv.replaceChild( newnode, p ); |
| 69 | ++ // Do the async XML call |
| 70 | ++ xhReq = createXMLHttpRequest(); |
| 71 | ++ xhReq.open( "GET", ActionURL, true); |
| 72 | ++ xhReq.onreadystatechange = a( newnode, xhReq, RevertURL ); |
| 73 | ++ xhReq.send( null ); |
| 74 | ++} |
| 75 | ++ |
| 76 | ++function makeOneclickVisible() { |
| 77 | ++ var OneclickDivs = document.getElementsByName("oneclick"); |
| 78 | ++ function a(x) { |
| 79 | ++ return function() { |
| 80 | ++ p = x.parentNode; |
| 81 | ++ while ( p.className != 'ticketoverview' ) { |
| 82 | ++ p = p.parentNode; |
| 83 | ++ } |
| 84 | ++ moveTicket( p, SpamQueueID ); |
| 85 | ++ }; |
| 86 | ++ } |
| 87 | ++ TicketCount = OneclickDivs.length; |
| 88 | ++ for ( var i=0; i<TicketCount; i++ ) { |
| 89 | ++ OneclickDivs[i].style.display='inline'; |
| 90 | ++ OneclickDivs[i].style.cursor='pointer'; |
| 91 | ++ OneclickDivs[i].onclick=a(OneclickDivs[i]); |
| 92 | ++ } |
| 93 | ++} |
| 94 | ++ |
| 95 | ++window.onload = makeOneclickVisible; |
| 96 | ++ |
| 97 | +Index: trunk/Kernel/Output/HTML/Standard/AgentTicketOverviewPreview.dtl |
| 98 | +=================================================================== |
| 99 | +--- trunk.orig/Kernel/Output/HTML/Standard/AgentTicketOverviewPreview.dtl 2009-01-28 13:50:07.000000000 +1100 |
| 100 | +@@ -9,7 +9,8 @@ |
| 101 | + # did not receive this file, see http://www.gnu.org/licenses/gpl-2.0.txt. |
| 102 | + # -- |
| 103 | + <!-- start ticket --> |
| 104 | +-<table border="0" width="100%" cellspacing="0" cellpadding="3"> |
| 105 | ++<div class="ticketoverview"> |
| 106 | ++<table border="0" width="100%" cellspacing="0" cellpadding="3" class="ticketview"> |
| 107 | + <tr> |
| 108 | + <td align="left" width="1%" class="mainhead"> |
| 109 | + <!-- dtl:block:Bulk --> |
| 110 | +@@ -27,7 +28,7 @@ |
| 111 | + </td> |
| 112 | + </tr> |
| 113 | + </table> |
| 114 | +-<table border="0" width="100%" cellspacing="0" cellpadding="3"> |
| 115 | ++<table border="0" width="100%" cellspacing="0" cellpadding="3" class="ticketview2"> |
| 116 | + <tr> |
| 117 | + <td align="left" width="60%" class="menu"> |
| 118 | + <!-- dtl:block:Menu --> |
| 119 | +@@ -49,9 +50,26 @@ |
| 120 | + </td> |
| 121 | + </tr> |
| 122 | + </table> |
| 123 | +-<table border="0" width="100%" cellspacing="0" cellpadding="3"> |
| 124 | ++<table border="0" width="100%" cellspacing="0" cellpadding="3" class="ticketview3"> |
| 125 | + <tr> |
| 126 | + <td width="75%" class="mainbody"> |
| 127 | ++ <div name="oneclick" style="display:none; float:right; padding: 0.5em; -moz-border-radius: 1em; background-color:#dddddd;"> |
| 128 | ++ <table border="0"> |
| 129 | ++ <tr> |
| 130 | ++ <td valign="middle"> |
| 131 | ++ <img src="$Env{"Images"}edittrash.png" alt="" > |
| 132 | ++ </td> |
| 133 | ++ <td valign="middle"> |
| 134 | ++ 1-click<br />$Text{"Spam"} |
| 135 | ++ </td> |
| 136 | ++ </tr> |
| 137 | ++ </table> |
| 138 | ++ </div> |
| 139 | ++ <script type="text/javascript"> |
| 140 | ++ var SpamQueueID = "$Config{"SpamQueueID"}"; |
| 141 | ++ var ImagePath = "$Env{"Images"}"; |
| 142 | ++ </script> |
| 143 | ++ <script type="text/javascript" src="$Env{"Images"}../../oneclick.js"></script> |
| 144 | + <table border="0" width="100%" cellspacing="0" cellpadding="1"> |
| 145 | + # From:, To:, Cc: |
| 146 | + <!-- dtl:block:Row --> |
| 147 | +@@ -304,7 +322,7 @@ |
| 148 | + <!-- dtl:block:Move --> |
| 149 | + <b>$Text{"Change queue"}:</b> |
| 150 | + <br/> |
| 151 | +- <form action="$Env{"CGIHandle"}" method="get"> |
| 152 | ++ <form action="$Env{"CGIHandle"}" method="get" name="ChangeQueue"> |
| 153 | + <input type="hidden" name="Action" value="AgentTicketMove"/> |
| 154 | + <input type="hidden" name="QueueID" value="$QData{"QueueID"}"/> |
| 155 | + <input type="hidden" name="TicketID" value="$QData{"TicketID"}"/> |
| 156 | +@@ -319,4 +337,5 @@ |
| 157 | + </td> |
| 158 | + </tr> |
| 159 | + </table> |
| 160 | ++</div> |
| 161 | + <!-- end ticket --> |
| 162 | +Index: trunk/Kernel/Output/HTML/TicketOverviewPreview.pm |
| 163 | +=================================================================== |
| 164 | +--- trunk.orig/Kernel/Output/HTML/TicketOverviewPreview.pm 2009-01-28 13:50:11.000000000 +1100 |
| 165 | +@@ -142,6 +142,9 @@ |
| 166 | + TicketID => $Param{TicketID}, |
| 167 | + ); |
| 168 | + |
| 169 | ++ # Set QueueID (needed for one-click spam patch) |
| 170 | ++ $Param{QueueID} = $Article{QueueID}; |
| 171 | ++ |
| 172 | + # run article modules |
| 173 | + if ( ref $Self->{ConfigObject}->Get('Ticket::Frontend::ArticlePreViewModule') eq 'HASH' ) { |
| 174 | + my %Jobs = %{ $Self->{ConfigObject}->Get('Ticket::Frontend::ArticlePreViewModule') }; |
Property changes on: trunk/otrs/patches/50-one-click-spam.patch |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 175 | + native |
Index: trunk/otrs/var/httpd/htdocs/22px-Wikimedia-logo.svg.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: trunk/otrs/var/httpd/htdocs/22px-Wikimedia-logo.svg.png |
___________________________________________________________________ |
Added: svn:mime-type |
2 | 176 | + image/png |
Index: trunk/otrs/var/httpd/htdocs/22px-Wikimedia_Community_Logo.svg.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: trunk/otrs/var/httpd/htdocs/22px-Wikimedia_Community_Logo.svg.png |
___________________________________________________________________ |
Added: svn:mime-type |
3 | 177 | + image/png |
Index: trunk/otrs/var/httpd/htdocs/images/Standard/ready.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: trunk/otrs/var/httpd/htdocs/images/Standard/ready.png |
___________________________________________________________________ |
Added: svn:mime-type |
4 | 178 | + image/png |
Index: trunk/otrs/var/httpd/htdocs/images/Standard/notready.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: trunk/otrs/var/httpd/htdocs/images/Standard/notready.png |
___________________________________________________________________ |
Added: svn:mime-type |
5 | 179 | + image/png |
Index: trunk/otrs/var/httpd/htdocs/images/Standard/edittrash.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: trunk/otrs/var/httpd/htdocs/images/Standard/edittrash.png |
___________________________________________________________________ |
Added: svn:mime-type |
6 | 180 | + image/png |
Index: trunk/otrs/var/httpd/htdocs/images/Standard/clock.gif |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/otrs/var/httpd/htdocs/images/Standard/clock.gif |
___________________________________________________________________ |
Added: svn:mime-type |
7 | 181 | + application/octet-stream |
Index: trunk/otrs/var/httpd/htdocs/images/Standard/searchX.gif |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/otrs/var/httpd/htdocs/images/Standard/searchX.gif |
___________________________________________________________________ |
Added: svn:mime-type |
8 | 182 | + application/octet-stream |
Index: trunk/otrs/var/httpd/htdocs/images/Standard/user.gif |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/otrs/var/httpd/htdocs/images/Standard/user.gif |
___________________________________________________________________ |
Added: svn:mime-type |
9 | 183 | + application/octet-stream |
Index: trunk/otrs/var/httpd/htdocs/120px-Wikimedia_logo_text_RGB.svg.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: trunk/otrs/var/httpd/htdocs/120px-Wikimedia_logo_text_RGB.svg.png |
___________________________________________________________________ |
Added: svn:mime-type |
10 | 184 | + image/png |
Index: trunk/otrs/README.wikimedia |
— | — | @@ -0,0 +1,47 @@ |
| 2 | +Patches against OTRS 2.4 CVS can be found in the patches directory, these can |
| 3 | +be applied using quilt push -a. Since quilt does not support binary files, the |
| 4 | +images are distributed separately in the var directory. |
| 5 | + |
| 6 | +10-tooltips.patch |
| 7 | +----------------- |
| 8 | +Adds Walter Zorn's tooltip library, which is required by 30-wm-brand and |
| 9 | +40-user-tooltips. |
| 10 | + |
| 11 | +20-ticket-number-search.patch |
| 12 | +----------------------------- |
| 13 | +Adds a button which uses JavaScript to search for a given ticket number and |
| 14 | +jump directly to the zoom page. |
| 15 | + |
| 16 | +Needs searchX.gif. |
| 17 | + |
| 18 | +30-wm-brand.patch |
| 19 | +----------------- |
| 20 | +Adds Wikimedia-specific logos, links and layout. |
| 21 | + |
| 22 | +Needs 120px-Wikimedia_logo_text_RGB.svg.png, |
| 23 | +22px-Wikimedia_Community_Logo.svg.png, 22px-Wikimedia-logo.svg.png |
| 24 | + |
| 25 | +40-user-tooltips.patch |
| 26 | +---------------------- |
| 27 | +Adds tooltips in the online agent list, showing more information about each |
| 28 | +agent. |
| 29 | + |
| 30 | +Needs clock.gif, user.gif. |
| 31 | + |
| 32 | +Upstream may be interested. |
| 33 | + |
| 34 | +50-one-click-spam.patch |
| 35 | +----------------------- |
| 36 | +Adds a button to the "large" queue view that, when clicked, moves the given |
| 37 | +ticket to the spam queue, using XHR. |
| 38 | + |
| 39 | +Needs edittrash.png, notready.png, ready.png. |
| 40 | + |
| 41 | +Upstream may be interested if the patch was improved a bit. |
| 42 | + |
| 43 | +60-really-secure-mode.patch |
| 44 | +--------------------------- |
| 45 | +Modifies the definition of the SecureMode configuration variable, causing it to |
| 46 | +eliminate escalation from web admins to arbitrary shell execution. Has been |
| 47 | +submitted upstream. |
| 48 | + |
Property changes on: trunk/otrs/README.wikimedia |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 49 | + native |