Revision history for Elive 1.16 27th August 2011 [enhancements] - Elive::Entity::Session - The ELM 3.x SessionInsert and SessionUpdate commands often return a null response rather that an error message which was then leading to low level failures while unpacking. Catch this and return (as far as possible) a more meaningful error message. [refactoring] - elive_query: cleaned up code for succinctness. 1.15 24th August 2011 [enhancements] More work on inaccessable server details. This can actually indictate that either the session manager or license manager are not running and reachable. - Elive::Connection::SDK - error message changed to "Unable to get server details. Are all services running?" [refactoring] Elive is no longer a base class for Elive::DAO. This is largely for Elive::StandardV2's benefit, which can now base itself directly on Elive::DAO rather than Elive. - Created new module Elive::DAO::_Base - Changed parent class for Elive::DAO and Elive::DAO::_Array from Elive to Elive::DAO::_Base - Set $Elive::DAO::Version = '0.01' 1.14 21st August 2011 [bug fixes] Improved detection and handling of inaccessable server details. This is usually an indication that the Session Server (elive) is not running or is unreachable. - Elive::Connection::SDK - was dieing with 'Can't call method "version" on an undefined value'. Now produces the more meaningful 'Unable to get server details is the Session Server (elive) running?' - elive_query: now produces a warning and continues - elive_raise_meeting: now dies with this error (unable to determine version) unless the '-use elm2 or -use elm3' options are present. [testing] General improvements to error messages and handling when the server details are inaccessable - the underlying problem should now be more obvious to the tester. 1.13 19th August 2011 Improved support for sites running multiple session servers. [enhancements] - Elive::Connection::SDK - the server_details() method now returns a list of values when used in a list context. - Elive::DAO - avoid attempting to cache weak (keyless) entities. This is for Elive::StandardV2's benefit, e.g. the serverVersions entity. [pod] - Elive::Entity::ServerDetails - documented the list() method. This is useful for sites that running multiple session servers. [testing] - script-elive_query.t - removed serverDetails singleton test (there can be multiple servers). - soap-session-participants.t - fixed planning 1.12 15th August 2011 [bug fixes] Elive::DAO / Elive::Entity::Recording - the 'updateRecording' command can return a null response (observed under ELM 3.3.4). Added code to Elive::DAO to check for empty update responses and defensively refetch the raw data to complete the update and update checks. [documentation] Elive::Entity::Recording - tidied up upload() and insert() pod examples. 1.11 12th August 2011 [documentation] Elive::Entity::InvitedGuest - the login name, by convention, should be an email address. Changed pod and some tests to reflect this. 1.10 11th August 2011 [bug fixes] - elive_raise_meeting: re-added default for meeting name (left out with Elive 1.09). 1.09 10th August 2011 [compatibility] Further support for Elluminate Live version >= 9.0.0 < 9.5.0 - elive_raise_meeting: Reintroduced automatic selection of session class based on version (see rev 0.96), but this time against earlier Elluminate Live! versions -- Elive::Entity::Session (-user elm3) is the default for Elluminate Live! >= 9.5.0 -- Elive::View::Session (-use elm2) is otherwise the default [testing] removed $TEST_AUTHOR check from all script-*.t tests script-elive_raise_meeting.t - skip elm3 tests for Elluminate < 9.5 1.08 9th August 2011 [compatibility] I regression tested against Elluminate 9.0 to check results. - Recording and groups had some problems and failing tests - I skipped all tests that involve Elive::Entity::Session. It wasn't usable (as expected). - Elive::View::Session worked pretty well, after one minor bug fix (see below). - I made some modifications to the soap-connect.t to treat 9.0 as the mininum supported version and 9.5+ as the recommended version. Under Elive 10.0.1+ the getUser command (Elive::Entity::User retrieve method) matches on both userId and loginName. - I relaxed the _readback() consistancy checks to allow this. Also, added tests to soap-user.t to capture this behaviour. [bug fixes] - Elive::Entity::Session - the retrieve() method now returns undef when an attempt is made to access a non-existent meeting. This fix was sufficient pass all Elive::View::Session tests on Elluminate 9.0. 1.07 7th August 2011 [compatibility] Some failures were detected when running soap-user.t and soap-group.t tests against earlier ELM 3.0 / Elive 9.5 servers. These were caused by attempting to parse 'domain' and 'groups' properties that were seen in early 3.0 responses. Some changes were made to silently ignore these properties. - Elive::DAO, Elive::Util - add 'Any' datatype for ignored properties - elive_query - ignore fields of type 'Any' - Elive::Entity::User - declare 'groups' and 'domain' as type 'Any' - Elive::Entity::User - declare 'domain' as type 'Any' Will monitor these properties in new releases. [bug fixes] elive_query - reverted use of Try::Tiny based on perl 5.8.3 regressions 1.06 6th August 2011 [enhancements] elive_raise_meeting - added -all_moderators option [refactoring] - renamed class Elive::Array to Elive::DAO::Array. The old class name can still be referenced , but now produces a depreciated warning. [testing] - corrected occasional bogus failures (invalid ID generation) in mock tests. 1.05 1st August 2011 [bug fixes] Elive::Entity::Session - corrected handling of invited guests in insert() and update () methods - Corrected SOAP delimiter for invited guests list from ',' to ';' - Disallow promotion of Invited guests to moderator, ie $participant->is_moderator(1) has no effect when the participant is a group ($participant->type == 1). 1.04 28th July 2011 [security] Essential changes to improve general security and play better with Perl's Taint mode. Elive now dies when any attempt is made to construct a request from tainted strings. - These changes will only have an impact when taint is enabled, e.g. '-T' has been passed as a perl option. - Taint checking is limited to outgoing strings (Str) in SOAP requests. - Neither booleans (Bool) or integers (Int) are checked. However both Int and Bool are sanitised when building SOAP requests. - No attempt is made to apply taint checking to incoming data from SOAP::Lite requests. Elive::Util::_freeze() - Any attempts to freeze tainted strings (type Str) while in taint mode now results in an error Elive::DAO::list() - the 'filter' parameter is now frozen to avoid bypassing taintness checks. Elive::Entity::Recording, Elive::Entity::Preload - all SOAP parameters are now frozen and taint checks are applied. Dropped dependency on Storable::dclone; replaced with Clone::clone. - Storable::dclone doesn't seem to honor taintness, whereas Clone::clone does. [enhancements] Elive::Entity::Recording - added BUILDARGS method. 'size' is now computed and doesn't need to be specified in upload()s. Elive::Entity::ParticipantList - movedf update checks to _readback_checks() for the benefit of Elive::Entity::Session. 1.03 24th July 2011 [enhancements] elive_raise_meeting - added '--dump=yaml' option [pod] A few minor corrections to Elive::Entity::Session pod. 1.02 21st July 2011 [pod] Noted insert() and update() methods as undergoing depreciation for meetings, meeting parameters, server parameters and participant lists. [enhancements] Elive::Entity::Participant - added is_participant() setter/getter Elive::Entity:Role - added BUILDARGS() method and simplified coercements. [bug fixes] Elive::Entity::User - corrected ineffective BUILDARGS() method. 1.01 20th July 2011 [bug fixes] Elive::Entity::Preload - removed legacy method Elive::Entity::Preload::_freeze(). This was interfering with readback checks. [documentation] README - Amendements to section 'Configuring SDK Access' Elive - Admendments introductory example POD 1.00 19th July 2011 [Regression tested against Elm 3.0 / Elive 9.5 (earliest supported version). Back-ported recently introduced Elive::Entity::Session to Elm 3.0+. Other minor changes for compatibility.]. Elive - amended introductory example POD to create a meeting using Elive::Entity::Session (was using Elive::View::Session). elive_raise_meeting - now unconditionally uses Elive::Entity::Session as the default class for raising meetings (-use elm3). soap-recording.t - skipped some failing download tests for Elm <= 3.0. Elive::Entity::ServerParameters - included some aliases for mispellings present in Elm 3.0 responses (sic) ModertatorTelephonyAddress, ModertatorTelephonyPIN [Minor refactorings] - added _restful_url() method to Elive::DAO. Inherited and overriden by Elive::Entity::Group. [README] - Manual configuration instructions amended - only needed for LDAP 0.99 14th July 2011 [Regression tested against various perls, including 5.8.3, 5.8.8, 5.10.1 and 5.14.0. Fixed further nits and incompatibilities and established 5.8.3 as the minimum supportable perl version] META.yml - Further raised minimum perl version 5.8.1 to 5.8.3 - Pod::Usage minimum version set to 1.36 Elive::Entity::Preload - `$fh->binmode` => `binmode $fh` for 5.8.3 IO::Handle compatability Elive::Util - Minor refactoring of _freeze() method to avoid occasional SEGVs during DEMOLISH of objects in program exit global destruction (observed running while tests on perl 5.8.8 - 5.10.1). Elive::DAO - Fixes update() handling of copy objects. - Updates on copy objects were resulting in unblessed $obj->_db_data and breaking the is_changed() method. - Subrecords are now copied as well. Added _is_copy() metadata and modified __set_db_data to copy recursively. [Standardized on Try::Tiny's 'try' method] - Added dependency on Try::Tiny. - Replaced all non-stringy use of 'eval' built-in with 'try'. 0.98 8th July 2011 [Minor bug fixes, testing and documentation] META.yml - Raised minimum perl version from the default 5.0.5 to 5.8.1. This is the earliest versions reporting reliable smoke test results. - corrected Scalar::Util::weaken() handling of copy objects to work on perl 5.13.3 - minor nit from smoke tests. Elive::Entity::Session - further documentation, particularly on working with preloads Elive::Entity::Preload - implmented short form of import_from_server() method. Elive::Entity::Report - update() method was ignoring data parameter - fixed. 0.97 6th July 2011 Elive::View::Session - Added support (and some documentation) for recurring sessions. 0.96 29th June 2011 elive_raise_meeting: - default session class to Elive::Entity::Session (elm3) for server version >= 10.0.1, Elive::View::Session (elm2) otherwise - added further elm3 options: -follow -recording_resolution -profile - fixed long standing nit - not picking up $ELIVE_DEBUG (also fixed in elive_query). Elive::View::Session - parameterless use of update() method now works as documented Elive::Entity::Session - fixed a bug that prevented retrieved objects from being updated. 0.95 28th June 2011 [A pretty big release. This introduces Elive::Entity::Session; ELM 3.0 compatible meeting/session creation and management]. - New class Elive::Entity::Session. This implements inserts and updates via the ELM 3.x createSession and updateSession commands. -- Recurring meetings and telephony are not yet implemented. -- I'm not using this in production anywhere, so I treating this as a trial release, proabably until after the release of Elluminate 11.0 [Gemini]). -- It's largely call compatible with Elive::View::Session so in most cases all you need to do in your source code to start using it is: s{Elive::View::Session}{Elive::Entity::Session}. - Refactored Elive::View::Meeting, now based on Elive::Entity::Session. Elive::View::Meeting will be retained for the forseeable future, its continuing roles are: -- continue to allow insert/update via elm 2.x commands. -- support for elive_query [Elive::DAO refactoring] - removed ugly need to call 'construct' when coercing sub-objects. Elive::DAO::construct now works recursively and only needs to be called once. [Elive::Entity::Participants Construction] - Full support for users, groups and invited guests. - Introduced '-moderators' and '-participants' modifiers in participant list construction. So you now have the option of: Elive::Entity::Session->create({ ... participants => [ -moderators => [qw(alice bob)], -others => '*staff_group', ] }); Instead of using magic numbers for roles: Elive::Entity::Session->create({ ... participants => [ 'alice=2', 'bob=2', '*staff_group=3', ] }); Also works for Elive::View::Session. [Some renaming and new classes] - Added class Elive::Entity::Preloads - lists of preloads - Class Elive::Entity::ParticipantList::Participants has been renamed to Elive::Entity::Participants. - Class Elive::Entity::ParticipantList::Participant has been renamed to Elive::Entity::Participant. [elive_raise_meeting elm 3.x support] - now supports -participant and -moderators|other options - is now capable of raising meetings via either Elive::View::Meeting (option -use elm2) or Elive::Entity::Meeting (option -use elm3). - has new elm3 options: -exit_url -max_cameras -restricted [other minor bug fixes] - elive_query: tweaked binmode/utf8 on stdout as flagged by latest Test::Perl::Critic - elive_raise_meeting (and underlying Elive::Entity::Meeting) now properly support the add_preload option. 0.91 15th June 2011 Elive::View::Session - documented delegate attributes and methods. Elive::Entity::Group - handle recursive sub groups. Added new method expand_members(). Elive::DAO modifications for up-and-coming ELM3 support. New method __apply_freeze_aliases() 0.90 9th June 2011 [refactoring] - Added new object class Elive::Util::Type. Replacement for the Elive::Util::parse_type() function. - Elive::Struct is no more. Merged with Elive::DAO. [minor work-arounds] - Elive::Entity::ServerParameters - telephonyType SOAP response is being returned as a reference: {Name: 'PHONE', Ordinal: 1, TelephonyType: 1}, but the database simply contains the string 'PHONE'. This is now dereferenced to return a string ('PHONE'). 0.89 20th May 2011 [minor bug fixes and refactoring]. - Moved _get_results() and _unpack_as_list() from Elive::DAO to Elive::Entity. These are a Command Toolkit specific kludge that aren't required by StandardV2 and shouldn't be required for any future adapters. - Elive::Connection::SDK - now dies outright unless given a login username. - bug fix to safety check on admin user update/delete. Check was being bypassed when role was updated 0.88 27th April 2011 - elive_query: set STDOUT encoding to utf-8 (ELM default encoding). 0.87_2 15th April 2011 - Elive::Entity::Meeting->buildJNLP - Now understands user objects when passed as parameters. See updated pod example. - Really removed Elive::script::elive_meeting::ViewMeeting this time (see release 0.83) 0.87_1 14th April 2011 - Removed stray .depend file from distribution. 0.87 11th April 2011 - Elive::Entity::MeetingParameters - corrected datatype for 'videoWindow' to 'Int' (was 'Bool'). - elive_raise_meeting - added options: -cost_center -user_notes -moderator_notes 0.86 15th March 2011 - $preload = Elive::Entity::Preload->upload( 'filename' ) - now works as documented in Elive introductory example. 0.85 15th March 2011 [Completing Elive::View::Session functionality. Phasing it in as the preferred high level class for meeting construction and setup.] - Added add_preload option to Elive::View::Session. Utilised in elive_query. - Elive pod doco. Changed introductory example to raise a meeting via Elive::View::Session. Also added preload upload to example. - Also took out 'see also' links to Elive::Entity::MeetingParameters, Elive::Entity::Meeting, Elive::Entity::ServerParameters, 0.84 11th March 2011 - Elive::View::Session - added support for recurring meetings - elive_query - converted from Elive::Entity::Meeting and friends to Elive::View::Meeting - Elive::Struct reverted from Mouse find_attribute_by_name to get_attribute. Was misbehaving under Perl 5.8.x when invoked via DEMOLISH during object destruction. 0.83 3rd March 2011 [This release introduces Elive::View::Session - a consolidation of Elive::Entity::Meeting, Elive::Entity::MeetingParameters, Elive::Entity::ServerParameters and Elive::Entity::ParticipantList.] - Initial construction of Elive::View::Session. Supporting tests are in t/32-soap-session.t. - Elive::Entity::ServerParameters - now handles update of seats. - Added entity class Elive::Entity::InvitedGuest - Extended Elive::Entity::ParticipantList to model invited guests. - Removed Elive::script::elive_meeting::ViewMeeting; supersueded by Elive::View::Session. - Added Elive::Util::next_quarter_hour() - mostly to support Elive::StandardV2 tests. - Phased out 'use base ...' in favour of 'use parent ...' 0.82 10th February 2011 [I hadn't run t/26-soap-user.t and t/27-soap-group updates against a live SOAP servive for a while :-| found some compatibility problems between Elluminate 9.7 and 10.0.1.] - Elive::Entity::User; to mirror SDK changes. The password was previously handled seperately via the 'changePassword' command, but is now a required field in the initial insert. Also tidied up the update checks; introduced _safety_check() method for consistancy. - Elive::Entity::Group; update modifed to match change in SDK. -- The separator character for has changed from ';' to ','. -- Added new class Elive::Entity::Group::Members. -- Group name now passed to 'updateGroup' command. - extended t/26-soap-user.t and t/27-soap-group. These may be enabled by setting the following enviroment variables: -- ELIVE_TEST_USER_UPDATES -- ELIVE_TEST_GROUP_UPDATES These tests can only be run on a non-LDAP server. See README for details. 0.81 4th February 2011 - Resolve aliases on entity insert and update. For example the following are now equivalent: Elive::Entity::Meeting->insert({privateMeeting => 1, ...}); # use real attribute name Elive::Entity::Meeting->insert({private => 1, ...}); # use alias name 0.80 28th January 2011 - Elive::Entity::ParticipantList. Detect and catch the common scenario of attempting to add unknown users. Now croaks with a friendlier and easily caught error message: "unable to add 7 of 35 participants; rejected users: user1 user2 ..." - Eliminated remaining direct uses of Elive::Util::_freeze() function. Replaced with Elive::DAO::->_freeze() for consistancy. 0.79 21st January 2011 - bugfix to elive_query. Had silently broken 'select * ...' queries around 0.76. Added tests to t/40-script-elive-query.t. 0.78 8th December 2010 - Removed bogus dependency on IO::Prompt. Causing unneccessary build problems on Windows. 0.77 8th December 2010 - Added tests on setting big meeting participant lists. Bug fixed in pending Elluminate 10.0.2 release. - Downgraded Term::Readline::Perl dependency from 'required' to 'recommended'. alternatives include Term::Readline::TTYtter 0.76 10th November 2010 work on elive_query: - added -adapter option. For impending integration with Elive::StandardV2. Added data_classes() method to Elive::DAO for discovery of entity classes. - IO::Interactive::is_interactive() dieing when executed from debian 5 cron (error opening /dev/tty). Now evaled; assume non-interactive on eval error. 0.75 28th October 2010 elive_query: Extended the range of data that can be selected for meetings. This includes data for meeting parameters and server parameters. Also now selectable are associated participants, recordings and preloads. select name,participants,url from meeting where id = 1234567890123 In particular, 'select ** from meeting' will retrieve all data from Meeting, MeetingParameters and ServerParameters. This involves 2 secondary SOAP calls to retrieve associated data. Slow, but thorough. 0.74 18th October 2010 Bug Fixes: - Elive::Entity::Preload - Make sure that the preload has an 'ownerId' defined. It seems to be required for preloads to function properly. 0.74_2 14th October 2010 Support for LDAP groups in participant lists - Elive::Entity::ParticipantList has been significantly refactored. It now correctly interprets the 'type' property (introduced ~ ELM v3.0) and supports both 'user' and 'group' properties. - Group support also added to elive_raise_meeting - see pod Bug fixes: - Elive::Entity::Meeting: Added 'adapter' property. Interesting values include: 'default' & 'standardv2'. Other Enhancements: - General support for credentials embedded in urls, E.g: http://user@host.org/inst 0.74_1 7th October 2010 Essential changes to implement Elive::StandardV2 - A new companion CPAN module that implements bindings to ELM Standard API Bridge V2. The classes in this distribution that referenced by ELive::API are Elive::Connection::API, Elive::Array, Elive::DAO and Elive::DAO::Singleton. - Elive::Entity now only contains ELM specialisations. The generic portion has been moved to create a new base class, Elive::DAO. - Added new mixin class Elive::DAO::Singleton - Add subclasses Elive::Connection::SDK & Elive::Connection::API - Elive::_check_for_errors moved to Elive::Connection - Elive known_adapter() && check_adapter() methods replaced by known_command() and check_command() methods in Elive::Connection::SDK and Elive::Connection::API 0.73 3rd September 2010 - Added script tests to manifest - Checked against Elluminate 10.0.1 - passed! - Starting investigation into extending this module to also support the Elluminate V2 API, via the SOAP endpoint: http://site-name.com/instance/v2/webservice.event. 0.72 13th August 2010 - Elive::Entity::Group: added implicit casting of user objects in member lists. The follow now works as you would expect: my $bob = Elive::Entity::User->get_by_loginName('bob'); my $group = Elive::Entity::Group->insert({ name => 'Elluminati', members => [111111, 222222, 'alice', $bob ], }); - Added script tests (elive_query, elive_raise_meeting, elive_lint_config). - Elive::Struct Provided method aliases for existing entity level aliases. For example $meeting->private is now equivalent to $meeting->privateMeeting. 0.71 21st June 2010 - Fixed elive_query (loading of Elive::Connection) from last change. Added a test for this. 0.70 21st June 2010 Support for Elluminate 9.7 => 10.0 - New Preload properties: isProtected and isDataAvailable. - New Recording properties: sessionInstanceId, startDate and endDate - Accommodated some newly introduced bugs/changes: -- User get_by_loginName() is no longer case insensitive -- Preloaded whiteboard files lost extension during insert/update (introduction.wdb => introduction). Note: attempted insert/update of files with no extension will crash the SOAP request with the error message: 'String index out of range: -1' (have put in a ticket to Elluminate help desk). 0.69 11th June 2010 - Raised SOAP::Lite dependency 0.69 => 0.712. This eliminates some encoding failures under old perls (5.8.8-) and slightly older versions of SOAP::Lite. Encoding/decoding of HTML entities now properly handled. Thanks SOAP::Lite maintainers! - Minor refactorings to Elive codebase in order to pass Test::Perl::Critic severity level 4 tests (00c-critic.t). -- Most commonly, Atomic parsing of subroutine arguments. E.g. what was: sub disconnect { my $class = shift; my %opt = @_; # ... } After refactoring becomes: sub disconnect { my ($class, %opt) = @_; # .... } Second most common refactoring was adding explicit final 'return' to subroutines. For gory details, see svn commit of rev 377. 0.68 2nd June 2010 - Added new entity class: Elive::Entity::Report. - Bug fix: Entity data was being returned with encoded entities. HTML::Entities::decode_entities is now used. 0.67 28th May 2010 - Added Elive::Entity::Recording::upload() method. 0.66 22nd May 2010 - Moved check of property checks from Elive::Entity to Elive::Struct. Made it a moose /mouse BUILDARGS method. - Added 'type' field to participants method. Newly discovered due to above BUILDARGS check. - Recordings do not have to be associated with a Meeting. Made RecordingId optional. - Implicit casting of objects to ids. For example, you can now write: Elive::Entity::Meeting->new({facilitatorId => $user, # ... }); Instead of: Elive::Entity::Meeting->new({facilitatorId => $user->userId, # ... }); 0.65 17th May 2010 - Hide participants in elive_query script - not a retrievable entity. - pod tweaks. 0.64 11th March 2010 - Elive::Entity::Group changed GroupId from Int to Str. Can be non-numeric when groups are configured for LDAP. 0.63 7th March 2010 - Fixed usage/error messages in Elive::Entity '_readback' method. - RestrictedMeeting flag appears inoperative in Elm 9.7. Added a test in 22-entity-meeting.t to catch this in 9.8 onwards. - Added -restricted option to elive_raise_meeting. Will require the above Elm fix to become effective. 0.62 16th February 2010 Changes to README doco re troubleshooting and meeting pod. 0.61 26th January 2010 elive_raise_meeting support for Elluminate 9.7 release - Modified user search/validation filter for Elm 3.2 compatibility. - Added 'quit' command. Also 'describe'; alias for 'show'. 0.60 25th January 2010 - Added -occurs option to elive_raise_meeting script - Further tweaks to README 0.59 23rd January 2010 - Updated README file to reflect Elluminate 9.5+ configuration. - Took out Elive->collections method. Easily derivable and only used in testing. 0.58 14th January 2010 Support for Elluminate 9.7 release: - Added new field 'dn' to Elive::Entity::Group - LDAP domain name. - Added Elive::Entity::Group::_thaw(). This was required to handle modified output from Group DAO. We now get a single result with all members separated by ';', instead of a list of individual members. - Fix in Elive::Entity::_thaw(). It was modifying parts of the input struct. Now makes a copy on entry via Storable::dclone. - added 27-soap-group.t - group specific tests. 0.57 5th January 2010 - Altered tests to pass Mouse 0.40 constraints, '+002' is not considered a valid 'Int'(?). Transient Mouse bug? - Elive::Entity - Added a warning for attempted use of is_changed on none database objects. 0.56 4th January 2010 - Objects are now automatically stringified on all SOAP calls. For example: Elive::Entity::Meeting->insert({ facilitatorId => $user->userId, # ... }); Can now be written: Elive::Entity::Meeting->insert({ facilitatorId => $user, # ... }); - Improved mock testing coverage. Now able to run much of the meeting and recording tests offline. - Pod/doco improvements. In particular, show a meeting insert in the introductory example. - Removed some unreachable code from elive_raise_meeting.