]> nmode's Git Repositories - signal-cli/commitdiff
Create config directory/files as only user readable
authorAsamK <asamk@gmx.de>
Wed, 20 Jul 2016 21:11:52 +0000 (23:11 +0200)
committerAsamK <asamk@gmx.de>
Wed, 20 Jul 2016 21:11:52 +0000 (23:11 +0200)
Directories are created with mode 700, files with 600

Fixes #21

src/main/java/org/asamk/signal/Manager.java

index 3e36e319c35825b93fbdcf2a7d6b5dc7add2a23f..68f664554ced9ac4e4e1a772c87c26edf4cb5887 100644 (file)
@@ -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.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.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 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();
 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() {
     }
 
     public String getFileName() {
-        new File(dataPath).mkdirs();
         return dataPath + "/" + username;
     }
 
         return dataPath + "/" + username;
     }
 
+    private static void createPrivateDirectories(String path) throws IOException {
+        final Path file = new File(path).toPath();
+        try {
+            Set<PosixFilePermission> 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<PosixFilePermission> 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;
     public boolean userExists() {
         if (username == null) {
             return false;
@@ -153,6 +177,10 @@ class Manager implements Signal {
         if (fileChannel != null)
             return;
 
         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) {
         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 {
                 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
                         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) {
 
         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()) {
             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 {
     }
 
     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);
         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 {
     }
 
     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);
         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 {
     }
 
     private File retrieveAttachment(SignalServiceAttachmentPointer pointer) throws IOException, InvalidMessageException {
-        new File(attachmentsPath).mkdirs();
+        createPrivateDirectories(attachmentsPath);
         return retrieveAttachment(pointer, getAttachmentFile(pointer.getId()), true);
     }
 
         return retrieveAttachment(pointer, getAttachmentFile(pointer.getId()), true);
     }