From cabf53b19c7e0b147768768e16cae8b4c7a83bc0 Mon Sep 17 00:00:00 2001 From: Angelo Failla Date: Mon, 24 Feb 2014 09:29:30 +0000 Subject: [PATCH] Implemented feature request at https://github.com/pallotron/yubiswitch/issues/7 Application now supports basic AppleScript commands: * KeyOn *KeyOff see changes to README.md for example usage. --- README.md | 23 ++++++++ YubiSwitch.sdef | 13 +++++ yubiswitch.xcodeproj/project.pbxproj | 34 +++++++++++ .../xcschemes/xcschememanagement.plist | 15 +++++ yubiswitch/AboutWindowController.xib | 6 +- yubiswitch/AppDelegate.h | 3 +- yubiswitch/AppDelegate.m | 56 +++++++++++++------ yubiswitch/Base.lproj/MainMenu.xib | 17 +++++- yubiswitch/DefaultPreferences.plist | 2 + yubiswitch/YubiKeyScript.h | 34 +++++++++++ yubiswitch/YubiKeyScript.m | 38 +++++++++++++ yubiswitch/yubiswitch-Info.plist | 12 ++-- 12 files changed, 226 insertions(+), 27 deletions(-) create mode 100644 YubiSwitch.sdef create mode 100644 yubiswitch/YubiKeyScript.h create mode 100644 yubiswitch/YubiKeyScript.m diff --git a/README.md b/README.md index 24c600a..0ee9aa5 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,24 @@ Download Download the latest version in DMG format from [github release page here](https://github.com/pallotron/yubiswitch/releases/). +Integration with shell +====================== + +The application supports two basic AppleScript commands: + +* KeyOn +* KeyOff + +You can switch your yubikey on and off using this basic osacript commands: + +``` +$ osascript -e 'tell application "yubiswitch" to KeyOn' +``` + +``` +$ osascript -e 'tell application "yubiswitch" to KeyOff' +``` + Screenshots =========== @@ -74,9 +92,14 @@ YubiKey) when user preferences are changed - [x] Add "Start at login" feature +- [x] Support for basic AppleScript comomands: KeyOn/KeyOff + - [ ] Feature: lock computer when yubikey is removed (use IOServiceAddMatchingNotification in IOKit?) +- [ ] Feature: check update features, check if current version is the latest. +Connect to github somehow + - [ ] Support more yubikeys nano on multiple USB slots - [ ] Better support for plug and unplug events diff --git a/YubiSwitch.sdef b/YubiSwitch.sdef new file mode 100644 index 0000000..0c4f1ab --- /dev/null +++ b/YubiSwitch.sdef @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/yubiswitch.xcodeproj/project.pbxproj b/yubiswitch.xcodeproj/project.pbxproj index 8049125..11e72e4 100644 --- a/yubiswitch.xcodeproj/project.pbxproj +++ b/yubiswitch.xcodeproj/project.pbxproj @@ -19,6 +19,8 @@ 593B4E0E17F0A2BD003195DE /* PreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 593B4E0C17F0A2BD003195DE /* PreferencesController.m */; }; 593B4E0F17F0A2BD003195DE /* PreferencesController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 593B4E0D17F0A2BD003195DE /* PreferencesController.xib */; }; 594DCCE717EF99D400D9C2E2 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 594DCCE617EF99D400D9C2E2 /* LICENSE */; }; + 5983505918BA3B19001917C7 /* YubiSwitch.sdef in Resources */ = {isa = PBXBuildFile; fileRef = 5983505818BA3B19001917C7 /* YubiSwitch.sdef */; }; + 59882B5D18BA7735001B9389 /* YubiKeyScript.m in Sources */ = {isa = PBXBuildFile; fileRef = 59882B5C18BA7735001B9389 /* YubiKeyScript.m */; }; 598AF34517F380C4008165C6 /* DefaultPreferences.plist in Resources */ = {isa = PBXBuildFile; fileRef = 598AF34417F380C4008165C6 /* DefaultPreferences.plist */; }; 59C0616D17EED74400D3EE79 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59E5CF0E17EC2A9000898135 /* Cocoa.framework */; }; 59E5CF1917EC2A9000898135 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 59E5CF1717EC2A9000898135 /* InfoPlist.strings */; }; @@ -28,6 +30,9 @@ 59E5CF4417EC472400898135 /* YubiKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 59E5CF4317EC472400898135 /* YubiKey.m */; }; 59EC128A17ECFAFD00B3C3A6 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 59EC128917ECFAFD00B3C3A6 /* README.md */; }; 59EC128C17ECFEFE00B3C3A6 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59EC128B17ECFEFE00B3C3A6 /* IOKit.framework */; }; + 59EECB3C180440950091AF5E /* screenshot-prefs.png in Resources */ = {isa = PBXBuildFile; fileRef = 59EECB3A180440950091AF5E /* screenshot-prefs.png */; }; + 59EECB3D180440950091AF5E /* screenshot-menuitems.png in Resources */ = {isa = PBXBuildFile; fileRef = 59EECB3B180440950091AF5E /* screenshot-menuitems.png */; }; + 59EECB441804422C0091AF5E /* createdmg.sh in Resources */ = {isa = PBXBuildFile; fileRef = 59EECB431804422C0091AF5E /* createdmg.sh */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -85,6 +90,10 @@ 593B4E0C17F0A2BD003195DE /* PreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PreferencesController.m; sourceTree = ""; }; 593B4E0D17F0A2BD003195DE /* PreferencesController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesController.xib; sourceTree = ""; }; 594DCCE617EF99D400D9C2E2 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + 5970C8D418B3A48100CDE1BB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 5983505818BA3B19001917C7 /* YubiSwitch.sdef */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = YubiSwitch.sdef; path = ../YubiSwitch.sdef; sourceTree = ""; }; + 59882B5B18BA7735001B9389 /* YubiKeyScript.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YubiKeyScript.h; sourceTree = ""; }; + 59882B5C18BA7735001B9389 /* YubiKeyScript.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YubiKeyScript.m; sourceTree = ""; }; 598AF34417F380C4008165C6 /* DefaultPreferences.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DefaultPreferences.plist; sourceTree = ""; }; 59C0616B17EED6AB00D3EE79 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 59E5CF0B17EC2A9000898135 /* yubiswitch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = yubiswitch.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -105,6 +114,9 @@ 59E5CF4317EC472400898135 /* YubiKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YubiKey.m; sourceTree = ""; }; 59EC128917ECFAFD00B3C3A6 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.md; sourceTree = ""; }; 59EC128B17ECFEFE00B3C3A6 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + 59EECB3A180440950091AF5E /* screenshot-prefs.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "screenshot-prefs.png"; sourceTree = ""; }; + 59EECB3B180440950091AF5E /* screenshot-menuitems.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "screenshot-menuitems.png"; sourceTree = ""; }; + 59EECB431804422C0091AF5E /* createdmg.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = createdmg.sh; path = dmg/createdmg.sh; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -135,6 +147,8 @@ 59013C9117F6CDB900005A7E /* images */ = { isa = PBXGroup; children = ( + 59EECB3A180440950091AF5E /* screenshot-prefs.png */, + 59EECB3B180440950091AF5E /* screenshot-menuitems.png */, 59013C9217F6CDB900005A7E /* nano.jpg */, ); path = images; @@ -146,6 +160,7 @@ 59013C7F17F56F0F00005A7E /* ShortcutRecorder.xcodeproj */, 59EC128917ECFAFD00B3C3A6 /* README.md */, 594DCCE617EF99D400D9C2E2 /* LICENSE */, + 59EECB42180442230091AF5E /* dmg */, 59E5CF1417EC2A9000898135 /* yubiswitch */, 59E5CF0D17EC2A9000898135 /* Frameworks */, 59E5CF0C17EC2A9000898135 /* Products */, @@ -168,6 +183,7 @@ 59EC128B17ECFEFE00B3C3A6 /* IOKit.framework */, 59E5CF0E17EC2A9000898135 /* Cocoa.framework */, 59E5CF2D17EC2A9000898135 /* XCTest.framework */, + 5970C8D418B3A48100CDE1BB /* Foundation.framework */, 59E5CF1017EC2A9000898135 /* Other Frameworks */, ); name = Frameworks; @@ -196,6 +212,9 @@ 59E5CF2017EC2A9000898135 /* AppDelegate.h */, 59E5CF2117EC2A9000898135 /* AppDelegate.m */, 59E5CF2317EC2A9000898135 /* MainMenu.xib */, + 59882B5B18BA7735001B9389 /* YubiKeyScript.h */, + 59882B5C18BA7735001B9389 /* YubiKeyScript.m */, + 5983505818BA3B19001917C7 /* YubiSwitch.sdef */, 59E5CF4217EC472400898135 /* YubiKey.h */, 59E5CF4317EC472400898135 /* YubiKey.m */, 59E5CF2617EC2A9000898135 /* Images.xcassets */, @@ -216,6 +235,14 @@ name = "Supporting Files"; sourceTree = ""; }; + 59EECB42180442230091AF5E /* dmg */ = { + isa = PBXGroup; + children = ( + 59EECB431804422C0091AF5E /* createdmg.sh */, + ); + name = dmg; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -322,10 +349,14 @@ 594DCCE717EF99D400D9C2E2 /* LICENSE in Resources */, 598AF34517F380C4008165C6 /* DefaultPreferences.plist in Resources */, 59E5CF1917EC2A9000898135 /* InfoPlist.strings in Resources */, + 5983505918BA3B19001917C7 /* YubiSwitch.sdef in Resources */, 593B4E0A17F09362003195DE /* AboutWindowController.xib in Resources */, + 59EECB3D180440950091AF5E /* screenshot-menuitems.png in Resources */, + 59EECB3C180440950091AF5E /* screenshot-prefs.png in Resources */, 59013C9317F6CDB900005A7E /* nano.jpg in Resources */, 59013C8D17F571CE00005A7E /* MainMenu.xib in Resources */, 59E5CF2717EC2A9000898135 /* Images.xcassets in Resources */, + 59EECB441804422C0091AF5E /* createdmg.sh in Resources */, 593B4E0F17F0A2BD003195DE /* PreferencesController.xib in Resources */, 59EC128A17ECFAFD00B3C3A6 /* README.md in Resources */, ); @@ -339,6 +370,7 @@ buildActionMask = 2147483647; files = ( 593B4E0E17F0A2BD003195DE /* PreferencesController.m in Sources */, + 59882B5D18BA7735001B9389 /* YubiKeyScript.m in Sources */, 59E5CF2217EC2A9000898135 /* AppDelegate.m in Sources */, 593B4E0917F09362003195DE /* AboutWindowController.m in Sources */, 59E5CF4417EC472400898135 /* YubiKey.m in Sources */, @@ -458,6 +490,7 @@ GCC_PREFIX_HEADER = "yubiswitch/yubiswitch-Prefix.pch"; INFOPLIST_FILE = "yubiswitch/yubiswitch-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks "; + MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; @@ -473,6 +506,7 @@ GCC_PREFIX_HEADER = "yubiswitch/yubiswitch-Prefix.pch"; INFOPLIST_FILE = "yubiswitch/yubiswitch-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks "; + MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; diff --git a/yubiswitch.xcodeproj/xcuserdata/pallotron.xcuserdatad/xcschemes/xcschememanagement.plist b/yubiswitch.xcodeproj/xcuserdata/pallotron.xcuserdatad/xcschemes/xcschememanagement.plist index f1df452..75cc6ab 100644 --- a/yubiswitch.xcodeproj/xcuserdata/pallotron.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/yubiswitch.xcodeproj/xcuserdata/pallotron.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,11 +4,21 @@ SchemeUserState + 10.7.xcscheme + + orderHint + 4 + release.xcscheme orderHint 1 + yubiswitch-service.xcscheme + + orderHint + 5 + yubiswitch.xcscheme orderHint @@ -17,6 +27,11 @@ SuppressBuildableAutocreation + 5970C8D218B3A48100CDE1BB + + primary + + 59E5CF0A17EC2A9000898135 primary diff --git a/yubiswitch/AboutWindowController.xib b/yubiswitch/AboutWindowController.xib index d96edf0..820b99e 100644 --- a/yubiswitch/AboutWindowController.xib +++ b/yubiswitch/AboutWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -30,7 +30,7 @@ Enable/Disable Yubikey Nano -Copyright (C) 2013 Angelo "pallotron" Failla <pallotron@freaknet.org> +Copyright (C) 2013 Angelo "pallotron" Failla <pallotron@freaknet.org> http://github.com/pallotron/yubiswitch diff --git a/yubiswitch/AppDelegate.h b/yubiswitch/AppDelegate.h index 3ab154b..a7aac17 100644 --- a/yubiswitch/AppDelegate.h +++ b/yubiswitch/AppDelegate.h @@ -40,12 +40,13 @@ @property (assign) IBOutlet NSWindow *window; @property (assign) IBOutlet NSUserDefaultsController *controller; - -(IBAction)toggleSwitchOffDelay:(id)sender; +-(IBAction)toggleLockWhenUnplugged:(id)sender; -(IBAction)toggle:(id)sender; -(IBAction)quit:(id)sender; -(IBAction)about:(id)sender; -(IBAction)pref:(id)sender; +-(void)enableYubiKey:(BOOL)enable; -(void)notify:(NSString *)msg; -(void)reDisableYK; -(NSTimer*)createTimer:(NSInteger)interval; diff --git a/yubiswitch/AppDelegate.m b/yubiswitch/AppDelegate.m index bf90961..79b19dd 100644 --- a/yubiswitch/AppDelegate.m +++ b/yubiswitch/AppDelegate.m @@ -104,6 +104,13 @@ -(void)observeValueForKeyPath:(NSString *)aKeyPath ofObject:(id)anObject action:@selector(toggle:)]; [hotKeyCenter registerHotKey:newHotKey]; } + NSDictionary* hotkey = [[NSUserDefaults standardUserDefaults] + dictionaryForKey:@"hotkey"]; + [[statusMenu itemAtIndex:0] + setKeyEquivalent:[hotkey valueForKey:@"charactersIgnoringModifiers"]]; + [[statusMenu itemAtIndex:0] + setKeyEquivalentModifierMask: + [[hotkey valueForKey:@"modifierFlags"] unsignedIntValue]]; } else [super observeValueForKeyPath:aKeyPath ofObject:anObject change:aChange @@ -135,45 +142,60 @@ -(void)reDisableYK { } } --(IBAction)toggle:(id)sender { +-(void)enableYubiKey:(BOOL)enable { BOOL res; - if (isEnabled == true) { - res = [yk disable]; - if (res == TRUE) { - [statusItem setToolTip:(@"YubiKey disabled")]; - [statusItem setImage:[NSImage imageNamed:@"ico_disabled"]]; - isEnabled = false; - [[statusMenu itemAtIndex:0] setState:0]; - [self notify:@"YubiKey disabled"]; - } - } else { + if (enable == TRUE) { res = [yk enable]; - if (res == TRUE) { + } else { + res = [yk disable]; + } + if (res == TRUE) { + if (enable == TRUE) { [statusItem setToolTip:(@"YubiKey enabled")]; [statusItem setImage:[NSImage imageNamed:@"ico_enabled"]]; isEnabled = true; [[statusMenu itemAtIndex:0] setState:1]; [self notify:@"YubiKey enabled"]; NSDictionary* switchOffDelayPrefs = - [[NSUserDefaults standardUserDefaults] - dictionaryForKey:@"switchOffDelay"]; - bool enabled = [[switchOffDelayPrefs valueForKey:@"enabled"] boolValue]; + [[NSUserDefaults standardUserDefaults] + dictionaryForKey:@"switchOffDelay"]; + bool enabled = [[switchOffDelayPrefs valueForKey:@"enabled"] + boolValue]; if (enabled == TRUE) { NSNumberFormatter* f = [[NSNumberFormatter alloc] init]; [f setNumberStyle:NSNumberFormatterDecimalStyle]; NSNumber* interval = [f numberFromString: [switchOffDelayPrefs - valueForKey:@"interval"]]; - reDisableTimer = [self createTimer:(long)[interval integerValue]]; + valueForKey:@"interval"]]; + reDisableTimer = [self createTimer:(long)[interval + integerValue]]; } + } else { + [statusItem setToolTip:(@"YubiKey disabled")]; + [statusItem setImage:[NSImage imageNamed:@"ico_disabled"]]; + isEnabled = false; + [[statusMenu itemAtIndex:0] setState:0]; + [self notify:@"YubiKey disabled"]; } } } +-(IBAction)toggle:(id)sender { + if (isEnabled == TRUE) { + [self enableYubiKey:FALSE]; + } else { + [self enableYubiKey:TRUE]; + } +} + -(IBAction)toggleSwitchOffDelay:(id)sender { [controller save:self]; } +-(IBAction)toggleLockWhenUnplugged:(id)sender { + [controller save:self]; +} + -(IBAction)about:(id)sender { [[aboutwc window] makeKeyAndOrderFront:self]; [[aboutwc window] setOrderedIndex:0]; diff --git a/yubiswitch/Base.lproj/MainMenu.xib b/yubiswitch/Base.lproj/MainMenu.xib index 3b532dd..f4b193f 100644 --- a/yubiswitch/Base.lproj/MainMenu.xib +++ b/yubiswitch/Base.lproj/MainMenu.xib @@ -27,8 +27,18 @@ - + + + + + + + + + + + @@ -51,6 +61,9 @@ + + + @@ -66,7 +79,7 @@ - + diff --git a/yubiswitch/DefaultPreferences.plist b/yubiswitch/DefaultPreferences.plist index 297df74..6e44b68 100644 --- a/yubiswitch/DefaultPreferences.plist +++ b/yubiswitch/DefaultPreferences.plist @@ -2,6 +2,8 @@ + lockWhenUnplugged + hotKeyProductID 0x0010 hotKeyVendorID diff --git a/yubiswitch/YubiKeyScript.h b/yubiswitch/YubiKeyScript.h new file mode 100644 index 0000000..5330d84 --- /dev/null +++ b/yubiswitch/YubiKeyScript.h @@ -0,0 +1,34 @@ +// YubiKeyScript.h +// yubiswitch + +/* + yubiswitch - enable/disable yubikey + Copyright (C) 2013 Angelo "pallotron" Failla + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#import +#import "AppDelegate.h" + +// Implements AppleScript support, see sdef file called YubiSwitch.sdef +// example call: +// osascript -e 'tell application "yubiswitch" to KeyOn' +// osascript -e 'tell application "yubiswitch" to KeyOff' + +@interface YubiKeyScript : NSScriptCommand + +- (void)performDefaultImplementation; + +@end \ No newline at end of file diff --git a/yubiswitch/YubiKeyScript.m b/yubiswitch/YubiKeyScript.m new file mode 100644 index 0000000..febd1a2 --- /dev/null +++ b/yubiswitch/YubiKeyScript.m @@ -0,0 +1,38 @@ +// YubiKeyScript.m +// yubiswitch + +/* + yubiswitch - enable/disable yubikey + Copyright (C) 2013 Angelo "pallotron" Failla + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#import "YubiKeyScript.h" + +@implementation YubiKeyScript + +// simply call the public enableYubiKey method on the appDelegate main class +- (void)performDefaultImplementation { + AppDelegate *appDelegate = + (AppDelegate *)[[NSApplication sharedApplication]delegate]; + NSString* cmdName = [[self commandDescription] commandName]; + if ([cmdName isEqualToString: @"KeyOn"]) { + [appDelegate enableYubiKey:TRUE]; + } else if ([cmdName isEqualToString: @"KeyOff"]) { + [appDelegate enableYubiKey:FALSE]; + } +} + +@end diff --git a/yubiswitch/yubiswitch-Info.plist b/yubiswitch/yubiswitch-Info.plist index d699580..1a25e8d 100644 --- a/yubiswitch/yubiswitch-Info.plist +++ b/yubiswitch/yubiswitch-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile - Appicon + AppIcon CFBundleIdentifier pallotron.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion @@ -17,22 +17,26 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.3 + 0.5 CFBundleSignature ???? CFBundleVersion - 0.3 + 0.5 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} LSUIElement + NSAppleScriptEnabled + NSHumanReadableCopyright - Copyright (C) 2013 Angelo "pallotron" Failla <pallotron@freaknet.org> -- GNUGPL v3 + Copyright (C) 2013-present Angelo "pallotron" Failla <pallotron@freaknet.org> -- GNUGPL v3 NSMainNibFile MainMenu NSPrincipalClass NSApplication + OSAScriptingDefinition + YubiSwitch.sdef