From 082a7bb03e33c8066b5d0d169312f5f62f3f2792 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Fri, 9 Dec 2011 21:36:58 -0800 Subject: [PATCH] Change the perms of the socket to whoever owns the console. --- .../dns-updater/SocketListener.h | 3 ++ .../dns-updater/SocketListener.m | 30 ++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/DNSCrypt-Config-Updater/dns-updater/SocketListener.h b/DNSCrypt-Config-Updater/dns-updater/SocketListener.h index c9aa943..7dea890 100644 --- a/DNSCrypt-Config-Updater/dns-updater/SocketListener.h +++ b/DNSCrypt-Config-Updater/dns-updater/SocketListener.h @@ -15,10 +15,13 @@ #define kSOCK_GROUP_NAME "admin" #define kSOCK_PARENT_DIR_PERMS 0710 #define kSOCK_PERMS 0660 +#define kSOCK_REFRESH_RATE 5.0 +#define kREF_OWNER_FILE @"/dev/console" @interface SocketListener : NSObject - (id) initWithDNSUpdater: (DNSUpdater *) updater andProxySpawner: (ProxySpawner *) proxySpawner; - (BOOL) createListener; +- (BOOL) updateSocketPerms; @end diff --git a/DNSCrypt-Config-Updater/dns-updater/SocketListener.m b/DNSCrypt-Config-Updater/dns-updater/SocketListener.m index 1e5dc7b..43c1601 100644 --- a/DNSCrypt-Config-Updater/dns-updater/SocketListener.m +++ b/DNSCrypt-Config-Updater/dns-updater/SocketListener.m @@ -18,6 +18,7 @@ DNSUpdater *_updater; ProxySpawner *_proxySpawner; NSMutableData *_commandBuffer; +gid_t gid; - (id) initWithDNSUpdater: (DNSUpdater *) updater andProxySpawner: (ProxySpawner *)proxySpawner { @@ -128,6 +129,23 @@ NSMutableData *_commandBuffer; [fh readInBackgroundAndNotify]; } +- (BOOL) updateSocketPerms +{ + const char *refOwnerFile = [kREF_OWNER_FILE cStringUsingEncoding: NSUTF8StringEncoding]; + struct stat st; + BOOL ret = TRUE; + + if (stat(refOwnerFile, &st) != 0) { + return FALSE; + } + const char *sockParentDir = [kSOCK_PARENT_DIR cStringUsingEncoding: NSUTF8StringEncoding]; + ret &= ! chown(sockParentDir, st.st_uid, gid); + const char *sockPath = [kSOCK_PATH cStringUsingEncoding: NSUTF8StringEncoding]; + ret &= ! chown(sockPath, st.st_uid, gid); + + return ret; +} + - (BOOL) createListener { mode_t sockParentDirPerms = (mode_t) kSOCK_PARENT_DIR_PERMS; @@ -150,8 +168,11 @@ NSMutableData *_commandBuffer; chmod(sockParentDir, sockParentDirPerms); } if (group != NULL) { - chown(sockParentDir, (uid_t) 0, group->gr_gid); + gid = group->gr_gid; + } else { + gid = (gid_t) 0; } + chown(sockParentDir, (uid_t) 0, gid); const char *sockPath = [kSOCK_PATH cStringUsingEncoding: NSUTF8StringEncoding]; size_t sockPathSize = strlen(sockPath) + (size_t) 1U; struct sockaddr_un *su; @@ -177,9 +198,7 @@ NSMutableData *_commandBuffer; return FALSE; } free(su); - if (group != NULL) { - chown(sockPath, (uid_t) 0, group->gr_gid); - } + chown(sockPath, (uid_t) 0, gid); chmod(sockPath, sockPerms); umask(previousMask); NSFileHandle *fh = [[NSFileHandle alloc] initWithFileDescriptor: fd closeOnDealloc: TRUE]; @@ -191,6 +210,9 @@ NSMutableData *_commandBuffer; selector:@selector(commandRead:) name:@"NSFileHandleReadCompletionNotification" object:nil]; + + [NSTimer scheduledTimerWithTimeInterval: kSOCK_REFRESH_RATE target: self selector: @selector(updateSocketPerms) userInfo: nil repeats: YES]; + return TRUE; }