Improved path/execution action (#31)
Improved monitoring  + of external devices (#12)
Improved compatibility for recent versions of macOS (#30)

Shows active devices in status bar menu
This commit is contained in:
Patrick Wardle 2022-11-10 20:45:57 -10:00
parent aefbf06fd3
commit 8d3293dbf6
36 changed files with 1217 additions and 1048 deletions

3
.gitignore vendored
View File

@ -19,4 +19,5 @@ xcuserdata/
# Carthage
Carthage/Build/
Carthage/Checkouts
Carthage/Checkouts
Application/Uninstaller/

View File

@ -34,6 +34,7 @@
CDC60991263CBD36006D1332 /* AVMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = CDC60990263CBD36006D1332 /* AVMonitor.m */; };
CDC60994263CBEE7006D1332 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = CDC60993263CBEE7006D1332 /* Client.m */; };
CDCBF0DE26499DFF001D9F9A /* Event.m in Sources */ = {isa = PBXBuildFile; fileRef = CDCBF0DD26499DFF001D9F9A /* Event.m */; };
CDE09AF729198BA800561CFF /* OverSight Installer.app in Resources */ = {isa = PBXBuildFile; fileRef = CDE09AF629198BA800561CFF /* OverSight Installer.app */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@ -97,6 +98,7 @@
CDC60993263CBEE7006D1332 /* Client.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Client.m; sourceTree = "<group>"; };
CDCBF0DC26499DFF001D9F9A /* Event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = "<group>"; };
CDCBF0DD26499DFF001D9F9A /* Event.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Event.m; sourceTree = "<group>"; };
CDE09AF629198BA800561CFF /* OverSight Installer.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; path = "OverSight Installer.app"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -132,6 +134,7 @@
7D7755DA1F02E05B00D0017D = {
isa = PBXGroup;
children = (
CDE09AF12919829000561CFF /* Uninstaller */,
7D3B75201F13356900568828 /* Shared */,
7D7755E51F02E05B00D0017D /* Source */,
CDAFF434203E55F300F27635 /* Frameworks */,
@ -212,6 +215,14 @@
name = Frameworks;
sourceTree = "<group>";
};
CDE09AF12919829000561CFF /* Uninstaller */ = {
isa = PBXGroup;
children = (
CDE09AF629198BA800561CFF /* OverSight Installer.app */,
);
path = Uninstaller;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -285,6 +296,7 @@
buildActionMask = 2147483647;
files = (
CD8FD5D523BAE2D200EFE0FB /* Preferences.xib in Resources */,
CDE09AF729198BA800561CFF /* OverSight Installer.app in Resources */,
CD6836682391DB6F00CF19C1 /* security.plist in Resources */,
CD2F800C24455333009C3D77 /* AboutWindow.xib in Resources */,
7D16D6951F64E43300DB3161 /* UpdateWindow.xib in Resources */,
@ -457,7 +469,7 @@
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
CODE_SIGN_IDENTITY = "Developer ID Application";
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2.0.2;
CURRENT_PROJECT_VERSION = 2.1.0;
DEVELOPMENT_TEAM = VBG97UB4TA;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
@ -465,8 +477,8 @@
INFOPLIST_FILE = Application/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
LIBRARY_SEARCH_PATHS = "";
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 2.0.2;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 2.1.0;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight";
PRODUCT_NAME = OverSight;
@ -481,7 +493,7 @@
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
CODE_SIGN_IDENTITY = "Developer ID Application";
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2.0.2;
CURRENT_PROJECT_VERSION = 2.1.0;
DEVELOPMENT_TEAM = VBG97UB4TA;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
@ -489,8 +501,8 @@
INFOPLIST_FILE = Application/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
LIBRARY_SEARCH_PATHS = "";
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 2.0.2;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 2.1.0;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight";
PRODUCT_NAME = OverSight;

View File

@ -34,6 +34,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
enableAddressSanitizer = "YES"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
@ -50,6 +51,18 @@
ReferencedContainer = "container:Application.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
<AdditionalOption
key = "NSZombieEnabled"
value = "YES"
isEnabled = "YES">
</AdditionalOption>
<AdditionalOption
key = "MallocScribble"
value = ""
isEnabled = "YES">
</AdditionalOption>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -14,6 +14,7 @@
#import <CoreMedia/CoreMedia.h>
#import <Foundation/Foundation.h>
#import <CoreMediaIO/CMIOHardware.h>
#import <AVFoundation/AVCaptureDevice.h>
#import "Event.h"
#import "LogMonitor.h"
@ -21,35 +22,54 @@
@interface AVMonitor : NSObject <UNUserNotificationCenterDelegate>
//video log monitor
@property(nonatomic, retain)LogMonitor* videoLogMonitor;
//log monitor
@property(nonatomic, retain)LogMonitor* logMonitor;
//audio log monitor
@property(nonatomic, retain)LogMonitor* audioLogMonitor;
//camera attributions
@property(nonatomic, retain)NSMutableArray* cameraAttributions;
//clients
@property(nonatomic, retain)NSMutableArray* videoClients;
//audio attributions
@property(nonatomic, retain)NSMutableArray* audioAttributions;
//audio clients
@property(nonatomic, retain)NSMutableArray* audioClients;
//built in mic
@property(nonatomic, retain)AVCaptureDevice* builtInMic;
//audio (mic) callback
@property(nonatomic, copy)AudioObjectPropertyListenerBlock listenerBlock;
//built in camera
@property(nonatomic, retain)AVCaptureDevice* builtInCamera;
//camera state
@property NSControlStateValue cameraState;
//inital mic state
@property NSControlStateValue initialMicState;
//microphone state
@property NSControlStateValue microphoneState;
//initial camera state
@property NSControlStateValue initialCameraState;
//audio listeners
@property(nonatomic, retain)NSMutableDictionary* audioListeners;
//per device events
@property(nonatomic, retain)NSMutableDictionary* deviceEvents;
//audio event queue
@property(nonatomic, retain)dispatch_queue_t audioEventQueue;
//audio event timer
@property(nonatomic, retain)dispatch_source_t audioEventTimer;
//camera event queue
@property(nonatomic, retain)dispatch_queue_t cameraEventQueue;
//camera event timer
@property(nonatomic, retain)dispatch_source_t cameraEventTimer;
//last microphone state
@property(nonatomic, retain)Event* lastMicEvent;
/* METHODS */
//start
-(void)start;
//enumerate active devices
-(NSMutableArray*)enumerateActiveDevices;
//stop
-(void)stop;

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@ -53,7 +52,7 @@
</menu>
</menuItem>
</items>
<point key="canvasLocation" x="67" y="135"/>
<point key="canvasLocation" x="-168" y="153"/>
</menu>
<menu id="2P0-OI-hGc">
<items>
@ -61,22 +60,29 @@
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="WQ3-qz-mIN"/>
<menuItem title="Disable" tag="101" id="p8u-9L-hFY">
<menuItem title="Active Devices" tag="101" id="HRl-aW-6nn">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="arN-5E-2Bv"/>
<menuItem title="Disable" tag="102" id="p8u-9L-hFY">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="Y5x-j1-ofU"/>
<menuItem title="Preferences..." tag="103" id="Zao-2v-WyJ">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Allowed Items..." tag="102" id="i2A-ax-9ff">
<menuItem title="Allowed Items..." tag="104" id="i2A-ax-9ff">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="xGL-in-U11"/>
<menuItem title="Quit OverSight" tag="104" id="FkZ-L3-H8o">
<menuItem title="Quit OverSight" tag="105" id="FkZ-L3-H8o">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Uninstall OverSight..." tag="106" id="amL-48-7OW">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
</items>
<point key="canvasLocation" x="55" y="10"/>
<point key="canvasLocation" x="55" y="-1.5"/>
</menu>
</objects>
</document>

View File

@ -15,12 +15,6 @@
//pid
@property(nonatomic, retain)NSNumber* pid;
//message count
@property unsigned long long msgCount;
//client id
@property(nonatomic, retain)NSNumber* clientID;
//path
@property(nonatomic, retain)NSString* path;

View File

@ -14,7 +14,7 @@
-(NSString*)description
{
//description
return [NSString stringWithFormat:@"CLIENT: pid: %@, path: %@, clientID: %@", self.pid, self.path, self.clientID];
return [NSString stringWithFormat:@"CLIENT: pid: %@, path: %@", self.pid, self.path];
}
@end

View File

@ -9,6 +9,8 @@
@import Cocoa;
@import Foundation;
#import <AVFoundation/AVCaptureDevice.h>
#import "Client.h"
@interface Event : NSObject
@ -16,20 +18,23 @@
/* METHODS */
//init
-(id)init:(Client*)client device:(int)device state:(NSControlStateValue)state;
-(id)init:(Client*)client device:(AVCaptureDevice*)device deviceType:(int)deviceType state:(NSControlStateValue)state;
/* PROPERTIES */
//client
@property(nonatomic, retain)Client* client;
//time stamp
@property(nonatomic, retain)NSDate* timestamp;
//device
@property(nonatomic, retain)AVCaptureDevice* device;
//device
@property int device;
@property int deviceType;
//state
@property NSControlStateValue state;
//time stamp
@property(nonatomic, retain)NSDate* timestamp;
@end

View File

@ -11,7 +11,7 @@
@implementation Event
//init
-(id)init:(Client*)client device:(int)device state:(NSControlStateValue)state
-(id)init:(Client*)client device:(AVCaptureDevice*)device deviceType:(int)deviceType state:(NSControlStateValue)state
{
//super
self = [super init];
@ -23,6 +23,9 @@
//set device
self.device = device;
//set device type
self.deviceType = deviceType;
//set state
self.state = state;
@ -33,6 +36,4 @@
return self;
}
@end

View File

@ -12,6 +12,7 @@
<outlet property="browseButton" destination="gVP-Ih-dFA" id="j7F-V3-hEq"/>
<outlet property="executeArgsButton" destination="YqA-7j-gYp" id="tbC-AW-etO"/>
<outlet property="executePath" destination="z32-0s-dpb" id="HAL-Mg-ygB"/>
<outlet property="executePathButton" destination="vh6-KZ-8sT" id="VIP-AV-Nf6"/>
<outlet property="modesView" destination="K6i-xr-27e" id="DOb-L3-eeR"/>
<outlet property="toolbar" destination="V8g-Ya-LK4" id="SH2-6E-QST"/>
<outlet property="updateButton" destination="Mtn-pi-zIl" id="Oe1-Jy-nMH"/>
@ -25,14 +26,14 @@
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<rect key="contentRect" x="196" y="240" width="600" height="365"/>
<rect key="contentRect" x="196" y="240" width="600" height="426"/>
<rect key="screenRect" x="0.0" y="0.0" width="3440" height="1415"/>
<view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="600" height="365"/>
<rect key="frame" x="0.0" y="0.0" width="600" height="426"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Tx4-yW-fcJ">
<rect key="frame" x="138" y="2" width="325" height="65"/>
<rect key="frame" x="138" y="13" width="325" height="65"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="OverSight" id="m7R-HO-YMp"/>
</imageView>
@ -75,14 +76,14 @@
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
</connections>
<point key="canvasLocation" x="-823" y="488.5"/>
<point key="canvasLocation" x="-823" y="519"/>
</window>
<customView id="K6i-xr-27e" userLabel="Modes">
<rect key="frame" x="0.0" y="0.0" width="600" height="275"/>
<rect key="frame" x="0.0" y="0.0" width="600" height="376"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<button fixedFrame="YES" tag="1" translatesAutoresizingMaskIntoConstraints="NO" id="4sq-mb-bci">
<rect key="frame" x="39" y="223" width="29" height="18"/>
<rect key="frame" x="39" y="324" width="29" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="RwL-kA-7QL">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -93,7 +94,7 @@
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="156" translatesAutoresizingMaskIntoConstraints="NO" id="xbe-1S-lpy">
<rect key="frame" x="72" y="224" width="114" height="15"/>
<rect key="frame" x="72" y="326" width="114" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Start at Login" id="JVI-Or-h0u">
<font key="font" size="13" name="Menlo-Bold"/>
@ -102,7 +103,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="tFB-E4-zbp">
<rect key="frame" x="72" y="207" width="475" height="15"/>
<rect key="frame" x="72" y="309" width="475" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Automatically (re)start each time you login." id="E0T-Ug-P8f">
<font key="font" size="13" name="Menlo-Regular"/>
@ -111,7 +112,7 @@
</textFieldCell>
</textField>
<button fixedFrame="YES" tag="2" translatesAutoresizingMaskIntoConstraints="NO" id="Bog-hz-gcd">
<rect key="frame" x="39" y="161" width="29" height="18"/>
<rect key="frame" x="39" y="262" width="29" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="Aaw-XT-TEt">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -122,7 +123,7 @@
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="156" translatesAutoresizingMaskIntoConstraints="NO" id="Kjh-jc-STu">
<rect key="frame" x="72" y="162" width="98" height="15"/>
<rect key="frame" x="72" y="264" width="98" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="No Icon Mode" id="4EN-j2-enV">
<font key="font" size="13" name="Menlo-Bold"/>
@ -131,7 +132,7 @@
</textFieldCell>
</textField>
<button fixedFrame="YES" tag="3" translatesAutoresizingMaskIntoConstraints="NO" id="vQ5-vs-uTC">
<rect key="frame" x="39" y="99" width="29" height="18"/>
<rect key="frame" x="39" y="200" width="29" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="RC0-1U-dH3">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -142,25 +143,54 @@
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="262" translatesAutoresizingMaskIntoConstraints="NO" id="Enr-tn-mwG">
<rect key="frame" x="72" y="100" width="200" height="15"/>
<rect key="frame" x="72" y="201" width="318" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Disable 'Inactive' Alerts" id="a5n-tt-65v">
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Ignore External Device 'Activate' Alerts" id="a5n-tt-65v">
<font key="font" size="13" name="Menlo-Bold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="AAL-QY-azK">
<rect key="frame" x="72" y="83" width="522" height="15"/>
<rect key="frame" x="72" y="184" width="522" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Do not show an alert when the camera/microphone is deactivated. " id="SYJ-Qv-cRq">
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Do not show an alert when external devices are activated." id="SYJ-Qv-cRq">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button fixedFrame="YES" tag="4" translatesAutoresizingMaskIntoConstraints="NO" id="d0Y-aN-pCK">
<rect key="frame" x="39" y="148" width="29" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="Gok-kO-tp5">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="menu" size="14"/>
</buttonCell>
<connections>
<action selector="togglePreference:" target="-2" id="jST-9U-viK"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="262" translatesAutoresizingMaskIntoConstraints="NO" id="K3U-Od-Xdy">
<rect key="frame" x="72" y="149" width="200" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Disable 'Inactive' Alerts" id="Gsa-fn-iag">
<font key="font" size="13" name="Menlo-Bold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="5xo-jp-5qA">
<rect key="frame" x="72" y="132" width="522" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Do not show an alert when the camera/microphone is deactivated. " id="1A2-j2-kqG">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DuP-BJ-gMJ">
<rect key="frame" x="212" y="13" width="176" height="32"/>
<rect key="frame" x="212" y="59" width="176" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="View Allowed Items" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="KsW-is-XrR">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -171,7 +201,7 @@
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="xaO-g8-rdS">
<rect key="frame" x="72" y="145" width="475" height="15"/>
<rect key="frame" x="72" y="247" width="475" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Run without showing an icon in the status menu bar." id="SG5-YM-BoV">
<font key="font" size="13" name="Menlo-Regular"/>
@ -180,14 +210,14 @@
</textFieldCell>
</textField>
</subviews>
<point key="canvasLocation" x="-166" y="391.5"/>
<point key="canvasLocation" x="-167" y="510"/>
</customView>
<customView id="Jpg-nC-dWd" userLabel="Action">
<rect key="frame" x="0.0" y="0.0" width="600" height="275"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<button fixedFrame="YES" tag="4" translatesAutoresizingMaskIntoConstraints="NO" id="vh6-KZ-8sT">
<rect key="frame" x="39" y="223" width="29" height="18"/>
<button fixedFrame="YES" tag="5" translatesAutoresizingMaskIntoConstraints="NO" id="vh6-KZ-8sT">
<rect key="frame" x="39" y="224" width="29" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="egz-lN-TtL">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -198,7 +228,7 @@
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="117" translatesAutoresizingMaskIntoConstraints="NO" id="8Tb-Ih-SsC">
<rect key="frame" x="72" y="224" width="59" height="15"/>
<rect key="frame" x="72" y="226" width="59" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Execute" id="ncJ-bF-dAA">
<font key="font" size="13" name="Menlo-Bold"/>
@ -206,7 +236,7 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button fixedFrame="YES" tag="5" translatesAutoresizingMaskIntoConstraints="NO" id="YqA-7j-gYp">
<button fixedFrame="YES" tag="6" translatesAutoresizingMaskIntoConstraints="NO" id="YqA-7j-gYp">
<rect key="frame" x="39" y="151" width="29" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="egX-c0-Flf">
@ -237,9 +267,9 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="382" translatesAutoresizingMaskIntoConstraints="NO" id="z32-0s-dpb">
<rect key="frame" x="143" y="221" width="437" height="20"/>
<rect key="frame" x="143" y="223" width="437" height="20"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" allowsUndo="NO" state="on" borderStyle="bezel" placeholderString="path" drawsBackground="YES" id="Oe0-3Y-Srk">
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" allowsUndo="NO" state="on" borderStyle="bezel" placeholderString="Path..." drawsBackground="YES" id="Oe0-3Y-Srk">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
@ -249,7 +279,7 @@
</connections>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gVP-Ih-dFA">
<rect key="frame" x="498" y="187" width="89" height="33"/>
<rect key="frame" x="498" y="190" width="89" height="33"/>
<constraints>
<constraint firstAttribute="width" constant="75" id="0GJ-HY-4cb"/>
<constraint firstAttribute="height" constant="21" id="J0H-v3-Re0"/>
@ -263,7 +293,7 @@
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="GyI-og-F35">
<rect key="frame" x="72" y="181" width="427" height="30"/>
<rect key="frame" x="72" y="185" width="427" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Execute a script or binary when an event is detected." id="bky-MW-yBn">
<font key="font" size="13" name="Menlo-Regular"/>
@ -274,16 +304,16 @@
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="gVP-Ih-dFA" secondAttribute="trailing" constant="20" symbolic="YES" id="CvO-h8-LQr"/>
<constraint firstItem="gVP-Ih-dFA" firstAttribute="top" secondItem="Jpg-nC-dWd" secondAttribute="top" constant="60" id="nxN-h0-hTd"/>
<constraint firstItem="gVP-Ih-dFA" firstAttribute="top" secondItem="Jpg-nC-dWd" secondAttribute="top" constant="57" id="nxN-h0-hTd"/>
<constraint firstAttribute="trailing" secondItem="gVP-Ih-dFA" secondAttribute="trailing" constant="20" symbolic="YES" id="wdb-4c-5GF"/>
</constraints>
<point key="canvasLocation" x="-166" y="738.5"/>
<point key="canvasLocation" x="384" y="887"/>
</customView>
<customView id="1OV-sl-cSe" userLabel="Update">
<rect key="frame" x="0.0" y="0.0" width="618" height="275"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<button fixedFrame="YES" tag="6" translatesAutoresizingMaskIntoConstraints="NO" id="dml-JS-liI">
<button fixedFrame="YES" tag="7" translatesAutoresizingMaskIntoConstraints="NO" id="dml-JS-liI">
<rect key="frame" x="39" y="223" width="29" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="ljs-bE-JTP">
@ -337,7 +367,7 @@
</textFieldCell>
</textField>
</subviews>
<point key="canvasLocation" x="694" y="708.5"/>
<point key="canvasLocation" x="673" y="436"/>
</customView>
</objects>
<resources>

View File

@ -33,28 +33,28 @@
@property(nonatomic, retain)NSDictionary* preferences;
//toolbar
@property (weak) IBOutlet NSToolbar *toolbar;
//rules prefs view
@property (weak) IBOutlet NSView *rulesView;
@property (weak) IBOutlet NSToolbar* toolbar;
//modes view
@property (strong) IBOutlet NSView *modesView;
@property (strong) IBOutlet NSView* modesView;
//action view
@property (strong) IBOutlet NSView *actionView;
@property (strong) IBOutlet NSView* actionView;
//execute path button
@property (weak) IBOutlet NSButton* executePathButton;
//path to action
@property (weak) IBOutlet NSTextField *executePath;
@property (weak) IBOutlet NSSearchField* executePath;
//browse button
@property (weak) IBOutlet NSButton *browseButton;
@property (weak) IBOutlet NSButton* browseButton;
//execute args button
@property (weak) IBOutlet NSButton *executeArgsButton;
@property (weak) IBOutlet NSButton* executeArgsButton;
//update view
@property (weak) IBOutlet NSView *updateView;
@property (weak) IBOutlet NSView* updateView;
//update button
@property (weak) IBOutlet NSButton *updateButton;

View File

@ -23,7 +23,6 @@ extern os_log_t logHandle;
@synthesize toolbar;
@synthesize modesView;
@synthesize rulesView;
@synthesize actionView;
@synthesize updateView;
@synthesize updateWindowController;
@ -34,17 +33,20 @@ extern os_log_t logHandle;
//'no-icon mode' button
#define BUTTON_NO_ICON_MODE 2
//no external devices mode
#define BUTTON_NO_EXTERNAL_DEVICES_MODE 3
//'disable inactive' button
#define BUTTON_DISABLE_INACTIVE_MODE 3
#define BUTTON_DISABLE_INACTIVE_MODE 4
//action
#define BUTTON_EXECUTE_ACTION 4
#define BUTTON_EXECUTE_ACTION 5
//args for action
#define BUTTON_EXECUTE_ACTION_ARGS 5
#define BUTTON_EXECUTE_ACTION_ARGS 6
//'update mode' button
#define BUTTON_NO_UPDATE_MODE 6
#define BUTTON_NO_UPDATE_MODE 7
//init 'general' view
// add it, and make it selected
@ -58,6 +60,7 @@ extern os_log_t logHandle;
//set rules prefs as default
[self.toolbar setSelectedItemIdentifier:TOOLBAR_MODES_ID];
return;
}
@ -92,6 +95,9 @@ extern os_log_t logHandle;
//no icon
((NSButton*)[view viewWithTag:BUTTON_NO_ICON_MODE]).state = [NSUserDefaults.standardUserDefaults boolForKey:PREF_NO_ICON_MODE];
//no external device monitoring
((NSButton*)[view viewWithTag:BUTTON_NO_EXTERNAL_DEVICES_MODE]).state = [NSUserDefaults.standardUserDefaults boolForKey:PREF_NO_EXTERNAL_DEVICES_MODE];
//disable inactive alerts
((NSButton*)[view viewWithTag:BUTTON_DISABLE_INACTIVE_MODE]).state = [NSUserDefaults.standardUserDefaults boolForKey:PREF_DISABLE_INACTIVE];
@ -205,6 +211,14 @@ bail:
break;
}
//no icon mode
case BUTTON_NO_EXTERNAL_DEVICES_MODE:
{
//set
[NSUserDefaults.standardUserDefaults setBool:state forKey:PREF_NO_EXTERNAL_DEVICES_MODE];
break;
}
//disable inactive mode
case BUTTON_DISABLE_INACTIVE_MODE:
@ -236,6 +250,18 @@ bail:
[self browseButtonHandler:nil];
}
//disabled?
// reset path
if(NSControlStateValueOff == state)
{
//reset
self.executePath.stringValue = @"";
//save path & sync
[NSUserDefaults.standardUserDefaults setObject:nil forKey:PREF_EXECUTE_PATH];
[NSUserDefaults.standardUserDefaults synchronize];
}
break;
}
@ -276,7 +302,6 @@ bail:
return;
}
//TODO: supported OS
//'check for update' button handler
-(IBAction)check4Update:(id)sender
{
@ -378,7 +403,6 @@ bail:
break;
}
return;
}
@ -395,7 +419,8 @@ bail:
//set activation policy
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) setActivationPolicy];
});
});
});
return;
@ -432,9 +457,17 @@ bail:
//show it
response = [panel runModal];
//ignore cancel
//cancel?
// uncheck if path is blank
if(NSModalResponseCancel == response)
{
//blank?
if(0 == self.executePath.stringValue.length)
{
//uncheck
self.executePathButton.state = NSControlStateValueOff;
}
//bail
goto bail;
}

View File

@ -29,6 +29,9 @@
//init
-(id)init:(NSMenu*)menu;
//update status item menu
-(void)setActiveDevices:(NSArray*)activeDevices;
//remove status item
-(void)removeStatusItem;

View File

@ -22,13 +22,18 @@ extern os_log_t logHandle;
enum menuItems
{
status = 100,
devices,
toggle,
rules,
prefs,
rules,
quit,
uninstall,
end
};
//tag for active device
#define TAG_ACTIVE_DEVICE 1000
@implementation StatusBarItem
@synthesize isDisabled;
@ -100,6 +105,96 @@ enum menuItems
return;
}
//update status item menu
-(void)setActiveDevices:(NSArray*)activeDevices
{
//active menu item
NSMenuItem* activeDeviceMenuItem = nil;
//start index
NSInteger menuIndex = -1;
//string for device name/emoji
NSMutableString* deviceDetails = nil;
//get menu item
activeDeviceMenuItem = [self.statusItem.menu itemWithTag:devices];
//get menu item index start
menuIndex = [self.statusItem.menu indexOfItemWithTag:devices];
//iterate over menu
// remove all (prev) active devices
for(NSInteger i = self.statusItem.menu.itemArray.count-1; i>= 0; --i)
{
//remove active devices
if(TAG_ACTIVE_DEVICE == [[self.statusItem.menu itemAtIndex:i] tag])
{
//remove
[self.statusItem.menu removeItemAtIndex:i];
}
}
//no active devices?
// set title and then bail
if(0 == activeDevices.count)
{
//set title
activeDeviceMenuItem.title = @"No Active Devices";
//gone
goto bail;
}
//set title
activeDeviceMenuItem.title = @"Active Devices:";
//inc
menuIndex++;
//add each
for(AVCaptureDevice* activeDevice in activeDevices)
{
//menu item
NSMenuItem* item = nil;
//init string for name/etc
deviceDetails = [NSMutableString string];
//mic?
if(YES == [activeDevice isKindOfClass:NSClassFromString(@"AVCaptureHALDevice")])
{
//add
[deviceDetails appendString:@" 🎙️ "];
}
//camera
else
{
//add
[deviceDetails appendString:@" 📸 "];
}
//add name
[deviceDetails appendString:activeDevice.localizedName];
//init item
item = [[NSMenuItem alloc] initWithTitle:deviceDetails action:nil keyEquivalent:@""];
//set tag
item.tag = TAG_ACTIVE_DEVICE;
//add item to menu
[self.statusItem.menu insertItem:item atIndex:menuIndex];
//inc
menuIndex++;
}
bail:
return;
}
//remove status item
-(void)removeStatusItem
{
@ -246,6 +341,59 @@ enum menuItems
break;
//uninstall
case uninstall:
{
//uninstaller path
NSURL* uninstaller = nil;
//config options
NSWorkspaceOpenConfiguration* configuration = nil;
//init path to uninstaller
uninstaller = [NSBundle.mainBundle URLForResource:@"OverSight Installer" withExtension:@".app"];
if(nil == uninstaller)
{
//err msg
os_log_debug(logHandle, "failed to find uninstaller");
//bail
goto bail;
}
//init configuration
configuration = [[NSWorkspaceOpenConfiguration alloc] init];
//set args
configuration.arguments = @[CMD_UNINSTALL_VIA_UI];
//dbg msg
os_log_debug(logHandle, "launching uninstaller %{public}@", uninstaller);
@try
{
//launch (in)/(un)installer
[NSWorkspace.sharedWorkspace openApplicationAtURL:uninstaller configuration:configuration completionHandler:^(NSRunningApplication * _Nullable app, NSError * _Nullable error) {
//dbg msg
os_log_debug(logHandle, "launched uninstaller: %{public}@ (error: %{public}@)", app, error);
}];
}
@catch(NSException *exception)
{
//err msg
os_log_debug(logHandle, "failed to launch task (%{public}@)", exception);
//bail
goto bail;
}
break;
}
default:
break;

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>

View File

@ -10,6 +10,40 @@
//FOR LOGGING:
// % log stream --level debug --predicate="subsystem='com.objective-see.oversight'"
/*
Server data changed for media domain: <STMediaStatusDomainData: 0x12db069e0> {
audioAttributions = <STActivityAttributionCatalog: 0x12db05cf0> {
};
cameraAttributions = <STListData: 0x12db05290> {
<STMediaStatusDomainCameraCaptureAttribution: 0x12da088c0> {
cameraDescriptor = <STMediaStatusDomainCameraDescriptor: 0x12da088e0; cameraIdentifier: EAB7A68F-EC2B-4487-AADF-D8A91C1CB782; eligibleForPrivacyIndicator: NO>;
activityAttribution = <STActivityAttribution: 0x12da08850> {
attributedEntity = <STAttributedEntity: 0x12da092a0> {
executableIdentity = <STExecutableIdentity: 0x12da08fc0> {
auditToken = <BSAuditToken: 0x12da092e0; AUID: 501; EUID: 501; EGID: 20; RUID: 501; RGID: 20; PID: 72414; ASID: 100004; PIDVersion: 445476>;
};
websiteNonNil = NO;
systemService = NO;
};
};
};
<STMediaStatusDomainCameraCaptureAttribution: 0x12db06370> {
cameraDescriptor = <STMediaStatusDomainCameraDescriptor: 0x12db06390; cameraIdentifier: EAB7A68F-EC2B-4487-AADF-D8A91C1CB782; eligibleForPrivacyIndicator: NO>;
activityAttribution = <STActivityAttribution: 0x12db056f0> {
attributedEntity = <STAttributedEntity: 0x12db04ed0> {
executableIdentity = <STExecutableIdentity: 0x12db04f10> {
auditToken = <BSAuditToken: 0x12db06470; AUID: 501; EUID: 501; EGID: 20; RUID: 501; RGID: 20; PID: 72396; ASID: 100004; PIDVersion: 445425>;
};
websiteNonNil = NO;
systemService = NO;
};
};
};
};
*/
@import Cocoa;
@import OSLog;

View File

@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@ -323,6 +323,7 @@
/* Begin PBXShellScriptBuildPhase section */
CD17D55F20115E5E00F798D7 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@ -332,7 +333,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if [[ $BUILT_PRODUCTS_DIR = *\"ArchiveIntermediates\"* ]]; then\n cp -R -f \"$PROJECT_TEMP_ROOT/UninstalledProducts/macosx/OverSight.app\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources\"\n \n#normal build\nelse\n\nrm -rf \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources/OverSight.app\"\n\n#cp daemon/app\ncp -R -f \"$BUILT_PRODUCTS_DIR/OverSight.app\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources\"\n\nfi\n";
shellScript = "#Note: To build uninstaller for app (menu)\n# 1. Delete this script and build installer\n# 2. *Copy* into App \"Uninstaller\" folder\n# 3. Re-add script, and clean rebuild \n\nif [[ $BUILT_PRODUCTS_DIR = *\"ArchiveIntermediates\"* ]]; then\n cp -R -f \"$PROJECT_TEMP_ROOT/UninstalledProducts/macosx/OverSight.app\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources\"\n \n#normal build\nelse\n\nrm -rf \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources/OverSight.app\"\n\n#cp daemon/app\ncp -R -f \"$BUILT_PRODUCTS_DIR/OverSight.app\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources\"\n\nfi\n\n";
};
/* End PBXShellScriptBuildPhase section */
@ -383,14 +384,14 @@
CODE_SIGN_ENTITLEMENTS = "";
CODE_SIGN_IDENTITY = "Developer ID Application";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 2.0.2;
CURRENT_PROJECT_VERSION = 2.1.0;
DEVELOPMENT_TEAM = VBG97UB4TA;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
INFOPLIST_FILE = Helper/Info.plist;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 2.0.2;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 2.1.0;
ONLY_ACTIVE_ARCH = NO;
OTHER_CODE_SIGN_FLAGS = "";
OTHER_LDFLAGS = (
@ -418,14 +419,14 @@
CODE_SIGN_ENTITLEMENTS = "";
CODE_SIGN_IDENTITY = "Developer ID Application";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 2.0.2;
CURRENT_PROJECT_VERSION = 2.1.0;
DEVELOPMENT_TEAM = VBG97UB4TA;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
INFOPLIST_FILE = Helper/Info.plist;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 2.0.2;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 2.1.0;
ONLY_ACTIVE_ARCH = NO;
OTHER_CODE_SIGN_FLAGS = "";
OTHER_LDFLAGS = (
@ -454,16 +455,19 @@
CODE_SIGN_IDENTITY = "Developer ID Application";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2.0.2;
CURRENT_PROJECT_VERSION = 2.1.0;
DEVELOPMENT_TEAM = VBG97UB4TA;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
INFOPLIST_FILE = Source/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST))",
"@executable_path/../Frameworks",
);
LIBRARY_SEARCH_PATHS = "";
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 2.0.2;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 2.1.0;
OTHER_CODE_SIGN_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight.installer";
PRODUCT_NAME = "OverSight Installer";
@ -480,16 +484,19 @@
CODE_SIGN_IDENTITY = "Developer ID Application";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 2.0.2;
CURRENT_PROJECT_VERSION = 2.1.0;
DEVELOPMENT_TEAM = VBG97UB4TA;
ENABLE_HARDENED_RUNTIME = YES;
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
INFOPLIST_FILE = Source/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST))",
"@executable_path/../Frameworks",
);
LIBRARY_SEARCH_PATHS = "";
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 2.0.2;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 2.1.0;
OTHER_CODE_SIGN_FLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight.installer";
PRODUCT_NAME = "OverSight Installer";
@ -542,7 +549,7 @@
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MACOSX_DEPLOYMENT_TARGET = 12.0;
ONLY_ACTIVE_ARCH = NO;
PROVISIONING_PROFILE = "";
RUN_CLANG_STATIC_ANALYZER = YES;
@ -592,7 +599,7 @@
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MACOSX_DEPLOYMENT_TARGET = 12.0;
ONLY_ACTIVE_ARCH = NO;
PROVISIONING_PROFILE = "";
RUN_CLANG_STATIC_ANALYZER = YES;

View File

@ -0,0 +1,35 @@
{
"images" : [
{
"filename" : "darkMode.png",
"idiom" : "mac"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"filename" : "lightMode.png",
"idiom" : "mac"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "darkMode.png",
"idiom" : "mac"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -0,0 +1,35 @@
{
"images" : [
{
"idiom" : "mac",
"filename" : "darkMode.png"
},
{
"idiom" : "mac",
"filename" : "lightMode.png",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
]
},
{
"idiom" : "mac",
"filename" : "darkMode.png",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
]
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"preserves-vector-representation" : true
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,33 +1,33 @@
{
"images" : [
{
"idiom" : "mac",
"filename" : "darkMode.png"
"filename" : "darkMode.png",
"idiom" : "mac"
},
{
"idiom" : "mac",
"filename" : "lightMode.png",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
]
],
"filename" : "lightMode.png",
"idiom" : "mac"
},
{
"idiom" : "mac",
"filename" : "darkMode.png",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
]
],
"filename" : "darkMode.png",
"idiom" : "mac"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,35 @@
{
"images" : [
{
"filename" : "darkMode.png",
"idiom" : "mac"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"filename" : "lightMode.png",
"idiom" : "mac"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "darkMode.png",
"idiom" : "mac"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -78,12 +78,32 @@ extern os_log_t logHandle;
[self window].title = [NSString stringWithFormat:@"version %@", getAppVersion()];
//init status msg
[self.statusMsg setStringValue:@"...protects your webcam and microphone!"];
[self.statusMsg setStringValue:@"...protects your webcam & microphone!"];
//uninstall via app?
// just enable uinstall button
if(YES == [NSProcessInfo.processInfo.arguments containsObject:CMD_UNINSTALL_VIA_UI])
{
//enable uninstall
self.uninstallButton.enabled = YES;
//disable install
self.installButton.enabled = NO;
//make uninstall button first responder
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (100 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
//set first responder
[self.window makeFirstResponder:self.uninstallButton];
});
}
//app already installed?
// enable 'uninstall' button
// change 'install' button to say 'upgrade'
if(YES == isInstalled)
else if(YES == isInstalled)
{
//enable 'uninstall'
self.uninstallButton.enabled = YES;

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="20037" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="20037"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@ -96,7 +96,7 @@
<point key="canvasLocation" x="216.5" y="-225.5"/>
</window>
<customView id="bkk-rY-ALC" userLabel="Support">
<rect key="frame" x="0.0" y="0.0" width="812" height="454"/>
<rect key="frame" x="0.0" y="0.0" width="812" height="500"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<box fixedFrame="YES" boxType="custom" borderType="none" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="8QY-YW-R4a">
@ -133,7 +133,7 @@
<color key="fillColor" red="0.52700018810602922" green="0.69087679927512946" blue="0.21211786802009008" alpha="0.9959562059859155" colorSpace="custom" customColorSpace="sRGB"/>
</box>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Lq7-rg-Vi8">
<rect key="frame" x="12" y="392" width="367" height="54"/>
<rect key="frame" x="12" y="438" width="367" height="54"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Support OverSight?" id="hLy-Nm-ajB">
<font key="font" size="32" name="AvenirNextCondensed-Regular"/>
@ -142,12 +142,12 @@
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2VU-bI-F6R">
<rect key="frame" x="13" y="235" width="128" height="128"/>
<rect key="frame" x="13" y="281" width="128" height="128"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="Love" id="KDa-FN-bji"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" preferredMaxLayoutWidth="660" translatesAutoresizingMaskIntoConstraints="NO" id="5tM-5c-KKa">
<rect key="frame" x="151" y="244" width="636" height="110"/>
<rect key="frame" x="151" y="290" width="636" height="110"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="It's free, open-source, and written by a single (mac-loving) coder!" id="WLJ-8f-ExO">
<font key="font" size="40" name="AvenirNextCondensed-Regular"/>
@ -155,42 +155,8 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" alphaValue="0.59999999999999998" id="hcK-0X-K04">
<rect key="frame" x="290" y="105" width="233" height="29"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="Mahalo to the &quot;Friends Objective-See&quot;" id="x7K-o7-Ccb">
<font key="font" size="15" name="AvenirNextCondensed-Regular"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.90000000000000002" id="sGr-d7-8XJ">
<rect key="frame" x="23" y="57" width="104" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsJamf" id="Y3P-IW-QqH"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.90000000000000002" id="3xq-LX-eQC">
<rect key="frame" x="162" y="57" width="127" height="36"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsMosyle" id="tYt-qP-78Y"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.59999999999999998" id="hQo-Iv-Tqu">
<rect key="frame" x="322" y="57" width="123" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsKandji" id="Wvj-lw-Sj1"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.69999999999999996" id="jRS-B1-EGC">
<rect key="frame" x="674" y="61" width="123" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsKollide" id="aMp-cA-4ja"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.75" id="RsF-Dm-R74">
<rect key="frame" x="477" y="42" width="181" height="65"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsMacPaw" id="sSW-HX-Kg7"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" preferredMaxLayoutWidth="660" translatesAutoresizingMaskIntoConstraints="NO" id="mL7-9q-jrx">
<rect key="frame" x="520" y="173" width="274" height="57"/>
<rect key="frame" x="520" y="219" width="274" height="57"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Show some love? " id="Hvk-zS-1VC">
<font key="font" size="40" name="AvenirNextCondensed-Regular"/>
@ -198,16 +164,62 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.90000000000000002" id="Zyf-mO-fF5">
<rect key="frame" x="137" y="104" width="84" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsJamf" id="tGS-D3-Ik3"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.69999999999999996" id="3mq-qv-h8l">
<rect key="frame" x="350" y="56" width="114" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsKandji" id="e6d-In-kuf"/>
</imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" alphaValue="0.59999999999999998" id="MWL-4T-Xv3">
<rect key="frame" x="306" y="152" width="203" height="29"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="Mahalo to the &quot;Friends Objective-See&quot;" id="OYn-6J-Cfb">
<font key="font" size="15" name="AvenirNextCondensed-Regular"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.75" id="fJC-IE-PH9">
<rect key="frame" x="137" y="52" width="169" height="39"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsMacPaw" id="08t-7Z-gUk"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.66000000000000003" id="GTI-Em-kfn">
<rect key="frame" x="425" y="107" width="98" height="33"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsFleet" id="RBg-Sd-ADQ"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.66000000000000003" id="9c2-Co-4Ql">
<rect key="frame" x="528" y="49" width="148" height="46"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsPANW" id="dHd-yp-fGA"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.66000000000000003" id="3nY-gD-7cS">
<rect key="frame" x="546" y="102" width="130" height="36"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsKolide" id="wBR-4L-PRo"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.66000000000000003" id="KTw-zc-RYn">
<rect key="frame" x="268" y="100" width="127" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsMosyle" id="xZu-49-45r"/>
</imageView>
</subviews>
<point key="canvasLocation" x="686" y="1350"/>
<point key="canvasLocation" x="686" y="1393.5"/>
</customView>
</objects>
<resources>
<image name="FriendsFleet" width="236" height="96"/>
<image name="FriendsJamf" width="328" height="114"/>
<image name="FriendsKandji" width="500" height="127"/>
<image name="FriendsKollide" width="636" height="216"/>
<image name="FriendsKandji" width="1944" height="494"/>
<image name="FriendsKolide" width="636" height="216"/>
<image name="FriendsMacPaw" width="2034" height="335"/>
<image name="FriendsMosyle" width="925" height="242"/>
<image name="FriendsMosyle" width="963" height="265"/>
<image name="FriendsPANW" width="1312" height="240"/>
<image name="Icon" width="512" height="512"/>
<image name="Love" width="256" height="256"/>
<image name="OverSight" width="1301" height="227"/>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"/>

View File

@ -62,13 +62,13 @@
#define SIGNING_AUTH @"Developer ID Application: Objective-See, LLC (VBG97UB4TA)"
//product version url
#define PRODUCT_VERSIONS_URL @"https://objective-see.com/products.json"
#define PRODUCT_VERSIONS_URL @"https://objective-see.org/products.json"
//product url
#define PRODUCT_URL @"https://objective-see.com/products/oversight.html"
#define PRODUCT_URL @"https://objective-see.org/products/oversight.html"
//error(s) url
#define ERRORS_URL @"https://objective-see.com/errors.html"
#define ERRORS_URL @"https://objective-see.org/errors.html"
//os major
#define SUPPORTED_OS_MAJOR @"OSMajor"
@ -134,6 +134,10 @@
// icon mode
#define PREF_NO_ICON_MODE @"noIconMode"
//prefs
// no external devices mode
#define PREF_NO_EXTERNAL_DEVICES_MODE @"noExternalDevicesMode"
//prefs
// update mode
#define PREF_NO_UPDATE_MODE @"noupdateMode"
@ -142,7 +146,7 @@
#define PREFS_ALLOWED_ITEMS @"allowedItems"
//general error URL
#define FATAL_ERROR_URL @"https://objective-see.com/errors.html"
#define FATAL_ERROR_URL @"https://objective-see.org/errors.html"
//key for exit code
#define EXIT_CODE @"exitCode"
@ -177,6 +181,9 @@
//cmdline flag to uninstall
#define ACTION_UNINSTALL @"-uninstall"
//uninstall via UI
#define CMD_UNINSTALL_VIA_UI @"-uninstallViaUI"
//flag to uninstall
#define ACTION_UNINSTALL_FLAG 0

View File

@ -1,5 +1,5 @@
Patrons (2^6+):
Jan Koum, Christian Blümlein, MikeyH
Jan Koum, Nick, Shain Singh, Christian Blümlein, Rocky Zadok, Cane Juice, M S
Friends of Objective-See:
Jamf, Mosyle, Kandji, CleanMyMac X, Kollide, SmugMug, Guardian Mobile Firewall, iVerify, Halo Privacy, uberAgent
Kandji, Jamf, Mosyle, CleanMyMac X, Kolide, Fleet, Palo Alto Networks, SmugMug, Guardian Mobile Firewall, iVerify, Halo Privacy