=pod

=head1 History revision for DiCoP-Base

This document details the complete changes from v3.00 onwards.

See the CHANGES files in the DiCoP-Server package for the full version history.

=head2 2004-12-21 (Base v3.00 build 80)

=over 2

=item fixed

        deamon: ignore requests for favicon.ico
        wcr lib: Total: lines 8711, words 30863, chars 221535
        1499 tests ()

=back

=head2 2004-12-20 (Base v3.00 build 79)

=over 2

=item fixed

        add report_leak hooks into main accept loop and Handler.pm
        wcr lib: Total: lines 8697, words 30818, chars 221212
        1499 tests ()

=back

=head2 2004-12-16 (Base v3.00 build 78)

=over 2

=item fixed

        Hash: reset error upon read() to force rehash
        wcr lib: Total: lines 8665, words 30757, chars 220394
        1496 tests (hash)

=back

=head2 2004-12-15 (Base v3.00 build 77)

=over 2

=item added

Cache: get_oldest(), statistics()

=item fixed

        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(Nlog N))
                  touching a random item is O(1) (instead of O(Nlog 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)

=back

=head2 2004-12-09 (Base v3.00 build 76)

=over 2

=item added

        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 sortorder()
        handle #selfreq# in templates

=item fixed

        Handler: name_from_type() handle inputs like 'jobtypes' (already 's')
        Handler: gentable(): handle a filter argument to filter things
        wcr lib: Total: lines 8553, words 30371, chars 217744
        1493 tests (name_from_type, sort oder)

=back

=head2 2004-12-07 (Base v3.00 build 75)

=over 2

=item added

Handler: add flushdata(), constructfile_names()

=item fixed

        Handler: use generic storage access
        wcr lib: Total: lines 8477, words 30066, chars 215534
        1487 tests ()

=back

=head2 2004-12-06 (Base v3.00 build 74)

=over 2

=item fixed

        retract change to check_peer() (caller should prepend 'req0000 ')
        wcr lib: Total: lines 8437, words 29920, chars 214430
        1487 tests ()

=back

=head2 2004-11-30 (Base v3.00 build 73)

=over 2

=item fixed

        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 ()

=back

=head2 2004-11-25 (Base v3.00 build 72)

=over 2

=item fixed

        use POSIX (); vs use POSIX; to save memory (a few hundred KB)
        wcr lib: Total: lines 8430, words 29896, chars 214254
        1487 tests ()

=back

=head2 2004-11-23 (Base v3.00 build 71)

=over 2

=item added

Base: check_templates()

=item fixed

        PREREQ in Makefile.PL
        wcr lib: Total: lines 8430, words 29887, chars 214209
        1487 tests ()

=back

=head2 2004-11-16 (Base v3.00 build 70)

=over 2

=item added

Template: parameter 'virtual' for fields

=item fixed

        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 knownfields
        Template: fields(): do not return fields marked as virtual
        wcr lib: Total: lines 8402, words 29787, chars 213436
        1486 tests (Item->{_modified}, fields())

=back

=head2 2004-11-15 (Base v3.00 build 69)

=over 2

=item added

Template: parameter 'sort' for fields with "valid" lists

=item fixed

        wcr lib: Total: lines 8357, words 29568, chars 212010
        1482 tests ()

=back

=head2 2004-11-11 (Base v3.00 build 68)

=over 2

=item added

        Base: connectserver() - send URL or PARAMS to remote server
        Base: loadconnector() - load wget or libwww and create user-agent
        wcr lib: Total: lines 8357, words 29568, chars 212010
        1482 tests (connectserver)

=back

=head2 2004-11-03 (Base v3.00 build 67)

=over 2

=item fixed

        clear last_error before handling a request
        Item.pm:streamline : call gettemplate() directly
        wcr lib: Total: lines 8162, words 28915, chars 206866
        1480 tests ()

=back

=head2 2004-11-03 (Base v3.00 build 66)

=over 2

=item fixed

        always display short name in file/dir selectors (sigh)
        amended TODO
        wcr lib: Total: lines 8164, words 28921, chars 206860
        1480 tests ()

=back

=head2 2004-10-28 (Base v3.00 build 65)

=over 2

=item fixed

        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)

=back

=head2 2004-10-25 (Base v3.00 build 64)

=over 2

=item added

Template: fields_of_type()

=item fixed

        fix: refresh and cancel buttons on dir/file selector pages
        display short names in dir/file selector
        includeform: properly handle bool fields
        wcr lib: Total: lines 8164, words 28919, chars 206853
        1478 tests ()

=back

=head2 2004-10-21 (Base v3.00 build 63)

=over 2

=item fixed

        Item: put() calls checkfield()
        Template: normalize 'bool' fields to be 'on' or ''
        get_as_string: return bool fields as "No"/"&sigmaf;" (looks like "V")
        wcr lib: Total: lines 8131, words 28799, chars 206030
        1475 tests ()

=back

=head2 2004-10-20 (Base v3.00 build 62)

=over 2

=item fixed

        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 ()

=back

=head2 2004-10-14 (Base v3.00 build 61)

=over 2

=item added

support for layouts (extra plus style)

=item fixed

        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 ()

=back

=head2 2004-10-07 (Base v3.00 build 60)

=over 2

=item added

        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 ()

=back

=head2 2004-10-06 (Base v3.00 build 59)

=over 2

=item added

keys 'description', 'addoption', 'editoption' to Template system

=item fixed

        Base: undef warning in line 279 (undef values)
        wcr lib: Total: lines 8053, words 28494, chars 203653
        1473 tests (description, addoption, editoption)

=back

=head2 2004-09-30 (Base v3.00 build 58)

=over 2

=item fixed

        small cleanups
        wcr lib: Total: lines 8016, words 28323, chars 202565
        1465 tests ()

=back

=head2 2004-09-29 (Base v3.00 build 57)

=over 2

=item added

        support editindend and addindend in forms
        Handler: formatstring(): embed object fields into a format template

=item fixed

        Base: allow empty params in parseFormArgs() to make changing fields to
         the empty string possible
        Handler: buglet in gentable that barfed on '<td align="right">' when
         inserting class
        removed unused second param from optionlist()
        Handler: optionlist() 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, optionlist,empty params)

=back

=head2 2004-09-28 (Base v3.00 build 56)

=over 2

=item added

pass argument "proto" to Net::Server, too

=item fixed

        wcr lib: Total: lines 7880, words 27837, chars 199029
        1450 tests ()

=back

=head2 2004-09-27 (Base v3.00 build 55)

=over 2

=item fixed

        Handler: #type# => #servertype#
        Handler: replace request param templates in html-table output, too
        wcr lib: Total: lines 7879, words 27822, chars 198933
        1450 tests ()

=back

=head2 2004-09-23 (Base v3.00 build 54)

=over 2

=item fixed

        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 ()

=back

=head2 2004-09-22 (Base v3.00 build 53)

=over 2

=item fixed

        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 ()

=back

=head2 2004-09-15 (Base v3.00 build 52)

=over 2

=item added

        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

=item fixed

        Security: undef warning in _ip2hex()
        wcr lib: Total: lines 7868, words 27758, chars 198495
        1450 tests (Hash, check IP)

=back

=head2 2004-09-14 (Base v3.00 build 51)

=over 2

=item added

        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

=item fixed

        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)

=back

=head2 2004-09-13 (Base v3.00 build 50)

=over 2

=item added

authenticate_user() and request_auth() from Data

=item fixed

        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 ()

=back

=head2 2004-09-12 (Base v3.00 build 49)

=over 2

=item fixed

        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 ()

=back

=head2 2004-09-09 (Base v3.00 build 48)

=over 2

=item added

        Base: cpuinfo() (needed by Client and Proxy)
        Handler: request_file() (needed by Proxy and Server)

=item fixed

        preload http/ftp protocols in LWP for chroot environments
        wcr lib: Total: lines 7586, words 26456, chars 189442
        1414 tests ()

=back

=head2 2004-09-08 (Base v3.00 build 47)

=over 2

=item added

        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

=item fixed

        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 ()

=back

=head2 2004-09-07 (Base v3.00 build 46)

=over 2

=item added

        Handler: pre_connect(), status_config()
        Config: add check() etc
        converted t/config.t to Test::More

=item fixed

        init some fields (last_flush, flush_time, self etc) in init()
        better die() message when message file cannot be loaded
        Handler: finishrequest() => 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)

=back

=head2 2004-09-02 (Base v3.00 build 45)

=over 2

=item added

Template: support for min/max

=item fixed

        wcr lib: Total: lines 7315, words 25494, chars 182227
        1401 tests (min/max tests)

=back

=head2 2004-09-01 (Base v3.00 build 44)

=over 2

=item added

        optionlist(): support multiple filter words as in 'type=foo,bar'
        Handler: optionlist(): 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 fixed

        Item: require Template instead of use, lazy load
        wcr lib: Total: lines 7280, words 25260, chars 180834
        1396 tests ()

=back

=head2 2004-08-31 (Base v3.00 build 43)

=over 2

=item added

        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)

=item fixed

        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)

=back

=head2 2004-08-30 (Base v3.00 build 42)

=over 2

=item added

        property 'changable' to Template - fields that are changable, but
         are not automatically put on edit forms

=item fixed

        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)

=back

=head2 2004-08-26 (Base v3.00 build 41)

=over 2

=item added

        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"

=item fixed

        special casing for /extra\d/ keys in get_as_string
        Input field names in generated forms have '&nbsp;' 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)

=back

=head2 2004-08-24 (Base v3.00 build 40)

=over 2

=item added

        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)

=item fixed

        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)

=back

=head2 2004-08-23 (Base v3.00 build 39)

=over 2

=item added

        Template: constructfield(): construct objects from lass names
        includeform(): #safevalue#, #cmd#, #id# and #formname#
        Handler: move code to split submit name to convertsubmit_button()
        better output on fatal errors inside the status handler
        title to dirs/files in listing table

=item fixed

        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 (convertsubmit_button())

=back

=head2 2004-08-19 (Base v3.00 build 38)

=over 2

=item added

        Item.pm:construct () does construct foo_id object ref from ID
        Item.pm:parent ()
        warn upon empty filenames when reading templates

=item fixed

        Request.pm and Pattern.pm:template () => template_name() to not
         interfere with template() from Item.pm
        Item.pm:simplified  logic to get template
        gettemplates() => gettemplate()
        wcr lib: Total: lines 6431, words 21653, chars 157473
        1375 tests ()

=back

=head2 2004-08-18 (Base v3.00 build 37)

=over 2

=item fixed

        gen_table: use $item->fields(), not $item->keys()
        includeform() 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 ()

=back

=head2 2004-08-17 (Base v3.00 build 36)

=over 2

=item added

t/basics.t and t/mailpmt.

=item fixed

        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())

=back

=head2 2004-08-16 (Base v3.00 build 35)

=over 2

=item added

        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

=item fixed

        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())

=back

=head2 2004-08-12 (Base v3.00 build 34)

=over 2

=item added

replace #foo_list# by $self->foo_list($item) in status pages

=item fixed

        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 ()

=back

=head2 2004-08-11 (Base v3.00 build 33)

=over 2

=item added

        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

=item fixed

        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)

=back

=head2 2004-08-05 (Base v3.00 build 32)

=over 2

=item added

Item: fromstring_form() - construct Math::String from string

=item fixed

        in case of error requests, don't try to auth client
        Handler: guard against illegal objects in includeform()
        Handler: includeform(): 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 ()

=back

=head2 2004-07-29 (Base v3.00 build 31)

=over 2

=item fixed

        Handler: renamed includeedit_form() => includeform()
        includeform() 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())

=back

=head2 2004-07-28 (Base v3.00 build 30)

=over 2

=item added

        Handler: AUTOLOAD() from Dicop-Server's Data.pm
        Handler: get_id_list()
        Template.pm:field ()
        Handler: split read_template() into find_template() and readtemplate()

=item fixed

        include fields from tpl/ into edit form, fall back to string
        wcr lib: Total: lines 5887, words 19696, chars 143273
        1346 tests (fields())

=back

=head2 2004-07-21 (Base v3.00 build 29)

=over 2

=item added

Handler: status() include item's fields, too

=item fixed

        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)

=back

=head2 2004-07-20 (Base v3.00 build 28)

=over 2

=item added

        Handler: includeedit_form() - generate list of form fields to edit
        Item: template()

=item fixed

        wcr lib: Total: lines 5712, words 19106, chars 139132
        1335 tests ()

=back

=head2 2004-07-19 (Base v3.00 build 27)

=over 2

=item fixed

        Handler: flush(): call flushdata()
        wcr lib: Total: lines 5636, words 18863, chars 137237
        1333 tests ()

=back

=head2 2004-07-12 (Base v3.00 build 26)

=over 2

=item added

Handler: call replacemail_templates() from email()

=item fixed

        Handler: replace #time# in mailtemplate with readable time instead timestamp
        wcr lib: Total: lines 5628, words 18845, chars 137100
        1333 tests ()

=back

=head2 2004-07-08 (Base v3.00 build 25)

=over 2

=item added

=item fixed

        Template: fix check for ip/mask types in check_field()
        wcr lib: Total: lines 5622, words 18834, chars 137002
        1333 tests ()

=back

=head2 2004-07-07 (Base v3.00 build 24)

=over 2

=item added

Template: implement checks in check_field() (maxlen, filter some)

=item fixed

        wcr lib: Total: lines 5622, words 18834, chars 137001
        1327 tests ()

=back

=head2 2004-07-06 (Base v3.00 build 23)

=over 2

=item added

Template: check_field() and construct_field() stubs

=item fixed

        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 ()

=back

=head2 2004-07-05 (Base v3.00 build 22)

=over 2

=item added

        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:loadtemplates ()

=item fixed

        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)

=back

=head2 2004-07-03 (Base v3.00 build 21)

=over 2

=item added

        Handler: loadobject_definitions()
        honour cfg->{language} setting when loading messages

=item fixed

        Handler: move message loading into loadmessages()
        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)

=back

=head2 2004-06-24 (Base v3.00 build 20)

=over 2

=item added

        constructitem() from Data.pm
        cfglevel() to convert "1+2+4" to 7
        aftercfg_read() and afterload() called by _init()

=item fixed

        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 (cfglevel)

=back

=head2 2004-06-21 (Base v3.00 build 19)

=over 2

=item fixed

        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

=back

=head2 2004-06-17 (Base v3.00 build 18)

=over 2

=item added

        Pattern: throw error for negative pattern matches
        Pattern: added 'class' (admin|work|status|stats or invalid)

=item fixed

        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)

=back

=head2 2004-06-16 (Base v3.00 build 17)

=over 2

=item added

        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

=item fixed

        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 convertbrowser_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)

=back

=head2 2004-06-15 (Base v3.00 build 16)

=over 2

=item added

        Request patterns can have regular expressions for matching
        DEFAULT_PATTERNS to Dicop::Request (for testsuite)

=item fixed

        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)

=back

=head2 2004-04-27 (Base v3.00 build 15)

=over 2

=item fixed

        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 ()

=back

=head2 2004-02-25 (Base v3.00 build 14)

=over 2

=item fixed

        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 ()

=back

=head2 2004-02-24 (Base v3.00 build 13)

=over 2

=item fixed

        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 ()

=back

=head2 2004-02-10 (Base v3.00 build 12)

=over 2

=item added

        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

=item fixed

        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)

=back

=head2 2004-02-10 (Base v3.00 build 11)

=over 2

=item added

        status_dir(): handle dir listings
        read_dir()

=item fixed

        converted t/basepm.t to Test::More
        wcr lib: Total: lines 5985, words 21202, chars 152648
        2190 tests (read_dir)

=back

=head2 2004-02-09 (Base v3.00 build 10)

=over 2

=item added

        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()

=item fixed

        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 ()

=back

=head2 2004-02-06 (Base v3.00 build 9)

=over 2

=item added

Item.pm:from_file () - feed file data into from_string

=item fixed

        wcr lib: Total: lines 5945, words 21056, chars 151573
        2187 tests (from_file)

=back

=head2 2004-02-05 (Base v3.00 build 8)

=over 2

=item added

        Item.pm:from_string () takes a default class name as second arg
        Request.pm:auth ()

=item fixed

        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)

=back

=head2 2004-02-04 (Base v3.00 build 7)

=over 2

=item added

        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

=item fixed

        wcr lib: Total: lines 5966, words 21235, chars 152543
        2175 tests (Pattern.pm)

=back

=head2 2004-02-01 (Base v3.00 build 6)

=over 2

=item added

        daemon: unblock() - switch server to non-blocking mode
        Handler: statussort(), status(), gentable()

=item fixed

        init {last_error} to ''
        added {error} and error() to Item.pm
        wcr lib: Total: lines 5659, words 20182, chars 145021
        2170 tests (Item.pm)

=back

=head2 2004-01-30 (Base v3.00 build 5)

=over 2

=item added

use POSIX, use base qw/Net::Server/ moved to lib/deamon

=item fixed

        set $self->{self} from config field 'self' at init()
        two instances of Dicop::decode => decode() in Handler.pm
        finishrequest() 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)

=back

=head2 2004-01-28 (Base v3.00 build 4)

=over 2

=item fixed

        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 ()

=back

=head2 2004-01-23 (Base v3.00 build 3)

=over 2

=item added

        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 ()

=back

=head2 2004-01-23 (Base v3.00 build 2)

=over 2

=item fixed

        Handler.pm:don 't use Dicop::Server::Config nor Dicop::Files
        wcr lib: Total: lines 5395, words 19282, chars 138399
        2166 tests ()

=back

=head2 2004-01-22 (Base v3.00 build 1)

=over 2

=item added

first verson from Dicop 2.23

=item fixed

        converted first testfiles to Test::More
        moved generic Dicop code to Dicop::Base
        wcr lib: Total: lines 5397, words 19286, chars 138444
        2166 tests ()

=back

=head1 AUTHOR

(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 L<http://www.bsi.bund.de/> for more information.

=cut