From 35f914cba4b8c41200a8ba7582b9be2214eb0196 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Sat, 23 Sep 2017 10:42:09 +0200 Subject: [PATCH 01/17] Global improvment for main menu - [FIX] ignore states that should be ignored from the root items - [FIX] reload properly when MDM change Hello IT settings --- src/Hello IT/AppDelegate.m | 41 ++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/src/Hello IT/AppDelegate.m b/src/Hello IT/AppDelegate.m index c9764cc..c5590dc 100644 --- a/src/Hello IT/AppDelegate.m +++ b/src/Hello IT/AppDelegate.m @@ -24,13 +24,10 @@ @interface AppDelegate () @property (weak) IBOutlet NSWindow *window; @property (strong) NSStatusItem *statusItem; -@property (strong) IBOutlet NSMenu *statusMenu; @property id statusMenuManager; @property NSMutableArray *pluginInstances; @property Reachability *reachability; -@property (nonatomic) HITPluginTestState testState; - @property id notificationOjectForInterfaceTheme; @property id notificationOjectForMDMUpdate; @@ -96,12 +93,18 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { queue:nil usingBlock:^(NSNotification * _Nonnull note) { NSArray *domains = [note.userInfo objectForKey:@"com.apple.MCX.changedDomains"]; - if ([domains containsObject:[[NSBundle mainBundle] bundleIdentifier]]) { - [self reloadHelloIT]; + + for (NSString *domain in domains) { + if ([[domain lowercaseString] isEqualToString:[[[NSBundle mainBundle] bundleIdentifier] lowercaseString]]) { + [self reloadHelloIT]; + } } }]; + + self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; + [self reloadHelloIT]; self.reachability = [Reachability reachabilityWithHostname:@"captive.apple.com"]; @@ -132,9 +135,6 @@ - (void)reloadHelloIT { } - self.statusMenu = [[NSMenu alloc] init]; - self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; - [[HITPluginsManager sharedInstance] loadPluginsWithCompletionHandler:^(HITPluginsManager *pluginsManager) { [self loadMenu]; }]; @@ -146,6 +146,13 @@ - (void)updateStatusItem { return; } + HITPluginTestState statusMenuState = HITPluginTestStateNone; + + if ([self.statusMenuManager respondsToSelector:@selector(testState)]) { + statusMenuState |= [self.statusMenuManager testState]; + asl_log(NULL, NULL, ASL_LEVEL_INFO, "General state has changed for %lu.", (unsigned long)statusMenuState); + } + NSString *iconTitle = [[NSUserDefaults standardUserDefaults] stringForKey:kMenuItemStatusBarTitle]; if ([iconTitle length] == 0) { @@ -154,7 +161,7 @@ - (void)updateStatusItem { BOOL tryDark = NO; NSImage *icon; - switch (self.testState) { + switch (statusMenuState) { case HITPluginTestStateError: imageName = @"statusbar-error"; break; @@ -213,7 +220,7 @@ - (void)updateStatusItem { NSColor *textColor = nil; NSString *osxMode = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"]; - switch (self.testState) { + switch (statusMenuState) { case HITPluginTestStateError: textColor = [NSColor redColor]; break; @@ -293,20 +300,6 @@ - (void)loadMenu { - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"testState"]) { - int substate = HITPluginTestStateNone; - - if ([self.statusMenuManager respondsToSelector:@selector(testState)]) { - substate |= [self.statusMenuManager testState]; - } - - if (substate&HITPluginTestStateError) self.testState = HITPluginTestStateError; - else if (substate&HITPluginTestStateWarning) self.testState = HITPluginTestStateWarning; - else if (substate&HITPluginTestStateUnavailable) self.testState = HITPluginTestStateUnavailable; - else if (substate&HITPluginTestStateOK) self.testState = HITPluginTestStateOK; - else self.testState = HITPluginTestStateNone; - - asl_log(NULL, NULL, ASL_LEVEL_INFO, "General state has changed for %lu.", (unsigned long)self.testState); - [self updateStatusItem]; } } From f6d623cba61e40a4cd80fe4cfff41f375f7959db Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Sat, 23 Sep 2017 11:20:26 +0200 Subject: [PATCH 02/17] Update the menu loading behavior to support both pre and post 1.3 settings style. --- src/Hello IT/AppDelegate.m | 40 ++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/Hello IT/AppDelegate.m b/src/Hello IT/AppDelegate.m index c5590dc..51e8288 100644 --- a/src/Hello IT/AppDelegate.m +++ b/src/Hello IT/AppDelegate.m @@ -247,12 +247,31 @@ - (void)updateStatusItem { } - (void)loadMenu { - NSMutableDictionary *compositeSettings = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] mutableCopy]; - NSArray *relatedDomainNames = [[[[NSUserDefaults standardUserDefaults] persistentDomainNames] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF BEGINSWITH %@", @"com.github.ygini.Hello-IT."]] sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { + NSMutableDictionary *compositeSettings = [NSMutableDictionary dictionaryWithCapacity:2]; + + NSArray *oldStyleRootContent = [[NSUserDefaults standardUserDefaults] arrayForKey:kMenuItemContent]; + + if (oldStyleRootContent) { + // We have pre 1.3 preferences, were root item is the settings for public.submenu instead of regular item settings + // We need to rebuild the settings to fill 1.3+ needs, with root item being exactly like another item + + [compositeSettings setObject:@"public.submenu" forKey:kMenuItemFunctionIdentifier]; + [compositeSettings setObject:@{kMenuItemContent: oldStyleRootContent} forKey:kMenuItemSettings]; + + } else { + // 1.3+ version support standard function and settings keys at root, allowing end IT to use custom functions more easily + + [compositeSettings setObject:[[NSUserDefaults standardUserDefaults] stringForKey:kMenuItemFunctionIdentifier] forKey:kMenuItemFunctionIdentifier]; + [compositeSettings setObject:[[NSUserDefaults standardUserDefaults] dictionaryForKey:kMenuItemSettings] forKey:kMenuItemSettings]; + + } + + // HIT support composed menu item, all user's preferences starting with "bundleID." will be loaded as first item + NSArray *relatedDomainNames = [[[[NSUserDefaults standardUserDefaults] persistentDomainNames] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF BEGINSWITH[c] %@", [[[NSBundle mainBundle] bundleIdentifier] stringByAppendingString:@"."]]] sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { return [obj2 compare:obj1]; }]; - NSMutableArray *updatedContent = [[compositeSettings objectForKey:kMenuItemContent] mutableCopy]; + NSMutableArray *updatedContent = [[[compositeSettings objectForKey:kMenuItemSettings] objectForKey:kMenuItemContent] mutableCopy]; for (NSString *domainName in relatedDomainNames) { asl_log(NULL, NULL, ASL_LEVEL_INFO, "Adding nested preference domain %s as first item.", [domainName UTF8String]); @@ -262,21 +281,18 @@ - (void)loadMenu { atIndex:0]; } - [compositeSettings setObject:updatedContent forKey:kMenuItemContent]; - - NSString *menuBuilder = [compositeSettings objectForKey:kMenuItemFunctionIdentifier]; - - if ([menuBuilder length] == 0) { - menuBuilder = @"public.submenu"; - } + NSMutableDictionary *rootItemSettings = [[compositeSettings objectForKey:kMenuItemSettings] mutableCopy]; + [rootItemSettings setObject:updatedContent forKey:kMenuItemContent]; + [compositeSettings setObject:rootItemSettings forKey:kMenuItemSettings]; + if ([self.statusMenuManager respondsToSelector:@selector(testState)]) { NSObject *observablePluginInstance = self.statusMenuManager; [observablePluginInstance removeObserver:self forKeyPath:@"testState" context:nil]; } - Class SubMenuPlugin = [[HITPluginsManager sharedInstance] mainClassForPluginWithFunctionIdentifier:menuBuilder]; - self.statusMenuManager = [SubMenuPlugin newPlugInInstanceWithSettings:compositeSettings]; + Class SubMenuPlugin = [[HITPluginsManager sharedInstance] mainClassForPluginWithFunctionIdentifier:[compositeSettings objectForKey:kMenuItemFunctionIdentifier]]; + self.statusMenuManager = [SubMenuPlugin newPlugInInstanceWithSettings:[compositeSettings objectForKey:kMenuItemSettings]]; if (self.statusMenuManager) { if ([self.statusMenuManager respondsToSelector:@selector(setPluginsManager:)]) { [self.statusMenuManager setPluginsManager:[HITPluginsManager sharedInstance]]; From ad25c6eee2cfb4110f0064aa141de375cd2e400d Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Sat, 23 Sep 2017 11:22:54 +0200 Subject: [PATCH 03/17] Support pref reload even for subdomains --- src/Hello IT/AppDelegate.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Hello IT/AppDelegate.m b/src/Hello IT/AppDelegate.m index 51e8288..0ebe80e 100644 --- a/src/Hello IT/AppDelegate.m +++ b/src/Hello IT/AppDelegate.m @@ -95,7 +95,7 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { NSArray *domains = [note.userInfo objectForKey:@"com.apple.MCX.changedDomains"]; for (NSString *domain in domains) { - if ([[domain lowercaseString] isEqualToString:[[[NSBundle mainBundle] bundleIdentifier] lowercaseString]]) { + if ([[domain lowercaseString] rangeOfString:[[[NSBundle mainBundle] bundleIdentifier] lowercaseString]].location == 0) { [self reloadHelloIT]; } } From cb77064774124424e0497e850e44d98942cb1fef Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Mon, 25 Sep 2017 10:15:09 +0200 Subject: [PATCH 04/17] Initial version of AD Pass plugin --- .../ADPass/ADPass.xcodeproj/project.pbxproj | 260 ++++++++++++++++++ src/Plugins/ADPass/ADPass/HITPADPass.h | 13 + src/Plugins/ADPass/ADPass/HITPADPass.m | 13 + src/Plugins/ADPass/ADPass/Info.plist | 26 ++ .../ADPass/en.lproj/Localizable.strings | 12 + .../ADPass/fr.lproj/Localizable.strings | 15 + 6 files changed, 339 insertions(+) create mode 100644 src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj create mode 100644 src/Plugins/ADPass/ADPass/HITPADPass.h create mode 100644 src/Plugins/ADPass/ADPass/HITPADPass.m create mode 100644 src/Plugins/ADPass/ADPass/Info.plist create mode 100644 src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings create mode 100644 src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings diff --git a/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj b/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj new file mode 100644 index 0000000..dfb5049 --- /dev/null +++ b/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj @@ -0,0 +1,260 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXFileReference section */ + F83294A51F773076009DA574 /* ADPass.hitp */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ADPass.hitp; sourceTree = BUILT_PRODUCTS_DIR; }; + F83294A81F773076009DA574 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F83294A21F773076009DA574 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + F832949C1F773076009DA574 = { + isa = PBXGroup; + children = ( + F83294A71F773076009DA574 /* ADPass */, + F83294A61F773076009DA574 /* Products */, + ); + sourceTree = ""; + }; + F83294A61F773076009DA574 /* Products */ = { + isa = PBXGroup; + children = ( + F83294A51F773076009DA574 /* ADPass.hitp */, + ); + name = Products; + sourceTree = ""; + }; + F83294A71F773076009DA574 /* ADPass */ = { + isa = PBXGroup; + children = ( + F83294A81F773076009DA574 /* Info.plist */, + ); + path = ADPass; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F83294A41F773076009DA574 /* ADPass */ = { + isa = PBXNativeTarget; + buildConfigurationList = F83294AB1F773076009DA574 /* Build configuration list for PBXNativeTarget "ADPass" */; + buildPhases = ( + F83294A11F773076009DA574 /* Sources */, + F83294A21F773076009DA574 /* Frameworks */, + F83294A31F773076009DA574 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ADPass; + productName = ADPass; + productReference = F83294A51F773076009DA574 /* ADPass.hitp */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F832949D1F773076009DA574 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = "Yoann Gini"; + TargetAttributes = { + F83294A41F773076009DA574 = { + CreatedOnToolsVersion = 8.3.3; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = F83294A01F773076009DA574 /* Build configuration list for PBXProject "ADPass" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = F832949C1F773076009DA574; + productRefGroup = F83294A61F773076009DA574 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F83294A41F773076009DA574 /* ADPass */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + F83294A31F773076009DA574 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + F83294A11F773076009DA574 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + F83294A91F773076009DA574 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + F83294AA1F773076009DA574 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + F83294AC1F773076009DA574 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = ADPass/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = com.github.ygini.hitp.ADPass; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = hitp; + }; + name = Debug; + }; + F83294AD1F773076009DA574 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = ADPass/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = com.github.ygini.hitp.ADPass; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = hitp; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + F83294A01F773076009DA574 /* Build configuration list for PBXProject "ADPass" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F83294A91F773076009DA574 /* Debug */, + F83294AA1F773076009DA574 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F83294AB1F773076009DA574 /* Build configuration list for PBXNativeTarget "ADPass" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F83294AC1F773076009DA574 /* Debug */, + F83294AD1F773076009DA574 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = F832949D1F773076009DA574 /* Project object */; +} diff --git a/src/Plugins/ADPass/ADPass/HITPADPass.h b/src/Plugins/ADPass/ADPass/HITPADPass.h new file mode 100644 index 0000000..3739e0a --- /dev/null +++ b/src/Plugins/ADPass/ADPass/HITPADPass.h @@ -0,0 +1,13 @@ +// +// HITPADPass.h +// ADPass +// +// Created by Yoann Gini on 24/09/2017. +// Copyright © 2017 Yoann Gini. All rights reserved. +// + +#import + +@interface HITPADPass : HITPeriodicPlugin + +@end diff --git a/src/Plugins/ADPass/ADPass/HITPADPass.m b/src/Plugins/ADPass/ADPass/HITPADPass.m new file mode 100644 index 0000000..910b031 --- /dev/null +++ b/src/Plugins/ADPass/ADPass/HITPADPass.m @@ -0,0 +1,13 @@ +// +// HITPADPass.m +// ADPass +// +// Created by Yoann Gini on 24/09/2017. +// Copyright © 2017 Yoann Gini. All rights reserved. +// + +#import "HITPADPass.h" + +@implementation HITPADPass + +@end diff --git a/src/Plugins/ADPass/ADPass/Info.plist b/src/Plugins/ADPass/ADPass/Info.plist new file mode 100644 index 0000000..b26ee52 --- /dev/null +++ b/src/Plugins/ADPass/ADPass/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSHumanReadableCopyright + Copyright © 2017 Yoann Gini. All rights reserved. + NSPrincipalClass + + + diff --git a/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings b/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings new file mode 100644 index 0000000..3d85ba0 --- /dev/null +++ b/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings @@ -0,0 +1,12 @@ +/* + Localizable.strings + ADPass + + Created by Yoann Gini on 24/09/2017. + Copyright © 2017 Yoann Gini. All rights reserved. +*/ + + +"willExpireFormat" +"tooltip" +"disabledTooltip" diff --git a/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings b/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings new file mode 100644 index 0000000..cf0631a --- /dev/null +++ b/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings @@ -0,0 +1,15 @@ +/* + Localizable.strings + ADPass + + Created by Yoann Gini on 24/09/2017. + Copyright © 2017 Yoann Gini. All rights reserved. +*/ + + +// `%ld` is the format used to display the number of days before password expire. +// To show `Your password will expire in 42d` use format `Your password will expire in %ldd` + +"willExpireFormat" = "🔐 📆 %ld"; +"tooltip" = "Delay before your password expire, change it before!"; +"disabledTooltip" = "Your IT infrastructure isn't available. Current info is based on the last recorded value."; From 4a0ea7a619df5f973d445945a4ed08bcf77dce18 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Mon, 25 Sep 2017 10:15:43 +0200 Subject: [PATCH 05/17] Initial version of AD Pass plugin --- src/Hello IT.xcodeproj/project.pbxproj | 30 +++++ .../ADPass/ADPass.xcodeproj/project.pbxproj | 45 +++++++ src/Plugins/ADPass/ADPass/HITPADPass.m | 127 ++++++++++++++++++ src/Plugins/ADPass/ADPass/Info.plist | 6 +- .../ADPass/en.lproj/Localizable.strings | 9 +- .../ADPass/fr.lproj/Localizable.strings | 6 +- 6 files changed, 215 insertions(+), 8 deletions(-) diff --git a/src/Hello IT.xcodeproj/project.pbxproj b/src/Hello IT.xcodeproj/project.pbxproj index 146603f..65d024d 100644 --- a/src/Hello IT.xcodeproj/project.pbxproj +++ b/src/Hello IT.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ E1D068081B51D08E00567172 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = E1D068061B51D08E00567172 /* MainMenu.xib */; }; E1D068141B51D08F00567172 /* Hello_ITTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E1D068131B51D08F00567172 /* Hello_ITTests.m */; }; E1D0681F1B51D4B500567172 /* HITPluginsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E1D0681E1B51D4B500567172 /* HITPluginsManager.m */; }; + F83294DD1F7736B5009DA574 /* ADPass.hitp in Copy Default Plugins */ = {isa = PBXBuildFile; fileRef = F83294B31F773078009DA574 /* ADPass.hitp */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; F8340B8C1C96CF9000C820D7 /* statusbar-dark.png in Resources */ = {isa = PBXBuildFile; fileRef = F8340B781C96CF9000C820D7 /* statusbar-dark.png */; }; F8340B8D1C96CF9000C820D7 /* statusbar-dark@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F8340B791C96CF9000C820D7 /* statusbar-dark@2x.png */; }; F8340B8E1C96CF9000C820D7 /* statusbar-error-dark.png in Resources */ = {isa = PBXBuildFile; fileRef = F8340B7A1C96CF9000C820D7 /* statusbar-error-dark.png */; }; @@ -123,6 +124,13 @@ remoteGlobalIDString = E1D067F91B51D08E00567172; remoteInfo = "Hello IT"; }; + F83294B21F773078009DA574 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F83294AE1F773076009DA574 /* ADPass.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = F83294A51F773076009DA574; + remoteInfo = ADPass; + }; F8F4E5761F1A73CC004E8789 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = E1B2C8ED1B59351B005A9936 /* HITDevKit.xcodeproj */; @@ -195,6 +203,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( + F83294DD1F7736B5009DA574 /* ADPass.hitp in Copy Default Plugins */, E14B67DA1B59110D00941A27 /* ScriptedItem.hitp in Copy Default Plugins */, E14B67BB1B57888700941A27 /* OpenApplication.hitp in Copy Default Plugins */, E1AF407B1B52A6030017B4DD /* SubMenu.hitp in Copy Default Plugins */, @@ -242,6 +251,7 @@ E1D068131B51D08F00567172 /* Hello_ITTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Hello_ITTests.m; sourceTree = ""; }; E1D0681D1B51D4B500567172 /* HITPluginsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HITPluginsManager.h; sourceTree = ""; }; E1D0681E1B51D4B500567172 /* HITPluginsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HITPluginsManager.m; sourceTree = ""; }; + F83294AE1F773076009DA574 /* ADPass.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ADPass.xcodeproj; path = ADPass/ADPass.xcodeproj; sourceTree = ""; }; F8340B781C96CF9000C820D7 /* statusbar-dark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "statusbar-dark.png"; sourceTree = ""; }; F8340B791C96CF9000C820D7 /* statusbar-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "statusbar-dark@2x.png"; sourceTree = ""; }; F8340B7A1C96CF9000C820D7 /* statusbar-error-dark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "statusbar-error-dark.png"; sourceTree = ""; }; @@ -311,6 +321,7 @@ E17743301B51E6E600A5B406 /* Plugins */ = { isa = PBXGroup; children = ( + F83294AE1F773076009DA574 /* ADPass.xcodeproj */, E17743591B51EA8500A5B406 /* OpenResource.xcodeproj */, E17743751B51F19B00A5B406 /* Separator.xcodeproj */, E17743941B51F2C900A5B406 /* Title.xcodeproj */, @@ -435,6 +446,14 @@ name = "Supporting Files"; sourceTree = ""; }; + F83294AF1F773076009DA574 /* Products */ = { + isa = PBXGroup; + children = ( + F83294B31F773078009DA574 /* ADPass.hitp */, + ); + name = Products; + sourceTree = ""; + }; F86928FA1CA28B8800AB8E4C /* statusbar */ = { isa = PBXGroup; children = ( @@ -542,6 +561,10 @@ productRefGroup = E1D067FB1B51D08E00567172 /* Products */; projectDirPath = ""; projectReferences = ( + { + ProductGroup = F83294AF1F773076009DA574 /* Products */; + ProjectRef = F83294AE1F773076009DA574 /* ADPass.xcodeproj */; + }, { ProductGroup = E1B2C8EE1B59351B005A9936 /* Products */; ProjectRef = E1B2C8ED1B59351B005A9936 /* HITDevKit.xcodeproj */; @@ -658,6 +681,13 @@ remoteRef = E1B2C8F41B59351C005A9936 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + F83294B31F773078009DA574 /* ADPass.hitp */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = ADPass.hitp; + remoteRef = F83294B21F773078009DA574 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ diff --git a/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj b/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj index dfb5049..8b8d6fe 100644 --- a/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj +++ b/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj @@ -6,9 +6,22 @@ objectVersion = 46; objects = { +/* Begin PBXBuildFile section */ + F83294B71F77308C009DA574 /* HITDevKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F83294B61F77308C009DA574 /* HITDevKit.framework */; }; + F83294BA1F77313D009DA574 /* HITPADPass.m in Sources */ = {isa = PBXBuildFile; fileRef = F83294B91F77313D009DA574 /* HITPADPass.m */; }; + F83294BC1F773275009DA574 /* OpenDirectory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F83294BB1F773275009DA574 /* OpenDirectory.framework */; }; + F83294E61F77A8C9009DA574 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F83294E81F77A8C9009DA574 /* Localizable.strings */; }; +/* End PBXBuildFile section */ + /* Begin PBXFileReference section */ F83294A51F773076009DA574 /* ADPass.hitp */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ADPass.hitp; sourceTree = BUILT_PRODUCTS_DIR; }; F83294A81F773076009DA574 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F83294B61F77308C009DA574 /* HITDevKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HITDevKit.framework; path = "../../../../../../Library/Developer/Xcode/DerivedData/Hello_IT-aoxdloudbtfseogpklvucsgyvrib/Build/Products/Debug/HITDevKit.framework"; sourceTree = ""; }; + F83294B81F77313D009DA574 /* HITPADPass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HITPADPass.h; sourceTree = ""; }; + F83294B91F77313D009DA574 /* HITPADPass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HITPADPass.m; sourceTree = ""; }; + F83294BB1F773275009DA574 /* OpenDirectory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenDirectory.framework; path = System/Library/Frameworks/OpenDirectory.framework; sourceTree = SDKROOT; }; + F83294E71F77A8C9009DA574 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + F83294E91F77A99A009DA574 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -16,6 +29,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F83294BC1F773275009DA574 /* OpenDirectory.framework in Frameworks */, + F83294B71F77308C009DA574 /* HITDevKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -27,6 +42,7 @@ children = ( F83294A71F773076009DA574 /* ADPass */, F83294A61F773076009DA574 /* Products */, + F83294B51F77308C009DA574 /* Frameworks */, ); sourceTree = ""; }; @@ -42,10 +58,22 @@ isa = PBXGroup; children = ( F83294A81F773076009DA574 /* Info.plist */, + F83294B81F77313D009DA574 /* HITPADPass.h */, + F83294B91F77313D009DA574 /* HITPADPass.m */, + F83294E81F77A8C9009DA574 /* Localizable.strings */, ); path = ADPass; sourceTree = ""; }; + F83294B51F77308C009DA574 /* Frameworks */ = { + isa = PBXGroup; + children = ( + F83294BB1F773275009DA574 /* OpenDirectory.framework */, + F83294B61F77308C009DA574 /* HITDevKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -87,6 +115,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + fr, ); mainGroup = F832949C1F773076009DA574; productRefGroup = F83294A61F773076009DA574 /* Products */; @@ -103,6 +132,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + F83294E61F77A8C9009DA574 /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,16 +143,30 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F83294BA1F77313D009DA574 /* HITPADPass.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXVariantGroup section */ + F83294E81F77A8C9009DA574 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + F83294E71F77A8C9009DA574 /* en */, + F83294E91F77A99A009DA574 /* fr */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ F83294A91F773076009DA574 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -171,6 +215,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; diff --git a/src/Plugins/ADPass/ADPass/HITPADPass.m b/src/Plugins/ADPass/ADPass/HITPADPass.m index 910b031..f47d1c3 100644 --- a/src/Plugins/ADPass/ADPass/HITPADPass.m +++ b/src/Plugins/ADPass/ADPass/HITPADPass.m @@ -7,7 +7,134 @@ // #import "HITPADPass.h" +#import + +#define kHITPADPassExpiryTimeField @"msDS-UserPasswordExpiryTimeComputed" +#define kHITPADPassExpiryTimeKey @"public.ad.pass.expirySince1970" + +#define kHITPADPassWillExpireFormat @"willExpireFormat" +#define kHITPADPassTooltip @"tooltip" +#define kHITPADPassDisabledTooltip @"disabledTooltip" + +@interface HITPADPass () + +@property NSDate *passwordExpiracyDate; +@property BOOL lastADRequestSucceded; + +@property NSString *localeTablePath; + +@property NSString *defaultWillExpireFormat; +@property NSString *defaultTooltip; +@property NSString *defaultDisabledTooltip; + +@property NSString *willExpireFormat; +@property NSString *tooltip; +@property NSString *disabledTooltip; + +@end @implementation HITPADPass +- (instancetype)initWithSettings:(NSDictionary*)settings +{ + self = [super initWithSettings:settings]; + if (self) { + _defaultWillExpireFormat = @"🔐 📆 %ld"; + _defaultTooltip = @"Delay before your password expire, change it before!"; + _defaultDisabledTooltip = @"Your IT infrastructure isn't available. Current info is based on the last recorded value."; + + _willExpireFormat = [settings objectForKey:kHITPADPassWillExpireFormat]; + _tooltip = [settings objectForKey:kHITPADPassTooltip]; + _disabledTooltip = [settings objectForKey:kHITPADPassDisabledTooltip]; + + if ([_willExpireFormat length] == 0) { + _willExpireFormat = _defaultWillExpireFormat; + } + + if ([_tooltip length] == 0) { + _tooltip = _defaultTooltip; + } + + if ([_disabledTooltip length] == 0) { + _disabledTooltip = _defaultDisabledTooltip; + } + + _willExpireFormat = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassWillExpireFormat value:_willExpireFormat table:nil]; + _tooltip = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassTooltip value:_tooltip table:nil]; + _disabledTooltip = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassDisabledTooltip value:_disabledTooltip table:nil]; + } + return self; +} + +- (void)mainAction:(id)sender { + [[NSWorkspace sharedWorkspace] openFile:@"/System/Library/PreferencePanes/Accounts.prefPane"]; +} + +- (void)periodicAction:(NSTimer *)timer { + [self getPasswordExpiryDate]; + [self updateTitle]; +} + +- (void)updateTitle { + + NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:[NSDate date] toDate:self.passwordExpiracyDate options:0]; + + self.menuItem.title = [NSString stringWithFormat:self.willExpireFormat, (long)[components day]]; + self.menuItem.enabled = self.lastADRequestSucceded; + + self.menuItem.toolTip = self.lastADRequestSucceded ? self.tooltip : self.disabledTooltip; +} + +- (void)getPasswordExpiryDate { + NSError *error = nil; + + ODSession *searchSession = [ODSession sessionWithOptions:nil error:&error]; + + ODNode *searchNode = [ODNode nodeWithSession:searchSession + type:kODNodeTypeAuthentication + error:&error]; + + ODQuery *recordQuery = [ODQuery queryWithNode:searchNode + forRecordTypes:kODRecordTypeUsers + attribute:kODAttributeTypeRecordName + matchType:kODMatchEqualTo + queryValues:NSUserName() + returnAttributes:kHITPADPassExpiryTimeField + maximumResults:0 + error:&error]; + + NSArray *records = [recordQuery resultsAllowingPartial:NO error:&error]; + NSNumber *expiryTime = nil; + for (ODRecord *record in records) { + NSArray *values = [record valuesForAttribute:kHITPADPassExpiryTimeField error:&error]; + expiryTime = [values lastObject]; + + if (expiryTime) { + break; + } + } + + // Thank you Microsoft to use Jan 1, 1601 at 00:00 UTC as reference date… + if (expiryTime) { + NSDateComponents *adRefenreceDateComponents = [[NSDateComponents alloc] init]; + [adRefenreceDateComponents setDay:1]; + [adRefenreceDateComponents setMonth:1]; + [adRefenreceDateComponents setYear:1601]; + [adRefenreceDateComponents setEra:1]; + + NSDate *adRefenreceDate = [[NSCalendar calendarWithIdentifier:NSCalendarIdentifierISO8601] dateFromComponents:adRefenreceDateComponents]; + NSTimeInterval expiryTimeInterval = [expiryTime integerValue] / 10000000.0; + + + self.passwordExpiracyDate = [NSDate dateWithTimeInterval:expiryTimeInterval sinceDate:adRefenreceDate]; + self.lastADRequestSucceded = YES; + + [[NSUserDefaults standardUserDefaults] setInteger:[self.passwordExpiracyDate timeIntervalSince1970] forKey:kHITPADPassExpiryTimeKey]; + } else { + NSInteger expirySince1970 = [[NSUserDefaults standardUserDefaults] integerForKey:kHITPADPassExpiryTimeKey]; + self.passwordExpiracyDate = [NSDate dateWithTimeIntervalSince1970:expirySince1970]; + self.lastADRequestSucceded = NO; + } +} + @end diff --git a/src/Plugins/ADPass/ADPass/Info.plist b/src/Plugins/ADPass/ADPass/Info.plist index b26ee52..57469a3 100644 --- a/src/Plugins/ADPass/ADPass/Info.plist +++ b/src/Plugins/ADPass/ADPass/Info.plist @@ -19,8 +19,10 @@ CFBundleVersion 1 NSHumanReadableCopyright - Copyright © 2017 Yoann Gini. All rights reserved. + Copyright © 2017 Yoann Gini (Open Source Project). All rights reserved. NSPrincipalClass - + HITPADPass + HITPFunctionIdentifier + public.ad.pass diff --git a/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings b/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings index 3d85ba0..75be6ee 100644 --- a/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings +++ b/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings @@ -7,6 +7,9 @@ */ -"willExpireFormat" -"tooltip" -"disabledTooltip" +// `%ld` is the format used to display the number of days before password expire. +// To show `Your password will expire in 42d` use format `Your password will expire in %ldd` + +"willExpireFormat" = "Password expire in %ldd"; +"tooltip" = "Delay before your password expire, change it before!"; +"disabledTooltip" = "Your IT infrastructure isn't available. Current info is based on the last recorded value and you can't change your password."; diff --git a/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings b/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings index cf0631a..7de059f 100644 --- a/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings +++ b/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings @@ -10,6 +10,6 @@ // `%ld` is the format used to display the number of days before password expire. // To show `Your password will expire in 42d` use format `Your password will expire in %ldd` -"willExpireFormat" = "🔐 📆 %ld"; -"tooltip" = "Delay before your password expire, change it before!"; -"disabledTooltip" = "Your IT infrastructure isn't available. Current info is based on the last recorded value."; +"willExpireFormat" = "MDP expire dans %ldj"; +"tooltip" = "Nombre de jours avant que votre mot de passe ne change, pensez à le changer avant !"; +"disabledTooltip" = "Votre système d'information est injoignable. L'information actuelle est basée sur la dernière valeur enregistrée et vous ne pouvez pas changer votre mot de passe."; From 4fa3242c79c85fd0d9255191577a74008233bbdf Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Mon, 25 Sep 2017 10:16:30 +0200 Subject: [PATCH 06/17] Fix logic issue in the way state skipping was managed --- src/Plugins/SubMenu/SubMenu/HITPSubMenu.m | 25 ++++++++++++----------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Plugins/SubMenu/SubMenu/HITPSubMenu.m b/src/Plugins/SubMenu/SubMenu/HITPSubMenu.m index 2fa3349..879f6c4 100644 --- a/src/Plugins/SubMenu/SubMenu/HITPSubMenu.m +++ b/src/Plugins/SubMenu/SubMenu/HITPSubMenu.m @@ -73,6 +73,8 @@ -(NSMenuItem *)prepareNewMenuItem { id pluginInstance = [TargetPlugin newPlugInInstanceWithSettings:[item objectForKey:kMenuItemSettings]]; if (pluginInstance) { + NSObject *observablePluginInstance = pluginInstance; + if ([pluginInstance respondsToSelector:@selector(setPluginsManager:)]) { // Access to plugin manager may be needed to allow plugin to call other plugins, // to create a submenu for example @@ -80,22 +82,21 @@ -(NSMenuItem *)prepareNewMenuItem { } if ([pluginInstance respondsToSelector:@selector(testState)]) { + BOOL skipForGlobalState = NO; if ([pluginInstance respondsToSelector:@selector(skipForGlobalState)]) { - NSObject *observablePluginInstance = pluginInstance; - if (![observablePluginInstance skipForGlobalState]) { - asl_log(NULL, NULL, ASL_LEVEL_DEBUG, "Plugin instance of %s has state for global state, start observing it.", [NSStringFromClass(TargetPlugin) cStringUsingEncoding:NSUTF8StringEncoding]); - - [observablePluginInstance addObserver:self - forKeyPath:@"testState" - options:0 - context:nil]; - [self.observedSubPluginInstances addObject:observablePluginInstance]; - } + skipForGlobalState = [observablePluginInstance skipForGlobalState]; } - - + if (!skipForGlobalState) { + asl_log(NULL, NULL, ASL_LEVEL_DEBUG, "Plugin instance of %s has state for global state, start observing it.", [NSStringFromClass(TargetPlugin) cStringUsingEncoding:NSUTF8StringEncoding]); + + [observablePluginInstance addObserver:self + forKeyPath:@"testState" + options:0 + context:nil]; + [self.observedSubPluginInstances addObject:observablePluginInstance]; + } } if ([pluginInstance respondsToSelector:@selector(isNetworkRelated)]) { From 4c2f7328223f3a5f66ff0ab09f2e35a7e8f3b672 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Mon, 25 Sep 2017 11:49:24 +0200 Subject: [PATCH 07/17] Alert user to change AD password via notif, one per day --- src/Plugins/ADPass/ADPass/HITPADPass.m | 127 ++++++++++++++---- .../ADPass/en.lproj/Localizable.strings | 4 + .../ADPass/fr.lproj/Localizable.strings | 4 + 3 files changed, 110 insertions(+), 25 deletions(-) diff --git a/src/Plugins/ADPass/ADPass/HITPADPass.m b/src/Plugins/ADPass/ADPass/HITPADPass.m index f47d1c3..41c777b 100644 --- a/src/Plugins/ADPass/ADPass/HITPADPass.m +++ b/src/Plugins/ADPass/ADPass/HITPADPass.m @@ -11,25 +11,34 @@ #define kHITPADPassExpiryTimeField @"msDS-UserPasswordExpiryTimeComputed" #define kHITPADPassExpiryTimeKey @"public.ad.pass.expirySince1970" +#define kHITPADPassLastNotifKey @"public.ad.pass.lastNotification" #define kHITPADPassWillExpireFormat @"willExpireFormat" #define kHITPADPassTooltip @"tooltip" -#define kHITPADPassDisabledTooltip @"disabledTooltip" +#define kHITPADPassOfflineTooltip @"offlineTooltip" + +#define kHITPADPassNotifTitle @"notificationTitle" +#define kHITPADPassNotifMessageFormat @"notificationMessageFormat" +#define kHITPADPassNotifOfflineMessageFormat @"notificationOfflineMessageFormat" + +#define kHITPADPassAlertXDaysBefore @"alertXDaysBefore" @interface HITPADPass () -@property NSDate *passwordExpiracyDate; +@property NSDate *passwordExpiryDate; @property BOOL lastADRequestSucceded; @property NSString *localeTablePath; -@property NSString *defaultWillExpireFormat; -@property NSString *defaultTooltip; -@property NSString *defaultDisabledTooltip; - @property NSString *willExpireFormat; @property NSString *tooltip; -@property NSString *disabledTooltip; +@property NSString *offlineTooltip; + +@property NSString *notificationTitle; +@property NSString *notificationMessageFormat; +@property NSString *notificationOfflineMessageFormat; + +@property NSInteger alertXDaysBefore; @end @@ -39,29 +48,55 @@ - (instancetype)initWithSettings:(NSDictionary*)settings { self = [super initWithSettings:settings]; if (self) { - _defaultWillExpireFormat = @"🔐 📆 %ld"; - _defaultTooltip = @"Delay before your password expire, change it before!"; - _defaultDisabledTooltip = @"Your IT infrastructure isn't available. Current info is based on the last recorded value."; + _alertXDaysBefore = [[settings objectForKey:kHITPADPassAlertXDaysBefore] integerValue]; + + if (_alertXDaysBefore == 0) { + _alertXDaysBefore = 15; + } + + NSString *defaultWillExpireFormat = @"🔐 📆 %ld"; + NSString *defaultTooltip = @"Delay before your password expire, change it before!"; + NSString *defaultOfflineTooltip = @"Your IT infrastructure isn't available. Current info is based on the last recorded value."; _willExpireFormat = [settings objectForKey:kHITPADPassWillExpireFormat]; _tooltip = [settings objectForKey:kHITPADPassTooltip]; - _disabledTooltip = [settings objectForKey:kHITPADPassDisabledTooltip]; + _offlineTooltip = [settings objectForKey:kHITPADPassOfflineTooltip]; if ([_willExpireFormat length] == 0) { - _willExpireFormat = _defaultWillExpireFormat; + _willExpireFormat = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassWillExpireFormat value:defaultWillExpireFormat table:nil]; } if ([_tooltip length] == 0) { - _tooltip = _defaultTooltip; + _tooltip = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassTooltip value:defaultTooltip table:nil]; } - if ([_disabledTooltip length] == 0) { - _disabledTooltip = _defaultDisabledTooltip; + if ([_offlineTooltip length] == 0) { + _offlineTooltip = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassOfflineTooltip value:defaultOfflineTooltip table:nil]; } - _willExpireFormat = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassWillExpireFormat value:_willExpireFormat table:nil]; - _tooltip = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassTooltip value:_tooltip table:nil]; - _disabledTooltip = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassDisabledTooltip value:_disabledTooltip table:nil]; + + + NSString *defaultNotificationTitle = @"🔐 📆 ⚠️"; + NSString *defaultNotificationMessageFormat = @"Your password will expire on %@. Change it before!"; + NSString *defaultNotificationOfflineMessageFormat = @"Your password will expire on %@. Come back on your corporate network and change it before!"; + + _notificationTitle = [settings objectForKey:kHITPADPassNotifTitle]; + _notificationMessageFormat = [settings objectForKey:kHITPADPassNotifMessageFormat]; + _notificationOfflineMessageFormat = [settings objectForKey:kHITPADPassNotifOfflineMessageFormat]; + + if ([_notificationTitle length] == 0) { + _notificationTitle = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassNotifTitle value:defaultNotificationTitle table:nil]; + } + + if ([_notificationMessageFormat length] == 0) { + _notificationMessageFormat = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassNotifMessageFormat value:defaultNotificationMessageFormat table:nil]; + } + + if ([_notificationOfflineMessageFormat length] == 0) { + _notificationOfflineMessageFormat = [[NSBundle bundleForClass:[self class]] localizedStringForKey:kHITPADPassNotifOfflineMessageFormat value:defaultNotificationOfflineMessageFormat table:nil]; + } + + } return self; } @@ -77,12 +112,37 @@ - (void)periodicAction:(NSTimer *)timer { - (void)updateTitle { - NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:[NSDate date] toDate:self.passwordExpiracyDate options:0]; - - self.menuItem.title = [NSString stringWithFormat:self.willExpireFormat, (long)[components day]]; + NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:[NSDate date] toDate:self.passwordExpiryDate options:0]; + long daysBeforeExpiry = (long)[components day]; + self.menuItem.title = [NSString stringWithFormat:self.willExpireFormat, daysBeforeExpiry]; self.menuItem.enabled = self.lastADRequestSucceded; - self.menuItem.toolTip = self.lastADRequestSucceded ? self.tooltip : self.disabledTooltip; + self.menuItem.toolTip = self.lastADRequestSucceded ? self.tooltip : self.offlineTooltip; + + if (daysBeforeExpiry <= self.alertXDaysBefore) { + NSDate *dateOfLastNotification = [[NSUserDefaults standardUserDefaults] objectForKey:kHITPADPassLastNotifKey]; + + BOOL notifNeeded = NO; + + if (dateOfLastNotification) { + NSDateComponents *previousNotifComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:dateOfLastNotification toDate:self.passwordExpiryDate options:0]; + notifNeeded = [previousNotifComponents day] != daysBeforeExpiry; + } else { + notifNeeded = YES; + } + + if (notifNeeded) { + NSDateComponents* components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute fromDate:[NSDate date]]; + + components.hour = 10; + components.minute = 00; + + NSDate* deliveryDate = [[NSCalendar currentCalendar] dateFromComponents:components]; + + [self sendUserNotificationWithDeliveryDate:deliveryDate]; + [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:kHITPADPassLastNotifKey]; + } + } } - (void)getPasswordExpiryDate { @@ -126,15 +186,32 @@ - (void)getPasswordExpiryDate { NSTimeInterval expiryTimeInterval = [expiryTime integerValue] / 10000000.0; - self.passwordExpiracyDate = [NSDate dateWithTimeInterval:expiryTimeInterval sinceDate:adRefenreceDate]; + self.passwordExpiryDate = [NSDate dateWithTimeInterval:expiryTimeInterval sinceDate:adRefenreceDate]; self.lastADRequestSucceded = YES; - [[NSUserDefaults standardUserDefaults] setInteger:[self.passwordExpiracyDate timeIntervalSince1970] forKey:kHITPADPassExpiryTimeKey]; + [[NSUserDefaults standardUserDefaults] setInteger:[self.passwordExpiryDate timeIntervalSince1970] forKey:kHITPADPassExpiryTimeKey]; } else { NSInteger expirySince1970 = [[NSUserDefaults standardUserDefaults] integerForKey:kHITPADPassExpiryTimeKey]; - self.passwordExpiracyDate = [NSDate dateWithTimeIntervalSince1970:expirySince1970]; + self.passwordExpiryDate = [NSDate dateWithTimeIntervalSince1970:expirySince1970]; self.lastADRequestSucceded = NO; } } +- (void)sendUserNotificationWithDeliveryDate:(NSDate*)deliveryDate { + NSUserNotification *notification = [NSUserNotification new]; + + notification.deliveryDate = deliveryDate; + notification.title = self.notificationTitle; + NSString *infoTextFormat = self.lastADRequestSucceded ? self.notificationMessageFormat : self.notificationOfflineMessageFormat; + + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; + [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; + + NSString *stringDate = [dateFormatter stringFromDate:self.passwordExpiryDate]; + notification.informativeText = [NSString stringWithFormat:infoTextFormat, stringDate]; + + [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; +} + @end diff --git a/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings b/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings index 75be6ee..fafae27 100644 --- a/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings +++ b/src/Plugins/ADPass/ADPass/en.lproj/Localizable.strings @@ -13,3 +13,7 @@ "willExpireFormat" = "Password expire in %ldd"; "tooltip" = "Delay before your password expire, change it before!"; "disabledTooltip" = "Your IT infrastructure isn't available. Current info is based on the last recorded value and you can't change your password."; + +"notificationTitle" = "Password is about to expire!"; +"notificationMessageFormat" = "Your password will expire on %@. Change it before!"; +"notificationOfflineMessageFormat" = "Your password will expire on %@. Come back on your corporate network and change it before!"; diff --git a/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings b/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings index 7de059f..e6aca72 100644 --- a/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings +++ b/src/Plugins/ADPass/ADPass/fr.lproj/Localizable.strings @@ -13,3 +13,7 @@ "willExpireFormat" = "MDP expire dans %ldj"; "tooltip" = "Nombre de jours avant que votre mot de passe ne change, pensez à le changer avant !"; "disabledTooltip" = "Votre système d'information est injoignable. L'information actuelle est basée sur la dernière valeur enregistrée et vous ne pouvez pas changer votre mot de passe."; + +"notificationTitle" = "Votre mot de passe va expirer !"; +"notificationMessageFormat" = "Votre mot de passe expire le %@. Changez-le avant !"; +"notificationOfflineMessageFormat" = "Votre mot de passe expire le %@. Retournez sur votre réseau d'entreprise et changez-le avant la date butoire !"; From 11aec3a75a824a0cd587f237b4df2da0f9cdb5c3 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Mon, 25 Sep 2017 11:57:22 +0200 Subject: [PATCH 08/17] Fix path creation behavior to use only lowerstring case --- src/Hello IT/HITPluginsManager.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Hello IT/HITPluginsManager.m b/src/Hello IT/HITPluginsManager.m index 6718fba..7ed0c80 100644 --- a/src/Hello IT/HITPluginsManager.m +++ b/src/Hello IT/HITPluginsManager.m @@ -121,7 +121,7 @@ - (NSArray*)pluginsURLs { if (error) { asl_log(NULL, NULL, ASL_LEVEL_ERR, "Error when trying to access plugin directory in /Library:\n%s", [[error localizedDescription] cStringUsingEncoding:NSUTF8StringEncoding]); } else { - URL = [[URL URLByAppendingPathComponent:[[NSBundle mainBundle] bundleIdentifier]] URLByAppendingPathComponent:kHITPPlugInsFolder]; + URL = [[URL URLByAppendingPathComponent:[[[NSBundle mainBundle] bundleIdentifier] lowercaseString]] URLByAppendingPathComponent:kHITPPlugInsFolder]; if ([self directoryUsableAtURL:URL]) { [URLs addObject:URL]; } else { @@ -138,7 +138,7 @@ - (NSArray*)pluginsURLs { if (error) { asl_log(NULL, NULL, ASL_LEVEL_ERR, "Error when trying to access plugin directory in ~/Library:\n%s", [[error localizedDescription] cStringUsingEncoding:NSUTF8StringEncoding]); } else { - URL = [[URL URLByAppendingPathComponent:[[NSBundle mainBundle] bundleIdentifier]] URLByAppendingPathComponent:kHITPPlugInsFolder]; + URL = [[URL URLByAppendingPathComponent:[[[NSBundle mainBundle] bundleIdentifier] lowercaseString]] URLByAppendingPathComponent:kHITPPlugInsFolder]; if ([self directoryUsableAtURL:URL]) { [URLs addObject:URL]; } else { From 1bd579a34bc004bdf8f0783cc615320f4fa260d1 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Mon, 25 Sep 2017 12:11:48 +0200 Subject: [PATCH 09/17] Fix build settings to match reco and avoid some warnings --- .../HITDevKit.xcodeproj/project.pbxproj | 11 ++++++++++- src/HITDevKit/HITDevKit/Info.plist | 4 ++-- src/HITDevKit/HITDevKitTests/Info.plist | 2 +- src/Hello IT.xcodeproj/project.pbxproj | 13 +++++++++++++ src/Hello IT/Info.plist | 4 ++-- .../OpenApplication.xcodeproj/project.pbxproj | 9 ++++++++- .../OpenApplication/HITPOpenApplication.m | 2 +- .../OpenApplication/OpenApplication/Info.plist | 4 ++-- .../OpenResource.xcodeproj/project.pbxproj | 9 ++++++++- src/Plugins/OpenResource/OpenResource/Info.plist | 4 ++-- src/Plugins/Quit/Quit.xcodeproj/project.pbxproj | 15 ++++++++++++--- src/Plugins/Quit/Quit/Info.plist | 4 ++-- .../Quit/Quit/en.lproj/Localizable.strings | Bin 184 -> 93 bytes .../Quit/Quit/fr.lproj/Localizable.strings | Bin 190 -> 97 bytes .../ScriptedItem.xcodeproj/project.pbxproj | 9 ++++++++- src/Plugins/ScriptedItem/ScriptedItem/Info.plist | 4 ++-- .../Separator.xcodeproj/project.pbxproj | 9 ++++++++- src/Plugins/Separator/Separator/Info.plist | 4 ++-- .../SubMenu/SubMenu.xcodeproj/project.pbxproj | 9 ++++++++- src/Plugins/SubMenu/SubMenu/Info.plist | 4 ++-- .../TestHTTP/TestHTTP.xcodeproj/project.pbxproj | 9 ++++++++- src/Plugins/TestHTTP/TestHTTP/Info.plist | 4 ++-- .../Title/Title.xcodeproj/project.pbxproj | 9 ++++++++- src/Plugins/Title/Title/Info.plist | 4 ++-- 24 files changed, 113 insertions(+), 33 deletions(-) diff --git a/src/HITDevKit/HITDevKit.xcodeproj/project.pbxproj b/src/HITDevKit/HITDevKit.xcodeproj/project.pbxproj index a2988af..b925232 100644 --- a/src/HITDevKit/HITDevKit.xcodeproj/project.pbxproj +++ b/src/HITDevKit/HITDevKit.xcodeproj/project.pbxproj @@ -203,7 +203,7 @@ E1B2C8C81B59351B005A9936 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Yoann Gini (Open Source Project)"; TargetAttributes = { E1B2C8D01B59351B005A9936 = { @@ -314,14 +314,17 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -359,8 +362,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -396,6 +401,7 @@ INFOPLIST_FILE = HITDevKit/Info.plist; INSTALL_PATH = "@loader_path/../Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; @@ -413,6 +419,7 @@ INFOPLIST_FILE = HITDevKit/Info.plist; INSTALL_PATH = "@loader_path/../Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; @@ -432,6 +439,7 @@ ); INFOPLIST_FILE = HITDevKitTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -446,6 +454,7 @@ ); INFOPLIST_FILE = HITDevKitTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; diff --git a/src/HITDevKit/HITDevKit/Info.plist b/src/HITDevKit/HITDevKit/Info.plist index 78963ca..e95706f 100644 --- a/src/HITDevKit/HITDevKit/Info.plist +++ b/src/HITDevKit/HITDevKit/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 199 + 209 NSHumanReadableCopyright Copyright © 2015 Yoann Gini (Open Source Project). All rights reserved. NSPrincipalClass diff --git a/src/HITDevKit/HITDevKitTests/Info.plist b/src/HITDevKit/HITDevKitTests/Info.plist index 4d1fd44..ba72822 100644 --- a/src/HITDevKit/HITDevKitTests/Info.plist +++ b/src/HITDevKit/HITDevKitTests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/src/Hello IT.xcodeproj/project.pbxproj b/src/Hello IT.xcodeproj/project.pbxproj index 65d024d..f7c2db4 100644 --- a/src/Hello IT.xcodeproj/project.pbxproj +++ b/src/Hello IT.xcodeproj/project.pbxproj @@ -131,6 +131,13 @@ remoteGlobalIDString = F83294A51F773076009DA574; remoteInfo = ADPass; }; + F86CCC0A1F790D250043CF55 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F83294AE1F773076009DA574 /* ADPass.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = F83294A41F773076009DA574; + remoteInfo = ADPass; + }; F8F4E5761F1A73CC004E8789 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = E1B2C8ED1B59351B005A9936 /* HITDevKit.xcodeproj */; @@ -499,6 +506,7 @@ ); dependencies = ( F8F4E5771F1A73CC004E8789 /* PBXTargetDependency */, + F86CCC0B1F790D250043CF55 /* PBXTargetDependency */, F8F4E5791F1A73CC004E8789 /* PBXTargetDependency */, F8F4E57B1F1A73CC004E8789 /* PBXTargetDependency */, F8F4E57D1F1A73CC004E8789 /* PBXTargetDependency */, @@ -774,6 +782,11 @@ target = E1D067F91B51D08E00567172 /* Hello IT */; targetProxy = E1D0680E1B51D08F00567172 /* PBXContainerItemProxy */; }; + F86CCC0B1F790D250043CF55 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ADPass; + targetProxy = F86CCC0A1F790D250043CF55 /* PBXContainerItemProxy */; + }; F8F4E5771F1A73CC004E8789 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = HITDevKit; diff --git a/src/Hello IT/Info.plist b/src/Hello IT/Info.plist index bad3981..8760679 100644 --- a/src/Hello IT/Info.plist +++ b/src/Hello IT/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.12 + 1.2.99 CFBundleSignature ???? CFBundleVersion - 199 + 209 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/src/Plugins/OpenApplication/OpenApplication.xcodeproj/project.pbxproj b/src/Plugins/OpenApplication/OpenApplication.xcodeproj/project.pbxproj index bed2d67..efb53d1 100644 --- a/src/Plugins/OpenApplication/OpenApplication.xcodeproj/project.pbxproj +++ b/src/Plugins/OpenApplication/OpenApplication.xcodeproj/project.pbxproj @@ -93,7 +93,7 @@ E14B67951B57855F00941A27 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Yoann Gini (Open Source Project)"; TargetAttributes = { E14B679C1B57855F00941A27 = { @@ -170,13 +170,16 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -212,8 +215,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -244,6 +249,7 @@ ); INFOPLIST_FILE = OpenApplication/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; @@ -260,6 +266,7 @@ ); INFOPLIST_FILE = OpenApplication/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; diff --git a/src/Plugins/OpenApplication/OpenApplication/HITPOpenApplication.m b/src/Plugins/OpenApplication/OpenApplication/HITPOpenApplication.m index cef19c2..a770f34 100644 --- a/src/Plugins/OpenApplication/OpenApplication/HITPOpenApplication.m +++ b/src/Plugins/OpenApplication/OpenApplication/HITPOpenApplication.m @@ -45,7 +45,7 @@ - (instancetype)initWithSettings:(NSDictionary*)settings _args = [settings objectForKey:kHITPOpenApplicationArgsArray]; if (!_args) { - _args = @{}; + _args = @[]; } } diff --git a/src/Plugins/OpenApplication/OpenApplication/Info.plist b/src/Plugins/OpenApplication/OpenApplication/Info.plist index d05f4fe..6422fa2 100644 --- a/src/Plugins/OpenApplication/OpenApplication/Info.plist +++ b/src/Plugins/OpenApplication/OpenApplication/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 199 + 209 HITPFunctionIdentifier public.open.application NSHumanReadableCopyright diff --git a/src/Plugins/OpenResource/OpenResource.xcodeproj/project.pbxproj b/src/Plugins/OpenResource/OpenResource.xcodeproj/project.pbxproj index 9c9eb7e..6dc36b1 100644 --- a/src/Plugins/OpenResource/OpenResource.xcodeproj/project.pbxproj +++ b/src/Plugins/OpenResource/OpenResource.xcodeproj/project.pbxproj @@ -93,7 +93,7 @@ E1D068211B51E54E00567172 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Yoann Gini (Open Source Project)"; TargetAttributes = { E1D068281B51E54E00567172 = { @@ -170,13 +170,16 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -212,8 +215,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -244,6 +249,7 @@ ); INFOPLIST_FILE = OpenResource/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = OpenResource; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; @@ -260,6 +266,7 @@ ); INFOPLIST_FILE = OpenResource/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = OpenResource; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; diff --git a/src/Plugins/OpenResource/OpenResource/Info.plist b/src/Plugins/OpenResource/OpenResource/Info.plist index acff105..79e4054 100644 --- a/src/Plugins/OpenResource/OpenResource/Info.plist +++ b/src/Plugins/OpenResource/OpenResource/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 199 + 209 HITPFunctionIdentifier public.open.resource NSHumanReadableCopyright diff --git a/src/Plugins/Quit/Quit.xcodeproj/project.pbxproj b/src/Plugins/Quit/Quit.xcodeproj/project.pbxproj index 72a59f8..9a2088f 100644 --- a/src/Plugins/Quit/Quit.xcodeproj/project.pbxproj +++ b/src/Plugins/Quit/Quit.xcodeproj/project.pbxproj @@ -30,8 +30,8 @@ E1AF40551B529AB70017B4DD /* HITPQuit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HITPQuit.h; sourceTree = ""; }; E1AF40561B529AB70017B4DD /* HITPQuit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HITPQuit.m; sourceTree = ""; }; E1B2C9181B5947E0005A9936 /* HITDevKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HITDevKit.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug/HITDevKit.framework"; sourceTree = ""; }; - F89297411D11356100E431E2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - F89297431D11359800E431E2 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + F89297411D11356100E431E2 /* en */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + F89297431D11359800E431E2 /* fr */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -110,7 +110,7 @@ E1AF40391B529AA10017B4DD /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Yoann Gini (Open Source Project)"; TargetAttributes = { E1AF40401B529AA10017B4DD = { @@ -192,6 +192,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -201,13 +202,16 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -234,6 +238,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -243,8 +248,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -275,6 +282,7 @@ ); INFOPLIST_FILE = Quit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; @@ -291,6 +299,7 @@ ); INFOPLIST_FILE = Quit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; diff --git a/src/Plugins/Quit/Quit/Info.plist b/src/Plugins/Quit/Quit/Info.plist index 2fa4c04..26584a2 100644 --- a/src/Plugins/Quit/Quit/Info.plist +++ b/src/Plugins/Quit/Quit/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 199 + 209 HITPFunctionIdentifier public.quit NSHumanReadableCopyright diff --git a/src/Plugins/Quit/Quit/en.lproj/Localizable.strings b/src/Plugins/Quit/Quit/en.lproj/Localizable.strings index 68761ff24f9015fe40b3444ea52183121f6e7856..cc8eb4f01ca9c60e7be9374adb1071f11ca6f3d8 100644 GIT binary patch literal 93 zcmaFAd%wPxLU2i9Nolb{Qeu%pZfahsLS{*7u0mo?PJVf2Ub;eQacYr5Nxnj1X=aH+ vNk*zdVnIPpW^!UlW`3T6mOhtKV5nzEe6VX!n5VO=l7g**QXo*Jk~J3qX0#vL literal 184 zcmXAjI}XAy5Cx~sDJ++1asWhyC@A@a76Gy#QZTgx0zGaGqsE3e`jQ3qT&a+TpxG< diff --git a/src/Plugins/Quit/Quit/fr.lproj/Localizable.strings b/src/Plugins/Quit/Quit/fr.lproj/Localizable.strings index 27b5661047e4200b48b1bba42384c175c771bd21..1b2c5d4bdc5777085e718912a6c81ee7c820d631 100644 GIT binary patch literal 97 zcmaFAd%wPxLU2i9Nolb{Qeu%pZfahsLS{*7u0mo?PJVf2Ub;eQacYr5Nxnj1X=aH+ zNk*zdVnIPpW^!UlW`3T6mOhtKV5nzEe6VX!n5VO=l7g**QXo)eNotXjH5V5E?6n~; literal 190 zcmXAjI}XA?3S1tn|t dtk`k%jwKros)bdlXKrT4e`mg;SI?X)7y*MFAj1Fv diff --git a/src/Plugins/ScriptedItem/ScriptedItem.xcodeproj/project.pbxproj b/src/Plugins/ScriptedItem/ScriptedItem.xcodeproj/project.pbxproj index 2a8c6f3..b727562 100644 --- a/src/Plugins/ScriptedItem/ScriptedItem.xcodeproj/project.pbxproj +++ b/src/Plugins/ScriptedItem/ScriptedItem.xcodeproj/project.pbxproj @@ -93,7 +93,7 @@ E14B67BD1B59059000941A27 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Yoann Gini (Open Source Project)"; TargetAttributes = { E14B67C41B59059000941A27 = { @@ -170,13 +170,16 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -212,8 +215,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -244,6 +249,7 @@ ); INFOPLIST_FILE = ScriptedItem/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; @@ -260,6 +266,7 @@ ); INFOPLIST_FILE = ScriptedItem/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; diff --git a/src/Plugins/ScriptedItem/ScriptedItem/Info.plist b/src/Plugins/ScriptedItem/ScriptedItem/Info.plist index 7bd501a..9b736d5 100644 --- a/src/Plugins/ScriptedItem/ScriptedItem/Info.plist +++ b/src/Plugins/ScriptedItem/ScriptedItem/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 199 + 209 HITPFunctionIdentifier public.script.item NSHumanReadableCopyright diff --git a/src/Plugins/Separator/Separator.xcodeproj/project.pbxproj b/src/Plugins/Separator/Separator.xcodeproj/project.pbxproj index 40dda9d..b00e93f 100644 --- a/src/Plugins/Separator/Separator.xcodeproj/project.pbxproj +++ b/src/Plugins/Separator/Separator.xcodeproj/project.pbxproj @@ -93,7 +93,7 @@ E17743631B51F19B00A5B406 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Yoann Gini (Open Source Project)"; TargetAttributes = { E177436A1B51F19B00A5B406 = { @@ -170,13 +170,16 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -212,8 +215,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -244,6 +249,7 @@ ); INFOPLIST_FILE = Separator/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; @@ -260,6 +266,7 @@ ); INFOPLIST_FILE = Separator/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; diff --git a/src/Plugins/Separator/Separator/Info.plist b/src/Plugins/Separator/Separator/Info.plist index 28d1d97..81568e7 100644 --- a/src/Plugins/Separator/Separator/Info.plist +++ b/src/Plugins/Separator/Separator/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 199 + 209 HITPFunctionIdentifier public.separator NSHumanReadableCopyright diff --git a/src/Plugins/SubMenu/SubMenu.xcodeproj/project.pbxproj b/src/Plugins/SubMenu/SubMenu.xcodeproj/project.pbxproj index 17a8447..fca7e24 100644 --- a/src/Plugins/SubMenu/SubMenu.xcodeproj/project.pbxproj +++ b/src/Plugins/SubMenu/SubMenu.xcodeproj/project.pbxproj @@ -93,7 +93,7 @@ E1AF405E1B529F460017B4DD /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Yoann Gini (Open Source Project)"; TargetAttributes = { E1AF40651B529F460017B4DD = { @@ -170,13 +170,16 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -212,8 +215,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -244,6 +249,7 @@ ); INFOPLIST_FILE = SubMenu/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; @@ -260,6 +266,7 @@ ); INFOPLIST_FILE = SubMenu/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; diff --git a/src/Plugins/SubMenu/SubMenu/Info.plist b/src/Plugins/SubMenu/SubMenu/Info.plist index 0a5a3bc..eec8dcd 100644 --- a/src/Plugins/SubMenu/SubMenu/Info.plist +++ b/src/Plugins/SubMenu/SubMenu/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 199 + 209 HITPFunctionIdentifier public.submenu NSHumanReadableCopyright diff --git a/src/Plugins/TestHTTP/TestHTTP.xcodeproj/project.pbxproj b/src/Plugins/TestHTTP/TestHTTP.xcodeproj/project.pbxproj index 811b104..acafd8e 100644 --- a/src/Plugins/TestHTTP/TestHTTP.xcodeproj/project.pbxproj +++ b/src/Plugins/TestHTTP/TestHTTP.xcodeproj/project.pbxproj @@ -93,7 +93,7 @@ E12F1E381B52355B005A4418 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Yoann Gini (Open Source Project)"; TargetAttributes = { E12F1E3F1B52355B005A4418 = { @@ -170,13 +170,16 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -212,8 +215,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -244,6 +249,7 @@ ); INFOPLIST_FILE = TestHTTP/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; @@ -260,6 +266,7 @@ ); INFOPLIST_FILE = TestHTTP/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; diff --git a/src/Plugins/TestHTTP/TestHTTP/Info.plist b/src/Plugins/TestHTTP/TestHTTP/Info.plist index 0f2db5d..ec138ed 100644 --- a/src/Plugins/TestHTTP/TestHTTP/Info.plist +++ b/src/Plugins/TestHTTP/TestHTTP/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 199 + 209 HITPFunctionIdentifier public.test.http NSHumanReadableCopyright diff --git a/src/Plugins/Title/Title.xcodeproj/project.pbxproj b/src/Plugins/Title/Title.xcodeproj/project.pbxproj index 5e78148..5c7fd73 100644 --- a/src/Plugins/Title/Title.xcodeproj/project.pbxproj +++ b/src/Plugins/Title/Title.xcodeproj/project.pbxproj @@ -93,7 +93,7 @@ E17743821B51F2C900A5B406 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Yoann Gini (Open Source Project)"; TargetAttributes = { E17743891B51F2C900A5B406 = { @@ -170,13 +170,16 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -212,8 +215,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -244,6 +249,7 @@ ); INFOPLIST_FILE = Title/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; @@ -260,6 +266,7 @@ ); INFOPLIST_FILE = Title/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; WRAPPER_EXTENSION = hitp; diff --git a/src/Plugins/Title/Title/Info.plist b/src/Plugins/Title/Title/Info.plist index 4639402..294c24e 100644 --- a/src/Plugins/Title/Title/Info.plist +++ b/src/Plugins/Title/Title/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 199 + 209 HITPFunctionIdentifier public.title NSHumanReadableCopyright From dd3a8a2409671a20b7f8b8b8bea4f3a9fbc7a6d0 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Mon, 25 Sep 2017 12:17:34 +0200 Subject: [PATCH 10/17] Fixing warning with framework import --- .../OpenApplication.xcodeproj/project.pbxproj | 8 -------- .../OpenResource/OpenResource.xcodeproj/project.pbxproj | 8 -------- src/Plugins/Quit/Quit.xcodeproj/project.pbxproj | 8 -------- .../ScriptedItem/ScriptedItem.xcodeproj/project.pbxproj | 8 -------- src/Plugins/Separator/Separator.xcodeproj/project.pbxproj | 8 -------- src/Plugins/SubMenu/SubMenu.xcodeproj/project.pbxproj | 8 -------- src/Plugins/TestHTTP/TestHTTP.xcodeproj/project.pbxproj | 8 -------- src/Plugins/Title/Title.xcodeproj/project.pbxproj | 8 -------- 8 files changed, 64 deletions(-) diff --git a/src/Plugins/OpenApplication/OpenApplication.xcodeproj/project.pbxproj b/src/Plugins/OpenApplication/OpenApplication.xcodeproj/project.pbxproj index efb53d1..1d71c59 100644 --- a/src/Plugins/OpenApplication/OpenApplication.xcodeproj/project.pbxproj +++ b/src/Plugins/OpenApplication/OpenApplication.xcodeproj/project.pbxproj @@ -243,10 +243,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = OpenApplication/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; @@ -260,10 +256,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = OpenApplication/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; diff --git a/src/Plugins/OpenResource/OpenResource.xcodeproj/project.pbxproj b/src/Plugins/OpenResource/OpenResource.xcodeproj/project.pbxproj index 6dc36b1..866d590 100644 --- a/src/Plugins/OpenResource/OpenResource.xcodeproj/project.pbxproj +++ b/src/Plugins/OpenResource/OpenResource.xcodeproj/project.pbxproj @@ -243,10 +243,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = OpenResource/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; @@ -260,10 +256,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = OpenResource/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; diff --git a/src/Plugins/Quit/Quit.xcodeproj/project.pbxproj b/src/Plugins/Quit/Quit.xcodeproj/project.pbxproj index 9a2088f..13a46fb 100644 --- a/src/Plugins/Quit/Quit.xcodeproj/project.pbxproj +++ b/src/Plugins/Quit/Quit.xcodeproj/project.pbxproj @@ -276,10 +276,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = Quit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; @@ -293,10 +289,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = Quit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; diff --git a/src/Plugins/ScriptedItem/ScriptedItem.xcodeproj/project.pbxproj b/src/Plugins/ScriptedItem/ScriptedItem.xcodeproj/project.pbxproj index b727562..1523c11 100644 --- a/src/Plugins/ScriptedItem/ScriptedItem.xcodeproj/project.pbxproj +++ b/src/Plugins/ScriptedItem/ScriptedItem.xcodeproj/project.pbxproj @@ -243,10 +243,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = ScriptedItem/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; @@ -260,10 +256,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = ScriptedItem/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; diff --git a/src/Plugins/Separator/Separator.xcodeproj/project.pbxproj b/src/Plugins/Separator/Separator.xcodeproj/project.pbxproj index b00e93f..9d3fae8 100644 --- a/src/Plugins/Separator/Separator.xcodeproj/project.pbxproj +++ b/src/Plugins/Separator/Separator.xcodeproj/project.pbxproj @@ -243,10 +243,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = Separator/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; @@ -260,10 +256,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = Separator/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; diff --git a/src/Plugins/SubMenu/SubMenu.xcodeproj/project.pbxproj b/src/Plugins/SubMenu/SubMenu.xcodeproj/project.pbxproj index fca7e24..61e728f 100644 --- a/src/Plugins/SubMenu/SubMenu.xcodeproj/project.pbxproj +++ b/src/Plugins/SubMenu/SubMenu.xcodeproj/project.pbxproj @@ -243,10 +243,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = SubMenu/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; @@ -260,10 +256,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = SubMenu/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; diff --git a/src/Plugins/TestHTTP/TestHTTP.xcodeproj/project.pbxproj b/src/Plugins/TestHTTP/TestHTTP.xcodeproj/project.pbxproj index acafd8e..a0ca9f9 100644 --- a/src/Plugins/TestHTTP/TestHTTP.xcodeproj/project.pbxproj +++ b/src/Plugins/TestHTTP/TestHTTP.xcodeproj/project.pbxproj @@ -243,10 +243,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = TestHTTP/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; @@ -260,10 +256,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = TestHTTP/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; diff --git a/src/Plugins/Title/Title.xcodeproj/project.pbxproj b/src/Plugins/Title/Title.xcodeproj/project.pbxproj index 5c7fd73..df869b8 100644 --- a/src/Plugins/Title/Title.xcodeproj/project.pbxproj +++ b/src/Plugins/Title/Title.xcodeproj/project.pbxproj @@ -243,10 +243,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = Title/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; @@ -260,10 +256,6 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Hello_IT-dblktlmawojysuccadblmqsuewcj/Build/Products/Debug", - ); INFOPLIST_FILE = Title/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_BUNDLE_IDENTIFIER = "com.github.ygini.hitp.$(PRODUCT_NAME:rfc1034identifier)"; From 4fc62042a0109c3cca1c7e510c85c03b8a79ab57 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Tue, 26 Sep 2017 07:38:32 +0200 Subject: [PATCH 11/17] Disabling menu when AD isn't reachable. --- src/Plugins/ADPass/ADPass/HITPADPass.m | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Plugins/ADPass/ADPass/HITPADPass.m b/src/Plugins/ADPass/ADPass/HITPADPass.m index 41c777b..e01479c 100644 --- a/src/Plugins/ADPass/ADPass/HITPADPass.m +++ b/src/Plugins/ADPass/ADPass/HITPADPass.m @@ -115,10 +115,15 @@ - (void)updateTitle { NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:[NSDate date] toDate:self.passwordExpiryDate options:0]; long daysBeforeExpiry = (long)[components day]; self.menuItem.title = [NSString stringWithFormat:self.willExpireFormat, daysBeforeExpiry]; - self.menuItem.enabled = self.lastADRequestSucceded; - - self.menuItem.toolTip = self.lastADRequestSucceded ? self.tooltip : self.offlineTooltip; + if (self.lastADRequestSucceded) { + self.menuItem.target = self; + self.menuItem.toolTip = self.tooltip; + } else { + self.menuItem.target = nil; + self.menuItem.toolTip = self.offlineTooltip; + } + if (daysBeforeExpiry <= self.alertXDaysBefore) { NSDate *dateOfLastNotification = [[NSUserDefaults standardUserDefaults] objectForKey:kHITPADPassLastNotifKey]; From d2f0db2d2ace311b9c1e891ae060448fbeb04010 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Tue, 26 Sep 2017 18:41:25 +0200 Subject: [PATCH 12/17] Improved logs --- src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj | 5 +++-- src/Plugins/ADPass/ADPass/HITPADPass.m | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj b/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj index 8b8d6fe..9023157 100644 --- a/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj +++ b/src/Plugins/ADPass/ADPass.xcodeproj/project.pbxproj @@ -204,7 +204,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.12; + MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -247,7 +247,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.12; + MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; }; @@ -298,6 +298,7 @@ F83294AD1F773076009DA574 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/src/Plugins/ADPass/ADPass/HITPADPass.m b/src/Plugins/ADPass/ADPass/HITPADPass.m index e01479c..c784298 100644 --- a/src/Plugins/ADPass/ADPass/HITPADPass.m +++ b/src/Plugins/ADPass/ADPass/HITPADPass.m @@ -8,6 +8,7 @@ #import "HITPADPass.h" #import +#import #define kHITPADPassExpiryTimeField @"msDS-UserPasswordExpiryTimeComputed" #define kHITPADPassExpiryTimeKey @"public.ad.pass.expirySince1970" @@ -181,6 +182,7 @@ - (void)getPasswordExpiryDate { // Thank you Microsoft to use Jan 1, 1601 at 00:00 UTC as reference date… if (expiryTime) { + asl_log(NULL, NULL, ASL_LEVEL_INFO, "AD Password expiry date requested with success."); NSDateComponents *adRefenreceDateComponents = [[NSDateComponents alloc] init]; [adRefenreceDateComponents setDay:1]; [adRefenreceDateComponents setMonth:1]; @@ -196,6 +198,7 @@ - (void)getPasswordExpiryDate { [[NSUserDefaults standardUserDefaults] setInteger:[self.passwordExpiryDate timeIntervalSince1970] forKey:kHITPADPassExpiryTimeKey]; } else { + asl_log(NULL, NULL, ASL_LEVEL_INFO, "Unable to reach AD, working with old expiry date for AD Password."); NSInteger expirySince1970 = [[NSUserDefaults standardUserDefaults] integerForKey:kHITPADPassExpiryTimeKey]; self.passwordExpiryDate = [NSDate dateWithTimeIntervalSince1970:expirySince1970]; self.lastADRequestSucceded = NO; @@ -203,6 +206,7 @@ - (void)getPasswordExpiryDate { } - (void)sendUserNotificationWithDeliveryDate:(NSDate*)deliveryDate { + asl_log(NULL, NULL, ASL_LEVEL_NOTICE, "Notification to change AD password is requested."); NSUserNotification *notification = [NSUserNotification new]; notification.deliveryDate = deliveryDate; From cca93b331a575edc5f473ffa41a786ce5650cbef Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Tue, 26 Sep 2017 19:01:45 +0200 Subject: [PATCH 13/17] Open password change when user click on the notification and remove delivery date management. Wasn't working as excpected. --- src/Plugins/ADPass/ADPass/HITPADPass.m | 28 +++++++++++++++----------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/Plugins/ADPass/ADPass/HITPADPass.m b/src/Plugins/ADPass/ADPass/HITPADPass.m index c784298..0e7a2e7 100644 --- a/src/Plugins/ADPass/ADPass/HITPADPass.m +++ b/src/Plugins/ADPass/ADPass/HITPADPass.m @@ -24,7 +24,7 @@ #define kHITPADPassAlertXDaysBefore @"alertXDaysBefore" -@interface HITPADPass () +@interface HITPADPass () @property NSDate *passwordExpiryDate; @property BOOL lastADRequestSucceded; @@ -49,6 +49,8 @@ - (instancetype)initWithSettings:(NSDictionary*)settings { self = [super initWithSettings:settings]; if (self) { + [NSUserNotificationCenter defaultUserNotificationCenter].delegate = self; + _alertXDaysBefore = [[settings objectForKey:kHITPADPassAlertXDaysBefore] integerValue]; if (_alertXDaysBefore == 0) { @@ -137,15 +139,10 @@ - (void)updateTitle { notifNeeded = YES; } - if (notifNeeded) { - NSDateComponents* components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute fromDate:[NSDate date]]; - - components.hour = 10; - components.minute = 00; - - NSDate* deliveryDate = [[NSCalendar currentCalendar] dateFromComponents:components]; - - [self sendUserNotificationWithDeliveryDate:deliveryDate]; + NSDateComponents* components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute fromDate:[NSDate date]]; + + if (components.hour >= 10 && notifNeeded) { + [self sendUserNotification]; [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:kHITPADPassLastNotifKey]; } } @@ -205,11 +202,12 @@ - (void)getPasswordExpiryDate { } } -- (void)sendUserNotificationWithDeliveryDate:(NSDate*)deliveryDate { +- (void)sendUserNotification { asl_log(NULL, NULL, ASL_LEVEL_NOTICE, "Notification to change AD password is requested."); NSUserNotification *notification = [NSUserNotification new]; - notification.deliveryDate = deliveryDate; + notification.identifier = [[NSBundle bundleForClass:[self class]] bundleIdentifier]; + notification.title = self.notificationTitle; NSString *infoTextFormat = self.lastADRequestSucceded ? self.notificationMessageFormat : self.notificationOfflineMessageFormat; @@ -223,4 +221,10 @@ - (void)sendUserNotificationWithDeliveryDate:(NSDate*)deliveryDate { [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; } +- (void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification { + if ([notification.identifier isEqualToString:[[NSBundle bundleForClass:[self class]] bundleIdentifier]] && notification.activationType != NSUserNotificationActivationTypeNone) { + [self mainAction:notification]; + } +} + @end From 61b57172f9d6328fcc9c565002c0d8d5c656310a Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Tue, 26 Sep 2017 19:07:03 +0200 Subject: [PATCH 14/17] Hidde AD Pass when no expiry date is found --- src/Plugins/ADPass/ADPass/HITPADPass.m | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Plugins/ADPass/ADPass/HITPADPass.m b/src/Plugins/ADPass/ADPass/HITPADPass.m index 0e7a2e7..ba90ec2 100644 --- a/src/Plugins/ADPass/ADPass/HITPADPass.m +++ b/src/Plugins/ADPass/ADPass/HITPADPass.m @@ -110,11 +110,17 @@ - (void)mainAction:(id)sender { - (void)periodicAction:(NSTimer *)timer { [self getPasswordExpiryDate]; - [self updateTitle]; + if (self.passwordExpiryDate) { + self.menuItem.hidden = NO; + [self updateTitle]; + } else { + asl_log(NULL, NULL, ASL_LEVEL_INFO, "No AD Password expiry date found, hidding menu item."); + self.menuItem.hidden = YES; + } + } - (void)updateTitle { - NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:[NSDate date] toDate:self.passwordExpiryDate options:0]; long daysBeforeExpiry = (long)[components day]; self.menuItem.title = [NSString stringWithFormat:self.willExpireFormat, daysBeforeExpiry]; @@ -197,8 +203,9 @@ - (void)getPasswordExpiryDate { } else { asl_log(NULL, NULL, ASL_LEVEL_INFO, "Unable to reach AD, working with old expiry date for AD Password."); NSInteger expirySince1970 = [[NSUserDefaults standardUserDefaults] integerForKey:kHITPADPassExpiryTimeKey]; - self.passwordExpiryDate = [NSDate dateWithTimeIntervalSince1970:expirySince1970]; + self.passwordExpiryDate = expirySince1970 > 0 ? [NSDate dateWithTimeIntervalSince1970:expirySince1970] : nil; self.lastADRequestSucceded = NO; + } } From 25a43e69b70eb703d320be325ec47f63a726ada6 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Wed, 27 Sep 2017 18:42:25 +0200 Subject: [PATCH 15/17] Remove notifcation from notification center on click --- src/Plugins/ADPass/ADPass/HITPADPass.m | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Plugins/ADPass/ADPass/HITPADPass.m b/src/Plugins/ADPass/ADPass/HITPADPass.m index ba90ec2..06bdeca 100644 --- a/src/Plugins/ADPass/ADPass/HITPADPass.m +++ b/src/Plugins/ADPass/ADPass/HITPADPass.m @@ -231,6 +231,7 @@ - (void)sendUserNotification { - (void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification { if ([notification.identifier isEqualToString:[[NSBundle bundleForClass:[self class]] bundleIdentifier]] && notification.activationType != NSUserNotificationActivationTypeNone) { [self mainAction:notification]; + [center removeDeliveredNotification:notification]; } } From 70bea05e303a44fc7d5df86e99fb4916707103d6 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Wed, 27 Sep 2017 18:43:35 +0200 Subject: [PATCH 16/17] Update app version number according to release branch --- src/Hello IT/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Hello IT/Info.plist b/src/Hello IT/Info.plist index 8760679..b779bc8 100644 --- a/src/Hello IT/Info.plist +++ b/src/Hello IT/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.99 + 1.3.0 CFBundleSignature ???? CFBundleVersion From 48ff26c69c90cc93f100e188d1c2b20e34d4a0e9 Mon Sep 17 00:00:00 2001 From: Yoann Gini Date: Wed, 27 Sep 2017 18:45:40 +0200 Subject: [PATCH 17/17] Test build version OK --- src/HITDevKit/HITDevKit/Info.plist | 2 +- src/Hello IT/Info.plist | 2 +- src/Plugins/OpenApplication/OpenApplication/Info.plist | 2 +- src/Plugins/OpenResource/OpenResource/Info.plist | 2 +- src/Plugins/Quit/Quit/Info.plist | 2 +- src/Plugins/ScriptedItem/ScriptedItem/Info.plist | 2 +- src/Plugins/Separator/Separator/Info.plist | 2 +- src/Plugins/SubMenu/SubMenu/Info.plist | 2 +- src/Plugins/TestHTTP/TestHTTP/Info.plist | 2 +- src/Plugins/Title/Title/Info.plist | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/HITDevKit/HITDevKit/Info.plist b/src/HITDevKit/HITDevKit/Info.plist index e95706f..88acea3 100644 --- a/src/HITDevKit/HITDevKit/Info.plist +++ b/src/HITDevKit/HITDevKit/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 NSHumanReadableCopyright Copyright © 2015 Yoann Gini (Open Source Project). All rights reserved. NSPrincipalClass diff --git a/src/Hello IT/Info.plist b/src/Hello IT/Info.plist index b779bc8..cb30acb 100644 --- a/src/Hello IT/Info.plist +++ b/src/Hello IT/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/src/Plugins/OpenApplication/OpenApplication/Info.plist b/src/Plugins/OpenApplication/OpenApplication/Info.plist index 6422fa2..b00b9ac 100644 --- a/src/Plugins/OpenApplication/OpenApplication/Info.plist +++ b/src/Plugins/OpenApplication/OpenApplication/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 HITPFunctionIdentifier public.open.application NSHumanReadableCopyright diff --git a/src/Plugins/OpenResource/OpenResource/Info.plist b/src/Plugins/OpenResource/OpenResource/Info.plist index 79e4054..49f3e88 100644 --- a/src/Plugins/OpenResource/OpenResource/Info.plist +++ b/src/Plugins/OpenResource/OpenResource/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 HITPFunctionIdentifier public.open.resource NSHumanReadableCopyright diff --git a/src/Plugins/Quit/Quit/Info.plist b/src/Plugins/Quit/Quit/Info.plist index 26584a2..6070f91 100644 --- a/src/Plugins/Quit/Quit/Info.plist +++ b/src/Plugins/Quit/Quit/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 HITPFunctionIdentifier public.quit NSHumanReadableCopyright diff --git a/src/Plugins/ScriptedItem/ScriptedItem/Info.plist b/src/Plugins/ScriptedItem/ScriptedItem/Info.plist index 9b736d5..5b5d33e 100644 --- a/src/Plugins/ScriptedItem/ScriptedItem/Info.plist +++ b/src/Plugins/ScriptedItem/ScriptedItem/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 HITPFunctionIdentifier public.script.item NSHumanReadableCopyright diff --git a/src/Plugins/Separator/Separator/Info.plist b/src/Plugins/Separator/Separator/Info.plist index 81568e7..e3bf017 100644 --- a/src/Plugins/Separator/Separator/Info.plist +++ b/src/Plugins/Separator/Separator/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 HITPFunctionIdentifier public.separator NSHumanReadableCopyright diff --git a/src/Plugins/SubMenu/SubMenu/Info.plist b/src/Plugins/SubMenu/SubMenu/Info.plist index eec8dcd..00c6081 100644 --- a/src/Plugins/SubMenu/SubMenu/Info.plist +++ b/src/Plugins/SubMenu/SubMenu/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 HITPFunctionIdentifier public.submenu NSHumanReadableCopyright diff --git a/src/Plugins/TestHTTP/TestHTTP/Info.plist b/src/Plugins/TestHTTP/TestHTTP/Info.plist index ec138ed..a1294e3 100644 --- a/src/Plugins/TestHTTP/TestHTTP/Info.plist +++ b/src/Plugins/TestHTTP/TestHTTP/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 HITPFunctionIdentifier public.test.http NSHumanReadableCopyright diff --git a/src/Plugins/Title/Title/Info.plist b/src/Plugins/Title/Title/Info.plist index 294c24e..3daf7b9 100644 --- a/src/Plugins/Title/Title/Info.plist +++ b/src/Plugins/Title/Title/Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 209 + 217 HITPFunctionIdentifier public.title NSHumanReadableCopyright