Skip to content

Commit f89c8f4

Browse files
pjeanjeanmichitux
authored andcommitted
XWIKI-21611: Set right author when disabling/enabling an account
* Set only the original metadata author in XWikiUser.setDisabled * Use the same disable/enable action everywhere * Remove no longer needed request parameters
1 parent 16c7948 commit f89c8f4

File tree

3 files changed

+128
-94
lines changed
  • xwiki-platform-core

3 files changed

+128
-94
lines changed

xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/user/api/XWikiUser.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import org.xwiki.model.reference.EntityReferenceSerializer;
3232
import org.xwiki.model.reference.LocalDocumentReference;
3333
import org.xwiki.model.reference.WikiReference;
34+
import org.xwiki.user.UserReference;
35+
import org.xwiki.user.UserReferenceResolver;
3436

3537
import com.xpn.xwiki.XWiki;
3638
import com.xpn.xwiki.XWikiContext;
@@ -71,6 +73,8 @@ public class XWikiUser
7173

7274
private ContextualLocalizationManager localization;
7375

76+
private UserReferenceResolver<DocumentReference> documentReferenceUserReferenceResolver;
77+
7478
private Logger logger = LoggerFactory.getLogger(XWikiUser.class);
7579

7680
private String fullName;
@@ -204,6 +208,15 @@ private EntityReferenceSerializer<String> getLocalEntityReferenceSerializer()
204208
return localEntityReferenceSerializer;
205209
}
206210

211+
private UserReferenceResolver<DocumentReference> getDocumentReferenceUserReferenceResolver()
212+
{
213+
if (this.documentReferenceUserReferenceResolver == null) {
214+
this.documentReferenceUserReferenceResolver =
215+
Utils.getComponent(UserReferenceResolver.TYPE_DOCUMENT_REFERENCE, "document");
216+
}
217+
return this.documentReferenceUserReferenceResolver;
218+
}
219+
207220
private ContextualLocalizationManager getLocalization()
208221
{
209222
if (this.localization == null) {
@@ -337,7 +350,9 @@ public void setDisabled(boolean disable, XWikiContext context)
337350
XWikiDocument userdoc = getUserDocument(context);
338351
userdoc.setIntValue(getUserClassReference(userdoc.getDocumentReference().getWikiReference()),
339352
ACTIVE_PROPERTY, activeFlag);
340-
userdoc.setAuthorReference(context.getUserReference());
353+
UserReference userReference =
354+
getDocumentReferenceUserReferenceResolver().resolve(context.getUserReference());
355+
userdoc.getAuthors().setOriginalMetadataAuthor(userReference);
341356
context.getWiki().saveDocument(userdoc,
342357
localizePlainOrKey("core.users." + (disable ? "disable" : "enable") + ".saveComment"), context);
343358
} catch (XWikiException e) {

xwiki-platform-core/xwiki-platform-oldcore/src/test/java/com/xpn/xwiki/user/api/XWikiUserTest.java

Lines changed: 102 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,17 @@
1919
*/
2020
package com.xpn.xwiki.user.api;
2121

22+
import javax.inject.Named;
23+
2224
import org.junit.jupiter.api.BeforeEach;
2325
import org.junit.jupiter.api.Test;
2426
import org.mockito.Mock;
2527
import org.xwiki.localization.ContextualLocalizationManager;
28+
import org.xwiki.model.document.DocumentAuthors;
2629
import org.xwiki.model.reference.DocumentReference;
30+
import org.xwiki.test.junit5.mockito.MockComponent;
2731
import org.xwiki.test.mockito.MockitoComponentManager;
32+
import org.xwiki.user.UserReferenceResolver;
2833

2934
import com.xpn.xwiki.XWikiException;
3035
import com.xpn.xwiki.doc.XWikiDocument;
@@ -56,21 +61,29 @@ public class XWikiUserTest
5661
@InjectMockitoOldcore
5762
private MockitoOldcore mockitoOldcore;
5863

64+
@MockComponent
65+
@Named("document")
66+
private UserReferenceResolver<DocumentReference> documentReferenceUserReferenceResolver;
67+
5968
@Mock
6069
private XWikiDocument userDocument;
6170

62-
private DocumentReference userClassReference = new DocumentReference("xwiki", "XWiki", "XWikiUsers");
71+
@Mock
72+
private DocumentAuthors authors;
73+
74+
private final DocumentReference userClassReference = new DocumentReference("xwiki", "XWiki", "XWikiUsers");
6375

64-
private DocumentReference userReference = new DocumentReference("xwiki", "XWiki", "Foo");
76+
private final DocumentReference userReference = new DocumentReference("xwiki", "XWiki", "Foo");
6577

6678
@BeforeEach
6779
public void setup(MockitoComponentManager componentManager) throws Exception
6880
{
69-
when(mockitoOldcore.getSpyXWiki().getDocument(userReference, mockitoOldcore.getXWikiContext()))
70-
.thenReturn(userDocument);
71-
when(userDocument.getDocumentReference()).thenReturn(userReference);
72-
when(userDocument.getDocumentReferenceWithLocale()).thenReturn(userReference);
73-
when(userDocument.clone()).thenReturn(userDocument);
81+
when(this.mockitoOldcore.getSpyXWiki().getDocument(this.userReference, this.mockitoOldcore.getXWikiContext()))
82+
.thenReturn(this.userDocument);
83+
when(this.userDocument.getDocumentReference()).thenReturn(this.userReference);
84+
when(this.userDocument.getDocumentReferenceWithLocale()).thenReturn(this.userReference);
85+
when(this.userDocument.getAuthors()).thenReturn(this.authors);
86+
when(this.userDocument.clone()).thenReturn(this.userDocument);
7487
componentManager.registerMockComponent(ContextualLocalizationManager.class, "default");
7588
}
7689

@@ -95,138 +108,142 @@ public void createWithNullFullName()
95108
@Test
96109
public void isDisabled()
97110
{
98-
XWikiUser user = new XWikiUser(userReference);
99-
when(userDocument.getIntValue(userClassReference, XWikiUser.ACTIVE_PROPERTY, 1)).thenReturn(1);
100-
assertFalse(user.isDisabled(mockitoOldcore.getXWikiContext()));
111+
XWikiUser user = new XWikiUser(this.userReference);
112+
when(this.userDocument.getIntValue(this.userClassReference, XWikiUser.ACTIVE_PROPERTY, 1)).thenReturn(1);
113+
assertFalse(user.isDisabled(this.mockitoOldcore.getXWikiContext()));
101114

102-
when(userDocument.getIntValue(userClassReference, XWikiUser.ACTIVE_PROPERTY, 1)).thenReturn(0);
103-
assertTrue(user.isDisabled(mockitoOldcore.getXWikiContext()));
115+
when(this.userDocument.getIntValue(this.userClassReference, XWikiUser.ACTIVE_PROPERTY, 1)).thenReturn(0);
116+
assertTrue(user.isDisabled(this.mockitoOldcore.getXWikiContext()));
104117

105118
user = new XWikiUser((DocumentReference) null);
106-
assertFalse(user.isDisabled(mockitoOldcore.getXWikiContext()));
119+
assertFalse(user.isDisabled(this.mockitoOldcore.getXWikiContext()));
107120

108121
user = new XWikiUser(XWikiRightService.SUPERADMIN_USER_FULLNAME);
109-
assertFalse(user.isDisabled(mockitoOldcore.getXWikiContext()));
122+
assertFalse(user.isDisabled(this.mockitoOldcore.getXWikiContext()));
110123
}
111124

112125
@Test
113126
public void setDisabledFalseNormalUser() throws XWikiException
114127
{
115-
XWikiUser user = new XWikiUser(userReference);
116-
user.setDisabled(false, mockitoOldcore.getXWikiContext());
117-
verify(userDocument, times(1)).setIntValue(userClassReference, XWikiUser.ACTIVE_PROPERTY, 1);
118-
verify(mockitoOldcore.getSpyXWiki(), times(1))
119-
.saveDocument(same(userDocument), any(String.class), same(mockitoOldcore.getXWikiContext()));
128+
XWikiUser user = new XWikiUser(this.userReference);
129+
user.setDisabled(false, this.mockitoOldcore.getXWikiContext());
130+
verify(this.userDocument, times(1)).setIntValue(this.userClassReference, XWikiUser.ACTIVE_PROPERTY, 1);
131+
verify(this.mockitoOldcore.getSpyXWiki(), times(1))
132+
.saveDocument(same(this.userDocument), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
133+
verify(this.authors, times(1)).setOriginalMetadataAuthor(any());
134+
verify(this.authors, never()).setEffectiveMetadataAuthor(any());
120135
}
121136

122137
@Test
123138
public void setDisabledTrueNormalUser() throws XWikiException
124139
{
125-
XWikiUser user = new XWikiUser(userReference);
126-
user.setDisabled(true, mockitoOldcore.getXWikiContext());
127-
verify(userDocument, times(1)).setIntValue(userClassReference, XWikiUser.ACTIVE_PROPERTY, 0);
128-
verify(mockitoOldcore.getSpyXWiki(), times(1))
129-
.saveDocument(same(userDocument), any(String.class), same(mockitoOldcore.getXWikiContext()));
140+
XWikiUser user = new XWikiUser(this.userReference);
141+
user.setDisabled(true, this.mockitoOldcore.getXWikiContext());
142+
verify(this.userDocument, times(1)).setIntValue(this.userClassReference, XWikiUser.ACTIVE_PROPERTY, 0);
143+
verify(this.mockitoOldcore.getSpyXWiki(), times(1))
144+
.saveDocument(same(this.userDocument), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
145+
verify(this.authors, times(1)).setOriginalMetadataAuthor(any());
146+
verify(this.authors, never()).setEffectiveMetadataAuthor(any());
130147
}
131148

132149
@Test
133150
public void setDisabledGuestOrSuperadminUser() throws XWikiException
134151
{
135152
// With guest user we never save anything
136153
XWikiUser user = new XWikiUser((DocumentReference) null);
137-
user.setDisabled(true, mockitoOldcore.getXWikiContext());
138-
verify(userDocument, never())
139-
.setIntValue(same(userClassReference), any(String.class), any(Integer.class));
140-
verify(mockitoOldcore.getSpyXWiki(), never())
141-
.saveDocument(any(XWikiDocument.class), any(String.class), same(mockitoOldcore.getXWikiContext()));
142-
143-
user.setDisabled(false, mockitoOldcore.getXWikiContext());
144-
verify(userDocument, never())
145-
.setIntValue(same(userClassReference), any(String.class), any(Integer.class));
146-
verify(mockitoOldcore.getSpyXWiki(), never())
147-
.saveDocument(any(XWikiDocument.class), any(String.class), same(mockitoOldcore.getXWikiContext()));
154+
user.setDisabled(true, this.mockitoOldcore.getXWikiContext());
155+
verify(this.userDocument, never())
156+
.setIntValue(same(this.userClassReference), any(String.class), any(Integer.class));
157+
verify(this.mockitoOldcore.getSpyXWiki(), never())
158+
.saveDocument(any(XWikiDocument.class), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
159+
160+
user.setDisabled(false, this.mockitoOldcore.getXWikiContext());
161+
verify(this.userDocument, never())
162+
.setIntValue(same(this.userClassReference), any(String.class), any(Integer.class));
163+
verify(this.mockitoOldcore.getSpyXWiki(), never())
164+
.saveDocument(any(XWikiDocument.class), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
148165

149166
// With superadmin user we never save anything
150167
user = new XWikiUser(XWikiRightService.SUPERADMIN_USER_FULLNAME);
151-
user.setDisabled(true, mockitoOldcore.getXWikiContext());
152-
verify(userDocument, never())
153-
.setIntValue(same(userClassReference), any(String.class), any(Integer.class));
154-
verify(mockitoOldcore.getSpyXWiki(), never())
155-
.saveDocument(any(XWikiDocument.class), any(String.class), same(mockitoOldcore.getXWikiContext()));
156-
157-
user.setDisabled(false, mockitoOldcore.getXWikiContext());
158-
verify(userDocument, never())
159-
.setIntValue(same(userClassReference), any(String.class), any(Integer.class));
160-
verify(mockitoOldcore.getSpyXWiki(), never())
161-
.saveDocument(any(XWikiDocument.class), any(String.class), same(mockitoOldcore.getXWikiContext()));
168+
user.setDisabled(true, this.mockitoOldcore.getXWikiContext());
169+
verify(this.userDocument, never())
170+
.setIntValue(same(this.userClassReference), any(String.class), any(Integer.class));
171+
verify(this.mockitoOldcore.getSpyXWiki(), never())
172+
.saveDocument(any(XWikiDocument.class), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
173+
174+
user.setDisabled(false, this.mockitoOldcore.getXWikiContext());
175+
verify(this.userDocument, never())
176+
.setIntValue(same(this.userClassReference), any(String.class), any(Integer.class));
177+
verify(this.mockitoOldcore.getSpyXWiki(), never())
178+
.saveDocument(any(XWikiDocument.class), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
162179
}
163180

164181
@Test
165182
public void isEmailChecked()
166183
{
167-
XWikiUser user = new XWikiUser(userReference);
168-
when(userDocument.getIntValue(userClassReference, XWikiUser.EMAIL_CHECKED_PROPERTY, 1)).thenReturn(1);
169-
assertTrue(user.isEmailChecked(mockitoOldcore.getXWikiContext()));
184+
XWikiUser user = new XWikiUser(this.userReference);
185+
when(this.userDocument.getIntValue(this.userClassReference, XWikiUser.EMAIL_CHECKED_PROPERTY, 1)).thenReturn(1);
186+
assertTrue(user.isEmailChecked(this.mockitoOldcore.getXWikiContext()));
170187

171-
when(userDocument.getIntValue(userClassReference, XWikiUser.EMAIL_CHECKED_PROPERTY, 1)).thenReturn(0);
172-
assertFalse(user.isEmailChecked(mockitoOldcore.getXWikiContext()));
188+
when(this.userDocument.getIntValue(this.userClassReference, XWikiUser.EMAIL_CHECKED_PROPERTY, 1)).thenReturn(0);
189+
assertFalse(user.isEmailChecked(this.mockitoOldcore.getXWikiContext()));
173190

174191
user = new XWikiUser((DocumentReference) null);
175-
assertTrue(user.isEmailChecked(mockitoOldcore.getXWikiContext()));
192+
assertTrue(user.isEmailChecked(this.mockitoOldcore.getXWikiContext()));
176193

177194
user = new XWikiUser(XWikiRightService.SUPERADMIN_USER_FULLNAME);
178-
assertTrue(user.isEmailChecked(mockitoOldcore.getXWikiContext()));
195+
assertTrue(user.isEmailChecked(this.mockitoOldcore.getXWikiContext()));
179196
}
180197

181198
@Test
182199
public void setEmailCheckedFalseNormalUser() throws XWikiException
183200
{
184-
XWikiUser user = new XWikiUser(userReference);
185-
user.setEmailChecked(false, mockitoOldcore.getXWikiContext());
186-
verify(userDocument, times(1)).setIntValue(userClassReference, XWikiUser.EMAIL_CHECKED_PROPERTY, 0);
187-
verify(mockitoOldcore.getSpyXWiki(), times(1))
188-
.saveDocument(same(userDocument), any(String.class), same(mockitoOldcore.getXWikiContext()));
201+
XWikiUser user = new XWikiUser(this.userReference);
202+
user.setEmailChecked(false, this.mockitoOldcore.getXWikiContext());
203+
verify(this.userDocument, times(1)).setIntValue(this.userClassReference, XWikiUser.EMAIL_CHECKED_PROPERTY, 0);
204+
verify(this.mockitoOldcore.getSpyXWiki(), times(1))
205+
.saveDocument(same(this.userDocument), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
189206
}
190207

191208
@Test
192209
public void setEmailCheckedTrueNormalUser() throws XWikiException
193210
{
194-
XWikiUser user = new XWikiUser(userReference);
195-
user.setEmailChecked(true, mockitoOldcore.getXWikiContext());
196-
verify(userDocument, times(1)).setIntValue(userClassReference, XWikiUser.EMAIL_CHECKED_PROPERTY, 1);
197-
verify(mockitoOldcore.getSpyXWiki(), times(1))
198-
.saveDocument(same(userDocument), any(String.class), same(mockitoOldcore.getXWikiContext()));
211+
XWikiUser user = new XWikiUser(this.userReference);
212+
user.setEmailChecked(true, this.mockitoOldcore.getXWikiContext());
213+
verify(this.userDocument, times(1)).setIntValue(this.userClassReference, XWikiUser.EMAIL_CHECKED_PROPERTY, 1);
214+
verify(this.mockitoOldcore.getSpyXWiki(), times(1))
215+
.saveDocument(same(this.userDocument), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
199216
}
200217

201218
@Test
202219
public void setEmailCheckedGuestOrSuperadminUser() throws XWikiException
203220
{
204221
// With guest user we never save anything
205222
XWikiUser user = new XWikiUser((DocumentReference) null);
206-
user.setEmailChecked(true, mockitoOldcore.getXWikiContext());
207-
verify(userDocument, never())
208-
.setIntValue(same(userClassReference), any(String.class), any(Integer.class));
209-
verify(mockitoOldcore.getSpyXWiki(), never())
210-
.saveDocument(any(XWikiDocument.class), any(String.class), same(mockitoOldcore.getXWikiContext()));
211-
212-
user.setEmailChecked(false, mockitoOldcore.getXWikiContext());
213-
verify(userDocument, never())
214-
.setIntValue(same(userClassReference), any(String.class), any(Integer.class));
215-
verify(mockitoOldcore.getSpyXWiki(), never())
216-
.saveDocument(any(XWikiDocument.class), any(String.class), same(mockitoOldcore.getXWikiContext()));
223+
user.setEmailChecked(true, this.mockitoOldcore.getXWikiContext());
224+
verify(this.userDocument, never())
225+
.setIntValue(same(this.userClassReference), any(String.class), any(Integer.class));
226+
verify(this.mockitoOldcore.getSpyXWiki(), never())
227+
.saveDocument(any(XWikiDocument.class), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
228+
229+
user.setEmailChecked(false, this.mockitoOldcore.getXWikiContext());
230+
verify(this.userDocument, never())
231+
.setIntValue(same(this.userClassReference), any(String.class), any(Integer.class));
232+
verify(this.mockitoOldcore.getSpyXWiki(), never())
233+
.saveDocument(any(XWikiDocument.class), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
217234

218235
// With superadmin user we never save anything
219236
user = new XWikiUser(XWikiRightService.SUPERADMIN_USER_FULLNAME);
220-
user.setEmailChecked(true, mockitoOldcore.getXWikiContext());
221-
verify(userDocument, never())
222-
.setIntValue(same(userClassReference), any(String.class), any(Integer.class));
223-
verify(mockitoOldcore.getSpyXWiki(), never())
224-
.saveDocument(any(XWikiDocument.class), any(String.class), same(mockitoOldcore.getXWikiContext()));
225-
226-
user.setEmailChecked(false, mockitoOldcore.getXWikiContext());
227-
verify(userDocument, never())
228-
.setIntValue(same(userClassReference), any(String.class), any(Integer.class));
229-
verify(mockitoOldcore.getSpyXWiki(), never())
230-
.saveDocument(any(XWikiDocument.class), any(String.class), same(mockitoOldcore.getXWikiContext()));
237+
user.setEmailChecked(true, this.mockitoOldcore.getXWikiContext());
238+
verify(this.userDocument, never())
239+
.setIntValue(same(this.userClassReference), any(String.class), any(Integer.class));
240+
verify(this.mockitoOldcore.getSpyXWiki(), never())
241+
.saveDocument(any(XWikiDocument.class), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
242+
243+
user.setEmailChecked(false, this.mockitoOldcore.getXWikiContext());
244+
verify(this.userDocument, never())
245+
.setIntValue(same(this.userClassReference), any(String.class), any(Integer.class));
246+
verify(this.mockitoOldcore.getSpyXWiki(), never())
247+
.saveDocument(any(XWikiDocument.class), any(String.class), same(this.mockitoOldcore.getXWikiContext()));
231248
}
232249
}

xwiki-platform-core/xwiki-platform-web/xwiki-platform-web-templates/src/main/resources/templates/getusers.vm

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,18 @@
128128
'doc_hasdelete': $hasDelete,
129129
'doc_delete_url': $user.getURL('delete'),
130130
'doc_hasdisable': $hasDisable,
131-
'doc_disable_url': $user.getURL('save', $escapetool.url({
132-
"${userClassName}_0_active": 0,
133-
'comment': $services.localization.render('core.users.disable.saveComment'),
134-
'form_token': $services.csrf.token
131+
'doc_disable_url': $xwiki.getURL('XWiki.XWikiUserProfileSheet', 'get', $escapetool.url({
132+
'outputSyntax': 'plain',
133+
'action': 'disable',
134+
'userId': $user.documentReference,
135+
'csrf': $services.csrf.token
135136
})),
136137
'doc_hasenable': $hasEnable,
137-
'doc_enable_url': $user.getURL('save', $escapetool.url({
138-
"${userClassName}_0_active": 1,
139-
'comment': $services.localization.render('core.users.enable.saveComment'),
140-
'form_token': $services.csrf.token
138+
'doc_enable_url': $xwiki.getURL('XWiki.XWikiUserProfileSheet', 'get', $escapetool.url({
139+
'outputSyntax': 'plain',
140+
'action': 'enable',
141+
'userId': $user.documentReference,
142+
'csrf': $services.csrf.token
141143
})),
142144
'name': "#displayUserAliasWithAvatar($user.documentReference $disabled)",
143145
'first_name': $userObject.getValue('first_name'),

0 commit comments

Comments
 (0)