
This document details the complete changes from v3.00 onwards.
See the CHANGES files in the DiCoP-Server package for the full version history.
deamon: ignore requests for favicon.ico
wcr lib: Total: lines 8711, words 30863, chars 221535
1499 tests ()
add report_leak hooks into main accept loop and Handler.pm
wcr lib: Total: lines 8697, words 30818, chars 221212
1499 tests ()
Hash: reset error upon read() to force rehash
wcr lib: Total: lines 8665, words 30757, chars 220394
1496 tests (hash)
Cache: get_oldest(), statistics()
Base doesn't need data/
Request: correctly use cache with limit
Cache.pm: croak on unknown options (prevent mispelings)
touching the oldest item is O(N) (instead of O(N*log N))
touching a random item is O(1) (instead of O(N*log N))
finding oldest element is O(N) instead of O(N*logN)
fix bug with misspeling of internal keys
convert t/cachepm.t and t/eventpm.t to Test::More
wcr lib: Total: lines 8662, words 30738, chars 220245
1494 tests (cache)
Request: allow req's to override sort order, type (cmp, <=> and dir)
Handler: implement sorting on arbitrary fields in both directions, and
on numerical/string values in _sort_order()
handle ##selfreq## in templates
Handler: name_from_type() handle inputs like 'jobtypes' (already 's')
Handler: _gen_table(): handle a filter argument to filter things
wcr lib: Total: lines 8553, words 30371, chars 217744
1493 tests (name_from_type, sort oder)
Handler: add _flush_data(), _construct_file_names()
Handler: use generic storage access
wcr lib: Total: lines 8477, words 30066, chars 215534
1487 tests ()
retract change to check_peer() (caller should prepend 'req0000 ')
wcr lib: Total: lines 8437, words 29920, chars 214430
1487 tests ()
Handler: msg 457 generated by check_peer() was missing a 'req0000 '
Handler: document check_peer()
wcr lib: Total: lines 8437, words 29923, chars 214443
1487 tests ()
use POSIX (); vs use POSIX; to save memory (a few hundred KB)
wcr lib: Total: lines 8430, words 29896, chars 214254
1487 tests ()
Base: check_templates()
PREREQ in Makefile.PL
wcr lib: Total: lines 8430, words 29887, chars 214209
1487 tests ()
Template: parameter 'virtual' for fields
Item: newly created items get the current time as '_modified'
Item: use Carp when complaining about accessing non-existing keys
Template: warn about illegal characters in field names
Template: avoid double double keys in _known_fields
Template: fields(): do not return fields marked as virtual
wcr lib: Total: lines 8402, words 29787, chars 213436
1486 tests (Item->{_modified}, fields())
Template: parameter 'sort' for fields with "valid" lists
wcr lib: Total: lines 8357, words 29568, chars 212010
1482 tests ()
Base: _connect_server() - send URL or PARAMS to remote server
Base: _load_connector() - load wget or libwww and create user-agent
wcr lib: Total: lines 8357, words 29568, chars 212010
1482 tests (_connect_server)
clear last_error before handling a request
Item.pm: streamline: call _get_template() directly
wcr lib: Total: lines 8162, words 28915, chars 206866
1480 tests ()
always display short name in file/dir selectors (sigh)
amended TODO
wcr lib: Total: lines 8164, words 28921, chars 206860
1480 tests ()
Request: as_request_string() preserves empty params
raise max-request-length limit from 64 to 128 Kbyte
wcr lib: Total: lines 8164, words 28921, chars 206861
1480 tests (fix tests for empty params in Requests)
Template: fields_of_type()
fix: refresh and cancel buttons on dir/file selector pages
display short names in dir/file selector
_include_form: properly handle bool fields
wcr lib: Total: lines 8164, words 28919, chars 206853
1478 tests ()
Item: put() calls _check_field()
Template: normalize 'bool' fields to be 'on' or ''
get_as_string: return bool fields as "No"/"ς" (looks like "V")
wcr lib: Total: lines 8131, words 28799, chars 206030
1475 tests ()
Base: fix error output in case of missing Linux::Cpuinfo.pm
add use bytes; for a2h(), h2a() and decode()/encode()
Hash: return proper error if hash is empty (should not happend though)
wcr lib: Total: lines 8121, words 28749, chars 205735
1475 tests ()
support for layouts (extra plus style)
encode/decode 'path' in dir/file form (fix bug that '_' in filenames
was not possible)
wcr lib: Total: lines 8111, words 28722, chars 205506
1473 tests ()
Template: fix '"" is not numeric' in line 175
extract user_agent from headers and set it to be used later
wcr lib: Total: lines 8054, words 28503, chars 203725
1473 tests ()
keys 'description', 'addoption', 'editoption' to Template system
Base: undef warning in line 279 (undef values)
wcr lib: Total: lines 8053, words 28494, chars 203653
1473 tests (description, addoption, editoption)
small cleanups
wcr lib: Total: lines 8016, words 28323, chars 202565
1465 tests ()
support editindend and addindend in forms
Handler: _format_string(): embed object fields into a format template
Base: allow empty params in parseFormArgs() to make changing fields to
the empty string possible
Handler: buglet in _gen_table that barfed on '<td align="right">' when
inserting class
removed unused second param from _option_list()
Handler: _option_list() now supports option w/o name= (HTML compliant)
wcr lib: Total: lines 8020, words 28340, chars 202830
1465 tests (test for make_config(), editindend, addindend, _option_list,empty params)
pass argument "proto" to Net::Server, too
wcr lib: Total: lines 7880, words 27837, chars 199029
1450 tests ()
Handler: ##type## => ##servertype##
Handler: replace request param templates in html-table output, too
wcr lib: Total: lines 7879, words 27822, chars 198933
1450 tests ()
Handler: request_file(): handle case that client came via proxy
fix in cpuinfo regexp
wcr lib: Total: lines 7877, words 27816, chars 198878
1450 tests ()
handle "for_req0001,req0002" in info requests
workaround Linux::Cpuinfo clobbering up $/
fallback in status: handle undefined request type
wcr lib: Total: lines 7873, words 27798, chars 198708
1450 tests ()
Hash: compare() - compare two hashes
Hash: Hash contents of a scalar when given a reference
Template: check fields of type IP/MASK being valid and set error()
Handler: check_peer() - check IP adress of connection client
Security: undef warning in _ip2hex()
wcr lib: Total: lines 7868, words 27758, chars 198495
1450 tests (Hash, check IP)
Securtiy: ip_matches() - match IP and subnet mask against a check IP
check file locations in request_file() only if no_file_check is undef
converted t/security.t to Test::More
only use auth as info if info was not already set
speling and. gramar fixes. Amended TODO
wcr lib: Total: lines 7829, words 27666, chars 197790
1435 tests (ip_matches)
authenticate_user() and request_auth() from Data
authenticate_user() uses generic access to userlist
in case auth request was send in, use that as $info (help proxy)
wcr lib: Total: lines 7781, words 27463, chars 196551
1414 tests ()
better error message in case of non-existant user
require auth request only for requests that have auth=1 instead of
matching /^(form|status)$/ - that fixes cmd_help requests
parameter handling for finish_connect()
wcr lib: Total: lines 7641, words 26734, chars 191501
1414 tests ()
Base: cpuinfo() (needed by Client and Proxy)
Handler: request_file() (needed by Proxy and Server)
preload http/ftp protocols in LWP for chroot environments
wcr lib: Total: lines 7586, words 26456, chars 189442
1414 tests ()
Config: allowed_keys with undef entries warn with msg 802 (obsolete)
track time for all connects, average connect time and time of last connect
support default_style from config
change trclass replacement to set class for <td>, not <tr> (<tr> seems not
to overwrite the color of <td> :-/
wcr lib: Total: lines 7521, words 26246, chars 187874
1414 tests ()
Handler: pre_connect(), status_config()
Config: add check() etc
converted t/config.t to Test::More
init some fields (last_flush, flush_time, self etc) in _init()
better die() message when message file cannot be loaded
Handler: finish_request() => finish_connect()
show only name of directory, not complete path, when browsing directories
wcr lib: Total: lines 7445, words 25955, chars 185635
1407 tests (init fields)
Template: support for min/max
wcr lib: Total: lines 7315, words 25494, chars 182227
1401 tests (min/max tests)
_option_list(): support multiple filter words as in 'type=foo,bar'
Handler: _option_list(): replace templates with lists (necc. for add/edit
forms of charsets)
Template: valid => 'method_name' support
Template: support for 'selector' property of fields
Template: support for insert()
Handler: name_from_type() to turn 'proxy' into 'proxies'
Item: require Template instead of use, lazy load
wcr lib: Total: lines 7280, words 25260, chars 180834
1396 tests ()
Pattern.pm: doc about all the possible pattern fields
Template: a bit more doc plus an example
Template: property "filter"
Handler: filter option lists according to template "filter"
support for bitmasks (editfield_check.inc)
default value '0' possible in forms (got changed to '')
shut down a unitialized warning in File::Spec in testsuite
allow comments inside multi-line text definition blocks, too
allow '\\', '[' and ']' in text definitions
wcr lib: Total: lines 7111, words 24528, chars 175887
1396 tests (changeable fields are noadd => 1)
property 'changable' to Template - fields that are changable, but
are not automatically put on edit forms
discard auth info when special submit buttons are pressed (for
'Browse', 'Refresh' etc)
Base: encode() also encode \r
wcr lib: Total: lines 6874, words 23480, chars 169635
1394 tests (changeable fields)
Item, Template: support type 'list'
Template: doc about valid keys
Pattern: sort_order(), default values for 'sort' and 'sort_by'
support for 'Refresh' button in generated forms
support "submit_cmd_form;type_foo=>" (empty params) in button names
allow listing ".files" in dir listings (that needs to be an option)
Pattern: support "carry"
special casing for /extra\d/ keys in get_as_string
Input field names in generated forms have ' ' instead of ' '
Template: allow only known key names (guard against typos)
croak() at errors evaling templates/definitions
wcr lib: Total: lines 6832, words 23294, chars 168408
1392 tests (type 'list', 'refresh' in templates, submit buttons)
Item: handle fields of type 'time' in get_as_string()
Template.pm: document valid properties for fields
param $no_error to construct-chain (Item, Template)
amended INSTALL, README, BUGS
require Perl v5.8.1 - not v5.8.3
wcr lib: Total: lines 6645, words 22683, chars 164094
1384 tests (get_as_string)
Template: _construct_field(): construct objects from lass names
_include_form(): ##safevalue##, ##cmd##, ##id## and ##formname##
Handler: move code to split submit name to _convert_submit_button()
better output on fatal errors inside the status handler
title to dirs/files in listing table
get_as_string() does the right thing for fields of type foo_id
check for invalid browse dir/paths
make files or dirs selectable in filelist, depending on type_(file|dir)
dir/file listing works now when used from inside edit/add forms
allow key 'editlen' for template fields
wcr lib: Total: lines 6539, words 22195, chars 161339
1383 tests (_convert_submit_button())
Item.pm: _construct() does construct foo_id object ref from ID
Item.pm: parent()
warn upon empty filenames when reading templates
Request.pm and Pattern.pm: template() => template_name() to not
interfere with template() from Item.pm
Item.pm: simplified logic to get template
_get_templates() => _get_template()
wcr lib: Total: lines 6431, words 21653, chars 157473
1375 tests ()
gen_table: use $item->fields(), not $item->keys()
_include_form() and status(): use get_object($req) instead of get_foo()
t/basics.t and t/daemon.t
wcr lib: Total: lines 6394, words 21537, chars 156628
1373 tests ()
t/basics.t and t/mailpmt.
converted t/daemon.t to Test::More
split lib/daemon into lib/basics and lib/daemon to avoid Client
having to load Net::Server
move mail-sending code to Dicop::Mail so that Client doesn't
need to depend on Mail::Sendmail just because it uses Dicop::Handler
Linux::Cpuinfo not needed in PREREQ
Handler.pm: remove needless "use Cwd;"
wgte.pm: use Dicop::Base::read_file, not Dicop
Base: write_file() generate path unless it already exists
wcr lib: Total: lines 6369, words 21439, chars 155992
1373 tests (fields())
support for ##FOO_list## in requests without an ID
Item: fields()
Template: fields(), {fake_keys} support
print out used config file to STDERR upon start
guard against wrong ##FOO_list## in templates
drop support for BGCOLOR in template replacements
Base: replace_templates(): use $item->fields() if passed an object
adjust PREREQUISITES in Makefile.PL: BigInt v1.71, no Wordlist
wcr lib: Total: lines 6262, words 21099, chars 153355
1380 tests (fields())
replace ##foo_list## by $self->foo_list($item) in status pages
sort objects in option list by numerical ID
support for ##checkedvalue## in edit field templates for checkboxes
wcr lib: Total: lines 6176, words 20770, chars 150984
1374 tests ()
make Dicop::Item::template() work with classname as argument
README.win32
Handler: class_from_type()
include_edit_form() can handle ##add-object-fields## properly
Template: check for valid known good field params (editable etc)
Template: description(), help()
added keys 'noadd', 'name' to Template
object lists in include_form now have "name (description)" if possible
Item: error() sets {_error} from given param if neccessary
fixed shared ID space for subclasses in Item.pm
Makefile.PL: delete unnecc. "tests => ..." line (fix for win32)
wcr lib: Total: lines 6173, words 20747, chars 150777
1374 tests (shared ID space, tests for add-object-fields, Template)
Item: _from_string_form() - construct Math::String from string
in case of error requests, don't try to auth client
Handler: guard against illegal objects in _include_form()
Handler: _include_form(): use get_as_string() instead of get()
Hash.pm: support error(), return error in as_hex()
wcr lib: Total: lines 6031, words 20270, chars 147246
1351 tests ()
Handler: renamed _include_edit_form() => _include_form()
_include_form() also handle ##add-object-fields##
read_table_template(): accept also templates w/o TR or TD
include_edit_fields(): sort edit fields by editrank and then by name
generate options list form list of valid values
##fieldname## was empty
wcr lib: Total: lines 5954, words 19978, chars 145137
1348 tests (read_table_template())
Handler: AUTOLOAD() from Dicop-Server's Data.pm
Handler: get_id_list()
Template.pm: field()
Handler: split read_template() into find_template() and _read_template()
include fields from tpl/ into edit form, fall back to string
wcr lib: Total: lines 5887, words 19696, chars 143273
1346 tests (fields())
Handler: status() include item's fields, too
default HTML title is 'Dicop - '
detaint the strings in from_string() for eval
wcr lib: Total: lines 5725, words 19158, chars 139474
1342 tests (taint test)
Handler: _include_edit_form() - generate list of form fields to edit
Item: template()
wcr lib: Total: lines 5712, words 19106, chars 139132
1335 tests ()
Handler: flush(): call _flush_data()
wcr lib: Total: lines 5636, words 18863, chars 137237
1333 tests ()
Handler: call _replace_mail_templates() from email()
Handler: replace ##time## in mailtemplate with readable time instead timestamp
wcr lib: Total: lines 5628, words 18845, chars 137100
1333 tests ()
Template: fix check for ip/mask types in check_field()
wcr lib: Total: lines 5622, words 18834, chars 137002
1333 tests ()
Template: implement checks in check_field() (maxlen, filter some)
wcr lib: Total: lines 5622, words 18834, chars 137001
1327 tests ()
Template: check_field() and construct_field() stubs
Item: the error is stored in {_error}, not {error}!
remove unnecc. key _error init in Template.pm
Item: can read in string form with '=>' instead of '='
can read in string form with ' { ... multilinecode ... }
more doc in Item.pm
Handler.pm: instances of {error} vs. {_error}
wcr lib: Total: lines 5549, words 18594, chars 135344
1324 tests ()
use Template (if it exists) to init object fields and to check
for can_change($field)
sample entry in t/def/objects.def
Dicop::Data::Template
Item.pm: _load_templates()
parse "fieldname => ..." in objects def as "eval($val)"
wcr lib: Total: lines 5507, words 18469, chars 134435
1318 tests (itempm.t: template tests, t/template.t)
Handler: _load_object_definitions()
honour cfg->{language} setting when loading messages
Handler: move message loading into _load_messages()
more error checks for constructing patterns
make ID allocation generic on classname
move the msg/ and logs/ directories into t/ where they belongs
move requests.def to def/ and modify Handler to load it from def_dir
wcr lib: Total: lines 5289, words 17857, chars 129524
1310 tests (id space seperation)
_construct_item() from Data.pm
_cfg_level() to convert "1+2+4" to 7
_after_cfg_read() and _after_load() called by _init()
POD in CHANEGS
fixed TODO list to cover only Dicop::BASE
make _init() generic and re-usable
wcr lib: Total: lines 5273, words 17827, chars 129299
1303 tests (cfg_level)
forgot to include t/rand_req.t into MANIFEST
Dicop::Handler doesn't need to include Dicop::Client
wcr lib: Total: lines 5274, words 17809, chars 129459
1299 tests
Pattern: throw error for negative pattern matches
Pattern: added 'class' (admin|work|status|stats or invalid)
Request: handle "var_" as "var = ''" and not "var = [ ]"
check that a requests class is on of the allowed types only
Item: skip comments inside the {} blocks, too
Request/Pattern: continue match until match w/o error is found
wcr lib: Total: lines 5268, words 17788, chars 129320
1299 tests (pattern errors, pattern class, empty request param)
Pattern.pm: replace request-FIELD by FIELD_content when
title(), output() or template() is called
Request.pm: call patttern's title(), output() and template()
with $self as param
Base: replace_templates(): cluck() on non-ref as param
Handler: put request-errors not into forms
Handler: put loading request patterns in a subroutine
Handler: allow undef for $name in _convert_browser_request()
Request: is_form() return false on error
Pattern: better default template file name
wcr lib: Total: lines 5224, words 17628, chars 128185
1285 tests (request pattern tests, Handler.pm)
Request patterns can have regular expressions for matching
DEFAULT_PATTERNS to Dicop::Request (for testsuite)
use msg 462 for invalid requests instead of hardcoded string
better error message from Requests (no double ID or double \n)
fixed Pattern check for nonempty/required params to actually work
Pattern.pm: check for additional (unwanted) params and complain
removed obsolete doc about find_title()
Pattern.pm: removed unnecc. check_params()
wcr lib: Total: lines 5163, words 17453, chars 126683
1277 tests (request pattern tests)
moved Client.pm, client.t to Dicop-Server
if no matching pattern for a request was found, throw an error
pod fixes for Requests and Patterns
Dicop/Data/Request.pm moved to Dicop/Request.pm
wcr lib: Total: lines 5177, words 17538, chars 127218
1272 tests ()
Base.pm: document decode()
move cfg_default() from Handler.pm to Base.pm
Event.pm: add local to $\ = "\n"
wcr lib: Total: lines 6297, words 22084, chars 160059
2190 tests ()
make wcr use strict and warnings
remove SIGNATURE and doc about it, it is too cumbersome and the
integrity of the packages is already ensured by the detached sig
wcr lib: Total: lines 5985, words 21202, chars 152648
2190 tests ()
handle "submit-FOO" buttons in forms to carry additional per-button parameters
status_dir: make directories/files selectable, on selection execute request
status_dir: exclude .files (todo: make optional) and some fix-ups
on handling handle request, fall back to status() if all else fails
wcr lib: Total: lines 5985, words 21202, chars 152648
2190 tests (read_dir)
status_dir(): handle dir listings
read_dir()
converted t/basepm.t to Test::More
wcr lib: Total: lines 5985, words 21202, chars 152648
2190 tests (read_dir)
Handler.pm: load request patterns at startup, and use them to
verify and construct requests
handle_requests() loads the necc. template for each request
and makes them available as {tpl} and {tplrow} for tables
prepend config var {title} to of HTML title
Request: is_info(), is_auth(), is_form(), is_request()
bug in Request.pm in handling good cached copies
find title and ctype only if there are form requests
wcr lib: Total: lines 5985, words 21202, chars 152648
2187 tests ()
Item.pm: from_file() - feed file data into from_string
wcr lib: Total: lines 5945, words 21056, chars 151573
2187 tests (from_file)
Item.pm: from_string() takes a default class name as second arg
Request.pm: auth()
more work on request patterns, their request checks and errors
converted itempm.t to Test::More
wcr lib: Total: lines 5945, words 21056, chars 151573
2186 tests (Item, Pattern, Request)
msg/request.def - first draft of a request pattern definition file
lib/Dicop/Request/Pattern.pm - first draft of an object representing
valid request pattern
wcr lib: Total: lines 5966, words 21235, chars 152543
2175 tests (Pattern.pm)
daemon: unblock() - switch server to non-blocking mode
Handler: _status_sort(), status(), _gen_table()
init {last_error} to ''
added {error} and error() to Item.pm
wcr lib: Total: lines 5659, words 20182, chars 145021
2170 tests (Item.pm)
use POSIX, use base qw/Net::Server/ moved to lib/deamon
set $self->{self} from config field 'self' at _init()
two instances of Dicop::decode => decode() in Handler.pm
finish_request() called by handle_request() for specific stuff
better logic to call the handlers for the single requests
wcr lib: Total: lines 5559, words 19817, chars 142511
2168 tests (Handler.pm)
handle_requests calls request handler methods as method calls
taken over init of deny and allow security settings
from Data.pm into Handler.pm
wcr lib: Total: lines 5537, words 19793, chars 142334
2167 tests ()
added a custom accept() method that also works in non-blocking way
including switching to blocking
wcr lib: Total: lines 5493, words 19647, chars 141068
2167 tests ()
Handler.pm: don't use Dicop::Server::Config nor Dicop::Files
wcr lib: Total: lines 5395, words 19282, chars 138399
2166 tests ()
first verson from Dicop 2.23
converted first testfiles to Test::More
moved generic Dicop code to Dicop::Base
wcr lib: Total: lines 5397, words 19286, chars 138444
2166 tests ()

(c) Bundesamt fuer Sicherheit in der Informationstechnik 1998-2004
DiCoP is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.
See the file LICENSE or http://www.bsi.bund.de/ for more information.