Merge branch 'master' into SDA-1959b

This commit is contained in:
mattias-symphony 2020-04-27 15:37:29 +02:00 committed by GitHub
commit 0266bfb7be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
41 changed files with 747 additions and 1543 deletions

View File

@ -1,5 +1,5 @@
{
"url":"https://foundation-dev.symphony.com",
"url":"https://my.symphony.com",
"minimizeOnClose" : "ENABLED",
"launchOnStartup" : "ENABLED",
"alwaysOnTop" : "DISABLED",

View File

@ -2,7 +2,7 @@
## Overview
Using [Packages](http://s.sudre.free.fr/Software/Packages/about.html), we can build a .pkg file for an existing app (.app). The tool allows us to customise the installation procedure so as to capture the user entered pod url amongst other settings.
Using [Packages](http://s.sudre.free.fr/Software/Packages/about.html), we can build a .pkg file for an existing app (.app). The tool allows us to customise the installation procedure to capture the admin entered values from `/tmp/sym_settings.txt` and `/tmp/sym_permissions.txt`
## Pre-requisites
@ -17,27 +17,21 @@ Once we have [Packages](http://s.sudre.free.fr/Software/Packages/about.html) ins
The above command creates the build 'Symphony.pkg' and places it into the directory `installer/mac/build` relative to the project root.
Also note that the packages project file 'symphony-mac-packager.pkgproj' contains link to the plugin bundle and the post install script both of which are relative to 'symphony-mac-packager.pkgproj'.
Note that the packages project file 'symphony-mac-packager.pkgproj' contains link to the pre install and the post install scripts both of which are relative to 'symphony-mac-packager.pkgproj'.
[More command line documentation here](http://s.sudre.free.fr/Software/documentation/Packages/en/Project_Building.html#4)
## Notes
Currently, both the plugin source code and the plugin bundle are in the `installer/mac` directory. This helps us create builds in a quicker way than having to maintain another repo and building the plugin every time we build the pkg.
## Implementation Details
- The plugin captures data entered by the user and copied it to a temp file
- The post installation script then reads data from the temp file and replaces the values in the 'Symphony.config' file in the installed app
- Pre installation script checks to see if the version we are installing is higher than the already installed version. If the installed version is lower, it deletes the installed version.
- Post installation script reads data from the temp files and replaces the values in the 'Symphony.config' file in the installed app
## Known Issues
- During installation, there is a section called "Destination Select" which is skipped based on the OS and it's settings. This is a [known bug](https://stackoverflow.com/questions/4647416/mac-packagemaker-destination-select-step-a-skipping-boption-permanently-disa).
- Only macOS 10.7+ versions are supported with the installer plugin
- During installation, there is a section called "Destination Select" which is skipped based on the OS and it's settings. This is a [known bug](https://stackoverflow.com/questions/4647416/mac-packagemaker-destination-select-step-a-skipping-boption-permanently-disa).
## Related links
- [Packages Mac](http://s.sudre.free.fr/Software/Packages/about.html)
- [Packages User Guide](http://s.sudre.free.fr/Software/documentation/Packages/en/Packages_Installation.html)
- [Destination Select Bug](https://stackoverflow.com/questions/4647416/mac-packagemaker-destination-select-step-a-skipping-boption-permanently-disa)

View File

@ -1,52 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>19C57</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>SymphonySettingsPlugin</string>
<key>CFBundleIdentifier</key>
<string>com.symphony.SymphonySettingsPlugin</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>SymphonySettingsPlugin</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>4.0</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>1</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>11C29</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>19B90</string>
<key>DTSDKName</key>
<string>macosx10.15</string>
<key>DTXcode</key>
<string>1130</string>
<key>DTXcodeBuild</key>
<string>11C29</string>
<key>InstallerSectionTitle</key>
<string>Pod Settings</string>
<key>LSMinimumSystemVersion</key>
<string>10.10</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2017 Symphony. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MyInstallerPane</string>
<key>NSPrincipalClass</key>
<string>InstallerSection</string>
</dict>
</plist>

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SectionOrder</key>
<array>
<string>Introduction</string>
<string>ReadMe</string>
<string>License</string>
<string>SymphonySettingsPlugin.bundle</string>
<string>Target</string>
<string>PackageSelection</string>
<string>Install</string>
</array>
</dict>
</plist>

View File

@ -1,191 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Resources/Base.lproj/MyInstallerPane.nib</key>
<data>
YqJEUs+O0NAGFaXYG/PL5/LjGRY=
</data>
<key>Resources/InstallerSections.plist</key>
<data>
htLpJqbvPLRCEJWl7tW5JtJh57U=
</data>
<key>Resources/en.lproj/InfoPlist.strings</key>
<dict>
<key>hash</key>
<data>
MKMIqMmrq5wHe2WIb39Zx7uopYM=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/en.lproj/Localizable.strings</key>
<dict>
<key>hash</key>
<data>
BNnst4BtRwVgmY7KjJHnv/Gi9bA=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>files2</key>
<dict>
<key>Resources/Base.lproj/MyInstallerPane.nib</key>
<dict>
<key>hash</key>
<data>
YqJEUs+O0NAGFaXYG/PL5/LjGRY=
</data>
<key>hash2</key>
<data>
vrmW//WHQVaIHJrMeFnpvRK5qq2445PL7k/PHsv18/k=
</data>
</dict>
<key>Resources/InstallerSections.plist</key>
<dict>
<key>hash</key>
<data>
htLpJqbvPLRCEJWl7tW5JtJh57U=
</data>
<key>hash2</key>
<data>
s4rwjWW7Gd+XrsmL4BJfMLfOoaUnr8TRXs1Fc6Ieb24=
</data>
</dict>
<key>Resources/en.lproj/InfoPlist.strings</key>
<dict>
<key>hash</key>
<data>
MKMIqMmrq5wHe2WIb39Zx7uopYM=
</data>
<key>hash2</key>
<data>
6fmnl10zA3TcGk73XQtxuW2uRXRq0TLb3Oiprz+uW1M=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/en.lproj/Localizable.strings</key>
<dict>
<key>hash</key>
<data>
BNnst4BtRwVgmY7KjJHnv/Gi9bA=
</data>
<key>hash2</key>
<data>
N91Gfh6N6xvbnmDSlWU/PARxExcPoyutwL88q2opqak=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@ -1,339 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
3A10EBD41ED4336D0083702F /* MyInstallerPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A10EBD31ED4336D0083702F /* MyInstallerPane.m */; };
3A10EBD71ED4336D0083702F /* MyInstallerPane.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3A10EBD51ED4336D0083702F /* MyInstallerPane.xib */; };
3A10EBDA1ED4336D0083702F /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3A10EBD81ED4336D0083702F /* Localizable.strings */; };
3A10EBDC1ED4336D0083702F /* InstallerSections.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3A10EBDB1ED4336D0083702F /* InstallerSections.plist */; };
3A10EBE01ED4336D0083702F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3A10EBDE1ED4336D0083702F /* InfoPlist.strings */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
3A10EBCF1ED4336D0083702F /* SymphonySettingsPlugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SymphonySettingsPlugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
3A10EBD21ED4336D0083702F /* MyInstallerPane.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyInstallerPane.h; sourceTree = "<group>"; };
3A10EBD31ED4336D0083702F /* MyInstallerPane.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyInstallerPane.m; sourceTree = "<group>"; };
3A10EBD61ED4336D0083702F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MyInstallerPane.xib; sourceTree = "<group>"; };
3A10EBD91ED4336D0083702F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
3A10EBDB1ED4336D0083702F /* InstallerSections.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = InstallerSections.plist; sourceTree = "<group>"; };
3A10EBDD1ED4336D0083702F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3A10EBDF1ED4336D0083702F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
3A10EBCC1ED4336D0083702F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
3A10EBC61ED4336D0083702F = {
isa = PBXGroup;
children = (
3A10EBD11ED4336D0083702F /* SymphonySettingsPlugin */,
3A10EBD01ED4336D0083702F /* Products */,
);
sourceTree = "<group>";
};
3A10EBD01ED4336D0083702F /* Products */ = {
isa = PBXGroup;
children = (
3A10EBCF1ED4336D0083702F /* SymphonySettingsPlugin.bundle */,
);
name = Products;
sourceTree = "<group>";
};
3A10EBD11ED4336D0083702F /* SymphonySettingsPlugin */ = {
isa = PBXGroup;
children = (
3A10EBD21ED4336D0083702F /* MyInstallerPane.h */,
3A10EBD31ED4336D0083702F /* MyInstallerPane.m */,
3A10EBD51ED4336D0083702F /* MyInstallerPane.xib */,
3A10EBD81ED4336D0083702F /* Localizable.strings */,
3A10EBDB1ED4336D0083702F /* InstallerSections.plist */,
3A10EBDD1ED4336D0083702F /* Info.plist */,
3A10EBDE1ED4336D0083702F /* InfoPlist.strings */,
);
path = SymphonySettingsPlugin;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
3A10EBCE1ED4336D0083702F /* SymphonySettingsPlugin */ = {
isa = PBXNativeTarget;
buildConfigurationList = 3A10EBE31ED4336D0083702F /* Build configuration list for PBXNativeTarget "SymphonySettingsPlugin" */;
buildPhases = (
3A10EBCB1ED4336D0083702F /* Sources */,
3A10EBCC1ED4336D0083702F /* Frameworks */,
3A10EBCD1ED4336D0083702F /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = SymphonySettingsPlugin;
productName = SymphonySettingsPlugin;
productReference = 3A10EBCF1ED4336D0083702F /* SymphonySettingsPlugin.bundle */;
productType = "com.apple.product-type.bundle";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
3A10EBC71ED4336D0083702F /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1100;
ORGANIZATIONNAME = Symphony;
TargetAttributes = {
3A10EBCE1ED4336D0083702F = {
CreatedOnToolsVersion = 8.3.2;
DevelopmentTeam = 7S74264P3V;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 3A10EBCA1ED4336D0083702F /* Build configuration list for PBXProject "SymphonySettingsPlugin" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 3A10EBC61ED4336D0083702F;
productRefGroup = 3A10EBD01ED4336D0083702F /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
3A10EBCE1ED4336D0083702F /* SymphonySettingsPlugin */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
3A10EBCD1ED4336D0083702F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
3A10EBD71ED4336D0083702F /* MyInstallerPane.xib in Resources */,
3A10EBE01ED4336D0083702F /* InfoPlist.strings in Resources */,
3A10EBDA1ED4336D0083702F /* Localizable.strings in Resources */,
3A10EBDC1ED4336D0083702F /* InstallerSections.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
3A10EBCB1ED4336D0083702F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
3A10EBD41ED4336D0083702F /* MyInstallerPane.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
3A10EBD51ED4336D0083702F /* MyInstallerPane.xib */ = {
isa = PBXVariantGroup;
children = (
3A10EBD61ED4336D0083702F /* Base */,
);
name = MyInstallerPane.xib;
sourceTree = "<group>";
};
3A10EBD81ED4336D0083702F /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
3A10EBD91ED4336D0083702F /* en */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
3A10EBDE1ED4336D0083702F /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
3A10EBDF1ED4336D0083702F /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
3A10EBE11ED4336D0083702F /* 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";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
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.10;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
};
name = Debug;
};
3A10EBE21ED4336D0083702F /* Release */ = {
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";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
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.10;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
};
name = Release;
};
3A10EBE41ED4336D0083702F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "Apple Development";
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = 7S74264P3V;
INFOPLIST_FILE = SymphonySettingsPlugin/Info.plist;
INSTALL_PATH = "$(HOME)/Library/Bundles";
MACOSX_DEPLOYMENT_TARGET = 10.10;
PRODUCT_BUNDLE_IDENTIFIER = com.symphony.SymphonySettingsPlugin;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
WRAPPER_EXTENSION = bundle;
};
name = Debug;
};
3A10EBE51ED4336D0083702F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "Apple Development";
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = 7S74264P3V;
INFOPLIST_FILE = SymphonySettingsPlugin/Info.plist;
INSTALL_PATH = "$(HOME)/Library/Bundles";
MACOSX_DEPLOYMENT_TARGET = 10.10;
PRODUCT_BUNDLE_IDENTIFIER = com.symphony.SymphonySettingsPlugin;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
WRAPPER_EXTENSION = bundle;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
3A10EBCA1ED4336D0083702F /* Build configuration list for PBXProject "SymphonySettingsPlugin" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3A10EBE11ED4336D0083702F /* Debug */,
3A10EBE21ED4336D0083702F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
3A10EBE31ED4336D0083702F /* Build configuration list for PBXNativeTarget "SymphonySettingsPlugin" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3A10EBE41ED4336D0083702F /* Debug */,
3A10EBE51ED4336D0083702F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 3A10EBC71ED4336D0083702F /* Project object */;
}

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:SymphonySettingsPlugin.xcodeproj">
</FileRef>
</Workspace>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1100"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "3A10EBCE1ED4336D0083702F"
BuildableName = "SymphonySettingsPlugin.bundle"
BlueprintName = "SymphonySettingsPlugin"
ReferencedContainer = "container:SymphonySettingsPlugin.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "3A10EBCE1ED4336D0083702F"
BuildableName = "SymphonySettingsPlugin.bundle"
BlueprintName = "SymphonySettingsPlugin"
ReferencedContainer = "container:SymphonySettingsPlugin.xcodeproj">
</BuildableReference>
</MacroExpansion>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "3A10EBCE1ED4336D0083702F"
BuildableName = "SymphonySettingsPlugin.bundle"
BlueprintName = "SymphonySettingsPlugin"
ReferencedContainer = "container:SymphonySettingsPlugin.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Run - Debug.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>SymphonySettingsPlugin.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>3A10EBCE1ED4336D0083702F</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View File

@ -1,427 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="InstallerSection">
<connections>
<outlet property="firstPane" destination="Qsn-FY-4qK" id="Dhh-1H-QYh"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Qsn-FY-4qK" customClass="MyInstallerPane">
<connections>
<outlet property="alwaysOnTopCheckBox" destination="xJR-Fr-mRt" id="WhA-p1-kga"/>
<outlet property="autoLaunchCheckBox" destination="Zqh-0e-vtD" id="ETW-F7-I4U"/>
<outlet property="bringToFrontCheckBox" destination="2Me-7N-GvD" id="pH5-dt-hyv"/>
<outlet property="contentView" destination="TUK-W2-vig" id="gTd-A7-dof"/>
<outlet property="devToolsCheckBox" destination="TGe-oB-TBf" id="qqn-SW-zAf"/>
<outlet property="fullScreenCheckBox" destination="duA-yQ-iEf" id="0dM-Fa-K6i"/>
<outlet property="geoLocationCheckBox" destination="L6E-73-ezq" id="iLj-hy-quO"/>
<outlet property="mediaCheckBox" destination="B4Z-uk-s4I" id="NOT-XU-pPs"/>
<outlet property="midiSysexCheckBox" destination="EpT-Lf-0g8" id="Ddj-13-1M2"/>
<outlet property="minimizeOnCloseCheckBox" destination="pJv-Z5-S8c" id="hy7-4l-Y2A"/>
<outlet property="notificationsCheckBox" destination="X7P-UH-q4X" id="2vt-Ew-8lN"/>
<outlet property="openExternalAppCheckBox" destination="5NZ-5a-PIB" id="Abc-i1-mRt"/>
<outlet property="parentSection" destination="-2" id="FB7-UV-e8k"/>
<outlet property="podUrlAlertTextBox" destination="lha-ib-BpX" id="2Hp-DE-0mS"/>
<outlet property="podUrlTextBox" destination="bt3-SN-uKp" id="rpG-WU-oG1"/>
<outlet property="pointerLockCheckBox" destination="AuA-RI-UYn" id="6i4-GB-w1Z"/>
<outlet property="pointerLockCheckbox" destination="AuA-RI-UYn" id="3FH-1x-REu"/>
<outlet property="ssoCheckBox" destination="YPX-1k-Fs4" id="laJ-aN-s7A"/>
</connections>
</customObject>
<customView id="TUK-W2-vig" userLabel="View">
<rect key="frame" x="0.0" y="0.0" width="445" height="365"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<tabView toolTip="Pod Settings" fixedFrame="YES" drawsBackground="NO" allowsTruncatedLabels="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QyG-6U-OmT">
<rect key="frame" x="-7" y="-10" width="459" height="381"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<font key="font" metaFont="system"/>
<tabViewItems>
<tabViewItem label="Settings" identifier="" id="bcH-AH-92V">
<view key="view" ambiguous="YES" id="ltw-L5-z8g">
<rect key="frame" x="10" y="33" width="439" height="335"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bt3-SN-uKp">
<rect key="frame" x="152" y="278" width="201" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" title="https://[POD].symphony.com" drawsBackground="YES" usesSingleLineMode="YES" id="4WS-yY-IPf">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hdX-B9-o0w">
<rect key="frame" x="15" y="281" width="131" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Symphony Pod URL" id="R21-b3-R67">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="lRj-wz-i1m">
<rect key="frame" x="244" y="222" width="122" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Minimize on Close" id="VXX-cj-1fp">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pJv-Z5-S8c">
<rect key="frame" x="244" y="152" width="79" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Wks-ms-Dds">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Oc1-Dm-yfg">
<rect key="frame" x="244" y="114" width="93" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Bring to Front" id="nNz-Ll-NWY">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2Me-7N-GvD">
<rect key="frame" x="244" y="45" width="79" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" inset="2" id="xdK-SE-fCI">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="INy-Sf-8qZ">
<rect key="frame" x="15" y="221" width="124" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Launch on Startup" id="m0Q-sb-lur">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Zqh-0e-vtD">
<rect key="frame" x="15" y="152" width="79" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="961-eU-jAZ">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1Xi-cm-l1K">
<rect key="frame" x="244" y="185" width="175" height="28"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Minimize Symphony when closed" id="YlU-cU-Dpo">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4up-16-Exw">
<rect key="frame" x="15" y="185" width="175" height="28"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Launch Symphony when computer starts" id="Gdo-1v-GBn">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="mch-Fi-uVp">
<rect key="frame" x="244" y="78" width="175" height="28"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Bring Symphony to front when message is received" id="eaz-Rv-tsn">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Wzo-bc-Yl0">
<rect key="frame" x="15" y="114" width="99" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Always on Top" id="hAT-ho-9sn">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="KDh-Sm-XR0">
<rect key="frame" x="15" y="77" width="175" height="28"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Keep Symphony on top of other applications" id="hun-gL-63Y">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xJR-Fr-mRt">
<rect key="frame" x="15" y="44" width="79" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" inset="2" id="9CK-aX-XOH">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField verticalHuggingPriority="750" fixedFrame="YES" allowsExpansionToolTips="YES" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lha-ib-BpX">
<rect key="frame" x="150" y="247" width="274" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" state="on" id="BfU-TS-qd2">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="systemRedColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="YPX-1k-Fs4">
<rect key="frame" x="359" y="279" width="49" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="SSO" bezelStyle="regularSquare" imagePosition="left" inset="2" id="dgn-Hd-UcT">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="handleSSOCheckboxStateChange:" target="Qsn-FY-4qK" id="LyC-VX-uCH"/>
</connections>
</button>
</subviews>
</view>
</tabViewItem>
<tabViewItem label="Permissions" identifier="" id="Tgb-j9-73A">
<view key="view" id="50f-DH-wx7">
<rect key="frame" x="10" y="33" width="439" height="335"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="lmJ-xu-7sT">
<rect key="frame" x="17" y="301" width="101" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Media" id="dGH-H5-EpA">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="B4Z-uk-s4I">
<rect key="frame" x="17" y="238" width="69" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="TkH-Ca-6a3">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8ma-2K-tuH">
<rect key="frame" x="17" y="261" width="126" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Access to Camera, Audio, Microphone" id="OYI-4m-8XD">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="x9w-2S-xbk">
<rect key="frame" x="17" y="203" width="88" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Notifications" id="Lyz-nb-hmB">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="X7P-UH-q4X">
<rect key="frame" x="17" y="140" width="69" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="ubi-Bn-kql">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qTp-QP-l7r">
<rect key="frame" x="17" y="163" width="126" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Chrome Native Notifications" id="vHI-Mt-ZV2">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="V1I-f0-O6n">
<rect key="frame" x="17" y="105" width="101" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Geo Location" id="ckp-zw-fJC">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ogb-gv-9Wz">
<rect key="frame" x="17" y="65" width="126" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Symphony Accessing user location" id="wAZ-do-onR">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="L6E-73-ezq">
<rect key="frame" x="17" y="35" width="69" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Vzz-Is-k3v">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6L4-kr-but">
<rect key="frame" x="159" y="301" width="101" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Pointer Lock" id="H1v-Lk-USy">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AuA-RI-UYn">
<rect key="frame" x="159" y="238" width="69" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="2Qa-wv-TEa">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4eD-lV-xNb">
<rect key="frame" x="159" y="261" width="126" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Locking a pointer in Symphony context" id="b6W-z1-jFL">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="7yg-Fe-7yk">
<rect key="frame" x="159" y="203" width="101" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Full Screen" id="NFT-4J-chs">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="duA-yQ-iEf">
<rect key="frame" x="159" y="140" width="69" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="gFe-lr-eb0">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jz5-3O-sm5">
<rect key="frame" x="159" y="163" width="126" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Accessing full screen in Symphony context" id="UC5-bq-a56">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="I1n-yg-bzf">
<rect key="frame" x="159" y="105" width="126" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Open External App" id="Wew-Lc-ypX">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hYH-Vt-anY">
<rect key="frame" x="159" y="65" width="126" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Opening External app from Symphony" id="HnH-UO-NrW">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5NZ-5a-PIB">
<rect key="frame" x="159" y="35" width="69" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="GbH-xy-gh2">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZsT-ns-fQ1">
<rect key="frame" x="298" y="301" width="70" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="MidiSysex" id="Sgj-S7-tne">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EpT-Lf-0g8">
<rect key="frame" x="298" y="238" width="69" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="aSo-6F-oCF">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CB1-IS-bIc">
<rect key="frame" x="298" y="261" width="126" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Access to external connected devices" id="r4B-Jw-Y03">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</view>
</tabViewItem>
<tabViewItem label="Security" identifier="" id="vrn-fr-Dgw" userLabel="Security">
<view key="view" id="m10-37-sFo">
<rect key="frame" x="10" y="33" width="439" height="335"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gme-WH-3ls">
<rect key="frame" x="15" y="284" width="114" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Enable Dev Tools" id="UlB-kZ-FRf">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="TGe-oB-TBf">
<rect key="frame" x="15" y="215" width="79" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="ftT-x5-nva">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ggB-Ig-gRa">
<rect key="frame" x="15" y="248" width="112" height="28"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Enable dev tools for troubleshooting" id="XrC-xT-jAS">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</view>
</tabViewItem>
</tabViewItems>
</tabView>
</subviews>
<point key="canvasLocation" x="152.5" y="186.5"/>
</customView>
</objects>
</document>

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>4.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>InstallerSectionTitle</key>
<string>Pod Settings</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2017 Symphony. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MyInstallerPane</string>
<key>NSPrincipalClass</key>
<string>InstallerSection</string>
</dict>
</plist>

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SectionOrder</key>
<array>
<string>Introduction</string>
<string>ReadMe</string>
<string>License</string>
<string>SymphonySettingsPlugin.bundle</string>
<string>Target</string>
<string>PackageSelection</string>
<string>Install</string>
</array>
</dict>
</plist>

View File

@ -1,31 +0,0 @@
//
// MyInstallerPane.h
// SymphonySettingsPlugin
//
// Copyright © 2017 Symphony. All rights reserved.
//
#import <InstallerPlugins/InstallerPlugins.h>
@interface MyInstallerPane : InstallerPane<NSTextFieldDelegate>
@property (weak) IBOutlet NSButton *minimizeOnCloseCheckBox;
@property (weak) IBOutlet NSButton *autoLaunchCheckBox;
@property (weak) IBOutlet NSTextField *podUrlTextBox;
@property (weak) IBOutlet NSButton *alwaysOnTopCheckBox;
@property (weak) IBOutlet NSTextField *podUrlAlertTextBox;
@property (weak) IBOutlet NSButton *bringToFrontCheckBox;
@property (weak) IBOutlet NSButton *devToolsCheckBox;
@property (weak) IBOutlet NSButton *mediaCheckBox;
@property (weak) IBOutlet NSButton *geoLocationCheckBox;
@property (weak) IBOutlet NSButton *notificationsCheckBox;
@property (weak) IBOutlet NSButton *pointerLockCheckBox;
@property (weak) IBOutlet NSButton *fullScreenCheckBox;
@property (weak) IBOutlet NSButton *openExternalAppCheckBox;
@property (weak) IBOutlet NSButton *midiSysexCheckBox;
@property (weak) IBOutlet NSButton *ssoCheckBox;
@end

View File

@ -1,193 +0,0 @@
//
// MyInstallerPane.m
// SymphonySettingsPlugin
//
// Copyright © 2017 Symphony. All rights reserved.
//
#import "MyInstallerPane.h"
@implementation MyInstallerPane
- (NSString *)title
{
return [[NSBundle bundleForClass:[self class]] localizedStringForKey:@"PaneTitle" value:nil table:nil];
}
- (void)willEnterPane:(InstallerSectionDirection)dir {
// By default, set the value of the error message textbox to an empty string
_podUrlAlertTextBox.stringValue = @"";
[_podUrlTextBox setToolTip:@"Enter pod url in the format \"https://corporate.symphony.com\""];
[_ssoCheckBox setToolTip:@"Only check this option if your Symphony POD has been configured for SSO, in doubt do not check - contact your Symphony Admin"];
}
- (BOOL)shouldExitPane:(InstallerSectionDirection)dir {
NSString *podUrl = [_podUrlTextBox stringValue];
// Now, validate the url against a url regex
NSString *regex = @"^(https:\\/\\/)?(www.)?[a-zA-Z0-9]+([\\-\\.]{1}[a-zA-Z0-9]+)*\\.[a-zA-Z]{2,}(:[0-9]{1,5})?(\\/[a-zA-Z0-9-_.+!*'(),;\\/?:@=&$]*)?$";
NSPredicate *podUrlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if (![podUrlTest evaluateWithObject:podUrl]) {
_podUrlAlertTextBox.stringValue = @"Please enter a valid Pod url.";
return NO;
}
if ([podUrl rangeOfString:@"[POD]"].location != NSNotFound) {
_podUrlAlertTextBox.stringValue = @"Please enter a valid Pod url.";
return NO;
}
// Double confirmation for disabling media
if ([_mediaCheckBox state] == 0) {
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText: @"Are you sure you wish to disable the camera, microphone, and speakers?"];
[alert setInformativeText:@"Once disabled, users won't be able to participate in RTC calls effectively"];
[alert addButtonWithTitle:@"No"];
[alert addButtonWithTitle:@"Yes"];
[alert setAlertStyle:NSWarningAlertStyle];
NSInteger button = [alert runModal];
if (button == NSAlertFirstButtonReturn) {
return NO;
}
return YES;
}
return YES;
}
- (void)willExitPane:(InstallerSectionDirection)dir {
[self writeSettingsToFile];
[self writePermissionsToFile];
}
- (void)writeSettingsToFile {
NSString *podUrl = [_podUrlTextBox stringValue];
NSString *securePrefix = @"https://";
if (![podUrl hasPrefix:securePrefix]) {
podUrl = [securePrefix stringByAppendingString:podUrl];
[_podUrlTextBox setStringValue:podUrl];
}
// By default, set autoLaunchOnStart and minimizeOnClose to true
NSString *autoLaunchOnStart = @"true";
NSString *minimizeOnClose = @"true";
NSString *alwaysOnTop = @"false";
NSString *bringToFront = @"false";
NSString *devToolsEnabled = @"true\n";
// If the checkbox is changed, set the auto launch value accordingly
if ([_autoLaunchCheckBox state] == 0) {
autoLaunchOnStart = @"false";
}
// If the checkbox is changed, set the minimize on close value accordingly
if ([_minimizeOnCloseCheckBox state] == 0) {
minimizeOnClose = @"false";
}
// If the checkbox is changed, set the always on top value accordingly
if ([_alwaysOnTopCheckBox state] == 1) {
alwaysOnTop = @"true";
}
// If the checkbox is changed, set the bring to front value accordingly
if ([_bringToFrontCheckBox state] == 1) {
bringToFront = @"true";
}
// If the checkbox is changed, set the dev tools enabled value accordingly
if ([_devToolsCheckBox state] == 0) {
devToolsEnabled = @"false\n";
}
// Create an array with the selected options
NSArray *symSettings = [[NSArray alloc] initWithObjects:podUrl, minimizeOnClose, autoLaunchOnStart, alwaysOnTop, bringToFront, devToolsEnabled, nil];
// Create a string from the array with new-line as the separator
NSString *symSettingsString = [symSettings componentsJoinedByString:@"\n"];
// Write all the above settings to file
[symSettingsString writeToFile:@"/tmp/sym_settings.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
- (void)writePermissionsToFile {
// By default, set all the values to true
NSString *media = @"true";
NSString *geoLocation = @"true";
NSString *notifications = @"true";
NSString *pointerLock = @"true";
NSString *fullScreen = @"true";
NSString *openExternalApp = @"true";
NSString *midiSysex = @"true";
if ([_mediaCheckBox state] == 0) {
media = @"false";
}
if ([_geoLocationCheckBox state] == 0) {
geoLocation = @"false";
}
if ([_notificationsCheckBox state] == 0) {
notifications = @"false";
}
if ([_pointerLockCheckBox state] == 0) {
pointerLock = @"false";
}
if ([_fullScreenCheckBox state] == 0) {
fullScreen = @"false";
}
if ([_openExternalAppCheckBox state] == 0) {
openExternalApp = @"false";
}
if ([_midiSysexCheckBox state] == 0) {
midiSysex = @"false";
}
// Create an array with the selected options
NSArray *symPermissions = [[NSArray alloc] initWithObjects:media, geoLocation, notifications, midiSysex, pointerLock, fullScreen, openExternalApp, nil];
// Create a string from the array with new-line as the separator
NSString *symPermissionsString = [symPermissions componentsJoinedByString:@"\n"];
// Write all the above settings to file
[symPermissionsString writeToFile:@"/tmp/sym_permissions.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
- (IBAction)handleSSOCheckboxStateChange:(id)sender {
NSString *podUrl = [_podUrlTextBox stringValue];
NSString *ssoUrl = @"/login/sso/initsso";
if ([_ssoCheckBox state] == 1) {
podUrl = [podUrl stringByAppendingString:ssoUrl];
[_podUrlTextBox setStringValue:podUrl];
} else {
podUrl = [podUrl substringToIndex:podUrl.length - ssoUrl.length];
[_podUrlTextBox setStringValue:podUrl];
}
}
@end

View File

@ -1,2 +0,0 @@
InstallerSectionTitle = "Pod Settings";

View File

@ -1,3 +0,0 @@
/* Localized versions of Info.plist keys */
"PaneTitle" = "Pod Settings";

View File

@ -15,22 +15,13 @@ always_on_top=$(sed -n '4p' ${settingsFilePath});
bring_to_front=$(sed -n '5p' ${settingsFilePath});
dev_tools_enabled=$(sed -n '6p' ${settingsFilePath});
if [ "$pod_url" == "" ]; then
pod_url="https://my.symphony.com"
fi
## If any of the above values turn out to be empty, set default values ##
if [ "$pod_url" == "" ]; then pod_url="https://my.symphony.com"; fi
if [ "$minimize_on_close" == "" ] || [ "$minimize_on_close" == 'true' ]; then minimize_on_close='ENABLED'; else minimize_on_close='DISABLED'; fi
if [ "$launch_on_startup" == "" ] || [ "$launch_on_startup" == 'true' ]; then launch_on_startup='ENABLED'; else launch_on_startup='DISABLED'; fi
if [ "$always_on_top" == "" ] || [ "$always_on_top" == 'false' ]; then always_on_top='DISABLED'; else always_on_top='ENABLED'; fi
if [ "$bring_to_front" == "" ] || [ "$bring_to_front" == 'false' ]; then bring_to_front='DISABLED'; else bring_to_front='ENABLED'; fi
if [ "$dev_tools_enabled" == "" ]; then
dev_tools_enabled=true;
fi
if [ "$dev_tools_enabled" == "" ]; then dev_tools_enabled=true; fi
pod_url_escaped=$(sed 's#[&/\]#\\&#g' <<<"$pod_url")
## Replace the default settings with the user selected settings ##
@ -41,9 +32,6 @@ sed -i "" -E "s#\"launchOnStartup\" ?: ?\"([Ee][Nn][Aa][Bb][Ll][Ee][Dd]|[Dd][Ii]
sed -i "" -E "s#\"bringToFront\" ?: ?\"([Ee][Nn][Aa][Bb][Ll][Ee][Dd]|[Dd][Ii][Ss][Aa][Bb][Ll][Ee][Dd])\"#\"bringToFront\":\ \"$bring_to_front\"#g" ${newPath}
sed -i "" -E "s#\"devToolsEnabled\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"devToolsEnabled\":\ $dev_tools_enabled#g" ${newPath}
## Remove the temp settings file created ##
rm -f ${settingsFilePath}
## Get Symphony Permissions from the temp file ##
media=$(sed -n '1p' ${permissionsFilePath});
geo_location=$(sed -n '2p' ${permissionsFilePath});
@ -53,33 +41,14 @@ pointer_lock=$(sed -n '5p' ${permissionsFilePath});
full_screen=$(sed -n '6p' ${permissionsFilePath});
open_external_app=$(sed -n '7p' ${permissionsFilePath});
if [ "$media" == "" ]; then
media=true;
fi
if [ "$geo_location" == "" ]; then
geo_location=true;
fi
if [ "$notifications" == "" ]; then
notifications=true;
fi
if [ "$midi_sysex" == "" ]; then
midi_sysex=true;
fi
if [ "$pointer_lock" == "" ]; then
pointer_lock=true;
fi
if [ "$full_screen" == "" ]; then
full_screen=true;
fi
if [ "$open_external_app" == "" ]; then
open_external_app=true;
fi
## If any of the above values turn out to be empty, set default values ##
if [ "$media" == "" ]; then media=true; fi
if [ "$geo_location" == "" ]; then geo_location=true; fi
if [ "$notifications" == "" ]; then notifications=true; fi
if [ "$midi_sysex" == "" ]; then midi_sysex=true; fi
if [ "$pointer_lock" == "" ]; then pointer_lock=true;fi
if [ "$full_screen" == "" ]; then full_screen=true; fi
if [ "$open_external_app" == "" ]; then open_external_app=true; fi
## Replace the default permissions with the user selected permissions ##
sed -i "" -E "s#\"media\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"media\":\ $media#g" ${newPath}
@ -90,6 +59,6 @@ sed -i "" -E "s#\"pointerLock\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"po
sed -i "" -E "s#\"fullscreen\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"fullscreen\":\ $full_screen#g" ${newPath}
sed -i "" -E "s#\"openExternal\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"openExternal\":\ $open_external_app#g" ${newPath}
## Remove the temp permissions file created ##
## Remove the temp settings & permissions file created ##
rm -f ${settingsFilePath}
rm -f ${permissionsFilePath}

View File

@ -494,7 +494,7 @@
<key>FOLLOW_SYMBOLIC_LINKS</key>
<false/>
<key>IDENTIFIER</key>
<string>com.symphony.symphony-desktop</string>
<string>com.symphony.electron-desktop</string>
<key>LOCATION</key>
<integer>0</integer>
<key>NAME</key>
@ -510,7 +510,7 @@
<key>USE_HFS+_COMPRESSION</key>
<false/>
<key>VERSION</key>
<string>2.0.0</string>
<string>8.0.0</string>
</dict>
<key>TYPE</key>
<integer>0</integer>
@ -661,17 +661,6 @@
<key>LIST_TITLE_KEY</key>
<string>InstallerSectionTitle</string>
</dict>
<dict>
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
<string>ICPresentationViewInstallerPluginController</string>
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_INSTALLERPLUGIN_PATH</key>
<dict>
<key>PATH</key>
<string>SymphonySettingsPlugin.bundle</string>
<key>PATH_TYPE</key>
<integer>1</integer>
</dict>
</dict>
<dict>
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
<string>ICPresentationViewDestinationSelectController</string>
@ -715,9 +704,9 @@
<key>VALUE</key>
<dict>
<key>PATH</key>
<string>intro.html</string>
<string>/Users/vishwas/Code/symphony/SymphonyElectron/installer/mac/intro.html</string>
<key>PATH_TYPE</key>
<integer>3</integer>
<integer>1</integer>
</dict>
</dict>
</array>
@ -766,7 +755,7 @@
<key>IC_REQUIREMENT_OS_DISTRIBUTION_TYPE</key>
<integer>0</integer>
<key>IC_REQUIREMENT_OS_MINIMUM_VERSION</key>
<integer>100700</integer>
<integer>100900</integer>
</dict>
<key>IC_REQUIREMENT_CHECK_TYPE</key>
<integer>1</integer>
@ -781,11 +770,11 @@
</dict>
<dict>
<key>BEHAVIOR</key>
<integer>3</integer>
<integer>2</integer>
<key>DICTIONARY</key>
<dict>
<key>IC_REQUIREMENT_RAM_MINIMUM_SIZE_INDEX</key>
<integer>5</integer>
<integer>6</integer>
</dict>
<key>IC_REQUIREMENT_CHECK_TYPE</key>
<integer>0</integer>
@ -800,7 +789,7 @@
</dict>
<dict>
<key>BEHAVIOR</key>
<integer>3</integer>
<integer>2</integer>
<key>DICTIONARY</key>
<dict>
<key>IC_REQUIREMENT_CPU_ARCHITECTURE_FAMILY</key>
@ -810,7 +799,7 @@
<key>IC_REQUIREMENT_CPU_MINIMUM_CPU_CORES_COUNT</key>
<integer>1</integer>
<key>IC_REQUIREMENT_CPU_MINIMUM_FREQUENCY</key>
<integer>0</integer>
<integer>2000000</integer>
<key>IC_REQUIREMENT_CPU_POWERPC_ARCHITECTURE_TYPE</key>
<integer>0</integer>
</dict>

8
package-lock.json generated
View File

@ -17739,16 +17739,16 @@
}
},
"screen-share-indicator-frame": {
"version": "1.4.4",
"resolved": "git+https://github.com/symphonyoss/ScreenShareIndicatorFrame.git#e389ca1e037d174de4b5facb69e435c32c74db76",
"version": "1.4.6",
"resolved": "git+https://github.com/symphonyoss/ScreenShareIndicatorFrame.git#32472243f7c840c6f1310fde56b5498598eeb0a8",
"optional": true,
"requires": {
"run-script-os": "1.0.7"
}
},
"screen-snippet": {
"version": "1.0.6",
"resolved": "git+https://github.com/symphonyoss/ScreenSnippet2.git#c493f35831d7bf2a8164945f83c2669781dde3a7",
"version": "1.0.7",
"resolved": "git+https://github.com/symphonyoss/ScreenSnippet2.git#de0b90b92113b866cbc30a1c0a5f3c8fc0f6a418",
"optional": true
},
"semver": {

View File

@ -75,8 +75,7 @@
"library/indexvalidator.exec",
"library/libsymphonysearch.dylib",
"library/cryptoLib.dylib",
"library/dictionary",
"installer/mac/SymphonySettingsPlugin.bundle/Contents/MacOS/SymphonySettingsPlugin"
"library/dictionary"
]
},
"win": {

View File

@ -86,8 +86,8 @@ echo "Running snyk security tests"
snyk test --file=package.json --org="$SNYK_ORG"
# Replace url in config
echo "Setting default pod url to https://corporate.symphony.com"
sed -i -e 's/\"url\"[[:space:]]*\:[[:space:]]*\".*\"/\"url\":\"https:\/\/corporate.symphony.com\"/g' config/Symphony.config
echo "Setting default pod url to https://my.symphony.com"
sed -i -e 's/\"url\"[[:space:]]*\:[[:space:]]*\".*\"/\"url\":\"https:\/\/my.symphony.com\"/g' config/Symphony.config
# Setup the build version
echo "Setting build version to ${PARENT_BUILD_VERSION}"

View File

@ -0,0 +1,63 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`welcome should render correctly 1`] = `
<div
className="Welcome"
lang="en-US"
>
<div
className="Welcome-image-container"
>
<img
alt="Symphony Logo"
src="../renderer/assets/symphony-logo-plain.png"
/>
</div>
<div
className="Welcome-main-container"
>
<h3
className="Welcome-name"
>
Pod URL
</h3>
<div
className="Welcome-main-container-input-div"
>
<div
className="Welcome-main-container-input-selection"
>
<input
className="Welcome-main-container-podurl-box"
onChange={[Function]}
type="url"
value="https://my.symphony.com"
/>
</div>
<div
className="Welcome-main-container-sso-box"
title="Enable Single Sign On"
>
<label>
<input
checked={false}
onChange={[Function]}
type="checkbox"
/>
SSO
</label>
</div>
</div>
<label
className="Welcome-message-label"
/>
<button
className="Welcome-continue-button"
disabled={false}
onClick={[Function]}
>
Continue
</button>
</div>
</div>
`;

132
spec/welcome.spec.ts Normal file
View File

@ -0,0 +1,132 @@
import { shallow } from 'enzyme';
import * as React from 'react';
import Welcome from '../src/renderer/components/welcome';
import { ipcRenderer } from './__mocks__/electron';
describe('welcome', () => {
const welcomeLabel = 'welcome';
const welcomeMock = {
url: 'https://my.symphony.com',
message: '',
urlValid: true,
sso: false,
};
const onLabelEvent = 'on';
const removeListenerLabelEvent = 'removeListener';
it('should render correctly', () => {
const wrapper = shallow(React.createElement(Welcome));
expect(wrapper).toMatchSnapshot();
});
it('should call `welcome` event when component is mounted', () => {
const spy = jest.spyOn(ipcRenderer, onLabelEvent);
shallow(React.createElement(Welcome));
expect(spy).toBeCalledWith(welcomeLabel, expect.any(Function));
});
it('should remove listener `welcome` when component is unmounted', () => {
const spyMount = jest.spyOn(ipcRenderer, onLabelEvent);
const spyUnmount = jest.spyOn(ipcRenderer, removeListenerLabelEvent);
const wrapper = shallow(React.createElement(Welcome));
expect(spyMount).toBeCalledWith(welcomeLabel, expect.any(Function));
wrapper.unmount();
expect(spyUnmount).toBeCalledWith(welcomeLabel, expect.any(Function));
});
it('should call `updateState` when component is mounted', () => {
const spy = jest.spyOn(Welcome.prototype, 'setState');
shallow(React.createElement(Welcome));
ipcRenderer.send('welcome', welcomeMock);
expect(spy).toBeCalledWith(welcomeMock);
});
it('should change pod url in text box', () => {
const podUrlMock = {
url: 'https://corporate.symphony.com',
message: '',
urlValid: true,
sso: false,
};
const spy = jest.spyOn(Welcome.prototype, 'setState');
const updatePodUrlSpy = jest.spyOn(Welcome.prototype, 'updatePodUrl');
const wrapper = shallow(React.createElement(Welcome));
ipcRenderer.send('welcome', welcomeMock);
const welcomePodUrlBox = `input.Welcome-main-container-podurl-box`;
const input = wrapper.find(welcomePodUrlBox);
input.simulate('focus');
input.simulate('change', {target: {value: 'https://corporate.symphony.com'}});
expect(updatePodUrlSpy).toBeCalled();
expect(spy).toBeCalledWith(podUrlMock);
});
it('should show message for invalid pod url', () => {
const podUrlMock = {
url: 'abcdef',
message: 'Please enter a valid url',
urlValid: false,
sso: false,
};
const spy = jest.spyOn(Welcome.prototype, 'setState');
const updatePodUrlSpy = jest.spyOn(Welcome.prototype, 'updatePodUrl');
const wrapper = shallow(React.createElement(Welcome));
ipcRenderer.send('welcome', welcomeMock);
const welcomePodUrlBox = `input.Welcome-main-container-podurl-box`;
const input = wrapper.find(welcomePodUrlBox);
input.simulate('focus');
input.simulate('change', {target: {value: 'abcdef'}});
expect(updatePodUrlSpy).toBeCalled();
expect(spy).toBeCalledWith(podUrlMock);
});
it('should click sso checkbox', () => {
const podUrlMock = {
url: 'https://my.symphony.com',
message: '',
urlValid: true,
sso: true,
};
const spy = jest.spyOn(Welcome.prototype, 'setState');
const updatePodUrlSpy = jest.spyOn(Welcome.prototype, 'updateSsoCheckbox');
const wrapper = shallow(React.createElement(Welcome));
ipcRenderer.send('welcome', welcomeMock);
const welcomePodUrlBox = `input[type="checkbox"]`;
const input = wrapper.find(welcomePodUrlBox);
input.simulate('focus');
input.simulate('change', {target: {checked: true}});
expect(updatePodUrlSpy).toBeCalled();
expect(spy).toBeCalledWith(podUrlMock);
});
it('should set pod url', () => {
const spy = jest.spyOn(Welcome.prototype, 'setState');
const setPodUrlSpy = jest.spyOn(Welcome.prototype, 'setPodUrl');
const wrapper = shallow(React.createElement(Welcome));
ipcRenderer.send('welcome', welcomeMock);
const welcomeContinueButton = `button.Welcome-continue-button`;
wrapper.find(welcomeContinueButton).simulate('click');
expect(setPodUrlSpy).toBeCalled();
expect(spy).toBeCalledWith(welcomeMock);
});
});

View File

@ -22,12 +22,8 @@ export enum ClientSwitchType {
CLIENT_2_0_DAILY = 'CLIENT_2_0_DAILY',
}
export interface IGlobalConfig {
url: string;
contextIsolation: boolean;
}
export interface IConfig {
url: string;
minimizeOnClose: CloudConfigDataTypes;
launchOnStartup: CloudConfigDataTypes;
alwaysOnTop: CloudConfigDataTypes;
@ -51,6 +47,11 @@ export interface IConfig {
clientSwitch: ClientSwitchType;
}
export interface IGlobalConfig {
url: string;
contextIsolation: boolean;
}
export interface ICloudConfig {
configVersion?: string;
podLevelEntitlements: IPodLevelEntitlements;
@ -214,13 +215,13 @@ class Config {
* @param data {IConfig}
*/
public async updateUserConfig(data: Partial<IConfig>): Promise<void> {
logger.info(`config-handler: updating user config values with the data`, data);
logger.info(`config-handler: updating user config values with the data`, JSON.stringify(data));
this.userConfig = { ...this.userConfig, ...data };
try {
await writeFile(this.userConfigPath, JSON.stringify(this.userConfig), { encoding: 'utf8' });
logger.info(`config-handler: updated user config values with the data ${data}`);
logger.info(`config-handler: updated user config values with the data ${JSON.stringify(data)}`);
} catch (error) {
logger.error(`config-handler: failed to update user config file with ${data}`, error);
logger.error(`config-handler: failed to update user config file with ${JSON.stringify(data)}`, error);
dialog.showErrorBox(`Update failed`, `Failed to update user config due to error: ${error}`);
}
}
@ -323,7 +324,8 @@ class Config {
await app.whenReady();
await this.readGlobalConfig();
logger.info(`config-handler: user config doesn't exist! will create new one and update config`);
await this.updateUserConfig({ configVersion: app.getVersion().toString(), buildNumber, ...this.globalConfig } as IConfig);
const { url, ...rest } = this.globalConfig as IConfig;
await this.updateUserConfig({ configVersion: app.getVersion().toString(), buildNumber, ...rest } as IConfig);
}
this.userConfig = this.parseConfigData(fs.readFileSync(this.userConfigPath, 'utf8'));
logger.info(`config-handler: User configuration: `, this.userConfig);

View File

@ -51,8 +51,8 @@ export interface ICustomBrowserWindow extends Electron.BrowserWindow {
}
// Default window width & height
const DEFAULT_WIDTH: number = 900;
const DEFAULT_HEIGHT: number = 900;
let DEFAULT_WIDTH: number = 900;
let DEFAULT_HEIGHT: number = 900;
export class WindowHandler {
@ -88,10 +88,12 @@ export class WindowHandler {
private readonly backgroundThrottling: boolean;
private readonly windowOpts: ICustomBrowserWindowConstructorOpts;
private readonly globalConfig: IGlobalConfig;
private readonly userConfig: IConfig;
private readonly config: IConfig;
// Window reference
private readonly windows: object;
private shouldShowWelcomeScreen: boolean = false;
private loadFailError: string | undefined;
private mainWindow: ICustomBrowserWindow | null = null;
private aboutAppWindow: Electron.BrowserWindow | null = null;
@ -105,13 +107,15 @@ export class WindowHandler {
// Use these variables only on initial setup
this.config = config.getConfigFields([ 'isCustomTitleBar', 'mainWinPos', 'minimizeOnClose', 'notificationSettings', 'alwaysOnTop', 'locale', 'customFlags', 'clientSwitch' ]);
logger.info(`window-handler: main windows initialized with following config data`, this.config);
this.globalConfig = config.getGlobalConfigFields([ 'url', 'contextIsolation' ]);
const { disableThrottling } = config.getCloudConfigFields([ 'disableThrottling' ]) as any;
const { url, contextIsolation }: IGlobalConfig = this.globalConfig;
this.userConfig = config.getUserConfigFields([ 'url' ]);
const { customFlags } = this.config;
const { disableThrottling } = config.getCloudConfigFields([ 'disableThrottling' ]) as any;
this.windows = {};
this.contextIsolation = contextIsolation || false;
this.contextIsolation = this.globalConfig.contextIsolation || false;
this.backgroundThrottling = (customFlags.disableThrottling !== CloudConfigDataTypes.ENABLED || disableThrottling !== CloudConfigDataTypes.ENABLED);
this.isCustomTitleBar = isWindowsOS && this.config.isCustomTitleBar === CloudConfigDataTypes.ENABLED;
this.windowOpts = {
@ -146,7 +150,7 @@ export class WindowHandler {
i18n.setLocale(locale);
try {
const extra = {podUrl: url, process: 'main'};
const extra = {podUrl: this.userConfig.url ? this.userConfig.url : this.globalConfig.url, process: 'main'};
const defaultOpts = {uploadToServer: false, companyName: 'Symphony', submitURL: ''};
crashReporter.start({...defaultOpts, extra});
} catch (e) {
@ -160,12 +164,28 @@ export class WindowHandler {
*/
public async createApplication() {
this.updateVersionInfo();
await this.updateVersionInfo();
this.spellchecker = new SpellChecker();
logger.info(`window-handler: initialized spellchecker module with locale ${this.spellchecker.locale}`);
logger.info('window-handler: createApplication mainWinPos: ' + JSON.stringify(this.config.mainWinPos));
let {isFullScreen, isMaximized} = this.config.mainWinPos ? this.config.mainWinPos : {isFullScreen: false, isMaximized: false};
this.url = WindowHandler.getValidUrl(this.userConfig.url ? this.userConfig.url : this.globalConfig.url);
logger.info(`window-handler: setting url ${this.url} from config file!`);
if (this.globalConfig.url.startsWith('https://my.symphony.com') && !this.userConfig.url) {
this.shouldShowWelcomeScreen = true;
isMaximized = false;
isFullScreen = false;
DEFAULT_HEIGHT = 333;
DEFAULT_WIDTH = 542;
this.windowOpts.resizable = false;
this.windowOpts.maximizable = false;
this.windowOpts.fullscreenable = false;
}
// set window opts with additional config
this.mainWindow = new BrowserWindow({
...this.windowOpts, ...getBounds(this.config.mainWinPos, DEFAULT_WIDTH, DEFAULT_HEIGHT),
@ -180,31 +200,6 @@ export class WindowHandler {
logger.info('window-handler: this.mainWindow.getBounds: ' + JSON.stringify(this.mainWindow.getBounds()));
this.mainWindow.winName = apiName.mainWindowName;
const {isFullScreen, isMaximized} = this.config.mainWinPos ? this.config.mainWinPos : {isFullScreen: false, isMaximized: false};
if (isMaximized) {
this.mainWindow.maximize();
logger.info(`window-handler: window is maximized!`);
}
if (isFullScreen) {
logger.info(`window-handler: window is in full screen!`);
this.mainWindow.setFullScreen(true);
}
// Event needed to hide native menu bar on Windows 10 as we use custom menu bar
this.mainWindow.webContents.once('did-start-loading', () => {
logger.info(`window-handler: main window web contents started loading!`);
if ((this.config.isCustomTitleBar === CloudConfigDataTypes.ENABLED && isWindowsOS) && this.mainWindow && windowExists(this.mainWindow)) {
this.mainWindow.setMenuBarVisibility(false);
}
// monitors network connection and
// displays error banner on failure
monitorNetworkInterception();
});
this.url = WindowHandler.getValidUrl(this.globalConfig.url);
logger.info(`window-handler: setting url ${this.url} from config file!`);
// Get url to load from cmd line or from global config file
const urlFromCmd = getCommandLineArgs(process.argv, '--url=', false);
@ -219,22 +214,59 @@ export class WindowHandler {
logger.info(`window-handler: url from command line is whitelisted in the config file.`);
logger.info(`window-handler: setting ${commandLineUrl} from the command line as the main window url.`);
this.url = commandLineUrl;
this.shouldShowWelcomeScreen = false;
isMaximized = true;
isFullScreen = false;
this.mainWindow.resizable = true;
this.mainWindow.maximizable = true;
this.mainWindow.fullScreenable = true;
} else {
logger.info(`window-handler: url ${commandLineUrl} from command line is NOT WHITELISTED in the config file.`);
}
} else {
logger.info(`window-handler: setting ${commandLineUrl} from the command line as the main window url since pod whitelist is empty.`);
this.url = commandLineUrl;
this.shouldShowWelcomeScreen = false;
isMaximized = true;
isFullScreen = false;
this.mainWindow.resizable = true;
this.mainWindow.maximizable = true;
this.mainWindow.fullScreenable = true;
}
}
if (isMaximized) {
this.mainWindow.maximize();
logger.info(`window-handler: window is maximized!`);
}
if (isFullScreen) {
logger.info(`window-handler: window is in full screen!`);
this.mainWindow.setFullScreen(true);
}
this.startUrl = this.url;
if (this.shouldShowWelcomeScreen) {
this.handleWelcomeScreen();
}
// loads the main window with url from config/cmd line
this.mainWindow.loadURL(this.url);
// check for build expiry in case of test builds
this.checkExpiry(this.mainWindow);
// need this for postMessage origin
this.mainWindow.origin = this.globalConfig.url;
// Event needed to hide native menu bar on Windows 10 as we use custom menu bar
this.mainWindow.webContents.once('did-start-loading', () => {
logger.info(`window-handler: main window web contents started loading!`);
if ((this.config.isCustomTitleBar === CloudConfigDataTypes.ENABLED && isWindowsOS) && this.mainWindow && windowExists(this.mainWindow)) {
this.mainWindow.setMenuBarVisibility(false);
}
// monitors network connection and
// displays error banner on failure
monitorNetworkInterception();
});
this.mainWindow.webContents.on('did-finish-load', async () => {
logger.info(`window-handler: main window web contents finished loading!`);
// early exit if the window has already been destroyed
@ -380,6 +412,45 @@ export class WindowHandler {
return this.mainWindow;
}
/**
* Handles the use case of showing
* welcome screen for first time installs
*/
public handleWelcomeScreen() {
if (!this.url || !this.mainWindow) {
return;
}
if (this.url.startsWith('https://my.symphony.com')) {
this.url = format({
pathname: require.resolve('../renderer/react-window.html'),
protocol: 'file',
query: {
componentName: 'welcome',
locale: i18n.getLocale(),
},
slashes: true,
});
}
this.mainWindow.webContents.on('did-finish-load', () => {
if (!this.url || !this.mainWindow) {
return;
}
if (this.url.indexOf('welcome')) {
this.mainWindow.webContents.send('page-load-welcome', { locale: i18n.getLocale(), resource: i18n.loadedResources });
this.mainWindow.webContents.send('welcome', { url: this.startUrl, message: '', urlValid: true, sso: false });
}
});
ipcMain.on('set-pod-url', async (_event, newPodUrl: string) => {
await config.updateUserConfig({url: newPodUrl, mainWinPos: { ...this.mainWindow!.getPosition(), ...{ height: 900, width: 900 } } });
app.relaunch();
app.exit();
});
}
/**
* Gets the main window
*/

View File

@ -195,6 +195,15 @@
"Undo": "Undo",
"Updating Title bar style requires Symphony to relaunch.": "Updating Title bar style requires Symphony to relaunch.",
"View": "View",
"Welcome": {
"Continue": "Continue",
"Enable Single Sign On": "Enable Single Sign On",
"Please enter a valid url": "Please enter a valid url",
"Pod URL": "Pod URL",
"SSO": "SSO",
"Symphony Logo": "Symphony",
"WelcomeText": "Welcome"
},
"Window": "Window",
"Would you like to restart and apply these new settings now?": "Would you like to restart and apply these new settings now?",
"Your administrator has disabled": "Your administrator has disabled",

View File

@ -195,6 +195,15 @@
"Undo": "Undo",
"Updating Title bar style requires Symphony to relaunch.": "Updating Title bar style requires Symphony to relaunch.",
"View": "View",
"Welcome": {
"Continue": "Continue",
"Enable Single Sign On": "Enable Single Sign On",
"Please enter a valid url": "Please enter a valid url",
"Pod URL": "Pod URL",
"SSO": "SSO",
"Symphony Logo": "Symphony",
"WelcomeText": "Welcome"
},
"Window": "Window",
"Would you like to restart and apply these new settings now?": "Would you like to restart and apply these new settings now?",
"Your administrator has disabled": "Your administrator has disabled",

View File

@ -196,6 +196,15 @@
"Undo": "Annuler la dernière opération",
"Updating Title bar style requires Symphony to relaunch.": "La mise à jour du style de la barre de titre nécessite le redémarrage de Symphony.",
"View": "Visualiser",
"Welcome": {
"Continue": "Continuer",
"Enable Single Sign On": "Activer la SSO",
"Please enter a valid url": "Veuillez saisir une URL valide",
"Pod URL": "URL du pod",
"SSO": "SSO",
"Symphony Logo": "Symphony",
"WelcomeText": "Bienvenue"
},
"Window": "Fenêtre",
"Would you like to restart and apply these new settings now?": "Voulez-vous redémarrer et appliquer ce nouveau paramètre maintenant?",
"Your administrator has disabled": "Votre administrateur a désactivé",

View File

@ -195,6 +195,15 @@
"Undo": "Annuler la dernière opération",
"Updating Title bar style requires Symphony to relaunch.": "La mise à jour du style de la barre de titre nécessite le redémarrage de Symphony.",
"View": "Visualiser",
"Welcome": {
"Continue": "Continuer",
"Enable Single Sign On": "Activer la SSO",
"Please enter a valid url": "Veuillez saisir une URL valide",
"Pod URL": "URL du pod",
"SSO": "SSO",
"Symphony Logo": "Symphony",
"WelcomeText": "Bienvenue"
},
"Window": "Fenêtre",
"Would you like to restart and apply these new settings now?": "Voulez-vous redémarrer et appliquer ce nouveau paramètre maintenant?",
"Your administrator has disabled": "Votre administrateur a désactivé",

View File

@ -195,6 +195,15 @@
"Undo": "元に戻す",
"Updating Title bar style requires Symphony to relaunch.": "タイトルバーのスタイルを更新するには、Symphonyが再起動する必要があります。",
"View": "ビュー",
"Welcome": {
"Continue": "持続する",
"Enable Single Sign On": "シングルサインオンを有効にする",
"Please enter a valid url": "有効なURLを入力してください",
"Pod URL": "ポッドURL",
"SSO": "SSO",
"Symphony Logo": "Symphony",
"WelcomeText": "ようこそ"
},
"Window": "ウインドウ",
"Would you like to restart and apply these new settings now?": "今すぐ再起動して、新しい設定を適用しますか?",
"Your administrator has disabled": "管理者によて無効にされています",

View File

@ -195,6 +195,15 @@
"Undo": "元に戻す",
"Updating Title bar style requires Symphony to relaunch.": "タイトルバーのスタイルを更新するには、Symphonyが再起動する必要があります。",
"View": "ビュー",
"Welcome": {
"Continue": "持続する",
"Enable Single Sign On": "シングルサインオンを有効にする",
"Please enter a valid url": "有効なURLを入力してください",
"Pod URL": "ポッドURL",
"SSO": "SSO",
"Symphony Logo": "Symphony",
"WelcomeText": "ようこそ"
},
"Window": "ウインドウ",
"Would you like to restart and apply these new settings now?": "今すぐ再起動して、新しい設定を適用しますか?",
"Your administrator has disabled": "管理者によて無効にされています",

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@ -0,0 +1,141 @@
import { ipcRenderer } from 'electron';
import * as React from 'react';
import { i18n } from '../../common/i18n-preload';
interface IState {
url: string;
message: string;
urlValid: boolean;
sso: boolean;
}
const WELCOME_NAMESPACE = 'Welcome';
export default class Welcome extends React.Component<{}, IState> {
private readonly eventHandlers = {
onSetPodUrl: () => this.setPodUrl(),
};
constructor(props) {
super(props);
this.state = {
url: 'https://my.symphony.com',
message: '',
urlValid: true,
sso: false,
};
this.updateState = this.updateState.bind(this);
}
/**
* Render the component
*/
public render(): JSX.Element {
const { url, message, urlValid, sso } = this.state;
return (
<div className='Welcome' lang={i18n.getLocale()}>
<div className='Welcome-image-container'>
<img
src='../renderer/assets/symphony-logo-plain.png'
alt={i18n.t('Symphony Logo', WELCOME_NAMESPACE)()}
/>
</div>
<div className='Welcome-main-container'>
<h3 className='Welcome-name'>{i18n.t('Pod URL', WELCOME_NAMESPACE)()}</h3>
<div className='Welcome-main-container-input-div'>
<div className='Welcome-main-container-input-selection'>
<input className='Welcome-main-container-podurl-box'
type='url' value={url}
onChange={this.updatePodUrl.bind(this)}>
</input>
</div>
<div className='Welcome-main-container-sso-box'
title={i18n.t('Enable Single Sign On', WELCOME_NAMESPACE)()}>
<label>
<input type='checkbox' checked={sso} onChange={this.updateSsoCheckbox.bind(this)}/>
{i18n.t('SSO', WELCOME_NAMESPACE)()}
</label>
</div>
</div>
<label className='Welcome-message-label'>{message}</label>
<button className={!urlValid ? 'Welcome-continue-button-disabled' : 'Welcome-continue-button'}
disabled={!urlValid}
onClick={this.eventHandlers.onSetPodUrl}>
{i18n.t('Continue', WELCOME_NAMESPACE)()}
</button>
</div>
</div>
);
}
/**
* Perform actions on component being mounted
*/
public componentDidMount(): void {
ipcRenderer.on('welcome', this.updateState);
}
/**
* Perform actions on component being unmounted
*/
public componentWillUnmount(): void {
ipcRenderer.removeListener('welcome', this.updateState);
}
/**
* Set pod url and pass it to the main process
*/
public setPodUrl(): void {
const { url, sso } = this.state;
let ssoPath = '/login/sso/initsso';
if (url.endsWith('/')) {
ssoPath = 'login/sso/initsso';
}
ipcRenderer.send('set-pod-url', sso ? `${url}${ssoPath}` : url);
}
/**
* Update pod url from the text box
* @param _event
*/
public updatePodUrl(_event): void {
const url = _event.target.value;
const match = url.match(/(https?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)/g) != null;
if (!match) {
this.updateState(_event, {
url,
message: i18n.t('Please enter a valid url', WELCOME_NAMESPACE)(),
urlValid: false,
sso: this.state.sso,
});
return;
}
this.updateState(_event, { url, message: '', urlValid: true, sso: this.state.sso });
}
/**
* Update the SSO checkbox
* @param _event Event occurred upon action
* on the checkbox
*/
public updateSsoCheckbox(_event): void {
const ssoCheckBox = _event.target.checked;
this.updateState(_event, {
url: this.state.url,
message: this.state.message,
urlValid: this.state.urlValid,
sso: ssoCheckBox,
});
}
/**
* Update state
* @param _event
* @param data
*/
private updateState(_event, data): void {
this.setState(data as IState);
}
}

View File

@ -10,6 +10,7 @@ import NotificationSettings from './components/notification-settings';
import ScreenPicker from './components/screen-picker';
import ScreenSharingFrame from './components/screen-sharing-frame';
import ScreenSharingIndicator from './components/screen-sharing-indicator';
import Welcome from './components/welcome';
const enum components {
aboutApp = 'about-app',
@ -19,6 +20,7 @@ const enum components {
basicAuth = 'basic-auth',
notification = 'notification-comp',
notificationSettings = 'notification-settings',
welcome = 'welcome',
}
const loadStyle = (style) => {
@ -72,6 +74,11 @@ const load = () => {
loadStyle(components.notificationSettings);
component = NotificationSettings;
break;
case components.welcome:
document.title = i18n.t('WelcomeText', 'Welcome')();
loadStyle(components.welcome);
component = Welcome;
break;
}
const element = React.createElement(component);
ReactDOM.render(element, document.getElementById('Root'));

View File

@ -9,6 +9,7 @@ import DownloadManager from './components/download-manager';
import MessageBanner from './components/message-banner';
import NetworkError from './components/network-error';
import SnackBar from './components/snack-bar';
import Welcome from './components/welcome';
import WindowsTitleBar from './components/windows-title-bar';
import { SSFApi } from './ssf-api';
@ -148,6 +149,20 @@ ipcRenderer.on('page-load', (_event, { locale, resources, enableCustomTitleBar }
banner.showBanner(false, 'error');
});
ipcRenderer.on('page-load-welcome', (_event, data) => {
const { locale, resource } = data;
i18n.setResource(locale, resource);
// Renders component as soon as the page is ready
document.title = i18n.t('WelcomeText', 'Welcome')();
const styles = document.createElement('link');
styles.rel = 'stylesheet';
styles.type = 'text/css';
styles.href = `./styles/welcome.css`;
document.getElementsByTagName('head')[0].appendChild(styles);
const element = React.createElement(Welcome);
ReactDOM.render(element, document.getElementById('Root'));
});
// When the window fails to load
ipcRenderer.on('page-load-failed', (_event, { locale, resources }) => {
i18n.setResource(locale, resources);

View File

@ -0,0 +1,186 @@
@import "theme";
@white: rgb(255, 255, 255, 1);
@version-text-color: rgb(47, 47, 47, 1);
@text-padding: 10px;
body {
background-color: white;
margin: 0;
height: 100%;
width: 100%;
}
.Welcome:lang(ja-JP) {
font-family: @font-family-ja;
h4 {
margin: 3px 0;
}
.Welcome-symphony-section {
padding-left: 10px;
}
}
.Welcome:lang(fr-FR) {
.Welcome-symphony-section {
padding-left: 10px;
}
}
.Welcome {
display: flex;
flex-direction: column;
padding: 10px;
font-family: @font-family;
&-image-container {
text-align: center;
margin: 50px 0 10px;
}
&-image-container img {
width: 200px;
}
&-header-content {
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
}
&-main-container {
padding: 10px 20%;
}
&-main-container-input-div {
display: flex;
align-items: center;
width: 100%;
}
&-main-container-input-selection {
width: 100%;
}
&-main-container-podurl-box {
float: left;
width: 100%;
border-radius: 4px;
border: 1px solid #000;
padding: 5px;
max-width: -webkit-fill-available;
}
&-main-container-sso-box {
float: left;
width: 30%;
font-size: 12px;
padding-left: 5px;
}
&-name {
font-size: 1.0em;
font-weight: bold;
margin-bottom: 6px;
}
&-message-label {
font-size: 12px;
margin-left: 2px;
color: red;
}
&-logo {
margin: auto;
}
&-symphony-section {
padding-left: 10px;
}
hr {
width: 90%;
}
ul {
list-style: none;
clear: both;
display: table;
text-align: right;
margin: 0;
}
h4 {
text-align: start;
margin: 6px 0;
}
li {
display: table-row;
text-align: left;
line-height: 20px;
}
b {
display: table-cell;
padding-right: 1em;
text-align: left;
font-weight: normal;
}
&-continue-button {
text-transform: capitalize;
}
&-continue-button {
box-shadow: none;
border: none;
border-radius: 20px;
font-size: 0.8rem;
text-align: center;
padding: 10px 32px;
display: inline-block;
text-decoration: none;
line-height: 12px;
background-color: #3da2fd;
color: #ffffff;
cursor: pointer;
text-transform: uppercase;
float: right;
margin: 24px 30px 4px 0;
&:focus {
box-shadow: 0 0 10px rgba(61, 162, 253, 1);
outline: none;
}
}
&-continue-button-disabled {
box-shadow: none;
border: none;
border-radius: 20px;
font-size: 0.8rem;
text-align: center;
padding: 10px 32px;
display: inline-block;
text-decoration: none;
line-height: 12px;
color: #ffffff;
text-transform: uppercase;
float: right;
margin: 24px 30px 4px 0;
cursor: not-allowed;
background-color: #cccccc;
pointer-events: none;
&:focus {
box-shadow: 0 0 10px rgba(61, 162, 253, 1);
outline: none;
}
}
}