提交 088edabb 编写于 作者: J Jesse Glick

[FIXED JENKINS-24317] Corrected user dir migration code from JENKINS-23872.

Adapted from #1375 by @daniel-beck: omitting change to User construction, and adding test.
上级 151e1553
...@@ -61,6 +61,9 @@ Upcoming changes</a> ...@@ -61,6 +61,9 @@ Upcoming changes</a>
<li class=bug> <li class=bug>
Deadlock in <code>OldDataMonitor</code>. Deadlock in <code>OldDataMonitor</code>.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-24358">issue 24358</a>) (<a href="https://issues.jenkins-ci.org/browse/JENKINS-24358">issue 24358</a>)
<li class='major bug'>
Failure to migrate legacy user records properly broke Jenkins.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-24317">issue 24317</a>)
</ul> </ul>
</div><!--=TRUNK-END=--> </div><!--=TRUNK-END=-->
......
...@@ -384,23 +384,26 @@ public class User extends AbstractModelObject implements AccessControlled, Descr ...@@ -384,23 +384,26 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
// check for legacy users and migrate if safe to do so. // check for legacy users and migrate if safe to do so.
File[] legacy = getLegacyConfigFilesFor(id); File[] legacy = getLegacyConfigFilesFor(id);
if (legacy != null && legacy.length > 0) { if (legacy != null && legacy.length > 0) {
for (File p : legacy) { for (File legacyUserDir : legacy) {
final XmlFile legacyXml = new XmlFile(XSTREAM, new File(p, "config.xml")); final XmlFile legacyXml = new XmlFile(XSTREAM, new File(legacyUserDir, "config.xml"));
try { try {
Object o = legacyXml.read(); Object o = legacyXml.read();
if (o instanceof User) { if (o instanceof User) {
User tmp = (User) o; if (idStrategy().equals(id, legacyUserDir.getName()) && !idStrategy().filenameOf(legacyUserDir.getName())
if (idStrategy().equals(id, tmp.getId()) && !idStrategy().filenameOf(tmp.getId()) .equals(legacyUserDir.getName())) {
.equals(p.getParentFile().getName())) { if (!legacyUserDir.renameTo(configFile.getParentFile())) {
if (!p.getParentFile().renameTo(configFile.getParentFile())) { LOGGER.log(Level.WARNING, "Failed to migrate user record from {0} to {1}",
LOGGER.log(Level.FINE, "Could not migrate user record from {0} to {1}", new Object[]{legacyUserDir, configFile.getParentFile()});
new Object[]{p.getParentFile(), configFile.getParentFile()});
} }
break; break;
} }
} else {
LOGGER.log(Level.FINE, "Unexpected object loaded from {0}: {1}",
new Object[]{ legacyUserDir, o });
} }
} catch (IOException e) { } catch (IOException e) {
// ignore LOGGER.log(Level.FINE, String.format("Exception trying to load user from {0}: {1}",
new Object[]{ legacyUserDir, e.getMessage() }), e);
} }
} }
} }
......
...@@ -33,8 +33,10 @@ import hudson.security.GlobalMatrixAuthorizationStrategy; ...@@ -33,8 +33,10 @@ import hudson.security.GlobalMatrixAuthorizationStrategy;
import hudson.security.HudsonPrivateSecurityRealm; import hudson.security.HudsonPrivateSecurityRealm;
import hudson.security.Permission; import hudson.security.Permission;
import hudson.tasks.MailAddressResolver; import hudson.tasks.MailAddressResolver;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import jenkins.model.IdStrategy; import jenkins.model.IdStrategy;
...@@ -47,8 +49,10 @@ import org.junit.Rule; ...@@ -47,8 +49,10 @@ import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.jvnet.hudson.test.Bug; import org.jvnet.hudson.test.Bug;
import org.jvnet.hudson.test.FakeChangeLogSCM; import org.jvnet.hudson.test.FakeChangeLogSCM;
import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.TestExtension; import org.jvnet.hudson.test.TestExtension;
import org.jvnet.hudson.test.recipes.LocalData;
public class UserTest { public class UserTest {
...@@ -220,6 +224,16 @@ public class UserTest { ...@@ -220,6 +224,16 @@ public class UserTest {
assertEquals(user2.getId(), User.idStrategy().idFromFilename(User.idStrategy().filenameOf(user2.getId()))); assertEquals(user2.getId(), User.idStrategy().idFromFilename(User.idStrategy().filenameOf(user2.getId())));
} }
@Issue("JENKINS-24317")
@LocalData
@Test public void migration() throws Exception {
User bob = User.get("bob");
assertEquals("Bob Smith", bob.getFullName());
assertEquals("Bob Smith", User.get("Bob").getFullName());
assertEquals("nonexistent", User.get("nonexistent").getFullName());
assertEquals("[bob]", Arrays.toString(new File(j.jenkins.getRootDir(), "users").list()));
}
@Test @Test
public void testAddAndGetProperty() throws IOException { public void testAddAndGetProperty() throws IOException {
User user = User.get("John Smith"); User user = User.get("John Smith");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册