Skip to content

Commit 859d5fe

Browse files
exceptionfactorythenatog
authored andcommitted
NIFI-9785 Improved Login Credentials Writer File Handling
Signed-off-by: Nathan Gough <thenatog@gmail.com> This closes #5856.
1 parent 546f986 commit 859d5fe

File tree

2 files changed

+35
-19
lines changed

2 files changed

+35
-19
lines changed

nifi-commons/nifi-single-user-utils/src/main/java/org/apache/nifi/authentication/single/user/writer/StandardLoginCredentialsWriter.java

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,20 @@
2929
import javax.xml.stream.events.EndElement;
3030
import javax.xml.stream.events.StartElement;
3131
import javax.xml.stream.events.XMLEvent;
32+
import java.io.ByteArrayInputStream;
3233
import java.io.File;
33-
import java.io.FileInputStream;
3434
import java.io.FileOutputStream;
3535
import java.io.IOException;
3636
import java.io.InputStream;
3737
import java.io.OutputStream;
3838
import java.io.UncheckedIOException;
3939
import java.nio.file.Files;
40-
import java.nio.file.StandardCopyOption;
4140
import java.util.Iterator;
4241

4342
/**
4443
* Standard Login Credentials Writer updates Login Identity Providers Single User definition with Login Credentials
4544
*/
4645
public class StandardLoginCredentialsWriter implements LoginCredentialsWriter {
47-
48-
private static final String PROVIDERS_PREFIX = "login-identity-providers-";
49-
50-
private static final String PROVIDERS_SUFFIX = ".xml";
51-
5246
private static final String CLASS_TAG = "class";
5347

5448
private static final String PROVIDER_TAG = "provider";
@@ -71,25 +65,30 @@ public StandardLoginCredentialsWriter(final File providersFile) {
7165

7266
@Override
7367
public void writeLoginCredentials(final SingleUserCredentials singleUserCredentials) {
74-
try {
75-
final File updatedProvidersFile = File.createTempFile(PROVIDERS_PREFIX, PROVIDERS_SUFFIX);
76-
writeLoginCredentials(singleUserCredentials, updatedProvidersFile);
77-
Files.move(updatedProvidersFile.toPath(), providersFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
68+
final byte[] providers = readProviders();
69+
try (final InputStream providersInputStream = new ByteArrayInputStream(providers)) {
70+
writeLoginCredentials(singleUserCredentials, providersInputStream);
7871
} catch (final IOException e) {
7972
throw new UncheckedIOException("Writing Login Identity Providers Failed", e);
8073
} catch (final XMLStreamException e) {
8174
throw new RuntimeException("Processing Login Identity Providers Failed", e);
8275
}
8376
}
8477

85-
private void writeLoginCredentials(final SingleUserCredentials singleUserCredentials, final File updatedProvidersFile) throws IOException, XMLStreamException {
86-
try (final OutputStream outputStream = new FileOutputStream(updatedProvidersFile)) {
78+
private byte[] readProviders() {
79+
try {
80+
return Files.readAllBytes(providersFile.toPath());
81+
} catch (final IOException e) {
82+
throw new UncheckedIOException("Reading Login Identity Providers Failed", e);
83+
}
84+
}
85+
86+
private void writeLoginCredentials(final SingleUserCredentials singleUserCredentials, final InputStream inputStream) throws IOException, XMLStreamException {
87+
try (final OutputStream outputStream = new FileOutputStream(providersFile)) {
8788
final XMLEventWriter providersWriter = getProvidersWriter(outputStream);
88-
try (final InputStream inputStream = new FileInputStream(providersFile)) {
89-
final XMLEventReader providersReader = getProvidersReader(inputStream);
90-
updateLoginIdentityProviders(singleUserCredentials, providersReader, providersWriter);
91-
providersReader.close();
92-
}
89+
final XMLEventReader providersReader = getProvidersReader(inputStream);
90+
updateLoginIdentityProviders(singleUserCredentials, providersReader, providersWriter);
91+
providersReader.close();
9392
providersWriter.close();
9493
}
9594
}
@@ -131,7 +130,7 @@ private void updateLoginIdentityProviders(final SingleUserCredentials singleUser
131130
*
132131
* @param providersReader Providers Reader
133132
* @param providersWriter Providers Writer
134-
* @param propertyValue Property Value to be added
133+
* @param propertyValue Property Value to be added
135134
* @throws XMLStreamException Thrown on XMLEventReader.nextEvent()
136135
*/
137136
private void processProperty(final XMLEventReader providersReader, final XMLEventWriter providersWriter, final String propertyValue) throws XMLStreamException {

nifi-commons/nifi-single-user-utils/src/test/java/org/apache/nifi/authentication/single/user/writer/StandardLoginCredentialsWriterTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,18 @@
1919
import org.apache.nifi.authentication.single.user.SingleUserCredentials;
2020
import org.junit.jupiter.api.Test;
2121

22+
import java.io.File;
2223
import java.io.IOException;
24+
import java.io.UncheckedIOException;
2325
import java.net.URISyntaxException;
2426
import java.nio.file.Files;
2527
import java.nio.file.Path;
2628
import java.nio.file.Paths;
2729
import java.nio.file.StandardCopyOption;
2830
import java.util.UUID;
2931

32+
import static org.junit.jupiter.api.Assertions.assertFalse;
33+
import static org.junit.jupiter.api.Assertions.assertThrows;
3034
import static org.junit.jupiter.api.Assertions.assertTrue;
3135

3236
public class StandardLoginCredentialsWriterTest {
@@ -38,6 +42,19 @@ public class StandardLoginCredentialsWriterTest {
3842

3943
private static final String PROVIDER_CLASS = SingleUserCredentials.class.getName();
4044

45+
@Test
46+
public void testWriteLoginCredentialsProvidersNotFound() {
47+
final File providersNotFound = new File(UUID.randomUUID().toString());
48+
assertFalse(providersNotFound.exists());
49+
50+
final StandardLoginCredentialsWriter writer = new StandardLoginCredentialsWriter(providersNotFound);
51+
52+
final String username = UUID.randomUUID().toString();
53+
final String password = UUID.randomUUID().toString();
54+
final SingleUserCredentials credentials = new SingleUserCredentials(username, password, PROVIDER_CLASS);
55+
assertThrows(UncheckedIOException.class, () -> writer.writeLoginCredentials(credentials));
56+
}
57+
4158
@Test
4259
public void testWriteLoginCredentialsBlankProviders() throws IOException, URISyntaxException {
4360
final Path sourceProvidersPath = Paths.get(getClass().getResource(BLANK_PROVIDERS).toURI());

0 commit comments

Comments
 (0)