This commit was generated by cvs2svn to compensate for changes in r2155,
which included commits to RCS files with non-trunk default branches.
This commit is contained in:
parent
72d15e11ab
commit
4a7616d5a0
51 changed files with 1885 additions and 0 deletions
17
Global/api.skin
Normal file
17
Global/api.skin
Normal file
|
@ -0,0 +1,17 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
|
||||
<HTML>
|
||||
<% skin name="head" %>
|
||||
<body>
|
||||
|
||||
<table width="90%" border="0" cellspacing="1" cellpadding="5" bgcolor="#000000">
|
||||
<tr>
|
||||
<td width="200" nowrap align="left" valign="top" bgcolor="#cccc99">
|
||||
<p><a href="<% root.href action="main" %>"><img src="<% root.href action="image" %>" title="helma" border="0" width="174" height="35" align="baseline" style="border-width:3px;border-color:white;"></a></p>
|
||||
<% docapplication.skin name="navig" %></td>
|
||||
<td align="left" valign="top" bgcolor="#ffffff"><% response.body %></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
155
Global/functions.js
Normal file
155
Global/functions.js
Normal file
|
@ -0,0 +1,155 @@
|
|||
|
||||
|
||||
/**
|
||||
* scheduler function, runs global.appStat every minute
|
||||
*/
|
||||
function scheduler() {
|
||||
appStat();
|
||||
return 60000;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* initializes requestStat storage on startup
|
||||
*/
|
||||
function onStart() {
|
||||
app.requestStat = new HopObject();
|
||||
app.addressFilter = new Packages.helma.util.InetAddressFilter();
|
||||
var str = root.getProperty("allowadmin");
|
||||
if ( str!=null && str!="" ) {
|
||||
var arr = str.split(",");
|
||||
for ( var i in arr ) {
|
||||
var str = new java.lang.String(arr[i]);
|
||||
app.addressFilter.addAddress(str.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* updates the request stats in app.requestStat every 5 minutes
|
||||
*/
|
||||
function appStat() {
|
||||
if ( app.requestStat==null ) {
|
||||
app.requestStat = new HopObject();
|
||||
}
|
||||
if( (new Date()-300000) < app.requestStat.lastRun ) {
|
||||
return;
|
||||
}
|
||||
var arr = root.getApplications();
|
||||
for ( var i=0; i<arr.length; i++ ) {
|
||||
var tmp = app.requestStat.get(arr[i].getName());
|
||||
if ( tmp==null ) {
|
||||
tmp = new HopObject();
|
||||
tmp.lastTotal = 0;
|
||||
tmp.last5Min = 0;
|
||||
}
|
||||
var ct = arr[i].getRequestCount();
|
||||
tmp.last5Min = ct - tmp.lastTotal;
|
||||
tmp.lastTotal = ct;
|
||||
app.requestStat.set(arr[i].getName(), tmp);
|
||||
}
|
||||
app.requestStat.lastRun = new Date();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* utility function to sort object-arrays by name
|
||||
*/
|
||||
function sortByName(a,b) {
|
||||
if ( a.name>b.name )
|
||||
return 1;
|
||||
else if ( a.name==b.name )
|
||||
return 0;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* utility function to sort property-arrays by key
|
||||
*/
|
||||
function sortProps(a,b) {
|
||||
if ( a>b )
|
||||
return 1;
|
||||
else if ( a==b )
|
||||
return 0;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* check access to an application or the whole server, authenticate against md5-encrypted
|
||||
* properties of base-app or the particular application. if username or password aren't set
|
||||
* go into stealth-mode and return a 404. if username|password are wrong, prepare response-
|
||||
* object for http-auth and return false.
|
||||
* @arg application-object
|
||||
*/
|
||||
function checkAuth(appObj) {
|
||||
var ok = false;
|
||||
|
||||
// check against root
|
||||
var rootUsername = root.getProperty("adminusername");
|
||||
var rootPassword = root.getProperty("adminpassword");
|
||||
|
||||
if ( rootUsername==null || rootUsername=="" || rootPassword==null || rootPassword=="" )
|
||||
return forceStealth();
|
||||
|
||||
var uname = req.getUsername();
|
||||
var pwd = req.getPassword();
|
||||
|
||||
if ( uname==null || uname=="" || pwd==null || pwd=="" )
|
||||
return forceAuth();
|
||||
|
||||
var md5password = calcMD5(uname);
|
||||
var md5username = calcMD5(pwd);
|
||||
|
||||
if ( md5username==rootUsername && md5password==rootPassword )
|
||||
return true;
|
||||
|
||||
if ( appObj!=null && appObj.isActive() ) {
|
||||
// check against application
|
||||
var appUsername = appObj.getProperty("adminusername");
|
||||
var appPassword = appObj.getProperty("adminpassword");
|
||||
if ( appUsername==null || appUsername=="" || appPassword==null || appPassword=="" )
|
||||
return forceStealth();
|
||||
if ( md5username==appUsername && md5password==appPassword )
|
||||
return true;
|
||||
}
|
||||
return forceAuth();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* check access to the base-app by ip-addresses
|
||||
*/
|
||||
function checkAddress() {
|
||||
if ( !app.addressFilter.matches(java.net.InetAddress.getByName(req.data.http_remotehost)) )
|
||||
return forceStealth();
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* response is reset to 401 / authorization required
|
||||
*/
|
||||
function forceAuth(appObj) {
|
||||
res.status = 401;
|
||||
res.realm = (appObj==null) ? "helma" : appObj.name;
|
||||
res.reset();
|
||||
res.write ("Authorization Required. The server could not verify that you are authorized to access the requested page.");
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* response is reset to 404 / notfound
|
||||
*/
|
||||
function forceStealth() {
|
||||
res.reset();
|
||||
res.status = 404;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
14
Global/global.skin
Normal file
14
Global/global.skin
Normal file
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html>
|
||||
<% skin name="head" %>
|
||||
<body bgcolor="white">
|
||||
|
||||
<table width="90%" border="0" cellspacing="1" cellpadding="5" bgcolor="#000000">
|
||||
<tr>
|
||||
<td width="30%" align="left" valign="top" bgcolor="#cccc99"><% skin name="navig" %></td>
|
||||
<td width="70%" align="left" valign="top" bgcolor="#ffffff"><% response.body %></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
</html>
|
53
Global/head.skin
Normal file
53
Global/head.skin
Normal file
|
@ -0,0 +1,53 @@
|
|||
<head>
|
||||
<title><% response.title %></title>
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body, p, td, th, li {
|
||||
font-family: verdana, sans-serif;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
.list_apps {
|
||||
border-color:#ffffff;
|
||||
padding-top:5px;
|
||||
padding-bottom:5px;
|
||||
border-bottom-width:1px;
|
||||
border-bottom-style:dotted;
|
||||
}
|
||||
|
||||
.list_property {
|
||||
border-color:#999999;
|
||||
padding-top:5px;
|
||||
padding-bottom:5px;
|
||||
border-bottom-width:1px;
|
||||
border-bottom-style:dotted;
|
||||
}
|
||||
|
||||
.list_separator {
|
||||
font-weight:bold;
|
||||
background:#dfdfdf;
|
||||
border-color:#999999;
|
||||
padding-top:5px;
|
||||
padding-bottom:5px;
|
||||
border-bottom-width:1px;
|
||||
border-bottom-style:dotted;
|
||||
}
|
||||
|
||||
big {
|
||||
font-size: 18pt;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a {
|
||||
font-weight:bold;
|
||||
color: #cc3333;
|
||||
text-decoration:none;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration:underline;
|
||||
}
|
||||
|
||||
// -->
|
||||
</style>
|
||||
</head>
|
97
Global/macros.js
Normal file
97
Global/macros.js
Normal file
|
@ -0,0 +1,97 @@
|
|||
/**
|
||||
* macro rendering a skin
|
||||
* @param name name of skin
|
||||
*/
|
||||
function skin_macro(par) {
|
||||
if ( par && par.name ) {
|
||||
renderSkin(par.name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Macro returning the actual date and time.
|
||||
*/
|
||||
function now_macro() {
|
||||
var date = new Date();
|
||||
return(date.format("dd.MM.yyyy, HH:mm'h' zzz"));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* macro-utility: formatting property lists
|
||||
*/
|
||||
function formatProperties(props,par) {
|
||||
var prefix = (par && par.prefix) ? par.prefix : "";
|
||||
var suffix = (par && par.suffix) ? par.suffix : "";
|
||||
var separator = (par && par.separator) ? par.separator : "";
|
||||
var e = props.keys();
|
||||
var arr = new Array();
|
||||
if ( e==null )
|
||||
return "";
|
||||
while ( e.hasMoreElements() ) {
|
||||
arr[arr.length] = e.nextElement();
|
||||
}
|
||||
arr.sort(sortProps);
|
||||
for ( var i in arr ) {
|
||||
// don't print the admin-password
|
||||
if ( arr[i].toLowerCase()=="adminusername" || arr[i].toLowerCase()=="adminpassword" ) continue;
|
||||
res.write ( prefix + arr[i] + separator + props.getProperty(arr[i]) + suffix );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* macro-utility: formatting an integer value as human readable bytes
|
||||
*/
|
||||
function formatBytes(bytes) {
|
||||
if ( bytes > Math.pow(2,30) ) {
|
||||
res.write( Math.round( 100*bytes/Math.pow(2,30) ) / 100 + "gb" );
|
||||
} else if ( bytes > Math.pow(2,20) ) {
|
||||
res.write( Math.round( 100*bytes/Math.pow(2,20) ) / 100 + "mb" );
|
||||
} else {
|
||||
res.write( Math.round( 100*bytes/Math.pow(2,10) ) / 100 + "kb" );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* macro-utility: formatting time in millis as human readable age
|
||||
*/
|
||||
function formatAge(age) {
|
||||
var str = "";
|
||||
var days = Math.floor(age/86400);
|
||||
var age = age - days * 86400;
|
||||
var hours = Math.floor(age / 3600);
|
||||
var age = age - hours * 3600;
|
||||
var minutes = Math.floor(age / 60);
|
||||
var seconds = Math.floor(age - minutes * 60);
|
||||
if (days > 0)
|
||||
str += (days + " days, ");
|
||||
if (hours>0)
|
||||
str += (hours + "h, ");
|
||||
str += (minutes + "min");
|
||||
if (days == 0) str += (", " + seconds + "sec");
|
||||
return(str);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* macro-utility: formatting a number-suffix by choosing between singular and plural
|
||||
* @arg value number to be formatted
|
||||
* @arg param-object object to get fields
|
||||
* @param singular string used for value==1
|
||||
* @param plural string used for value!=1
|
||||
*/
|
||||
function formatCount(ct, par) {
|
||||
if ( !par || !par.singular || !par.plural ) {
|
||||
return "";
|
||||
}
|
||||
if ( ct==1 )
|
||||
return par.singular;
|
||||
else
|
||||
return par.plural;
|
||||
}
|
||||
|
||||
|
||||
|
178
Global/md5.js
Normal file
178
Global/md5.js
Normal file
|
@ -0,0 +1,178 @@
|
|||
/*
|
||||
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
|
||||
* Digest Algorithm, as defined in RFC 1321.
|
||||
* Copyright (C) Paul Johnston 1999 - 2000.
|
||||
* Updated by Greg Holt 2000 - 2001.
|
||||
* See http://pajhome.org.uk/site/legal.html for details.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Take a string and return the hex representation of its MD5.
|
||||
* @arg string
|
||||
*/
|
||||
function calcMD5(str)
|
||||
{
|
||||
x = str2blks_MD5(str);
|
||||
a = 1732584193;
|
||||
b = -271733879;
|
||||
c = -1732584194;
|
||||
d = 271733878;
|
||||
|
||||
for(i = 0; i < x.length; i += 16)
|
||||
{
|
||||
olda = a;
|
||||
oldb = b;
|
||||
oldc = c;
|
||||
oldd = d;
|
||||
|
||||
a = ff(a, b, c, d, x[i+ 0], 7 , -680876936);
|
||||
d = ff(d, a, b, c, x[i+ 1], 12, -389564586);
|
||||
c = ff(c, d, a, b, x[i+ 2], 17, 606105819);
|
||||
b = ff(b, c, d, a, x[i+ 3], 22, -1044525330);
|
||||
a = ff(a, b, c, d, x[i+ 4], 7 , -176418897);
|
||||
d = ff(d, a, b, c, x[i+ 5], 12, 1200080426);
|
||||
c = ff(c, d, a, b, x[i+ 6], 17, -1473231341);
|
||||
b = ff(b, c, d, a, x[i+ 7], 22, -45705983);
|
||||
a = ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
|
||||
d = ff(d, a, b, c, x[i+ 9], 12, -1958414417);
|
||||
c = ff(c, d, a, b, x[i+10], 17, -42063);
|
||||
b = ff(b, c, d, a, x[i+11], 22, -1990404162);
|
||||
a = ff(a, b, c, d, x[i+12], 7 , 1804603682);
|
||||
d = ff(d, a, b, c, x[i+13], 12, -40341101);
|
||||
c = ff(c, d, a, b, x[i+14], 17, -1502002290);
|
||||
b = ff(b, c, d, a, x[i+15], 22, 1236535329);
|
||||
|
||||
a = gg(a, b, c, d, x[i+ 1], 5 , -165796510);
|
||||
d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
|
||||
c = gg(c, d, a, b, x[i+11], 14, 643717713);
|
||||
b = gg(b, c, d, a, x[i+ 0], 20, -373897302);
|
||||
a = gg(a, b, c, d, x[i+ 5], 5 , -701558691);
|
||||
d = gg(d, a, b, c, x[i+10], 9 , 38016083);
|
||||
c = gg(c, d, a, b, x[i+15], 14, -660478335);
|
||||
b = gg(b, c, d, a, x[i+ 4], 20, -405537848);
|
||||
a = gg(a, b, c, d, x[i+ 9], 5 , 568446438);
|
||||
d = gg(d, a, b, c, x[i+14], 9 , -1019803690);
|
||||
c = gg(c, d, a, b, x[i+ 3], 14, -187363961);
|
||||
b = gg(b, c, d, a, x[i+ 8], 20, 1163531501);
|
||||
a = gg(a, b, c, d, x[i+13], 5 , -1444681467);
|
||||
d = gg(d, a, b, c, x[i+ 2], 9 , -51403784);
|
||||
c = gg(c, d, a, b, x[i+ 7], 14, 1735328473);
|
||||
b = gg(b, c, d, a, x[i+12], 20, -1926607734);
|
||||
|
||||
a = hh(a, b, c, d, x[i+ 5], 4 , -378558);
|
||||
d = hh(d, a, b, c, x[i+ 8], 11, -2022574463);
|
||||
c = hh(c, d, a, b, x[i+11], 16, 1839030562);
|
||||
b = hh(b, c, d, a, x[i+14], 23, -35309556);
|
||||
a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
|
||||
d = hh(d, a, b, c, x[i+ 4], 11, 1272893353);
|
||||
c = hh(c, d, a, b, x[i+ 7], 16, -155497632);
|
||||
b = hh(b, c, d, a, x[i+10], 23, -1094730640);
|
||||
a = hh(a, b, c, d, x[i+13], 4 , 681279174);
|
||||
d = hh(d, a, b, c, x[i+ 0], 11, -358537222);
|
||||
c = hh(c, d, a, b, x[i+ 3], 16, -722521979);
|
||||
b = hh(b, c, d, a, x[i+ 6], 23, 76029189);
|
||||
a = hh(a, b, c, d, x[i+ 9], 4 , -640364487);
|
||||
d = hh(d, a, b, c, x[i+12], 11, -421815835);
|
||||
c = hh(c, d, a, b, x[i+15], 16, 530742520);
|
||||
b = hh(b, c, d, a, x[i+ 2], 23, -995338651);
|
||||
|
||||
a = ii(a, b, c, d, x[i+ 0], 6 , -198630844);
|
||||
d = ii(d, a, b, c, x[i+ 7], 10, 1126891415);
|
||||
c = ii(c, d, a, b, x[i+14], 15, -1416354905);
|
||||
b = ii(b, c, d, a, x[i+ 5], 21, -57434055);
|
||||
a = ii(a, b, c, d, x[i+12], 6 , 1700485571);
|
||||
d = ii(d, a, b, c, x[i+ 3], 10, -1894986606);
|
||||
c = ii(c, d, a, b, x[i+10], 15, -1051523);
|
||||
b = ii(b, c, d, a, x[i+ 1], 21, -2054922799);
|
||||
a = ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
|
||||
d = ii(d, a, b, c, x[i+15], 10, -30611744);
|
||||
c = ii(c, d, a, b, x[i+ 6], 15, -1560198380);
|
||||
b = ii(b, c, d, a, x[i+13], 21, 1309151649);
|
||||
a = ii(a, b, c, d, x[i+ 4], 6 , -145523070);
|
||||
d = ii(d, a, b, c, x[i+11], 10, -1120210379);
|
||||
c = ii(c, d, a, b, x[i+ 2], 15, 718787259);
|
||||
b = ii(b, c, d, a, x[i+ 9], 21, -343485551);
|
||||
|
||||
a = add(a, olda);
|
||||
b = add(b, oldb);
|
||||
c = add(c, oldc);
|
||||
d = add(d, oldd);
|
||||
}
|
||||
return rhex(a) + rhex(b) + rhex(c) + rhex(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Convert a 32-bit number to a hex string with ls-byte first
|
||||
*/
|
||||
var hex_chr = "0123456789abcdef";
|
||||
function rhex(num)
|
||||
{
|
||||
str = "";
|
||||
for(j = 0; j <= 3; j++)
|
||||
str += hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) +
|
||||
hex_chr.charAt((num >> (j * 8)) & 0x0F);
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a string to a sequence of 16-word blocks, stored as an array.
|
||||
* Append padding bits and the length, as described in the MD5 standard.
|
||||
*/
|
||||
function str2blks_MD5(str)
|
||||
{
|
||||
nblk = ((str.length + 8) >> 6) + 1;
|
||||
blks = new Array(nblk * 16);
|
||||
for(i = 0; i < nblk * 16; i++) blks[i] = 0;
|
||||
for(i = 0; i < str.length; i++)
|
||||
blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * 8);
|
||||
blks[i >> 2] |= 0x80 << ((i % 4) * 8);
|
||||
blks[nblk * 16 - 2] = str.length * 8;
|
||||
return blks;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
|
||||
* to work around bugs in some JS interpreters.
|
||||
*/
|
||||
function add(x, y)
|
||||
{
|
||||
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
||||
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
||||
return (msw << 16) | (lsw & 0xFFFF);
|
||||
}
|
||||
|
||||
/*
|
||||
* Bitwise rotate a 32-bit number to the left
|
||||
*/
|
||||
function rol(num, cnt)
|
||||
{
|
||||
return (num << cnt) | (num >>> (32 - cnt));
|
||||
}
|
||||
|
||||
/*
|
||||
* These functions implement the basic operation for each round of the
|
||||
* algorithm.
|
||||
*/
|
||||
function cmn(q, a, b, x, s, t)
|
||||
{
|
||||
return add(rol(add(add(a, q), add(x, t)), s), b);
|
||||
}
|
||||
function ff(a, b, c, d, x, s, t)
|
||||
{
|
||||
return cmn((b & c) | ((~b) & d), a, b, x, s, t);
|
||||
}
|
||||
function gg(a, b, c, d, x, s, t)
|
||||
{
|
||||
return cmn((b & d) | (c & (~d)), a, b, x, s, t);
|
||||
}
|
||||
function hh(a, b, c, d, x, s, t)
|
||||
{
|
||||
return cmn(b ^ c ^ d, a, b, x, s, t);
|
||||
}
|
||||
function ii(a, b, c, d, x, s, t)
|
||||
{
|
||||
return cmn(c ^ (b | (~d)), a, b, x, s, t);
|
||||
}
|
17
Global/navig.skin
Normal file
17
Global/navig.skin
Normal file
|
@ -0,0 +1,17 @@
|
|||
<p><a href="<% root.href action="main" %>"><img src="<% root.href action="image" %>" title="helma" border="0" width="174" height="35" align="baseline" style="border-width:3px;border-color:white;"></a></p>
|
||||
<!--<p>at <b><a href="<% root.href action="main" %>?action=server"><% root.hostname %></a></b></p>-->
|
||||
|
||||
<div class="list_apps">
|
||||
<i><% root.appCount filter="active" singular=" app" plural=" apps"%> on <% root.hostname %></i>
|
||||
</div>
|
||||
|
||||
<% root.appList filter="active" %>
|
||||
|
||||
<p></p>
|
||||
|
||||
<div class="list_apps">
|
||||
<i>and <% root.appCount filter="disabled" %> disabled apps:</i>
|
||||
</div>
|
||||
|
||||
<% root.appList filter="disabled" skin="navig_disabled" %>
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue