From: AsamK Date: Wed, 20 Jul 2016 21:11:52 +0000 (+0200) Subject: Create config directory/files as only user readable X-Git-Tag: v0.5.0~10 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/ee5062a2cc83078d1d1d33cba32bbaa89e96f52e?ds=sidebyside Create config directory/files as only user readable Directories are created with mode 700, files with 600 Fixes #21 --- diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index 3e36e319..68f66455 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -60,12 +60,17 @@ import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import static java.nio.file.attribute.PosixFilePermission.*; + class Manager implements Signal { private final static String URL = "https://textsecure-service.whispersystems.org"; private final static TrustStore TRUST_STORE = new WhisperTrustStore(); @@ -124,10 +129,29 @@ class Manager implements Signal { } public String getFileName() { - new File(dataPath).mkdirs(); return dataPath + "/" + username; } + private static void createPrivateDirectories(String path) throws IOException { + final Path file = new File(path).toPath(); + try { + Set perms = EnumSet.of(OWNER_READ, OWNER_WRITE, OWNER_EXECUTE); + Files.createDirectories(file, PosixFilePermissions.asFileAttribute(perms)); + } catch (UnsupportedOperationException e) { + Files.createDirectories(file); + } + } + + private static void createPrivateFile(String path) throws IOException { + final Path file = new File(path).toPath(); + try { + Set perms = EnumSet.of(OWNER_READ, OWNER_WRITE); + Files.createFile(file, PosixFilePermissions.asFileAttribute(perms)); + } catch (UnsupportedOperationException e) { + Files.createFile(file); + } + } + public boolean userExists() { if (username == null) { return false; @@ -153,6 +177,10 @@ class Manager implements Signal { if (fileChannel != null) return; + createPrivateDirectories(dataPath); + if (!new File(getFileName()).exists()) { + createPrivateFile(getFileName()); + } fileChannel = new RandomAccessFile(new File(getFileName()), "rw").getChannel(); lock = fileChannel.tryLock(); if (lock == null) { @@ -202,7 +230,7 @@ class Manager implements Signal { File attachmentFile = getAttachmentFile(g.getAvatarId()); if (!avatarFile.exists() && attachmentFile.exists()) { try { - new File(avatarsPath).mkdirs(); + createPrivateDirectories(avatarsPath); Files.copy(attachmentFile.toPath(), avatarFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (Exception e) { // Ignore @@ -569,7 +597,7 @@ class Manager implements Signal { File aFile = getGroupAvatarFile(g.groupId); if (avatarFile != null) { - new File(avatarsPath).mkdirs(); + createPrivateDirectories(avatarsPath); Files.copy(Paths.get(avatarFile), aFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } if (aFile.exists()) { @@ -908,7 +936,7 @@ class Manager implements Signal { } private File retrieveContactAvatarAttachment(SignalServiceAttachment attachment, String number) throws IOException, InvalidMessageException { - new File(avatarsPath).mkdirs(); + createPrivateDirectories(avatarsPath); if (attachment.isPointer()) { SignalServiceAttachmentPointer pointer = attachment.asPointer(); return retrieveAttachment(pointer, getContactAvatarFile(number), false); @@ -923,7 +951,7 @@ class Manager implements Signal { } private File retrieveGroupAvatarAttachment(SignalServiceAttachment attachment, byte[] groupId) throws IOException, InvalidMessageException { - new File(avatarsPath).mkdirs(); + createPrivateDirectories(avatarsPath); if (attachment.isPointer()) { SignalServiceAttachmentPointer pointer = attachment.asPointer(); return retrieveAttachment(pointer, getGroupAvatarFile(groupId), false); @@ -938,7 +966,7 @@ class Manager implements Signal { } private File retrieveAttachment(SignalServiceAttachmentPointer pointer) throws IOException, InvalidMessageException { - new File(attachmentsPath).mkdirs(); + createPrivateDirectories(attachmentsPath); return retrieveAttachment(pointer, getAttachmentFile(pointer.getId()), true); }