From e4aba9ae2548fc01cf33eff8132c19fb2fe660a8 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 6 Sep 2016 15:33:26 +0200 Subject: [PATCH 01/14] add validation rule attribute to input field for interger attributes --- views/bootstrap/class.Bootstrap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/bootstrap/class.Bootstrap.php b/views/bootstrap/class.Bootstrap.php index ac03b9f4f..82e9eeaac 100644 --- a/views/bootstrap/class.Bootstrap.php +++ b/views/bootstrap/class.Bootstrap.php @@ -1105,7 +1105,7 @@ $('#acceptkeywords').click(function(ev) { if (strlen($objvalue) > 80) { echo ''; } else { - echo "getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".($attrdef->getMinValues() > 0 ? ' required' : '')." />"; + echo "getId()."]\" value=\"".htmlspecialchars($objvalue)."\"".($attrdef->getMinValues() > 0 ? ' required' : '').($attrdef->getType() == SeedDMS_Core_AttributeDefinition::type_int ? ' data-rule-digits="true"' : '')." />"; } } break; From bd15584c65d2767a32d0b8f8f7aa08d7279f64d3 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 6 Sep 2016 15:34:05 +0200 Subject: [PATCH 02/14] use invalidHandler instead of bind() --- views/bootstrap/class.AddDocument.php | 21 +++++++++++---------- views/bootstrap/class.AddSubFolder.php | 21 +++++++++++---------- views/bootstrap/class.EditDocument.php | 21 +++++++++++---------- views/bootstrap/class.UpdateDocument.php | 21 +++++++++++---------- 4 files changed, 44 insertions(+), 40 deletions(-) diff --git a/views/bootstrap/class.AddDocument.php b/views/bootstrap/class.AddDocument.php index 391dbb67f..2f79e0243 100644 --- a/views/bootstrap/class.AddDocument.php +++ b/views/bootstrap/class.AddDocument.php @@ -80,16 +80,17 @@ $(document).ready(function() { return false; return true; }, ""); - var validator = $("#form1").bind("invalid-form.validate", function() { - noty({ - text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()), - type: 'error', - dismissQueue: true, - layout: 'topRight', - theme: 'defaultTheme', - timeout: 1500, - }); - }).validate({ + $("#form1").validate({ + invalidHandler: function(e, validator) { + noty({ + text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()), + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500, + }); + }, rules: { 'userfile[]': { alternatives: $('#dropfolderfileform1') diff --git a/views/bootstrap/class.AddSubFolder.php b/views/bootstrap/class.AddSubFolder.php index 23fa1ef8a..6f5e74b55 100644 --- a/views/bootstrap/class.AddSubFolder.php +++ b/views/bootstrap/class.AddSubFolder.php @@ -66,16 +66,17 @@ $(document).ready( function() { ev.preventDefault(); }); */ - var validator = $("#form1").bind("invalid-form.validate", function() { - noty({ - text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()), - type: 'error', - dismissQueue: true, - layout: 'topRight', - theme: 'defaultTheme', - timeout: 1500, - }); - }).validate({ + $("#form1").validate({ + invalidHandler: function(e, validator) { + noty({ + text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()), + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500, + }); + }, messages: { name: "", comment: "" diff --git a/views/bootstrap/class.EditDocument.php b/views/bootstrap/class.EditDocument.php index 8571692a1..93d5d6147 100644 --- a/views/bootstrap/class.EditDocument.php +++ b/views/bootstrap/class.EditDocument.php @@ -71,16 +71,17 @@ $(document).ready( function() { ev.preventDefault(); }); */ - var validator = $("#form1").bind("invalid-form.validate", function() { - noty({ - text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()), - type: 'error', - dismissQueue: true, - layout: 'topRight', - theme: 'defaultTheme', - timeout: 1500, - }); - }).validate({ + $("#form1").validate({ + invalidHandler: function(e, validator) { + noty({ + text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()), + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500, + }); + }, messages: { name: "", comment: "", diff --git a/views/bootstrap/class.UpdateDocument.php b/views/bootstrap/class.UpdateDocument.php index ec29aeb19..3bf912e2b 100644 --- a/views/bootstrap/class.UpdateDocument.php +++ b/views/bootstrap/class.UpdateDocument.php @@ -81,16 +81,17 @@ $(document).ready( function() { return false; return true; }, ""); - var validator = $("#form1").bind("invalid-form.validate", function() { - noty({ - text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()), - type: 'error', - dismissQueue: true, - layout: 'topRight', - theme: 'defaultTheme', - timeout: 1500, - }); - }).validate({ + $("#form1").validate({ + invalidHandler: function(e, validator) { + noty({ + text: (validator.numberOfInvalids() == 1) ? "".replace('#', validator.numberOfInvalids()) : "".replace('#', validator.numberOfInvalids()), + type: 'error', + dismissQueue: true, + layout: 'topRight', + theme: 'defaultTheme', + timeout: 1500, + }); + }, rules: { userfile: { alternatives: $('#dropfolderfileform1') From 1e4a07be94c3bdee3bdb35e9fdf3811bb307ec95 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 6 Sep 2016 21:40:09 +0200 Subject: [PATCH 03/14] use ldap authentication if turned on --- webdav/webdav.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/webdav/webdav.php b/webdav/webdav.php index 487710d94..8c56b1d72 100644 --- a/webdav/webdav.php +++ b/webdav/webdav.php @@ -113,9 +113,27 @@ class HTTP_WebDAV_Server_SeedDMS extends HTTP_WebDAV_Server */ function check_auth($type, $user, $pass) /* {{{ */ { + global $settings; + if($this->logger) $this->logger->log('check_auth: type='.$type.', user='.$user.'', PEAR_LOG_INFO); - $userobj = $this->dms->getUserByLogin($user); + + $userobj = false; + + /* Authenticate against LDAP server {{{ */ + if (!$userobj && isset($settings->_ldapHost) && strlen($settings->_ldapHost)>0) { + require_once("../inc/inc.ClassLdapAuthentication.php"); + $authobj = new SeedDMS_LdapAuthentication($this->dms, $settings); + $userobj = $authobj->authenticate($user, $pass); + } /* }}} */ + + /* Authenticate against SeedDMS database {{{ */ + if(!$userobj) { + require_once("../inc/inc.ClassDbAuthentication.php"); + $authobj = new SeedDMS_DbAuthentication($this->dms, $settings); + $userobj = $authobj->authenticate($user, $pass); + } /* }}} */ + if(!$userobj) return false; if(md5($pass) != $userobj->getPwd()) From e94778ee70521887930d13a11d91af3c36444e3d Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 6 Sep 2016 21:41:13 +0200 Subject: [PATCH 04/14] add entry to 4.3.29 --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index e28549b80..e9a8e4857 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,7 @@ - new graph layout for workflow manager using cytoscape - show current workflow and highlight possible transitions on workflow tab of ViewDocument page +- webdav checks authentication against ldap and uses the authentication classes -------------------------------------------------------------------------------- Changes in version 4.3.28 From f2eac265f92ddcdac245cec4a309e7e8e6072a3b Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 7 Sep 2016 16:48:05 +0200 Subject: [PATCH 05/14] force reload of workflow transitions after adding new transition --- SeedDMS_Core/Core/inc.ClassWorkflow.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SeedDMS_Core/Core/inc.ClassWorkflow.php b/SeedDMS_Core/Core/inc.ClassWorkflow.php index 284011f6b..5288f333e 100644 --- a/SeedDMS_Core/Core/inc.ClassWorkflow.php +++ b/SeedDMS_Core/Core/inc.ClassWorkflow.php @@ -260,6 +260,10 @@ class SeedDMS_Core_Workflow { /* {{{ */ return false; } + /* force reloading all transitions otherwise getTransition() will fail if two + * transitions are added in a row, without reloading the workflow + */ + $this->_transitions = array(); $transition = $this->getTransition($db->getInsertID()); foreach($users as $user) { From 74d785623ecfbed884f2429b07dcb54307823083 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 7 Sep 2016 16:49:28 +0200 Subject: [PATCH 06/14] add note --- SeedDMS_Core/package.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SeedDMS_Core/package.xml b/SeedDMS_Core/package.xml index 78aee711e..1d7ebdfe6 100644 --- a/SeedDMS_Core/package.xml +++ b/SeedDMS_Core/package.xml @@ -25,6 +25,8 @@ GPL License - SeedDMЅ_Core_Object::getAttributes() orders attributes by name of attribute definition +- SeedDMЅ_Core_Workflow::addTransition() force reload of transition list after adding a +new transition From bfb29633deac0aaa2fdddfc455d56d542691cbd3 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 7 Sep 2016 16:49:52 +0200 Subject: [PATCH 07/14] fix calling php file --- utils/seeddms-xmldump | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/seeddms-xmldump b/utils/seeddms-xmldump index fe166dc73..2ac863e49 100755 --- a/utils/seeddms-xmldump +++ b/utils/seeddms-xmldump @@ -5,4 +5,4 @@ if [ -z "${SEEDDMS_HOME}" ]; then exit 1 fi -exec php -f "${SEEDDMS_HOME}/utils/xmldump" -- "${@}" +exec php -f "${SEEDDMS_HOME}/utils/xmldump.php" -- "${@}" From 7bf843f6c04311a57713fabd258bc5fca0259335 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Wed, 7 Sep 2016 16:50:10 +0200 Subject: [PATCH 08/14] add dumping workflows --- utils/xmldump.php | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/utils/xmldump.php b/utils/xmldump.php index af51ca072..7a081a201 100644 --- a/utils/xmldump.php +++ b/utils/xmldump.php @@ -105,6 +105,9 @@ $statistic = array( 'attributedefinitions'=>0, 'keywordcategories'=>0, 'documentcategories'=>0, + 'workflows'=>0, + 'workflowactions'=>0, + 'workflowstates'=>0, ); function dumplog($version, $type, $logs, $indent) { /* {{{ */ @@ -469,6 +472,13 @@ if($users) { } echo " \n"; } + if($mworkflows = $user->getMandatoryWorkflows()) { + echo " \n"; + foreach($mworkflows as $mworkflow) { + echo " getID()."\">\n"; + } + echo " \n"; + } echo " \n"; $statistic['users']++; } @@ -582,6 +592,72 @@ if($attrdefs) { } /* }}} */ +/* Dump workflows {{{ */ +if(!$sections || in_array('workflows', $sections)) { +$workflowstates = $dms->getAllWorkflowStates(); +if($workflowstates) { + echo "\n"; + foreach ($workflowstates as $workflowstate) { + echo " getID()."\">\n"; + echo " ".$workflowstate->getName()."\n"; + echo " ".$workflowstate->getDocumentStatus()."\n"; + echo " \n"; + $statistic['workflowstates']++; + } + echo "\n"; +} +$workflowactions = $dms->getAllWorkflowActions(); +if($workflowactions) { + echo "\n"; + foreach ($workflowactions as $workflowaction) { + echo " getID()."\">\n"; + echo " ".$workflowaction->getName()."\n"; + echo " \n"; + $statistic['workflowactions']++; + } + echo "\n"; +} +$workflows = $dms->getAllWorkflows(); +if($workflows) { + echo "\n"; + foreach ($workflows as $workflow) { + echo " getID()."\">\n"; + echo " ".$workflow->getName()."\n"; + echo " ".$workflow->getInitState()->getID()."\n"; + if($transitions = $workflow->getTransitions()) { + echo " \n"; + foreach($transitions as $transition) { + echo " getID()."\">\n"; + echo " ".$transition->getState()->getID()."\n"; + echo " ".$transition->getNextState()->getID()."\n"; + echo " ".$transition->getAction()->getID()."\n"; + echo " ".$transition->getMaxTime()."\n"; + if($transusers = $transition->getUsers()) { + echo " \n"; + foreach($transusers as $transuser) { + echo " getUser()->getID()."\">\n"; + } + echo " \n"; + } + if($transgroups = $transition->getGroups()) { + echo " \n"; + foreach($transgroups as $transgroup) { + echo " getGroup()->getID()."\" numofusers=\"".$transgroup->getNumOfUsers()."\">\n"; + } + echo " \n"; + } + echo " \n"; + } + echo " \n"; + } + echo " \n"; + $statistic['workflows']++; + } + echo "\n"; +} +} +/* }}} */ + /* Dump folders and documents {{{ */ $folder = $dms->getFolder($folderid); if($folder) { From 7a7a3ffb664fe03948f58c6aa876e6bbdb5c16ae Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 8 Sep 2016 15:20:13 +0200 Subject: [PATCH 09/14] import workflow --- utils/xmlimport.php | 241 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 236 insertions(+), 5 deletions(-) diff --git a/utils/xmlimport.php b/utils/xmlimport.php index cc7c874e6..9343fb538 100644 --- a/utils/xmlimport.php +++ b/utils/xmlimport.php @@ -216,6 +216,114 @@ function insert_keywordcategory($keywordcat) { /* {{{ */ return $newCategory; } /* }}} */ +function insert_workflow($workflow) { /* {{{ */ + global $dms, $debug, $objmap, $sections; + + if($debug) + print_r($workflow); + if($newWorkflow = $dms->getWorkflowByName($workflow['attributes']['name'])) { + echo "Workflow already exists\n"; + } else { + if(in_array('workflows', $sections)) { + if(!$initstate = $dms->getWorkflowState($objmap['workflowstates'][(int)$workflow['attributes']['initstate']])) { + echo "Error: could not add workflow because initial state is missing\n"; + return false; + } + if(!$newWorkflow = $dms->addWorkflow($workflow['attributes']['name'], $initstate)) { + echo "Error: could not add workflow\n"; + return false; + } + if($workflow['transitions']) { + foreach($workflow['transitions'] as $transition) { + if(!$state = $dms->getWorkflowState($objmap['workflowstates'][(int) $transition['attributes']['startstate']])) { + echo "Error: could not add workflow because start state of transition is missing\n"; + return false; + } + if(!$nextstate = $dms->getWorkflowState($objmap['workflowstates'][(int) $transition['attributes']['nextstate']])) { + echo "Error: could not add workflow because end state of transition is missing\n"; + return false; + } + if(!$action = $dms->getWorkflowAction($objmap['workflowactions'][(int) $transition['attributes']['action']])) { + echo "Error: could not add workflow because end state of transition is missing\n"; + return false; + } + $tusers = array(); + if($transition['users']) { + foreach($transition['users'] as $tuserid) { + if(!$tusers[] = $dms->getUser($objmap['users'][(int) $tuserid])) { + echo "Error: could not add workflow because user of transition is missing\n"; + return false; + } + } + } + $tgroups = array(); + if($transition['groups']) { + foreach($transition['groups'] as $tgroupid) { + if(!$tgroups[] = $dms->getGroup($objmap['groups'][(int) $tgroupid])) { + echo "Error: could not add workflow because group of transition is missing\n"; + return false; + } + } + } + if(!$newWorkflow->addTransition($state, $action, $nextstate, $tusers, $tgroups)) { + echo "Error: could not add workflow because transition could not be added\n"; + return false; + } + } + } + } else { + $newWorkflow = null; + } + } + if($newWorkflow) + $objmap['workflows'][$workflow['id']] = $newWorkflow->getID(); + return $newWorkflow; +} /* }}} */ + +function insert_workflowstate($workflowstate) { /* {{{ */ + global $dms, $debug, $objmap, $sections; + + if($debug) + print_r($workflowstate); + if($newWorkflowstate = $dms->getWorkflowStateByName($workflowstate['attributes']['name'])) { + echo "Workflow state already exists\n"; + } else { + if(in_array('workflows', $sections)) { + if(!$newWorkflowstate = $dms->addWorkflowState($workflowstate['attributes']['name'], isset($workflowstate['attributes']['documentstate']) ? $workflowstate['attributes']['documentstate'] : 0)) { + echo "Error: could not add workflow state\n"; + return false; + } + } else { + $newWorkflowstate = null; + } + } + if($newWorkflowstate) + $objmap['workflowstates'][$workflowstate['id']] = $newWorkflowstate->getID(); + return $newWorkflowstate; +} /* }}} */ + +function insert_workflowaction($workflowaction) { /* {{{ */ + global $dms, $debug, $objmap, $sections; + + if($debug) + print_r($workflowaction); + if($newWorkflowaction = $dms->getWorkflowActionByName($workflowaction['attributes']['name'])) { + echo "Workflow action already exists\n"; + } else { + if(in_array('workflows', $sections)) { + if(!$newWorkflowaction = $dms->addWorkflowAction($workflowaction['attributes']['name'])) { + echo "Error: could not add workflow action\n"; + return false; + } + } else { + $newWorkflowaction = null; + } + } + if($newWorkflowaction) + $objmap['workflowactions'][$workflowaction['id']] = $newWorkflowaction->getID(); + return $newWorkflowaction; +} /* }}} */ + function insert_document($document) { /* {{{ */ global $dms, $debug, $defaultUser, $objmap, $sections, $rootfolder; @@ -630,6 +738,9 @@ function insert_folder($folder) { /* {{{ */ function resolve_links() { /* {{{ */ global $dms, $debug, $defaultUser, $links, $objmap; + if(!$links) + return; + if($debug) print_r($links); foreach($links as $documentid=>$doclinks) { @@ -664,7 +775,7 @@ function resolve_links() { /* {{{ */ } /* }}} */ function startElement($parser, $name, $attrs) { /* {{{ */ - global $dms, $noversioncheck, $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link; + global $dms, $noversioncheck, $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; $parent = end($elementstack); array_push($elementstack, array('name'=>$name, 'attributes'=>$attrs)); @@ -681,9 +792,10 @@ function startElement($parser, $name, $attrs) { /* {{{ */ break; case "USER": /* users can be the users data, the member of a group, a mandatory - * reviewer or approver + * reviewer or approver, a workflow transition */ $first = $elementstack[1]; + $second = $elementstack[2]; if($first['name'] == 'USERS') { if($parent['name'] == 'MANDATORY_REVIEWERS') { $cur_user['individual']['reviewers'][] = (int) $attrs['ID']; @@ -695,6 +807,9 @@ function startElement($parser, $name, $attrs) { /* {{{ */ $cur_user['attributes'] = array(); $cur_user['individual']['reviewers'] = array(); $cur_user['individual']['approvers'] = array(); + $cur_user['group']['reviewers'] = array(); + $cur_user['group']['approvers'] = array(); + $cur_user['workflows'] = array(); } } elseif($first['name'] == 'GROUPS') { $cur_group['users'][] = (int) $attrs['USER']; @@ -704,10 +819,13 @@ function startElement($parser, $name, $attrs) { /* {{{ */ } elseif($first['name'] == 'DOCUMENT') { $cur_document['notifications']['users'][] = (int) $attrs['ID']; } + } elseif($second['name'] == 'WORKFLOW') { + $cur_transition['users'][] = (int) $attrs['ID']; } break; case "GROUP": $first = $elementstack[1]; + $second = $elementstack[2]; if($first['name'] == 'GROUPS') { $cur_group = array(); $cur_group['id'] = (int) $attrs['ID']; @@ -725,6 +843,8 @@ function startElement($parser, $name, $attrs) { /* {{{ */ } elseif($first['name'] == 'DOCUMENT') { $cur_document['notifications']['groups'][] = (int) $attrs['ID']; } + } elseif($second['name'] == 'WORKFLOW') { + $cur_transition['groups'][] = (int) $attrs['ID']; } break; case "DOCUMENT": @@ -817,6 +937,14 @@ function startElement($parser, $name, $attrs) { /* {{{ */ $cur_file['attributes'][$attrs['NAME']] = ''; } elseif($parent['name'] == 'LINK') { $cur_link['attributes'][$attrs['NAME']] = ''; + } elseif($parent['name'] == 'WORKFLOW') { + $cur_workflow['attributes'][$attrs['NAME']] = ''; + } elseif($parent['name'] == 'WORKFLOWTRANSITION') { + $cur_workflowtransition['attributes'][$attrs['NAME']] = ''; + } elseif($parent['name'] == 'WORKFLOWACTION') { + $cur_workflowaction['attributes'][$attrs['NAME']] = ''; + } elseif($parent['name'] == 'TRANSITION') { + $cur_transition['attributes'][$attrs['NAME']] = ''; } break; case "CATEGORIES": @@ -925,11 +1053,49 @@ function startElement($parser, $name, $attrs) { /* {{{ */ $cur_link['id'] = (int) $attrs['ID']; } break; + case "TRANSITIONS": + $first = $elementstack[2]; + if($first['name'] == 'WORKFLOW') { + $cur_workflow['transitions'] = array(); + } + break; + case "TRANSITION": + $first = $elementstack[2]; + if($first['name'] == 'WORKFLOW') { + $cur_transition = array(); + $cur_transition['id'] = (int) $attrs['ID']; + $cur_transition['users'] = array(); + $cur_transition['groups'] = array(); + } + break; + case "WORKFLOW": + $first = $elementstack[1]; + if($first['name'] == 'WORKFLOWS') { + $cur_workflow = array(); + $cur_workflow['id'] = (int) $attrs['ID']; + } elseif($parent['name'] == 'MANDATORY_WORKFLOWS') { + $cur_user['workflows'][] = (int) $attrs['ID']; + } + break; + case "WORKFLOWACTION": + $first = $elementstack[1]; + if($first['name'] == 'WORKFLOWACTIONS') { + $cur_workflowaction = array(); + $cur_workflowaction['id'] = (int) $attrs['ID']; + } + break; + case "WORKFLOWSTATE": + $first = $elementstack[1]; + if($first['name'] == 'WORKFLOWSTATES') { + $cur_workflowstate = array(); + $cur_workflowstate['id'] = (int) $attrs['ID']; + } + break; } } /* }}} */ function endElement($parser, $name) { /* {{{ */ - global $dms, $sections, $rootfolder, $objmap, $elementstack, $users, $groups, $links,$cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link; + global $dms, $sections, $rootfolder, $objmap, $elementstack, $users, $groups, $links,$cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; array_pop($elementstack); $parent = end($elementstack); @@ -999,11 +1165,61 @@ function endElement($parser, $name) { /* {{{ */ $cur_document['links'][] = $cur_link; } break; + case "TRANSITION": + $second = $elementstack[2]; + if($second['name'] == 'WORKFLOW') { + $cur_workflow['transitions'][] = $cur_transition; + } + break; + case 'WORKFLOW': + $first = $elementstack[1]; + if($first['name'] == 'WORKFLOWS') { + insert_workflow($cur_workflow); + } + break; + case 'WORKFLOWACTION': + insert_workflowaction($cur_workflowaction); + break; + case 'WORKFLOWSTATE': + insert_workflowstate($cur_workflowstate); + break; + case 'WORKFLOWS': + /* Workflows has all been added. It's time to set the mandatory workflows + * of each user. + */ + foreach($users as $tuser) { + if($tuser['workflows']) { + if(!$user = $dms->getUser($objmap['users'][$tuser['id']])) { + echo "Error: Cannot find user for adding mandatory workflows\n"; + exit; + } + foreach($tuser['workflows'] as $tworkflowid) { + if(!$wk = $dms->getWorkflow($objmap['workflows'][$tworkflowid])) { + echo "Error: Cannot find workflow for adding mandatory workflows\n"; + exit; + } + $user->setMandatoryWorkflow($wk); + } + foreach($tuser['individual']['reviewers'] as $userid) { + $user->setMandatoryReviewer($objmap['users'][$userid], false); + } + foreach($tuser['individual']['approvers'] as $userid) { + $user->setMandatoryApprover($objmap['users'][$userid], false); + } + foreach($tuser['group']['reviewers'] as $groupid) { + $user->setMandatoryReviewer($objmap['groups'][$groupid], true); + } + foreach($tuser['group']['approvers'] as $userid) { + $user->setMandatoryApprover($objmap['groups'][$groupid], true); + } + } + } + break; } } /* }}} */ function characterData($parser, $data) { /* {{{ */ - global $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link; + global $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; $current = end($elementstack); $parent = prev($elementstack); @@ -1091,6 +1307,18 @@ function characterData($parser, $data) { /* {{{ */ case 'LINK': $cur_link['attributes'][$current['attributes']['NAME']] = $data; break; + case 'WORKFLOW': + $cur_workflow['attributes'][$current['attributes']['NAME']] = $data; + break; + case 'WORKFLOWSTATE': + $cur_workflowstate['attributes'][$current['attributes']['NAME']] = $data; + break; + case 'WORKFLOWACTION': + $cur_workflowaction['attributes'][$current['attributes']['NAME']] = $data; + break; + case 'TRANSITION': + $cur_transition['attributes'][$current['attributes']['NAME']] = $data; + break; } break; case 'DATA': @@ -1192,7 +1420,7 @@ if(isset($options['no-version-check'])) { $noversioncheck = true; } -$sections = array('documents', 'folders', 'groups', 'users', 'keywordcategories', 'documentcategories', 'attributedefinitions'); +$sections = array('documents', 'folders', 'groups', 'users', 'keywordcategories', 'documentcategories', 'attributedefinitions', 'workflows'); if(isset($options['sections'])) { $sections = explode(',', $options['sections']); } @@ -1235,6 +1463,9 @@ $objmap = array( 'groups' => array(), 'folders' => array(), 'documents' => array(), + 'workflows' => array(), + 'workflowstates' => array(), + 'workflowactions' => array(), ); $xml_parser = xml_parser_create("UTF-8"); From 19c80748e30518cc717377d15cfc4f59e249470e Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 13 Sep 2016 17:09:00 +0200 Subject: [PATCH 10/14] export workflow --- utils/xmldump.php | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/utils/xmldump.php b/utils/xmldump.php index 7a081a201..38579f4c0 100644 --- a/utils/xmldump.php +++ b/utils/xmldump.php @@ -182,7 +182,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ if($attributes = $folder->getAttributes()) { foreach($attributes as $attribute) { $attrdef = $attribute->getAttributeDefinition(); - echo $indent." getID()."\">".$attribute->getValue()."\n"; + echo $indent." getID()."\">".wrapWithCData($attribute->getValue())."\n"; } } if($folder->inheritsAccess()) { @@ -225,7 +225,8 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ if($documents) { foreach($documents as $document) { $owner = $document->getOwner(); - echo $indent."getId()."\" folder=\"".$folder->getID()."\""; + /* parent folder is only set if it is no skipped */ + echo $indent."getId()."\"".(!$skipcurrent ? " folder=\"".$folder->getID()."\"" : ""); if($document->isLocked()) echo " locked=\"true\""; echo ">\n"; @@ -285,8 +286,6 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ if($versions) { echo $indent." \n"; foreach($versions as $version) { - $approvalStatus = $version->getApprovalStatus(30); - $reviewStatus = $version->getReviewStatus(30); $owner = $version->getUser(); echo $indent." getVersion()."\">\n"; echo $indent." ".$version->getMimeType()."\n"; @@ -313,12 +312,33 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ } echo $indent." \n"; } + $approvalStatus = $version->getApprovalStatus(30); if($approvalStatus) { dumplog($version, 'approval', $approvalStatus, $indent); } + $reviewStatus = $version->getReviewStatus(30); if($reviewStatus) { dumplog($version, 'review', $reviewStatus, $indent); } + $workflow = $version->getWorkflow(); + if($workflow) { + $workflowstate = $version->getWorkflowState(); + echo $indent." getID()."\" state=\"".$workflowstate->getID()."\">\n"; + } + $wkflogs = $version->getWorkflowLog(); + if($wkflogs) { + echo $indent." \n"; + foreach($wkflogs as $wklog) { + echo $indent." \n"; + echo $indent." ".$wklog->getDate()."\n"; + echo $indent." ".$wklog->getTransition()->getID()."\n"; + $loguser = $wklog->getUser(); + echo $indent." ".$loguser->getID()."\n"; + echo $indent." ".wrapWithCData($wklog->getComment())."\n"; + echo $indent." \n"; + } + echo $indent." \n"; + } if(file_exists($dms->contentDir . $version->getPath())) { echo $indent." contentDir . $version->getPath())."\""; if(filesize($dms->contentDir . $version->getPath()) < $maxsize) { @@ -449,7 +469,8 @@ if($users) { if($image = $user->getImage()) { echo " \n"; echo " ".$image['mimeType']."\n"; - echo " ".base64_encode($image['image'])."\n"; + /* image data is already base64 coded */ + echo " ".$image['image']."\n"; echo " \n"; } if($mreviewers = $user->getMandatoryReviewers()) { From 74277d9e766a3e59dc041e6ca08424d7148e527c Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 13 Sep 2016 17:09:19 +0200 Subject: [PATCH 11/14] use logger, lots of bug fixes --- utils/xmlimport.php | 329 ++++++++++++++++++++++++++++++-------------- 1 file changed, 227 insertions(+), 102 deletions(-) diff --git a/utils/xmlimport.php b/utils/xmlimport.php index 9343fb538..a020c81a1 100644 --- a/utils/xmlimport.php +++ b/utils/xmlimport.php @@ -1,5 +1,6 @@ $review) { @@ -45,7 +46,7 @@ function getRevAppLog($reviews) { /* {{{ */ $newreview['logs'] = array(); foreach($review['logs'] as $j=>$log) { if(!array_key_exists($log['attributes']['user'], $objmap['users'])) { - echo "Warning: user for review log cannot be mapped\n"; + $logger->warning("User for review log cannot be mapped"); } else { $newlog = array(); $newlog['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]); @@ -61,12 +62,12 @@ function getRevAppLog($reviews) { /* {{{ */ } /* }}} */ function insert_user($user) { /* {{{ */ - global $dms, $debug, $sections, $defaultUser, $objmap; + global $logger, $dms, $debug, $sections, $defaultUser, $objmap; if($debug) print_r($user); if ($newUser = $dms->getUserByLogin($user['attributes']['login'])) { - echo "User '".$user['attributes']['login']."' already exists\n"; + $logger->info("User '".$user['attributes']['login']."' already exists"); } else { if(in_array('users', $sections)) { $newUser = $dms->addUser( @@ -82,8 +83,17 @@ function insert_user($user) { /* {{{ */ $user['attributes']['disabled'], $user['attributes']['pwdexpiration']); if(!$newUser) { - echo "Error: could not add user\n"; + $logger->err("Could not add user"); return false; + } else { + $logger->info("Added user '".$user['attributes']['login']."'"); + if(isset($user['image']) && $user['image']) { + $filecontents = base64_decode($user['image']['data']); + $filename = tempnam('/tmp', 'FOO-User-Img'); + file_put_contents($filename, $filecontents); + $newUser->setImage($filename, $user['image']['mimetype']); + unlink($filename); + } } } else { $newUser = $defaultUser; @@ -95,16 +105,17 @@ function insert_user($user) { /* {{{ */ } /* }}} */ function insert_group($group) { /* {{{ */ - global $dms, $debug, $objmap, $sections, $users; + global $logger, $dms, $debug, $objmap, $sections, $users; if($debug) print_r($group); if ($newGroup = $dms->getGroupByName($group['attributes']['name'])) { - echo "Group already exists\n"; + $logger->info("Group already exists"); } else { if(in_array('groups', $sections)) { $newGroup = $dms->addGroup($group['attributes']['name'], $group['attributes']['comment']); if($newGroup) { + $logger->info("Added group '".$group['attributes']['name']."'"); foreach($group['users'] as $guser) { /* Check if user is in array of users which has been previously filled * by the users in the xml file. Alternative, we could check if the @@ -113,18 +124,20 @@ function insert_group($group) { /* {{{ */ if(isset($users[$guser])) { $user = $users[$guser]; if($newMember = $dms->getUserByLogin($user['attributes']['login'])) { - $newGroup->addUser($newMember); + if($newGroup->addUser($newMember)) { + $logger->info("Added user '".$newMember->getLogin()."' to group '".$group['attributes']['name']."'"); + } } else { - echo "Error: could not find member of group\n"; + $logger->err("Could not find member of group"); return false; } } else { - echo "Error: group member is not contained in xml file\n"; + $logger->err("Group member is not contained in xml file"); return false; } } } else { - echo "Error: could not add group\n"; + $logger->err("Could not add group"); return false; } } else { @@ -137,17 +150,19 @@ function insert_group($group) { /* {{{ */ } /* }}} */ function insert_attributedefinition($attrdef) { /* {{{ */ - global $dms, $debug, $objmap, $sections; + global $logger, $dms, $debug, $objmap, $sections; if($debug) print_r($attrdef); if($newAttrdef = $dms->getAttributeDefinitionByName($attrdef['attributes']['name'])) { - echo "Attribute definition already exists\n"; + $logger->info("Attribute definition already exists"); } else { if(in_array('attributedefinitions', $sections)) { if(!$newAttrdef = $dms->addAttributeDefinition($attrdef['attributes']['name'], $attrdef['objecttype'], $attrdef['attributes']['type'], $attrdef['attributes']['multiple'], $attrdef['attributes']['minvalues'], $attrdef['attributes']['maxvalues'], $attrdef['attributes']['valueset'], $attrdef['attributes']['regex'])) { - echo "Error: could not add attribute definition\n"; + $logger->err("Could not add attribute definition"); return false; + } else { + $logger->info("Added attribute definition '".$attrdef['attributes']['name']."'"); } } else { $newAttrdef = null; @@ -159,17 +174,19 @@ function insert_attributedefinition($attrdef) { /* {{{ */ } /* }}} */ function insert_documentcategory($documentcat) { /* {{{ */ - global $dms, $debug, $objmap, $sections; + global $logger, $dms, $debug, $objmap, $sections; if($debug) print_r($documentcat); if($newCategory = $dms->getDocumentCategoryByName($documentcat['attributes']['name'])) { - echo "Document category already exists\n"; + $logger->info("Document category already exists"); } else { if(in_array('documentcategories', $sections)) { if(!$newCategory = $dms->addDocumentCategory($documentcat['attributes']['name'])) { - echo "Error: could not add document category\n"; + $logger->err("Error: could not add document category"); return false; + } else { + $logger->info("Added document category '".$documentcat['attributes']['name']."'"); } } else { $newCategory = null; @@ -182,27 +199,29 @@ function insert_documentcategory($documentcat) { /* {{{ */ } /* }}} */ function insert_keywordcategory($keywordcat) { /* {{{ */ - global $dms, $debug, $objmap, $sections; + global $logger, $dms, $debug, $objmap, $sections; if($debug) print_r($keywordcat); if(!array_key_exists((int) $keywordcat['attributes']['owner'], $objmap['users'])) { - echo "Error: owner of keyword category cannot be found\n"; + $logger->err("Owner of keyword category cannot be found"); return false; } $owner = $objmap['users'][(int) $keywordcat['attributes']['owner']]; if($newCategory = $dms->getKeywordCategoryByName($keywordcat['attributes']['name'], $owner)) { - echo "Document category already exists\n"; + $logger->info("Document category already exists"); } else { if(in_array('keywordcategories', $sections)) { if(!$newCategory = $dms->addKeywordCategory($owner, $keywordcat['attributes']['name'])) { - echo "Error: could not add keyword category\n"; + $logger->err("Could not add keyword category"); return false; + } else { + $logger->info("Added keyword category '".$keywordcat['attributes']['name']."'"); } foreach($keywordcat['keywords'] as $keyword) { if(!$newCategory->addKeywordList($keyword['attributes']['name'])) { - echo "Error: could not add keyword to keyword category\n"; + $logger->err("Could not add keyword to keyword category"); return false; } } @@ -217,41 +236,43 @@ function insert_keywordcategory($keywordcat) { /* {{{ */ } /* }}} */ function insert_workflow($workflow) { /* {{{ */ - global $dms, $debug, $objmap, $sections; + global $logger, $dms, $debug, $objmap, $sections; if($debug) print_r($workflow); if($newWorkflow = $dms->getWorkflowByName($workflow['attributes']['name'])) { - echo "Workflow already exists\n"; + $logger->info("Workflow already exists"); } else { if(in_array('workflows', $sections)) { if(!$initstate = $dms->getWorkflowState($objmap['workflowstates'][(int)$workflow['attributes']['initstate']])) { - echo "Error: could not add workflow because initial state is missing\n"; + $logger->err("Could not add workflow because initial state is missing"); return false; } if(!$newWorkflow = $dms->addWorkflow($workflow['attributes']['name'], $initstate)) { - echo "Error: could not add workflow\n"; + $logger->err("Could not add workflow"); return false; + } else { + $logger->info("Added workflow '".$workflow['attributes']['name']."'"); } if($workflow['transitions']) { foreach($workflow['transitions'] as $transition) { if(!$state = $dms->getWorkflowState($objmap['workflowstates'][(int) $transition['attributes']['startstate']])) { - echo "Error: could not add workflow because start state of transition is missing\n"; + $logger->err("Could not add workflow because start state of transition is missing"); return false; } if(!$nextstate = $dms->getWorkflowState($objmap['workflowstates'][(int) $transition['attributes']['nextstate']])) { - echo "Error: could not add workflow because end state of transition is missing\n"; + $logger->err("Could not add workflow because end state of transition is missing"); return false; } if(!$action = $dms->getWorkflowAction($objmap['workflowactions'][(int) $transition['attributes']['action']])) { - echo "Error: could not add workflow because end state of transition is missing\n"; + $logger->err("Could not add workflow because end state of transition is missing"); return false; } $tusers = array(); if($transition['users']) { foreach($transition['users'] as $tuserid) { if(!$tusers[] = $dms->getUser($objmap['users'][(int) $tuserid])) { - echo "Error: could not add workflow because user of transition is missing\n"; + $logger->err("Could not add workflow because user of transition is missing"); return false; } } @@ -260,13 +281,13 @@ function insert_workflow($workflow) { /* {{{ */ if($transition['groups']) { foreach($transition['groups'] as $tgroupid) { if(!$tgroups[] = $dms->getGroup($objmap['groups'][(int) $tgroupid])) { - echo "Error: could not add workflow because group of transition is missing\n"; + $logger->err("Could not add workflow because group of transition is missing"); return false; } } } if(!$newWorkflow->addTransition($state, $action, $nextstate, $tusers, $tgroups)) { - echo "Error: could not add workflow because transition could not be added\n"; + $logger->err("Could not add workflow because transition could not be added"); return false; } } @@ -281,17 +302,19 @@ function insert_workflow($workflow) { /* {{{ */ } /* }}} */ function insert_workflowstate($workflowstate) { /* {{{ */ - global $dms, $debug, $objmap, $sections; + global $logger, $dms, $debug, $objmap, $sections; if($debug) print_r($workflowstate); if($newWorkflowstate = $dms->getWorkflowStateByName($workflowstate['attributes']['name'])) { - echo "Workflow state already exists\n"; + $logger->info("Workflow state already exists"); } else { if(in_array('workflows', $sections)) { if(!$newWorkflowstate = $dms->addWorkflowState($workflowstate['attributes']['name'], isset($workflowstate['attributes']['documentstate']) ? $workflowstate['attributes']['documentstate'] : 0)) { - echo "Error: could not add workflow state\n"; + $logger->err("Could not add workflow state"); return false; + } else { + $logger->info("Added workflow state '".$workflowstate['attributes']['name']."'"); } } else { $newWorkflowstate = null; @@ -303,17 +326,19 @@ function insert_workflowstate($workflowstate) { /* {{{ */ } /* }}} */ function insert_workflowaction($workflowaction) { /* {{{ */ - global $dms, $debug, $objmap, $sections; + global $logger, $dms, $debug, $objmap, $sections; if($debug) print_r($workflowaction); if($newWorkflowaction = $dms->getWorkflowActionByName($workflowaction['attributes']['name'])) { - echo "Workflow action already exists\n"; + $logger->info("Workflow action already exists"); } else { if(in_array('workflows', $sections)) { if(!$newWorkflowaction = $dms->addWorkflowAction($workflowaction['attributes']['name'])) { - echo "Error: could not add workflow action\n"; + $logger->err("Could not add workflow action"); return false; + } else { + $logger->info("Added workflow action '".$workflowaction['attributes']['name']."'"); } } else { $newWorkflowaction = null; @@ -325,12 +350,13 @@ function insert_workflowaction($workflowaction) { /* {{{ */ } /* }}} */ function insert_document($document) { /* {{{ */ - global $dms, $debug, $defaultUser, $objmap, $sections, $rootfolder; + global $logger, $dms, $debug, $defaultUser, $objmap, $sections, $rootfolder, $contentdir; - if($debug) print_r($document); + if($debug) + print_r($document); if(!array_key_exists((int) $document['attributes']['owner'], $objmap['users'])) { - echo "Warning: owner of document cannot be mapped using default user\n"; + $logger->warning("Owner of document cannot be mapped using default user"); $owner = $defaultUser; } else { $owner = $dms->getUser($objmap['users'][(int) $document['attributes']['owner']]); @@ -342,7 +368,7 @@ function insert_document($document) { /* {{{ */ if(array_key_exists((int) $orgid, $objmap['attributedefs'])) { $attributes[$objmap['attributedefs'][$orgid]] = $value; } else { - echo "Warning: User attribute ".$orgid." cannot be mapped\n"; + $logger->warning("User attribute ".$orgid." cannot be mapped"); } } } @@ -352,7 +378,7 @@ function insert_document($document) { /* {{{ */ if(array_key_exists((int) $catid, $objmap['documentcategories'])) { $categories[$objmap['documentcategories'][$catid]] = $dms->getDocumentCategory($objmap['documentcategories'][$catid]); } else { - echo "Warning: Category ".$catid." cannot be mapped\n"; + $logger->warning("Category ".$catid." cannot be mapped"); } } } @@ -361,7 +387,7 @@ function insert_document($document) { /* {{{ */ if(array_key_exists($document['folder'], $objmap['folders'])) { $folder = $dms->getFolder($objmap['folders'][$document['folder']]); } else { - echo "Error: folder ".$document['folder']." cannot be mapped\n"; + $logger->err("Folder ".$document['folder']." cannot be mapped"); return false; } } else @@ -372,11 +398,11 @@ function insert_document($document) { /* {{{ */ $initversion = array_shift($document['versions']); if(!empty($initversion['fileref'])) { $filename = tempnam('/tmp', 'FOO'); - copy($initversion['fileref'], $filename); + copy($contentdir.$initversion['fileref'], $filename); } else { $filecontents = base64_decode($initversion['data']); if(strlen($filecontents) != $initversion['data_length']) { - echo "Warning: file length (".strlen($filecontents).") doesn't match expected length (".$initversion['data_length'].").\n"; + $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$initversion['data_length'].")."); $newDocument = null; $error = true; } @@ -412,13 +438,28 @@ function insert_document($document) { /* {{{ */ } } */ + + $workflow = null; + if(isset($initversion['workflow']) && $initversion['workflow']) { + if(array_key_exists((int) $initversion['workflow']['id'], $objmap['workflows'])) { + $workflow = $dms->getWorkflow($objmap['workflows'][(int) $initversion['workflow']['id']]); + if(!$workflow) { + $logger->warning("Workflow ".$orgid." cannot be mapped"); + } + } else { + $logger->warning("Workflow ".$initversion['workflow']['id']." cannot be mapped"); + } + } + if($initversion['workflowlogs']) { + } + $version_attributes = array(); if(isset($initversion['user_attributes'])) { foreach($initversion['user_attributes'] as $orgid=>$value) { if(array_key_exists((int) $orgid, $objmap['attributedefs'])) { $version_attributes[$objmap['attributedefs'][$orgid]] = $value; } else { - echo "Warning: User attribute ".$orgid." cannot be mapped\n"; + $logger->warning("User attribute ".$orgid." cannot be mapped"); } } } @@ -440,23 +481,34 @@ function insert_document($document) { /* {{{ */ isset($initversion['attributes']['comment']) ? $initversion['attributes']['comment'] : '', $attributes, $version_attributes, - null //workflow + $workflow ) ) { unlink($filename); - echo "Error: could not add document\n"; + $logger->err("Could not add document '".$document['attributes']['name']."'"); return false; } else { + $logger->info("Added document '".$document['attributes']['name']."'"); $newDocument = $result[0]; unlink($filename); + if(isset($document['attributes']['lockedby'])) { + if(!array_key_exists($document['attributes']['lockedby'], $objmap['users'])) { + $logger->warning("User for document lock cannot be mapped"); + } else { + if($lockuser = $dms->getUser($objmap['users'][$document['attributes']['lockedby']])) { + $newDocument->setLocked($lockuser); + } + } + } + $newVersion = $result[1]->getContent(); $newVersion->setDate(dateToTimestamp($initversion['attributes']['date'])); $newlogs = array(); foreach($initversion['statuslogs'] as $i=>$log) { if(!array_key_exists($log['attributes']['user'], $objmap['users'])) { unset($initversion['statuslogs'][$i]); - echo "Warning: user for status log cannot be mapped\n"; + $logger->warning("User for status log cannot be mapped"); } else { $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]); $newlogs[] = $log['attributes']; @@ -478,7 +530,7 @@ function insert_document($document) { /* {{{ */ $newDocument->setDefaultAccess($document['attributes']['defaultaccess']); foreach($document['versions'] as $version) { if(!array_key_exists((int) $version['attributes']['owner'], $objmap['users'])) { - echo "Error: owner of document cannot be mapped\n"; + $logger->err("Owner of document cannot be mapped"); return false; } $owner = $dms->getUser($objmap['users'][(int) $version['attributes']['owner']]); @@ -517,17 +569,17 @@ function insert_document($document) { /* {{{ */ if(array_key_exists((int) $orgid, $objmap['attributedefs'])) { $version_attributes[$objmap['attributedefs'][$orgid]] = $value; } else { - echo "Warning: User attribute ".$orgid." cannot be mapped\n"; + $logger->warning("User attribute ".$orgid." cannot be mapped"); } } } if(!empty($version['fileref'])) { $filename = tempnam('/tmp', 'FOO'); - copy($version['fileref'], $filename); + copy($contentdir.$version['fileref'], $filename); } else { $filecontents = base64_decode($version['data']); if(strlen($filecontents) != $version['data_length']) { - echo "Warning: file length (".strlen($filecontents).") doesn't match expected length (".$version['data_length'].").\n"; + $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$version['data_length'].")."); } $filename = tempnam('/tmp', 'FOO'); file_put_contents($filename, $filecontents); @@ -552,7 +604,7 @@ function insert_document($document) { /* {{{ */ foreach($version['statuslogs'] as $i=>$log) { if(!array_key_exists($log['attributes']['user'], $objmap['users'])) { unset($version['statuslogs'][$i]); - echo "Warning: user for status log cannot be mapped\n"; + $logger->warning("User for status log cannot be mapped"); } else { $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]); $newlogs[] = $log['attributes']; @@ -575,7 +627,7 @@ function insert_document($document) { /* {{{ */ if(isset($document['notifications']['users']) && $document['notifications']['users']) { foreach($document['notifications']['users'] as $userid) { if(!array_key_exists($userid, $objmap['users'])) { - echo "Warning: user for notification cannot be mapped\n"; + $logger->warning("User for notification cannot be mapped"); } else { $newDocument->addNotify($objmap['users'][$userid], 1); } @@ -584,7 +636,7 @@ function insert_document($document) { /* {{{ */ if(isset($document['notifications']['groups']) && $document['notifications']['groups']) { foreach($document['notifications']['groups'] as $groupid) { if(!array_key_exists($groupid, $objmap['groups'])) { - echo "Warning: user for notification cannot be mapped\n"; + $logger->warning("User for notification cannot be mapped"); } else { $newDocument->addNotify($objmap['groups'][$groupid], 0); } @@ -595,13 +647,13 @@ function insert_document($document) { /* {{{ */ foreach($document['acls'] as $acl) { if($acl['type'] == 'user') { if(!array_key_exists($acl['user'], $objmap['users'])) { - echo "Warning: user for notification cannot be mapped\n"; + $logger->warning("User for notification cannot be mapped"); } else { $newDocument->addAccess($acl['mode'], $objmap['users'][$acl['user']], 1); } } elseif($acl['type'] == 'group') { if(!array_key_exists($acl['group'], $objmap['groups'])) { - echo "Warning: group for notification cannot be mapped\n"; + $logger->warning("Group for notification cannot be mapped"); } else { $newDocument->addAccess($acl['mode'], $objmap['groups'][$acl['group']], 0); } @@ -611,18 +663,18 @@ function insert_document($document) { /* {{{ */ if(isset($document['files']) && $document['files']) { foreach($document['files'] as $file) { if(!array_key_exists($file['attributes']['owner'], $objmap['users'])) { - echo "Warning: user for file cannot be mapped\n"; + $logger->warning("User for file cannot be mapped"); $owner = $defaultUser; } else { $owner = $dms->getUser($objmap['users'][$file['attributes']['owner']]); } if(!empty($file['fileref'])) { $filename = tempnam('/tmp', 'FOO'); - copy($file['fileref'], $filename); + copy($contentdir.$file['fileref'], $filename); } else { $filecontents = base64_decode($file['data']); if(strlen($filecontents) != $file['data_length']) { - echo "Warning: file length (".strlen($filecontents).") doesn't match expected length (".$file['data_length'].").\n"; + $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$file['data_length'].")."); } $filename = tempnam('/tmp', 'FOO'); file_put_contents($filename, $filecontents); @@ -650,13 +702,13 @@ function insert_document($document) { /* {{{ */ } /* }}} */ function insert_folder($folder) { /* {{{ */ - global $dms, $debug, $objmap, $defaultUser, $sections, $rootfolder; + global $logger, $dms, $debug, $objmap, $defaultUser, $sections, $rootfolder; if($debug) print_r($folder); if(in_array('folders', $sections)) { if(!array_key_exists($folder['attributes']['owner'], $objmap['users'])) { - echo "Warning: owner of folder cannot be mapped using default user\n"; + $logger->warning("Owner of folder cannot be mapped using default user"); $owner = $defaultuser; } else { $owner = $dms->getUser($objmap['users'][(int) $folder['attributes']['owner']]); @@ -668,7 +720,7 @@ function insert_folder($folder) { /* {{{ */ if(array_key_exists((int) $orgid, $objmap['attributedefs'])) { $attributes[$objmap['attributedefs'][$orgid]] = $value; } else { - echo "Warning: User attribute ".$orgid." cannot be mapped\n"; + $logger->warning("User attribute ".$orgid." cannot be mapped"); } } } @@ -677,15 +729,17 @@ function insert_folder($folder) { /* {{{ */ if(array_key_exists($folder['folder'], $objmap['folders'])) { $parent = $dms->getFolder($objmap['folders'][$folder['folder']]); } else { - echo "Error: Folder ".$folder['folder']." cannot be mapped\n"; + $logger->err("Folder ".$folder['folder']." cannot be mapped"); exit; } } else $parent = $rootfolder; if(!$newFolder = $parent->addSubFolder($folder['attributes']['name'], $folder['attributes']['comment'], $owner, $folder['attributes']['sequence'], $attributes)) { - echo "Error: could not add folder\n"; + $logger->err("Could not add folder"); return false; + } else { + $logger->info("Added folder '".$folder['attributes']['name']."'"); } $newFolder->setDate(dateToTimestamp($folder['attributes']['date'])); @@ -693,7 +747,7 @@ function insert_folder($folder) { /* {{{ */ if(isset($folder['notifications']['users']) && $folder['notifications']['users']) { foreach($folder['notifications']['users'] as $userid) { if(!array_key_exists($userid, $objmap['users'])) { - echo "Warning: user for notification cannot be mapped\n"; + $logger->warning("User for notification cannot be mapped"); } else { $newFolder->addNotify($objmap['users'][$userid], 1); } @@ -702,7 +756,7 @@ function insert_folder($folder) { /* {{{ */ if(isset($folder['notifications']['groups']) && $folder['notifications']['groups']) { foreach($folder['notifications']['groups'] as $groupid) { if(!array_key_exists($groupid, $objmap['groups'])) { - echo "Warning: user for notification cannot be mapped\n"; + $logger->warning("User for notification cannot be mapped"); } else { $newFolder->addNotify($objmap['groups'][$groupid], 0); } @@ -713,13 +767,13 @@ function insert_folder($folder) { /* {{{ */ foreach($folder['acls'] as $acl) { if($acl['type'] == 'user') { if(!array_key_exists($acl['user'], $objmap['users'])) { - echo "Warning: user for notification cannot be mapped\n"; + $logger->warning("User for notification cannot be mapped"); } else { $newFolder->addAccess($acl['mode'], $objmap['users'][$acl['user']], 1); } } elseif($acl['type'] == 'group') { if(!array_key_exists($acl['group'], $objmap['groups'])) { - echo "Warning: group for notification cannot be mapped\n"; + $logger->warning("Group for notification cannot be mapped"); } else { $newFolder->addAccess($acl['mode'], $objmap['groups'][$acl['group']], 0); } @@ -736,7 +790,7 @@ function insert_folder($folder) { /* {{{ */ } /* }}} */ function resolve_links() { /* {{{ */ - global $dms, $debug, $defaultUser, $links, $objmap; + global $logger, $dms, $debug, $defaultUser, $links, $objmap; if(!$links) return; @@ -750,32 +804,32 @@ function resolve_links() { /* {{{ */ if(array_key_exists($doclink['attributes']['target'], $objmap['documents'])) { if($target = $dms->getDocument($objmap['documents'][$doclink['attributes']['target']])) { if(!array_key_exists($doclink['attributes']['owner'], $objmap['users'])) { - echo "Warning: user for link cannot be mapped using default user\n"; + $logger->warning("User for link cannot be mapped using default user"); $owner = $defaultUser; } else { $owner = $dms->getUser($objmap['users'][$doclink['attributes']['owner']]); } if(!$doc->addDocumentLink($target->getID(), $owner->getID(), $doclink['attributes']['public'])) { - echo "Error: could not add document link from ".$doc->getID()." to ".$target->getID()."\n"; + $logger->err("Could not add document link from ".$doc->getID()." to ".$target->getID()); } } else { - echo "Warning: target document not found in database\n"; + $logger->warning("Target document not found in database"); } } else { - echo "Warning: target document not found in object mapping\n"; + $logger->warning("Target document not found in object mapping"); } } } else { - echo "Warning: document not found in database\n"; + $logger->warning("Document not found in database"); } } else { - echo "Warning: document not found in object mapping\n"; + $logger->warning("Document not found in object mapping"); } } } /* }}} */ function startElement($parser, $name, $attrs) { /* {{{ */ - global $dms, $noversioncheck, $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; + global $logger, $dms, $noversioncheck, $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_workflowlog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; $parent = end($elementstack); array_push($elementstack, array('name'=>$name, 'attributes'=>$attrs)); @@ -785,7 +839,7 @@ function startElement($parser, $name, $attrs) { /* {{{ */ $xdbversion = explode('.', $attrs['DBVERSION']); $dbversion = $dms->getDBVersion(); if(($xdbversion[0] != $dbversion['major']) || ($xdbversion[1] != $dbversion['minor'])) { - echo "Error: Database version (".implode('.', array($dbversion['major'], $dbversion['minor'], $dbversion['subminor'])).") doesn't match version in input file (".implode('.', $xdbversion).").\n"; + $logger->crit("Database version (".implode('.', array($dbversion['major'], $dbversion['minor'], $dbversion['subminor'])).") doesn't match version in input file (".implode('.', $xdbversion).")."); exit(1); } } @@ -850,7 +904,11 @@ function startElement($parser, $name, $attrs) { /* {{{ */ case "DOCUMENT": $cur_document = array(); $cur_document['id'] = (int) $attrs['ID']; - $cur_document['folder'] = (int) $attrs['FOLDER']; + + if(isset($attrs['FOLDER'])) + $cur_document['folder'] = (int) $attrs['FOLDER']; + if(isset($attrs['LOCKED']) && $attrs['LOCKED'] == 'true') + $cur_document['locked'] = true; $cur_document['attributes'] = array(); $cur_document['versions'] = array(); break; @@ -867,11 +925,20 @@ function startElement($parser, $name, $attrs) { /* {{{ */ $cur_version['attributes'] = array(); $cur_version['approvals'] = array(); $cur_version['reviews'] = array(); + $cur_version['statuslogs'] = array(); + $cur_version['workflowlogs'] = array(); break; case "STATUSLOG": $cur_statuslog = array(); $cur_statuslog['attributes'] = array(); break; + case "WORKFLOWLOGS": + $cur_version['workflowlogs'] = array(); + break; + case "WORKFLOWLOG": + $cur_workflowlog = array(); + $cur_workflowlog['attributes'] = array(); + break; case "APPROVAL": $cur_approval = array(); $cur_approval['attributes'] = array(); @@ -911,6 +978,8 @@ function startElement($parser, $name, $attrs) { /* {{{ */ } } elseif($parent['name'] == 'STATUSLOG') { $cur_statuslog['attributes'][$attrs['NAME']] = ''; + } elseif($parent['name'] == 'WORKFLOWLOG') { + $cur_workflowlog['attributes'][$attrs['NAME']] = ''; } elseif($parent['name'] == 'APPROVAL') { $cur_approval['attributes'][$attrs['NAME']] = ''; } elseif($parent['name'] == 'APPROVALLOG') { @@ -1075,6 +1144,8 @@ function startElement($parser, $name, $attrs) { /* {{{ */ $cur_workflow['id'] = (int) $attrs['ID']; } elseif($parent['name'] == 'MANDATORY_WORKFLOWS') { $cur_user['workflows'][] = (int) $attrs['ID']; + } elseif($parent['name'] == 'VERSION') { + $cur_version['workflow'] = array('id'=>(int) $attrs['ID'], 'state'=>(int) $attrs['STATE']); } break; case "WORKFLOWACTION": @@ -1095,7 +1166,7 @@ function startElement($parser, $name, $attrs) { /* {{{ */ } /* }}} */ function endElement($parser, $name) { /* {{{ */ - global $dms, $sections, $rootfolder, $objmap, $elementstack, $users, $groups, $links,$cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; + global $logger, $dms, $sections, $rootfolder, $objmap, $elementstack, $users, $groups, $links,$cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowlog, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; array_pop($elementstack); $parent = end($elementstack); @@ -1114,6 +1185,9 @@ function endElement($parser, $name) { /* {{{ */ case "STATUSLOG": $cur_version['statuslogs'][] = $cur_statuslog; break; + case "WORKFLOWLOG": + $cur_version['workflowlogs'][] = $cur_workflowlog; + break; case "APPROVAL": $cur_version['approvals'][] = $cur_approval; break; @@ -1190,12 +1264,12 @@ function endElement($parser, $name) { /* {{{ */ foreach($users as $tuser) { if($tuser['workflows']) { if(!$user = $dms->getUser($objmap['users'][$tuser['id']])) { - echo "Error: Cannot find user for adding mandatory workflows\n"; + $logger->err("Cannot find user for adding mandatory workflows"); exit; } foreach($tuser['workflows'] as $tworkflowid) { if(!$wk = $dms->getWorkflow($objmap['workflows'][$tworkflowid])) { - echo "Error: Cannot find workflow for adding mandatory workflows\n"; + $logger->err("Cannot find workflow for adding mandatory workflows"); exit; } $user->setMandatoryWorkflow($wk); @@ -1219,7 +1293,7 @@ function endElement($parser, $name) { /* {{{ */ } /* }}} */ function characterData($parser, $data) { /* {{{ */ - global $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; + global $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowlog, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; $current = end($elementstack); $parent = prev($elementstack); @@ -1228,39 +1302,72 @@ function characterData($parser, $data) { /* {{{ */ switch($parent['name']) { case 'DOCUMENT': if(isset($current['attributes']['TYPE']) && $current['attributes']['TYPE'] == 'user') { - $cur_document['user_attributes'][$current['attributes']['ATTRDEF']] = $data; + if(isset($cur_document['user_attributes'][$current['attributes']['ATTRDEF']])) + $cur_document['user_attributes'][$current['attributes']['ATTRDEF']] .= $data; + else + $cur_document['user_attributes'][$current['attributes']['ATTRDEF']] = $data; } else { - $cur_document['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_document['attributes'][$current['attributes']['NAME']])) + $cur_document['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_document['attributes'][$current['attributes']['NAME']] = $data; } break; case 'FOLDER': if(isset($current['attributes']['TYPE']) && $current['attributes']['TYPE'] == 'user') { - $cur_folder['user_attributes'][$current['attributes']['ATTRDEF']] = $data; + if(isset($cur_folder['user_attributes'][$current['attributes']['ATTRDEF']])) + $cur_folder['user_attributes'][$current['attributes']['ATTRDEF']] .= $data; + else + $cur_folder['user_attributes'][$current['attributes']['ATTRDEF']] = $data; } else { - $cur_folder['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_folder['attributes'][$current['attributes']['NAME']])) + $cur_folder['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_folder['attributes'][$current['attributes']['NAME']] = $data; } break; case 'VERSION': if(isset($current['attributes']['TYPE']) && $current['attributes']['TYPE'] == 'user') { - $cur_version['user_attributes'][$current['attributes']['ATTRDEF']] = $data; + if(isset($cur_version['user_attributes'][$current['attributes']['ATTRDEF']])) + $cur_version['user_attributes'][$current['attributes']['ATTRDEF']] .= $data; + else + $cur_version['user_attributes'][$current['attributes']['ATTRDEF']] = $data; } else { - $cur_version['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_version['attributes'][$current['attributes']['NAME']])) + $cur_version['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_version['attributes'][$current['attributes']['NAME']] = $data; } break; case 'STATUSLOG': - $cur_statuslog['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_statuslog['attributes'][$current['attributes']['NAME']])) + $cur_statuslog['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_statuslog['attributes'][$current['attributes']['NAME']] = $data; break; case 'APPROVAL': $cur_approval['attributes'][$current['attributes']['NAME']] = $data; break; case 'APPROVALLOG': - $cur_approvallog['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_approvallog['attributes'][$current['attributes']['NAME']])) + $cur_approvallog['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_approvallog['attributes'][$current['attributes']['NAME']] = $data; break; case 'REVIEW': $cur_review['attributes'][$current['attributes']['NAME']] = $data; break; case 'REVIEWLOG': - $cur_reviewlog['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_reviewlog['attributes'][$current['attributes']['NAME']])) + $cur_reviewlog['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_reviewlog['attributes'][$current['attributes']['NAME']] = $data; + break; + case 'WORKFLOWLOG': + if(isset($cur_workflowlog['attributes'][$current['attributes']['NAME']])) + $cur_workflowlog['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_workflowlog['attributes'][$current['attributes']['NAME']] = $data; break; case 'USER': if(isset($cur_user['attributes'][$current['attributes']['NAME']])) @@ -1302,19 +1409,31 @@ function characterData($parser, $data) { /* {{{ */ $cur_user['image']['mimetype'] = $data; break; case 'FILE': - $cur_file['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_file['attributes'][$current['attributes']['NAME']])) + $cur_file['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_file['attributes'][$current['attributes']['NAME']] = $data; break; case 'LINK': $cur_link['attributes'][$current['attributes']['NAME']] = $data; break; case 'WORKFLOW': - $cur_workflow['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_workflow['attributes'][$current['attributes']['NAME']])) + $cur_workflow['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_workflow['attributes'][$current['attributes']['NAME']] = $data; break; case 'WORKFLOWSTATE': - $cur_workflowstate['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_workflowstate['attributes'][$current['attributes']['NAME']])) + $cur_workflowstate['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_workflowstate['attributes'][$current['attributes']['NAME']] = $data; break; case 'WORKFLOWACTION': - $cur_workflowaction['attributes'][$current['attributes']['NAME']] = $data; + if(isset($cur_workflowaction['attributes'][$current['attributes']['NAME']])) + $cur_workflowaction['attributes'][$current['attributes']['NAME']] .= $data; + else + $cur_workflowaction['attributes'][$current['attributes']['NAME']] = $data; break; case 'TRANSITION': $cur_transition['attributes'][$current['attributes']['NAME']] = $data; @@ -1364,6 +1483,12 @@ if(isset($options['v']) || isset($options['verѕion'])) { exit(0); } +$logfile = "xmlimport.log"; +$logconf = array(); +$logconf['timeformat'] = '%Y-%m-%d %H:%M:%S'; +$logconf['lineFormat'] = '%{timestamp} %{priority} xmlimport: %{ident} %{message}'; +$logger = Log::factory('file', $logfile, '', $logconf); + /* Check for debug mode */ $debug = false; if(isset($options['debug'])) { @@ -1389,7 +1514,7 @@ if(isset($options['contentdir'])) { if(substr($contentdir, -1, 1) != DIRECTORY_SEPARATOR) $contentdir .= DIRECTORY_SEPARATOR; } else { - echo "Directory ".$options['contentdir']." does not exists\n"; + $logger->crit("Directory ".$options['contentdir']." does not exists"); exit(1); } } else { @@ -1435,7 +1560,7 @@ $db->connect() or die ("Could not connect to db-server \"" . $settings->_dbHostn $dms = new SeedDMS_Core_DMS($db, $settings->_contentDir.$settings->_contentOffsetDir); if(!$settings->_doNotCheckDBVersion && !$dms->checkVersion()) { - echo "Database update needed."; + $logger->crit("Database update needed."); exit; } $dms->setRootFolderID($settings->_rootFolderID); @@ -1447,7 +1572,7 @@ if(!$rootfolder) { if($defaultuserid) { if(!$defaultUser = $dms->getUser($defaultuserid)) { - echo "Error: Could not find default user with id ".$defaultuserid."\n"; + $logger->crit("Could not find default user with id ".$defaultuserid); exit(1); } } else { @@ -1495,7 +1620,7 @@ if($exportmapping) { } fclose($fp); } else { - echo "Error: could not open mapping file '".$exportmapping."'\n"; + $logger->err("Could not open mapping file '".$exportmapping."'"); } } ?> From 4ccdcac7dff6ec5e4454cb03cbedd2adfb14f243 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Sep 2016 11:02:40 +0200 Subject: [PATCH 12/14] rewrite[Review|Approval]Log() copies file --- SeedDMS_Core/Core/inc.ClassDocument.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/SeedDMS_Core/Core/inc.ClassDocument.php b/SeedDMS_Core/Core/inc.ClassDocument.php index d37252c67..0b27b0cb7 100644 --- a/SeedDMS_Core/Core/inc.ClassDocument.php +++ b/SeedDMS_Core/Core/inc.ClassDocument.php @@ -2738,6 +2738,10 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */ $db->rollbackTransaction(); return false; } + $reviewLogID = $db->getInsertID(); + if(!empty($log['file'])) { + SeedDMS_Core_File::copyFile($log['file'], $this->_dms->contentDir . $this->_document->getDir() . 'r' . $reviewLogID); + } } } @@ -2862,6 +2866,10 @@ class SeedDMS_Core_DocumentContent extends SeedDMS_Core_Object { /* {{{ */ $db->rollbackTransaction(); return false; } + $approveLogID = $db->getInsertID(); + if(!empty($log['file'])) { + SeedDMS_Core_File::copyFile($log['file'], $this->_dms->contentDir . $this->_document->getDir() . 'a' . $approveLogID); + } } } From e55047fb58ebee2f18d23353e297adf1dd72ff97 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Sep 2016 14:00:42 +0200 Subject: [PATCH 13/14] lots of bug fixes --- utils/xmldump.php | 70 ++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/utils/xmldump.php b/utils/xmldump.php index 38579f4c0..37bd87c46 100644 --- a/utils/xmldump.php +++ b/utils/xmldump.php @@ -140,11 +140,11 @@ function dumplog($version, $type, $logs, $indent) { /* {{{ */ if(!empty($a['file'])) { $filename = $dms->contentDir . $document->getDir().'r'.(int) $a[$type2.'LogID']; if(file_exists($filename)) { - echo $indent." \n"; echo chunk_split(base64_encode(file_get_contents($filename)), 76, "\n"); - echo $indent." \n"; + echo $indent." \n"; } else { echo " fileref=\"".$filename."\" />\n"; if($contentdir) { @@ -163,6 +163,25 @@ function dumplog($version, $type, $logs, $indent) { /* {{{ */ echo $indent." \n"; } /* }}} */ +function dumpNotifications($notifications, $indent) { /* {{{ */ + if($notifications) { + if($notifications['groups'] || $notifications['users']) { + echo $indent." \n"; + if($notifications['users']) { + foreach($notifications['users'] as $user) { + echo $indent." getID()."\" />\n"; + } + } + if($notifications['groups']) { + foreach($notifications['groups'] as $group) { + echo $indent." getID()."\" />\n"; + } + } + echo $indent." \n"; + } + } +} /* }}} */ + function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ global $sections, $statistic, $index, $dms, $maxsize, $contentdir; @@ -185,11 +204,19 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ echo $indent." getID()."\">".wrapWithCData($attribute->getValue())."\n"; } } - if($folder->inheritsAccess()) { - echo $indent." \n"; - } else { - echo $indent." \n"; + $notifications = $folder->getNotifyList(); + dumpNotifications($notifications, $indent); + + /* getAccessList() returns also inherited access. So first check + * if inheritsAccess is set and don't output any acls in that case. + * There could be acls of the folder, which will be visible once the + * inheritsAccess is turned off. Those entries will be lost in the + * xml output. + */ + if(!$folder->inheritsAccess()) { $accesslist = $folder->getAccessList(); + if($accesslist['users'] || $accesslist['groups']) { + echo $indent." \n"; foreach($accesslist['users'] as $acl) { echo $indent." getUser(); @@ -205,6 +232,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ echo "/>\n"; } echo $indent." \n"; + } } echo $indent."\n"; $statistic['folders']++; @@ -252,10 +280,16 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ } } - /* Check if acl is not inherited */ + /* getAccessList() returns also inherited access. So first check + * if inheritsAccess is set and don't output any acls in that case. + * There could be acls of the folder, which will be visible once the + * inheritsAccess is turned off. Those entries will be lost in the + * xml output. + */ if(!$document->inheritsAccess()) { - echo $indent." \n"; $accesslist = $document->getAccessList(); + if($accesslist['users'] || $accesslist['groups']) { + echo $indent." \n"; foreach($accesslist['users'] as $acl) { echo $indent." getUser(); @@ -271,6 +305,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ echo "/>\n"; } echo $indent." \n"; + } } $cats = $document->getCategories(); @@ -383,7 +418,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ } else { echo " fileref=\"".$document->getID()."-A-".$file->getID().$file->getFileType()."\" />\n"; if($contentdir) { - copy($dms->contentDir . $version->getPath(), $contentdir.$document->getID()."-A-".$file->getID().$file->getFileType()); + copy($dms->contentDir . $file->getPath(), $contentdir.$document->getID()."-A-".$file->getID().$file->getFileType()); } else { echo "Warning: file content (size=".filesize($dms->contentDir . $file->getPath()).") will be missing from output\n"; } @@ -410,22 +445,7 @@ function tree($folder, $parent=null, $indent='', $skipcurrent=false) { /* {{{ */ echo $indent." \n"; } $notifications = $document->getNotifyList(); - if($notifications) { - if($notifications['groups'] || $notifications['users']) { - echo $indent." \n"; - if($notifications['users']) { - foreach($notifications['users'] as $user) { - echo $indent." getID()."\" />\n"; - } - } - if($notifications['groups']) { - foreach($notifications['groups'] as $group) { - echo $indent." getID()."\" />\n"; - } - } - echo $indent." \n"; - } - } + dumpNotifications($notifications, $indent); echo $indent."\n"; $statistic['documents']++; From 7b065e7b05ba3d988f6d54bba58e50af040e3d64 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Thu, 15 Sep 2016 14:01:01 +0200 Subject: [PATCH 14/14] lots of bug fixes --- utils/xmlimport.php | 566 ++++++++++++++++++++++++++------------------ 1 file changed, 331 insertions(+), 235 deletions(-) diff --git a/utils/xmlimport.php b/utils/xmlimport.php index a020c81a1..047c3001e 100644 --- a/utils/xmlimport.php +++ b/utils/xmlimport.php @@ -53,6 +53,12 @@ function getRevAppLog($reviews) { /* {{{ */ $newlog['status'] = $log['attributes']['status']; $newlog['comment'] = $log['attributes']['comment']; $newlog['date'] = $log['attributes']['date']; + if(!empty($log['data'])) { + $filecontents = base64_decode($log['data']); + $filename = tempnam('/tmp', 'FOO-revapp'); + file_put_contents($filename, $filecontents); + $newlog['file'] = $filename; + } $newreview['logs'][] = $newlog; } } @@ -394,8 +400,69 @@ function insert_document($document) { /* {{{ */ $folder = $rootfolder; if(in_array('documents', $sections)) { - $error = false; $initversion = array_shift($document['versions']); + $reviews = array('i'=>array(), 'g'=>array()); + /* + if($initversion['reviews']) { + foreach($initversion['reviews'] as $review) { + if($review['attributes']['type'] == 1) { + if(isset($objmap['groups'][(int) $review['attributes']['required']])) + $reviews['g'][] = $objmap['groups'][(int) $review['attributes']['required']]; + } else { + if(isset($objmap['users'][(int) $review['attributes']['required']])) + $reviews['i'][] = $objmap['users'][(int) $review['attributes']['required']]; + } + } + } + */ + $approvals = array('i'=>array(), 'g'=>array()); + /* + if($initversion['approvals']) { + foreach($initversion['approvals'] as $approval) { + if($approval['attributes']['type'] == 1) { + if(isset($objmap['groups'][(int) $approval['attributes']['required']])) + $approvals['g'][] = $objmap['groups'][(int) $approval['attributes']['required']]; + } else { + if(isset($objmap['users'][(int) $approval['attributes']['required']])) + $approvals['i'][] = $objmap['users'][(int) $approval['attributes']['required']]; + } + } + } + */ + + $workflow = null; + $workflowstate = null; + if(isset($initversion['workflow']) && $initversion['workflow']) { + if(array_key_exists((int) $initversion['workflow']['id'], $objmap['workflows'])) { + $workflow = $dms->getWorkflow($objmap['workflows'][(int) $initversion['workflow']['id']]); + if(!$workflow) { + $logger->warning("Workflow ".$initversion['workflow']['id']." cannot be mapped"); + } + } else { + $logger->warning("Workflow ".$initversion['workflow']['id']." cannot be mapped"); + } + if(array_key_exists((int) $initversion['workflow']['state'], $objmap['workflowstates'])) { + $workflowstate = $dms->getWorkflow($objmap['workflowstates'][(int) $initversion['workflow']['state']]); + if(!$workflowstate) { + $logger->warning("Workflowstate ".$initversion['workflow']['state']." cannot be mapped"); + } + } else { + $logger->warning("Workflowstate ".$initversion['workflow']['state']." cannot be mapped"); + } + } + if($initversion['workflowlogs']) { + } + + $version_attributes = array(); + if(isset($initversion['user_attributes'])) { + foreach($initversion['user_attributes'] as $orgid=>$value) { + if(array_key_exists((int) $orgid, $objmap['attributedefs'])) { + $version_attributes[$objmap['attributedefs'][$orgid]] = $value; + } else { + $logger->warning("User attribute ".$orgid." cannot be mapped"); + } + } + } if(!empty($initversion['fileref'])) { $filename = tempnam('/tmp', 'FOO'); copy($contentdir.$initversion['fileref'], $filename); @@ -403,17 +470,92 @@ function insert_document($document) { /* {{{ */ $filecontents = base64_decode($initversion['data']); if(strlen($filecontents) != $initversion['data_length']) { $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$initversion['data_length'].")."); - $newDocument = null; - $error = true; } $filename = tempnam('/tmp', 'FOO'); file_put_contents($filename, $filecontents); } - if(!$error) { + if(!$result = $folder->addDocument( + $document['attributes']['name'], + $document['attributes']['comment'], + isset($document['attributes']['expires']) ? dateToTimestamp($document['attributes']['expires']) : 0, + $owner, + isset($document['attributes']['keywords']) ? $document['attributes']['keywords'] : 0, + $categories, + $filename, + $initversion['attributes']['orgfilename'], + $initversion['attributes']['filetype'], + $initversion['attributes']['mimetype'], + $document['attributes']['sequence'], + $reviews, //reviewers + $approvals, //approvers + $initversion['version'], + isset($initversion['attributes']['comment']) ? $initversion['attributes']['comment'] : '', + $attributes, + $version_attributes, + $workflow + ) + ) { + unlink($filename); + $logger->err("Could not add document '".$document['attributes']['name']."'"); + return false; + } + + /* The document and its initial version was added */ + $logger->info("Added document '".$document['attributes']['name']."'"); + $newDocument = $result[0]; + unlink($filename); + + if(isset($document['attributes']['lockedby'])) { + if(!array_key_exists($document['attributes']['lockedby'], $objmap['users'])) { + $logger->warning("User for document lock cannot be mapped"); + } else { + if($lockuser = $dms->getUser($objmap['users'][$document['attributes']['lockedby']])) { + $newDocument->setLocked($lockuser); + } + } + } + + $newVersion = $result[1]->getContent(); + $newVersion->setDate(dateToTimestamp($initversion['attributes']['date'])); + if($workflowstate) + $newVersion->setWorkflowState($workflowstate); + $newlogs = array(); + foreach($initversion['statuslogs'] as $i=>$log) { + if(!array_key_exists($log['attributes']['user'], $objmap['users'])) { + unset($initversion['statuslogs'][$i]); + $logger->warning("User for status log cannot be mapped"); + } else { + $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]); + $newlogs[] = $log['attributes']; + } + } + $newVersion->rewriteStatusLog($newlogs); + + /* Set reviewers and review log */ + if($initversion['reviews']) { +// print_r($initversion['reviews']); + $newreviews = getRevAppLog($initversion['reviews']); + $newVersion->rewriteReviewLog($newreviews); + } + if($initversion['approvals']) { + $newapprovals = getRevAppLog($initversion['approvals']); + $newVersion->rewriteApprovalLog($newapprovals); + } + + $newDocument->setDate(dateToTimestamp($document['attributes']['date'])); + $newDocument->setDefaultAccess($document['attributes']['defaultaccess']); + $newDocument->setInheritAccess($document['attributes']['inheritaccess']); + foreach($document['versions'] as $version) { + if(!array_key_exists((int) $version['attributes']['owner'], $objmap['users'])) { + $logger->err("Owner of document cannot be mapped"); + return false; + } + $owner = $dms->getUser($objmap['users'][(int) $version['attributes']['owner']]); + $reviews = array('i'=>array(), 'g'=>array()); /* - if($initversion['reviews']) { - foreach($initversion['reviews'] as $review) { + if($version['reviews']) { + foreach($version['reviews'] as $review) { if($review['attributes']['type'] == 1) { if(isset($objmap['groups'][(int) $review['attributes']['required']])) $reviews['g'][] = $objmap['groups'][(int) $review['attributes']['required']]; @@ -426,8 +568,8 @@ function insert_document($document) { /* {{{ */ */ $approvals = array('i'=>array(), 'g'=>array()); /* - if($initversion['approvals']) { - foreach($initversion['approvals'] as $approval) { + if($version['approvals']) { + foreach($version['approvals'] as $approval) { if($approval['attributes']['type'] == 1) { if(isset($objmap['groups'][(int) $approval['attributes']['required']])) $approvals['g'][] = $objmap['groups'][(int) $approval['attributes']['required']]; @@ -440,22 +582,31 @@ function insert_document($document) { /* {{{ */ */ $workflow = null; - if(isset($initversion['workflow']) && $initversion['workflow']) { - if(array_key_exists((int) $initversion['workflow']['id'], $objmap['workflows'])) { - $workflow = $dms->getWorkflow($objmap['workflows'][(int) $initversion['workflow']['id']]); + $workflowstate = null; + if(isset($version['workflow']) && $version['workflow']) { + if(array_key_exists((int) $version['workflow']['id'], $objmap['workflows'])) { + $workflow = $dms->getWorkflow($objmap['workflows'][(int) $version['workflow']['id']]); if(!$workflow) { - $logger->warning("Workflow ".$orgid." cannot be mapped"); + $logger->warning("Workflow ".$version['workflow']['id']." cannot be mapped"); } } else { - $logger->warning("Workflow ".$initversion['workflow']['id']." cannot be mapped"); + $logger->warning("Workflow ".$version['workflow']['id']." cannot be mapped"); + } + if(array_key_exists((int) $version['workflow']['state'], $objmap['workflowstates'])) { + $workflowstate = $dms->getWorkflow($objmap['workflowstates'][(int) $version['workflow']['state']]); + if(!$workflowstate) { + $logger->warning("Workflowstate ".$version['workflow']['state']." cannot be mapped"); + } + } else { + $logger->warning("Workflowstate ".$version['workflow']['state']." cannot be mapped"); } } - if($initversion['workflowlogs']) { + if($version['workflowlogs']) { } $version_attributes = array(); - if(isset($initversion['user_attributes'])) { - foreach($initversion['user_attributes'] as $orgid=>$value) { + if(isset($version['user_attributes'])) { + foreach($version['user_attributes'] as $orgid=>$value) { if(array_key_exists((int) $orgid, $objmap['attributedefs'])) { $version_attributes[$objmap['attributedefs'][$orgid]] = $value; } else { @@ -463,233 +614,128 @@ function insert_document($document) { /* {{{ */ } } } - if(!$result = $folder->addDocument( - $document['attributes']['name'], - $document['attributes']['comment'], - isset($document['attributes']['expires']) ? dateToTimestamp($document['attributes']['expires']) : 0, + if(!empty($version['fileref'])) { + $filename = tempnam('/tmp', 'FOO'); + copy($contentdir.$version['fileref'], $filename); + } else { + $filecontents = base64_decode($version['data']); + if(strlen($filecontents) != $version['data_length']) { + $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$version['data_length'].")."); + } + $filename = tempnam('/tmp', 'FOO'); + file_put_contents($filename, $filecontents); + } + if(!($result = $newDocument->addContent( + $version['attributes']['comment'], $owner, - isset($document['attributes']['keywords']) ? $document['attributes']['keywords'] : 0, - $categories, $filename, - $initversion['attributes']['orgfilename'], - $initversion['attributes']['filetype'], - $initversion['attributes']['mimetype'], - $document['attributes']['sequence'], + $version['attributes']['orgfilename'], + $version['attributes']['filetype'], + $version['attributes']['mimetype'], $reviews, //reviewers $approvals, //approvers - $initversion['version'], - isset($initversion['attributes']['comment']) ? $initversion['attributes']['comment'] : '', - $attributes, + $version['version'], $version_attributes, $workflow - ) - ) { + ))) { unlink($filename); - $logger->err("Could not add document '".$document['attributes']['name']."'"); + $logger->err("Could not add version '".$version['version']."' of document '".$document['attributes']['name']."'"); return false; - } else { - $logger->info("Added document '".$document['attributes']['name']."'"); - $newDocument = $result[0]; + } + + $logger->info("Added version '".$version['version']."' of document '".$document['attributes']['name']."'"); + $newVersion = $result->getContent(); + if($workflowstate) + $newVersion->setWorkflowState($workflowstate); + $newVersion->setDate(dateToTimestamp($version['attributes']['date'])); + $newlogs = array(); + foreach($version['statuslogs'] as $i=>$log) { + if(!array_key_exists($log['attributes']['user'], $objmap['users'])) { + unset($version['statuslogs'][$i]); + $logger->warning("User for status log cannot be mapped"); + } else { + $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]); + $newlogs[] = $log['attributes']; + } + } + $newVersion->rewriteStatusLog($newlogs); + + if($version['reviews']) { + $newreviews = getRevAppLog($version['reviews']); + $newVersion->rewriteReviewLog($newreviews); + } + if($version['approvals']) { + $newapprovals = getRevAppLog($version['approvals']); + $newVersion->rewriteApprovalLog($newapprovals); + } + + unlink($filename); + } + + if(isset($document['notifications']['users']) && $document['notifications']['users']) { + foreach($document['notifications']['users'] as $userid) { + if(!array_key_exists($userid, $objmap['users'])) { + $logger->warning("User for notification cannot be mapped"); + } else { + $newDocument->addNotify($objmap['users'][$userid], 1); + } + } + } + if(isset($document['notifications']['groups']) && $document['notifications']['groups']) { + foreach($document['notifications']['groups'] as $groupid) { + if(!array_key_exists($groupid, $objmap['groups'])) { + $logger->warning("User for notification cannot be mapped"); + } else { + $newDocument->addNotify($objmap['groups'][$groupid], 0); + } + } + } + if(isset($document['acls']) && $document['acls']) { + foreach($document['acls'] as $acl) { + if($acl['type'] == 'user') { + if(!array_key_exists($acl['user'], $objmap['users'])) { + $logger->warning("User for notification cannot be mapped"); + } else { + $newDocument->addAccess($acl['mode'], $objmap['users'][$acl['user']], 1); + } + } elseif($acl['type'] == 'group') { + if(!array_key_exists($acl['group'], $objmap['groups'])) { + $logger->warning("Group for notification cannot be mapped"); + } else { + $newDocument->addAccess($acl['mode'], $objmap['groups'][$acl['group']], 0); + } + } + } + } + if(isset($document['files']) && $document['files']) { + foreach($document['files'] as $file) { + if(!array_key_exists($file['attributes']['owner'], $objmap['users'])) { + $logger->warning("User for file cannot be mapped"); + $owner = $defaultUser; + } else { + $owner = $dms->getUser($objmap['users'][$file['attributes']['owner']]); + } + if(!empty($file['fileref'])) { + $filename = tempnam('/tmp', 'FOO'); + copy($contentdir.$file['fileref'], $filename); + } else { + $filecontents = base64_decode($file['data']); + if(strlen($filecontents) != $file['data_length']) { + $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$file['data_length'].")."); + } + $filename = tempnam('/tmp', 'FOO'); + file_put_contents($filename, $filecontents); + } + $newDocument->addDocumentFile( + $file['attributes']['name'], + $file['attributes']['comment'], + $owner, + $filename, + $file['attributes']['orgfilename'], + $file['attributes']['filetype'], + $file['attributes']['mimetype'] + ); unlink($filename); - - if(isset($document['attributes']['lockedby'])) { - if(!array_key_exists($document['attributes']['lockedby'], $objmap['users'])) { - $logger->warning("User for document lock cannot be mapped"); - } else { - if($lockuser = $dms->getUser($objmap['users'][$document['attributes']['lockedby']])) { - $newDocument->setLocked($lockuser); - } - } - } - - $newVersion = $result[1]->getContent(); - $newVersion->setDate(dateToTimestamp($initversion['attributes']['date'])); - $newlogs = array(); - foreach($initversion['statuslogs'] as $i=>$log) { - if(!array_key_exists($log['attributes']['user'], $objmap['users'])) { - unset($initversion['statuslogs'][$i]); - $logger->warning("User for status log cannot be mapped"); - } else { - $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]); - $newlogs[] = $log['attributes']; - } - } - $newVersion->rewriteStatusLog($newlogs); - - /* Set reviewers and review log */ - if($initversion['reviews']) { - $newreviews = getRevAppLog($initversion['reviews']); - $newVersion->rewriteReviewLog($newreviews); - } - if($initversion['approvals']) { - $newapprovals = getRevAppLog($initversion['approvals']); - $newVersion->rewriteApprovalLog($newapprovals); - } - - $newDocument->setDate(dateToTimestamp($document['attributes']['date'])); - $newDocument->setDefaultAccess($document['attributes']['defaultaccess']); - foreach($document['versions'] as $version) { - if(!array_key_exists((int) $version['attributes']['owner'], $objmap['users'])) { - $logger->err("Owner of document cannot be mapped"); - return false; - } - $owner = $dms->getUser($objmap['users'][(int) $version['attributes']['owner']]); - - $reviews = array('i'=>array(), 'g'=>array()); - /* - if($version['reviews']) { - foreach($version['reviews'] as $review) { - if($review['attributes']['type'] == 1) { - if(isset($objmap['groups'][(int) $review['attributes']['required']])) - $reviews['g'][] = $objmap['groups'][(int) $review['attributes']['required']]; - } else { - if(isset($objmap['users'][(int) $review['attributes']['required']])) - $reviews['i'][] = $objmap['users'][(int) $review['attributes']['required']]; - } - } - } - */ - $approvals = array('i'=>array(), 'g'=>array()); - /* - if($version['approvals']) { - foreach($version['approvals'] as $approval) { - if($approval['attributes']['type'] == 1) { - if(isset($objmap['groups'][(int) $approval['attributes']['required']])) - $approvals['g'][] = $objmap['groups'][(int) $approval['attributes']['required']]; - } else { - if(isset($objmap['users'][(int) $approval['attributes']['required']])) - $approvals['i'][] = $objmap['users'][(int) $approval['attributes']['required']]; - } - } - } - */ - $version_attributes = array(); - if(isset($version['user_attributes'])) { - foreach($version['user_attributes'] as $orgid=>$value) { - if(array_key_exists((int) $orgid, $objmap['attributedefs'])) { - $version_attributes[$objmap['attributedefs'][$orgid]] = $value; - } else { - $logger->warning("User attribute ".$orgid." cannot be mapped"); - } - } - } - if(!empty($version['fileref'])) { - $filename = tempnam('/tmp', 'FOO'); - copy($contentdir.$version['fileref'], $filename); - } else { - $filecontents = base64_decode($version['data']); - if(strlen($filecontents) != $version['data_length']) { - $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$version['data_length'].")."); - } - $filename = tempnam('/tmp', 'FOO'); - file_put_contents($filename, $filecontents); - } - if(!($result = $newDocument->addContent( - $version['attributes']['comment'], - $owner, - $filename, - $version['attributes']['orgfilename'], - $version['attributes']['filetype'], - $version['attributes']['mimetype'], - $reviews, //reviewers - $approvals, //approvers - $version['version'], - $version_attributes, - null //workflow - ))) { - } - $newVersion = $result->getContent(); - $newVersion->setDate(dateToTimestamp($version['attributes']['date'])); - $newlogs = array(); - foreach($version['statuslogs'] as $i=>$log) { - if(!array_key_exists($log['attributes']['user'], $objmap['users'])) { - unset($version['statuslogs'][$i]); - $logger->warning("User for status log cannot be mapped"); - } else { - $log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]); - $newlogs[] = $log['attributes']; - } - } - $newVersion->rewriteStatusLog($newlogs); - - if($version['reviews']) { - $newreviews = getRevAppLog($version['reviews']); - $newVersion->rewriteReviewLog($newreviews); - } - if($version['approvals']) { - $newapprovals = getRevAppLog($version['approvals']); - $newVersion->rewriteApprovalLog($newapprovals); - } - - unlink($filename); - } - } - if(isset($document['notifications']['users']) && $document['notifications']['users']) { - foreach($document['notifications']['users'] as $userid) { - if(!array_key_exists($userid, $objmap['users'])) { - $logger->warning("User for notification cannot be mapped"); - } else { - $newDocument->addNotify($objmap['users'][$userid], 1); - } - } - } - if(isset($document['notifications']['groups']) && $document['notifications']['groups']) { - foreach($document['notifications']['groups'] as $groupid) { - if(!array_key_exists($groupid, $objmap['groups'])) { - $logger->warning("User for notification cannot be mapped"); - } else { - $newDocument->addNotify($objmap['groups'][$groupid], 0); - } - } - } - if(isset($document['acls']) && $document['acls']) { - $newDocument->setInheritAccess(false); - foreach($document['acls'] as $acl) { - if($acl['type'] == 'user') { - if(!array_key_exists($acl['user'], $objmap['users'])) { - $logger->warning("User for notification cannot be mapped"); - } else { - $newDocument->addAccess($acl['mode'], $objmap['users'][$acl['user']], 1); - } - } elseif($acl['type'] == 'group') { - if(!array_key_exists($acl['group'], $objmap['groups'])) { - $logger->warning("Group for notification cannot be mapped"); - } else { - $newDocument->addAccess($acl['mode'], $objmap['groups'][$acl['group']], 0); - } - } - } - } - if(isset($document['files']) && $document['files']) { - foreach($document['files'] as $file) { - if(!array_key_exists($file['attributes']['owner'], $objmap['users'])) { - $logger->warning("User for file cannot be mapped"); - $owner = $defaultUser; - } else { - $owner = $dms->getUser($objmap['users'][$file['attributes']['owner']]); - } - if(!empty($file['fileref'])) { - $filename = tempnam('/tmp', 'FOO'); - copy($contentdir.$file['fileref'], $filename); - } else { - $filecontents = base64_decode($file['data']); - if(strlen($filecontents) != $file['data_length']) { - $logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$file['data_length'].")."); - } - $filename = tempnam('/tmp', 'FOO'); - file_put_contents($filename, $filecontents); - } - $newDocument->addDocumentFile( - $file['attributes']['name'], - $file['attributes']['comment'], - $owner, - $filename, - $file['attributes']['orgfilename'], - $file['attributes']['filetype'], - $file['attributes']['mimetype'] - ); - unlink($filename); - } } } } else { @@ -744,6 +790,7 @@ function insert_folder($folder) { /* {{{ */ $newFolder->setDate(dateToTimestamp($folder['attributes']['date'])); $newFolder->setDefaultAccess($folder['attributes']['defaultaccess']); + $newFolder->setInheritAccess($folder['attributes']['inheritaccess']); if(isset($folder['notifications']['users']) && $folder['notifications']['users']) { foreach($folder['notifications']['users'] as $userid) { if(!array_key_exists($userid, $objmap['users'])) { @@ -763,7 +810,6 @@ function insert_folder($folder) { /* {{{ */ } } if(isset($folder['acls']) && $folder['acls']) { - $newFolder->setInheritAccess(false); foreach($folder['acls'] as $acl) { if($acl['type'] == 'user') { if(!array_key_exists($acl['user'], $objmap['users'])) { @@ -828,6 +874,46 @@ function resolve_links() { /* {{{ */ } } /* }}} */ +function set_mandatory() { /* {{{ */ + global $logger, $dms, $users, $objmap; + + if(!$users) + return; + + foreach($users as $user) { + if ($newUser = $dms->getUserByLogin($user['attributes']['login'])) { + if($user['individual']['reviewers']) { + foreach($user['individual']['reviewers'] as $u) { + if($uobj = $dms->getUser($objmap['users'][$u])) { + $newUser->setMandatoryReviewer($uobj->getID(), false); + } + } + } + if($user['individual']['approvers']) { + foreach($user['individual']['approvers'] as $u) { + if($uobj = $dms->getUser($objmap['users'][$u])) { + $newUser->setMandatoryApprover($uobj->getID(), false); + } + } + } + if($user['group']['reviewers']) { + foreach($user['group']['reviewers'] as $u) { + if($uobj = $dms->getGroup($objmap['groups'][$u])) { + $newUser->setMandatoryReviewer($uobj->getID(), true); + } + } + } + if($user['group']['approvers']) { + foreach($user['group']['approvers'] as $u) { + if($uobj = $dms->getGroup($objmap['groups'][$u])) { + $newUser->setMandatoryApprover($uobj->getID(), true); + } + } + } + } + } +} /* }}} */ + function startElement($parser, $name, $attrs) { /* {{{ */ global $logger, $dms, $noversioncheck, $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_workflowlog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition; @@ -1070,6 +1156,12 @@ function startElement($parser, $name, $attrs) { /* {{{ */ $cur_file['fileref'] = $attrs['FILEREF']; else $cur_file['data'] = ""; + } elseif($parent['name'] == 'REVIEWLOG') { + $cur_reviewlog['data_length'] = (int) $attrs['LENGTH']; + if(isset($attrs['FILEREF'])) + $cur_reviewlog['fileref'] = $attrs['FILEREF']; + else + $cur_reviewlog['data'] = ""; } break; case "KEYWORD": @@ -1451,6 +1543,9 @@ function characterData($parser, $data) { /* {{{ */ case 'FILE': $cur_file['data'] .= $data; break; + case 'REVIEWLOG': + $cur_reviewlog['data'] .= $data; + break; } break; case 'USER': @@ -1609,6 +1704,7 @@ while ($data = fread($fp, 65535)) { } resolve_links(); +set_mandatory(); if($exportmapping) { if($fp = fopen($exportmapping, 'w')) {