1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.server.ldap.handlers;
21
22
23 import org.apache.directory.server.core.entry.ClonedServerEntry;
24 import org.apache.directory.server.ldap.LdapSession;
25 import org.apache.directory.shared.ldap.message.LdapResult;
26 import org.apache.directory.shared.ldap.message.ModifyDnRequest;
27 import org.apache.directory.shared.ldap.message.ResultCodeEnum;
28 import org.apache.directory.shared.ldap.name.LdapDN;
29
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33
34
35
36
37
38
39
40 public class ModifyDnHandler extends ReferralAwareRequestHandler<ModifyDnRequest>
41 {
42 private static final Logger LOG = LoggerFactory.getLogger( ModifyDnHandler.class );
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 public void handleIgnoringReferrals( LdapSession session, LdapDN reqTargetDn,
62 ClonedServerEntry entry, ModifyDnRequest req )
63 {
64 LdapResult result = req.getResultResponse().getLdapResult();
65 LOG.debug( "Handling modify dn request while ignoring referrals: {}", req );
66
67 if ( req.getName().isEmpty() )
68 {
69
70 String msg = "Modify DN is not allowed on Root DSE.";
71 result.setResultCode( ResultCodeEnum.PROTOCOL_ERROR );
72 result.setErrorMessage( msg );
73 session.getIoSession().write( req.getResultResponse() );
74 return;
75 }
76
77 try
78 {
79 LdapDN newRdn = new LdapDN( req.getNewRdn().toString() );
80 newRdn.normalize( session.getCoreSession().getDirectoryService()
81 .getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
82
83 LdapDN oldRdn = new LdapDN( req.getName().getRdn().toString() );
84 oldRdn.normalize( session.getCoreSession().getDirectoryService()
85 .getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
86
87 boolean rdnChanged = req.getNewRdn() != null &&
88 ! newRdn.getNormName().equals( oldRdn.getNormName() );
89
90 if ( rdnChanged )
91 {
92 if ( req.getNewSuperior() != null )
93 {
94 session.getCoreSession().moveAndRename( req );
95 }
96 else
97 {
98 session.getCoreSession().rename( req );
99 }
100 }
101 else if ( req.getNewSuperior() != null )
102 {
103 req.setNewRdn( null );
104 session.getCoreSession().move( req );
105 }
106 else
107 {
108 result.setErrorMessage( "Attempt to move entry onto itself." );
109 result.setResultCode( ResultCodeEnum.ENTRY_ALREADY_EXISTS );
110 result.setMatchedDn( req.getName() );
111 session.getIoSession().write( req.getResultResponse() );
112 return;
113 }
114
115 result.setResultCode( ResultCodeEnum.SUCCESS );
116 session.getIoSession().write( req.getResultResponse() );
117 }
118 catch ( Exception e )
119 {
120 handleException( session, req, e );
121 }
122 }
123 }