getServer(get_request('server_id_src')); $ldap['DST'] = $_SESSION[APPCONFIG]->getServer(get_request('server_id_dst')); # Error checking if (! trim($request['dnDST'])) { error(_('You left the destination DN blank.'), 'error', 'index.php'); } if ($ldap['DST']->isReadOnly()) { error(_('Destination server is currently READ-ONLY.'), 'error', 'index.php'); } if ($ldap['DST']->dnExists($request['dnDST'])) { error(sprintf(_('The destination entry (%s) already exists.'), pretty_print_dn($request['dnDST'])), 'error', 'index.php'); } if (! $ldap['DST']->dnExists($ldap['DST']->getContainer($request['dnDST']))) { error(sprintf(_('The destination container (%s) does not exist.'), pretty_print_dn($ldap['DST']->getContainer($request['dnDST']))), 'error', 'index.php'); } if (pla_compare_dns($request['dnSRC'],$request['dnDST']) == 0 && $ldap['SRC']->getIndex() == $ldap['DST']->getIndex()) { error(_('The source and destination DN are the same.'), 'error', 'index.php'); } $request['recursive'] = (get_request('recursive') == 'on') ? true : false; $request['remove'] = (get_request('remove') == 'yes') ? true : false; if ($request['recursive']) { $filter = get_request('filter','POST',false,'(objectClass=*)'); # Build a tree similar to that of the tree browser to give to r_copy_dn $ldap['tree'] = array(); printf('

%s%s

',_('Copying '),$request['dnSRC']); printf('

%s

',_('Recursive copy progress')); print '

'; print ''; printf ('%s...',_('Building snapshot of tree to copy')); $ldap['tree'] = build_tree($ldap['SRC'],$request['dnSRC'],array(),$filter); printf('%s
',_('Success')); # Prevent script from bailing early on a long delete @set_time_limit(0); $copy_result = r_copy_dn($ldap['SRC'],$ldap['DST'],$ldap['tree'],$request['dnSRC'],$request['dnDST'],$request['remove']); $copy_message = $copy_result; print '
'; } else { if ($_SESSION[APPCONFIG]->getValue('confirm','copy')) { $request['pageSRC'] = new TemplateRender($ldap['SRC']->getIndex(),get_request('template','REQUEST',false,null)); $request['pageSRC']->setDN($request['dnSRC']); $request['pageSRC']->accept(true); $request['pageDST'] = new TemplateRender($ldap['DST']->getIndex(),get_request('template','REQUEST',false,'none')); $request['pageDST']->setContainer($app['server']->getContainer($request['dnDST'])); $request['pageDST']->accept(true); $request['templateSRC'] = $request['pageSRC']->getTemplate(); $request['templateDST'] = $request['pageDST']->getTemplate(); $request['templateDST']->copy($request['templateSRC'],get_rdn($request['dnDST']),true); # Set all attributes with a values as shown, and remove the add value options foreach ($request['templateDST']->getAttributes(true) as $sattribute) { if ($sattribute->getValues() && ! $sattribute->isInternal()) { $sattribute->show(); $sattribute->setMaxValueCount(count($sattribute->getValues())); } } $request['pageDST']->accept(); return; } else { $copy_result = copy_dn($ldap['SRC'],$ldap['DST'],$request['dnSRC'],$request['dnDST'],$request['remove']); if ($copy_result) { $copy_message = sprintf('%s %s: %s %s', $request['remove'] ? _('Move successful') : _('Copy successful'), _('DN'), $request['dnDST'], _('has been created.')); } else { $copy_message = sprintf('%s %s: %s %s', $request['remove'] ? _('Move NOT successful') : _('Copy NOT successful'), _('DN'), $request['dnDST'], _('has NOT been created.')); } } } if ($copy_result) { $redirect_url = sprintf('cmd.php?cmd=template_engine&server_id=%s&dn=%s&refresh=SID_%s_nodes&noheader=1', $ldap['DST']->getIndex(),rawurlencode($request['dnDST']),$ldap['DST']->getIndex()); system_message(array( 'title'=>_('Copy Entry'), 'body'=>$copy_message, 'type'=>'info'), $redirect_url); } function r_copy_dn($serverSRC,$serverDST,$snapshottree,$dnSRC,$dnDST,$remove) { if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) { debug_log('Entered (%%)', 1, 0, __FILE__, __LINE__, __METHOD__, $fargs); } $copy_message = array(); $children = isset($snapshottree[$dnSRC]) ? $snapshottree[$dnSRC] : null; # If we have children, then we need to copy, then delete for a move if (is_array($children) && count($children)) { $copy_result = copy_dn($serverSRC,$serverDST,$dnSRC,$dnDST,false); if (! $copy_result) { return FALSE; } $copy_message[] = sprintf('%s %s: %s %s', _('Copy successful'), _('DN'), $dnDST, _('has been created.')); $hadError = false; foreach ($children as $child_dn) { $dnDST_new = sprintf('%s,%s',get_rdn($child_dn),$dnDST); $copy_result = r_copy_dn($serverSRC,$serverDST,$snapshottree,$child_dn,$dnDST_new,$remove); $copy_message = array_merge($copy_message,array_values($copy_result)); if (! $copy_result) { $hadError = TRUE; } } if (! $hadError && $remove) { $delete_result = $serverSRC->delete($dnSRC); if ($delete_result) { $copy_message[] = sprintf('%s %s: %s %s', _('Delete successful'), _('DN'), $dnDST, _('has been deleted.')); } } } else { $copy_result = copy_dn($serverSRC,$serverDST,$dnSRC,$dnDST,$remove); if ($copy_result) { $copy_message[] = sprintf('%s %s: %s %s', $remove ? _('Move successful') : _('Copy successful'), _('DN'), $dnDST, _('has been created.')); } else { $copy_message[] = sprintf('%s %s: %s %s', $remove ? _('Move NOT successful') : _('Copy NOT successful'), _('DN'), $dnDST, _('has NOT been created.')); } } return $copy_message; } function copy_dn($serverSRC,$serverDST,$dnSRC,$dnDST,$remove) { if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) { debug_log('Entered (%%)', 1, 0, __FILE__, __LINE__, __METHOD__, $fargs); } $request = array(); $request['pageSRC'] = new PageRender($serverSRC->getIndex(),get_request('template','REQUEST',false,'none')); $request['pageSRC']->setDN($dnSRC); $request['pageSRC']->accept(); $request['pageDST'] = new PageRender($serverDST->getIndex(),get_request('template','REQUEST',false,'none')); $request['pageDST']->setContainer($serverDST->getContainer($dnDST)); $request['pageDST']->accept(); $request['templateSRC'] = $request['pageSRC']->getTemplate(); $request['templateDST'] = $request['pageDST']->getTemplate(); $request['templateDST']->copy($request['pageSRC']->getTemplate(),get_rdn($dnDST,0)); # Create of move the entry if ($remove) { return $serverDST->rename($request['templateSRC']->getDN(), $request['templateDST']->getRDN(), $serverDST->getContainer($dnDST), TRUE); } else { return $serverDST->add($request['templateDST']->getDN(), $request['templateDST']->getLDAPadd()); } } function build_tree($server,$dn,$buildtree) { if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) { debug_log('Entered (%%)', 1, 0, __FILE__, __LINE__, __METHOD__, $fargs); } # We search all children, not only the visible children in the tree $children = $server->getContainerContents($dn,null,0); if (count($children)) { $buildtree[$dn] = $children; foreach ($children as $child_dn) { $buildtree = build_tree($server, $child_dn, $buildtree); } } if (DEBUG_ENABLED) { debug_log('Returning (%s)', 1, 0, __FILE__, __LINE__, __METHOD__, $buildtree); } return $buildtree; }