mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-18 02:39:30 +00:00
Merge branch 'refs/heads/master' into feature/import_plugins
This commit is contained in:
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
github: mstarke
|
||||
custom: https://flattr.com/thing/1550529/mstarkeMacPass-on-GitHub
|
||||
11
.travis.yml
11
.travis.yml
@@ -8,6 +8,16 @@ before_install:
|
||||
- gem install xcpretty --no-document --quiet
|
||||
|
||||
after_success:
|
||||
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage de
|
||||
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage en
|
||||
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage es
|
||||
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage fr
|
||||
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage it
|
||||
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage nl
|
||||
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage ru
|
||||
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage sv-SE
|
||||
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage zh-Hans
|
||||
- zip -9ry Localisations.zip Localisations
|
||||
- cd ./build/Build/Products/Release
|
||||
- zip -9ry MacPass-continuous.zip MacPass.app
|
||||
- shasum -a 256 MacPass-continuous.zip > MacPass-continuous.zip.sha256
|
||||
@@ -30,6 +40,7 @@ deploy:
|
||||
api_key:
|
||||
secure: AEb7fgi29S3aXFt5bXz+lq1KHISumny6bf4j06JBC5gUrSs+dW0/tmVFq68XRAqigeOQU31wwv20f7OHiy+GRYDXM2xBsX9ZBQ2IilnaXlDy/mPsNcJJJsZ2gyodi3KnU0rZtTb93me2YyU86H4Na/gtaZZUKjLwCFtGGziExD8=
|
||||
file:
|
||||
- Localisations.zip
|
||||
- MacPass-continuous.zip
|
||||
- MacPass-continuous.zip.sha256
|
||||
overwrite: true
|
||||
|
||||
2
Cartfile
2
Cartfile
@@ -1,3 +1,3 @@
|
||||
github "sparkle-project/Sparkle" ~> 1.18.1
|
||||
github "sparkle-project/Sparkle" ~> 1.22
|
||||
github "MacPass/KeePassKit" ~> 2.4
|
||||
github "mstarke/HNHUi" ~> 3.0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
github "MacPass/KeePassKit" "2.4.7"
|
||||
github "mstarke/HNHUi" "3.0"
|
||||
github "robbiehanson/KissXML" "5.2.3"
|
||||
github "sparkle-project/Sparkle" "1.20.0"
|
||||
github "sparkle-project/Sparkle" "1.22.0"
|
||||
|
||||
@@ -721,6 +721,7 @@
|
||||
4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAutotypeDelay.m; sourceTree = "<group>"; };
|
||||
4C8E889122C223620002C7C8 /* createdTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = createdTemplate.pdf; sourceTree = "<group>"; };
|
||||
4C8E889322C227270002C7C8 /* plugins.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = plugins.json; path = Resources/plugins.json; sourceTree = "<group>"; };
|
||||
4C8EAF20236720090025CC00 /* MacPass.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MacPass.entitlements; sourceTree = "<group>"; };
|
||||
4C8F0C6C1FCEE98900BE157F /* MPPluginConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPluginConstants.h; sourceTree = "<group>"; };
|
||||
4C8F0C6D1FCEE9B900BE157F /* MPPluginConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPluginConstants.m; sourceTree = "<group>"; };
|
||||
4C8F0C6F1FCEF91400BE157F /* MPPickcharsParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPickcharsParser.h; sourceTree = "<group>"; };
|
||||
@@ -733,6 +734,7 @@
|
||||
4C97CCEF1FA727DC00E58F8C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
4C9BFFF91FD19B5400264B16 /* MPPrettyPasswordTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPrettyPasswordTransformer.h; sourceTree = "<group>"; };
|
||||
4C9BFFFA1FD19B5400264B16 /* MPPrettyPasswordTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPrettyPasswordTransformer.m; sourceTree = "<group>"; };
|
||||
4C9FE47423703DA50096A5EA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
4CA08D9E17A831B200A6544B /* MPAddEntryContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAddEntryContextMenuDelegate.h; sourceTree = "<group>"; };
|
||||
4CA08D9F17A831B200A6544B /* MPAddEntryContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAddEntryContextMenuDelegate.m; sourceTree = "<group>"; };
|
||||
4CA0B2EC15BCADAC00654E32 /* PreferencesWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesWindow.xib; sourceTree = "<group>"; };
|
||||
@@ -955,9 +957,9 @@
|
||||
7837112B22553B1D009BD28D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; };
|
||||
7837112D225540D1009BD28D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PluginRepositoryBrowserView.xib; sourceTree = "<group>"; };
|
||||
78371130225540D8009BD28D /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PluginRepositoryBrowserView.strings; sourceTree = "<group>"; };
|
||||
78C093DB236A18560008577C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeDoctorReportViewController.strings; sourceTree = "<group>"; };
|
||||
78E1F8AF22E3A3DF00E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/IntegrationPreferences.strings; sourceTree = "<group>"; };
|
||||
78E1F8B122E3A5D600E738AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AutotypeDoctorReportViewController.xib; sourceTree = "<group>"; };
|
||||
78E1F8B422E3A5DB00E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AutotypeDoctorReportViewController.strings; sourceTree = "<group>"; };
|
||||
78E1F8B822E3B06700E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PickcharsView.strings; sourceTree = "<group>"; };
|
||||
78E1F8BA22E3B0B700E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/PickfieldView.strings; sourceTree = "<group>"; };
|
||||
78E1F8BC22E3B12300E738AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/OpenPanelAccessoryView.strings; sourceTree = "<group>"; };
|
||||
@@ -1512,6 +1514,7 @@
|
||||
4C77E36D15B84A240093A587 /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4C8EAF20236720090025CC00 /* MacPass.entitlements */,
|
||||
4C8E889322C227270002C7C8 /* plugins.json */,
|
||||
FA13910A1F9CD9EB0033D256 /* Localizable.stringsdict */,
|
||||
4C888C8E16EB6C91003D34A1 /* Localizable.strings */,
|
||||
@@ -1992,13 +1995,15 @@
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}",
|
||||
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
|
||||
);
|
||||
name = Versioning;
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "git=`sh /etc/profile; which git`\n#branch_name=`$git symbolic-ref HEAD | sed -e 's,refs/heads/\\\\(.*\\\\),\\\\1,'`\nbranch_name=`$git rev-parse --abbrev-ref HEAD`\n#simple_branch_name=`$git rev-parse --abbrev-ref HEAD`\ngit_count=`$git rev-list $branch_name |wc -l | sed 's/^ *//;s/ *$//'`\n\nbuild_number=\"${git_count}0\"\nif [ $CONFIGURATION != \"Release\" ] || [ $branch_name != \"master\" ]; then\nbuild_number+=\"-$branch_name\"\nfi\nif [ \"$CI\" = \"true\" ]; then\nbuild_date=`date +\"%Y%m%d%H%m%S\"`\nbuild_number=\"$build_date-continuous\"\nfi\n\nplist=\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\ndsym_plist=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$plist\"\nif [ -f \"$DSYM_INFO_PLIST\" ] ; then\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$dsym_plist\"\nfi\n";
|
||||
shellScript = "git=`sh /etc/profile; which git`\nbranch_name=`$git rev-parse --abbrev-ref HEAD`\ngit_count=`$git rev-list $branch_name |wc -l | sed 's/^ *//;s/ *$//'`\n\nbuild_number=\"${git_count}0\"\nif [ $CONFIGURATION != \"Release\" ] || [ $branch_name != \"master\" ]; then\nbuild_number+=\"-$branch_name\"\nfi\nif [ \"$CI\" = \"true\" ]; then\nbuild_date=`date +\"%Y%m%d%H%m%S\"`\nbuild_number=\"$build_date-continuous\"\nfi\n\nplist=\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\ndsym_plist=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$plist\"\nif [ -f \"$DSYM_INFO_PLIST\" ] ; then\n/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $build_number\" \"$dsym_plist\"\nfi\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
@@ -2367,6 +2372,7 @@
|
||||
4C4161151F50333C003BC0AF /* es */,
|
||||
FAA9109A1F9A95A500F7CB90 /* pl */,
|
||||
6A74B07C2076F4B60049BC29 /* sv-SE */,
|
||||
4C9FE47423703DA50096A5EA /* en */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
@@ -2651,10 +2657,10 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
78E1F8B122E3A5D600E738AE /* Base */,
|
||||
78E1F8B422E3A5DB00E738AE /* ru */,
|
||||
4C1888CF230FBC080054A38F /* de */,
|
||||
71FF7A27230FEF6B002F488F /* it */,
|
||||
ABE8662F2316617500201125 /* zh-Hans */,
|
||||
78C093DB236A18560008577C /* ru */,
|
||||
);
|
||||
name = AutotypeDoctorReportViewController.xib;
|
||||
sourceTree = "<group>";
|
||||
@@ -2787,7 +2793,7 @@
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 0.7.9;
|
||||
CURRENT_PROJECT_VERSION = 0.7.11;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
@@ -2842,7 +2848,7 @@
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
CURRENT_PROJECT_VERSION = 0.7.9;
|
||||
CURRENT_PROJECT_VERSION = 0.7.11;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
<connections>
|
||||
<outlet property="accessibiltyStatusImageView" destination="Xzw-kJ-WoH" id="jEb-0z-dNB"/>
|
||||
<outlet property="accessibiltyStatusTextField" destination="Pqa-Ff-7cc" id="h5M-ZN-GhR"/>
|
||||
<outlet property="requestScreenRecordingButton" destination="d5Z-hD-bpr" id="gS2-vu-2zM"/>
|
||||
<outlet property="screenRecordingStatusImageView" destination="vvZ-Lj-v22" id="7h0-cF-Mxt"/>
|
||||
<outlet property="screenRecordingStatusTextField" destination="IP0-CP-tlA" id="AfL-XZ-KRk"/>
|
||||
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
|
||||
@@ -18,27 +19,15 @@
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<customView id="Hz6-mo-xeY">
|
||||
<rect key="frame" x="0.0" y="0.0" width="400" height="375"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="400" height="469"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<stackView orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="T2c-ZD-ioV">
|
||||
<rect key="frame" x="20" y="20" width="360" height="0.0"/>
|
||||
<beginningViews>
|
||||
<stackView orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ErP-eL-yKu"/>
|
||||
</beginningViews>
|
||||
<visibilityPriorities>
|
||||
<integer value="1000"/>
|
||||
</visibilityPriorities>
|
||||
<customSpacing>
|
||||
<real value="3.4028234663852886e+38"/>
|
||||
</customSpacing>
|
||||
</stackView>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Xzw-kJ-WoH">
|
||||
<rect key="frame" x="20" y="339" width="16" height="16"/>
|
||||
<rect key="frame" x="20" y="433" width="16" height="16"/>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="DWu-HI-z3k"/>
|
||||
</imageView>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Pqa-Ff-7cc">
|
||||
<rect key="frame" x="42" y="338" width="80" height="17"/>
|
||||
<rect key="frame" x="42" y="432" width="80" height="17"/>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="Accessibility" id="aIL-8W-63g">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
@@ -46,7 +35,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hY9-T0-hke">
|
||||
<rect key="frame" x="42" y="274" width="340" height="56"/>
|
||||
<rect key="frame" x="42" y="368" width="340" height="56"/>
|
||||
<textFieldCell key="cell" controlSize="small" selectable="YES" id="6GI-KJ-Xue">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<string key="title">MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application.</string>
|
||||
@@ -55,7 +44,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="x9d-0h-hyJ">
|
||||
<rect key="frame" x="38" y="226" width="236" height="32"/>
|
||||
<rect key="frame" x="38" y="320" width="236" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="Open Accessibilty Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8m1-vs-pd5">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
@@ -65,11 +54,11 @@
|
||||
</connections>
|
||||
</button>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="vvZ-Lj-v22">
|
||||
<rect key="frame" x="20" y="188" width="16" height="16"/>
|
||||
<rect key="frame" x="20" y="282" width="16" height="16"/>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="kCX-CB-5vQ"/>
|
||||
</imageView>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6vq-iM-inn">
|
||||
<rect key="frame" x="42" y="81" width="340" height="98"/>
|
||||
<rect key="frame" x="42" y="175" width="340" height="98"/>
|
||||
<textFieldCell key="cell" controlSize="small" selectable="YES" id="7of-1z-Nfk">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<string key="title">MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will check if it can read every window title of currently visible windows. This test will not read the actual title. The titles aren't stored or processed in any way.</string>
|
||||
@@ -77,8 +66,38 @@
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IP0-CP-tlA">
|
||||
<rect key="frame" x="42" y="281" width="112" height="17"/>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="Screen Recording" id="9gr-mz-2I4">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cd-Q0r">
|
||||
<rect key="frame" x="20" y="304" width="360" height="5"/>
|
||||
</box>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d5Z-hD-bpr">
|
||||
<rect key="frame" x="38" y="127" width="177" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="Request Permissions…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="1Nx-Cg-TCn">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="requestScreenRecordingPermissions:" target="-2" id="dvF-Aw-j5Q"/>
|
||||
</connections>
|
||||
</button>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" preferredMaxLayoutWidth="336" translatesAutoresizingMaskIntoConstraints="NO" id="cu4-Jq-eaS">
|
||||
<rect key="frame" x="42" y="84" width="340" height="42"/>
|
||||
<textFieldCell key="cell" selectable="YES" id="Mhg-rd-1hK">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<string key="title">To request Screen Recording permissions, MacPass will try to capture a 1 by 1 Pixel sized screenshot of the top left part of your screen. The data is not stored nor processed in any way.</string>
|
||||
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dek-ho-dPm">
|
||||
<rect key="frame" x="38" y="33" width="271" height="32"/>
|
||||
<rect key="frame" x="38" y="48" width="271" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="Open Screen Recording Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="lgB-Ys-L9R">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
@@ -87,49 +106,41 @@
|
||||
<action selector="openScreenRecordingPreferences:" target="-2" id="rvE-ff-sR2"/>
|
||||
</connections>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IP0-CP-tlA">
|
||||
<rect key="frame" x="42" y="187" width="112" height="17"/>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="Screen Recording" id="9gr-mz-2I4">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cd-Q0r">
|
||||
<rect key="frame" x="20" y="210" width="360" height="5"/>
|
||||
</box>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="IP0-CP-tlA" firstAttribute="top" secondItem="BHb-cd-Q0r" secondAttribute="bottom" constant="8" symbolic="YES" id="0sS-li-mx4"/>
|
||||
<constraint firstItem="d5Z-hD-bpr" firstAttribute="top" secondItem="6vq-iM-inn" secondAttribute="bottom" constant="20" symbolic="YES" id="1SD-9R-lf0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="hY9-T0-hke" secondAttribute="trailing" constant="20" symbolic="YES" id="1lC-Hg-bzq"/>
|
||||
<constraint firstItem="vvZ-Lj-v22" firstAttribute="leading" secondItem="Xzw-kJ-WoH" secondAttribute="leading" id="2ZC-Uf-Pe3"/>
|
||||
<constraint firstItem="vvZ-Lj-v22" firstAttribute="centerY" secondItem="IP0-CP-tlA" secondAttribute="centerY" id="2t3-9h-RIf"/>
|
||||
<constraint firstItem="Pqa-Ff-7cc" firstAttribute="leading" secondItem="Xzw-kJ-WoH" secondAttribute="trailing" constant="8" symbolic="YES" id="57a-U7-goz"/>
|
||||
<constraint firstItem="6vq-iM-inn" firstAttribute="top" secondItem="IP0-CP-tlA" secondAttribute="bottom" constant="8" symbolic="YES" id="5ag-ah-YEW"/>
|
||||
<constraint firstItem="dek-ho-dPm" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="6Zj-Te-qHt"/>
|
||||
<constraint firstItem="cu4-Jq-eaS" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="A1C-96-raA"/>
|
||||
<constraint firstItem="x9d-0h-hyJ" firstAttribute="top" secondItem="hY9-T0-hke" secondAttribute="bottom" constant="20" symbolic="YES" id="Avt-sj-8GL"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Pqa-Ff-7cc" secondAttribute="trailing" constant="20" symbolic="YES" id="Bmg-tH-M7Q"/>
|
||||
<constraint firstAttribute="trailing" secondItem="6vq-iM-inn" secondAttribute="trailing" constant="20" symbolic="YES" id="Cga-EU-fSf"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="x9d-0h-hyJ" secondAttribute="trailing" constant="20" symbolic="YES" id="D8o-Gu-s2Y"/>
|
||||
<constraint firstItem="T2c-ZD-ioV" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="G27-G3-ORS"/>
|
||||
<constraint firstItem="T2c-ZD-ioV" firstAttribute="top" relation="greaterThanOrEqual" secondItem="dek-ho-dPm" secondAttribute="bottom" constant="20" symbolic="YES" id="GL8-gK-2fL"/>
|
||||
<constraint firstItem="dek-ho-dPm" firstAttribute="top" secondItem="cu4-Jq-eaS" secondAttribute="bottom" constant="8" symbolic="YES" id="EH9-BF-LGO"/>
|
||||
<constraint firstItem="x9d-0h-hyJ" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="J4Y-VM-MZt"/>
|
||||
<constraint firstAttribute="trailing" secondItem="T2c-ZD-ioV" secondAttribute="trailing" constant="20" symbolic="YES" id="M4d-KM-mLN"/>
|
||||
<constraint firstItem="dek-ho-dPm" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="TaR-vo-kBx"/>
|
||||
<constraint firstAttribute="trailing" secondItem="cu4-Jq-eaS" secondAttribute="trailing" constant="20" symbolic="YES" id="Mvl-zI-d9a"/>
|
||||
<constraint firstItem="BHb-cd-Q0r" firstAttribute="top" secondItem="x9d-0h-hyJ" secondAttribute="bottom" constant="20" symbolic="YES" id="TlD-dn-LEm"/>
|
||||
<constraint firstItem="BHb-cd-Q0r" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="YdV-6E-JaO"/>
|
||||
<constraint firstItem="IP0-CP-tlA" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="c76-Ak-WXw"/>
|
||||
<constraint firstItem="Xzw-kJ-WoH" firstAttribute="centerY" secondItem="Pqa-Ff-7cc" secondAttribute="centerY" id="dF3-uj-K2q"/>
|
||||
<constraint firstItem="Pqa-Ff-7cc" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="eyJ-B0-kI3"/>
|
||||
<constraint firstItem="dek-ho-dPm" firstAttribute="top" secondItem="6vq-iM-inn" secondAttribute="bottom" constant="20" symbolic="YES" id="i0R-gb-coZ"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="d5Z-hD-bpr" secondAttribute="trailing" constant="20" symbolic="YES" id="hEn-cJ-Ymz"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="dek-ho-dPm" secondAttribute="trailing" constant="20" symbolic="YES" id="jIb-UJ-efk"/>
|
||||
<constraint firstItem="hY9-T0-hke" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="kLD-8A-d1Y"/>
|
||||
<constraint firstItem="cu4-Jq-eaS" firstAttribute="top" secondItem="d5Z-hD-bpr" secondAttribute="bottom" constant="8" symbolic="YES" id="nRl-Zo-yCx"/>
|
||||
<constraint firstItem="6vq-iM-inn" firstAttribute="leading" secondItem="IP0-CP-tlA" secondAttribute="leading" id="nby-S7-orD"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="IP0-CP-tlA" secondAttribute="trailing" constant="20" symbolic="YES" id="ntn-yh-HC3"/>
|
||||
<constraint firstItem="Xzw-kJ-WoH" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="oAi-Zl-LCI"/>
|
||||
<constraint firstItem="hY9-T0-hke" firstAttribute="top" secondItem="Pqa-Ff-7cc" secondAttribute="bottom" constant="8" symbolic="YES" id="oK3-FK-r0S"/>
|
||||
<constraint firstAttribute="bottom" secondItem="T2c-ZD-ioV" secondAttribute="bottom" constant="20" symbolic="YES" id="pm7-eL-q1F"/>
|
||||
<constraint firstItem="d5Z-hD-bpr" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="oZ8-mG-RYJ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="BHb-cd-Q0r" secondAttribute="trailing" constant="20" symbolic="YES" id="ryW-3O-g6b"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="dek-ho-dPm" secondAttribute="trailing" constant="20" symbolic="YES" id="xcq-hp-Ay9"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="-409" y="-124"/>
|
||||
<point key="canvasLocation" x="-409" y="-112.5"/>
|
||||
</customView>
|
||||
</objects>
|
||||
<resources>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14313.18"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
@@ -31,6 +31,9 @@
|
||||
<buttonCell key="cell" type="push" title="Select" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6Wi-9i-Tcb">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<string key="keyEquivalent" base64-UTF8="YES">
|
||||
DQ
|
||||
</string>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="pickField:" target="-2" id="fLO-qW-oC9"/>
|
||||
@@ -121,11 +124,11 @@
|
||||
</tableView>
|
||||
</subviews>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" verticalHuggingPriority="750" horizontal="YES" id="RHy-ph-0lP">
|
||||
<scroller key="horizontalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="RHy-ph-0lP">
|
||||
<rect key="frame" x="1" y="255" width="432" height="16"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="b5D-WW-IPI">
|
||||
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="b5D-WW-IPI">
|
||||
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
|
||||
@@ -21,6 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
- (void)runChecksAndPresentResults;
|
||||
- (void)openScreenRecordingPreferences;
|
||||
- (void)requestScreenRecordingPermission;
|
||||
- (void)openAccessibiltyPreferences;
|
||||
- (void)openAutomationPreferences;
|
||||
|
||||
|
||||
@@ -63,22 +63,41 @@
|
||||
|
||||
- (BOOL)hasScreenRecordingPermissions:(NSError *__autoreleasing*)error {
|
||||
/* macos 10.14 and lower do not require screen recording permission to get window titles */
|
||||
if (@available(macOS 10.15, *)) {
|
||||
|
||||
/*
|
||||
Solution is heavily inspired by Craig Hockenberry's
|
||||
https://stackoverflow.com/questions/56597221/detecting-screen-recording-settings-on-macos-catalina/58985069#58985069
|
||||
*/
|
||||
if(@available(macOS 10.15, *)) {
|
||||
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
|
||||
NSUInteger numberOfWindows = CFArrayGetCount(windowList);
|
||||
NSUInteger numberOfWindowsWithName = 0;
|
||||
BOOL canRecordScreen = NO;
|
||||
for(int idx = 0; idx < numberOfWindows; idx++) {
|
||||
NSDictionary *windowInfo = (NSDictionary *)CFArrayGetValueAtIndex(windowList, idx);
|
||||
NSNumber *ownerPid = windowInfo[(id)kCGWindowOwnerPID];
|
||||
/*
|
||||
Skip over our own windows
|
||||
*/
|
||||
if(ownerPid.intValue == NSProcessInfo.processInfo.processIdentifier) {
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
Skip applications we aren't allowed to access anyway
|
||||
*/
|
||||
NSRunningApplication *ownerApp = [NSRunningApplication runningApplicationWithProcessIdentifier:ownerPid.intValue];
|
||||
if(!ownerApp) {
|
||||
continue;
|
||||
}
|
||||
NSString *windowName = windowInfo[(id)kCGWindowName];
|
||||
if(windowName) {
|
||||
numberOfWindowsWithName++;
|
||||
}
|
||||
else {
|
||||
break; //breaking early, numberOfWindowsWithName not increased
|
||||
if([ownerApp.executableURL.lastPathComponent isEqualToString:@"Dock"]) {
|
||||
continue;
|
||||
}
|
||||
canRecordScreen = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
CFRelease(windowList);
|
||||
BOOL canRecordScreen = (numberOfWindows == numberOfWindowsWithName);
|
||||
if(!canRecordScreen && error) {
|
||||
*error = [NSError errorInDomain:MPAutotypeErrorDomain withCode:MPErrorAutotypeIsMissingScreenRecordingPermissions description:NSLocalizedString(@"ERROR_NO_PERMISSION_TO_RECORD_SCREEN", "Error description for missing screen recording permissions")];
|
||||
}
|
||||
@@ -104,8 +123,23 @@
|
||||
}
|
||||
|
||||
- (void)openScreenRecordingPreferences {
|
||||
//TODO fix this in macOS 10.15 to use the correct URL
|
||||
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security"]];
|
||||
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"]];
|
||||
}
|
||||
|
||||
- (void)requestScreenRecordingPermission {
|
||||
/* macos 10.14 and lower do not require screen recording permission to get window titles */
|
||||
if(@available(macos 10.15, *)) {
|
||||
/*
|
||||
To minimize the intrusion just make a 1px image of the upper left corner
|
||||
This way there is no real possibilty to access any private data
|
||||
*/
|
||||
CGImageRef screenshot = CGWindowListCreateImage(
|
||||
CGRectMake(0, 0, 1, 1),
|
||||
kCGWindowListOptionOnScreenOnly,
|
||||
kCGNullWindowID,
|
||||
kCGWindowImageDefault);
|
||||
CFRelease(screenshot);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)openAutomationPreferences {
|
||||
|
||||
@@ -17,12 +17,13 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@property (strong) IBOutlet NSImageView *screenRecordingStatusImageView;
|
||||
@property (strong) IBOutlet NSTextField *screenRecordingStatusTextField;
|
||||
@property (strong) IBOutlet NSButton *requestScreenRecordingButton;
|
||||
|
||||
- (IBAction)openAccessibiltyPreferences:(id)sender;
|
||||
- (IBAction)openScreenRecordingPreferences:(id)sender;
|
||||
- (IBAction)requestScreenRecordingPermissions:(id)sender;
|
||||
- (IBAction)openAutomationPreferences:(id)sender;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
@@ -29,6 +29,10 @@
|
||||
[MPAutotypeDoctor.defaultDoctor openScreenRecordingPreferences];
|
||||
}
|
||||
|
||||
- (IBAction)requestScreenRecordingPermissions:(id)sender {
|
||||
[MPAutotypeDoctor.defaultDoctor requestScreenRecordingPermission];
|
||||
}
|
||||
|
||||
- (void)openAutomationPreferences:(id)sender {
|
||||
[MPAutotypeDoctor.defaultDoctor openAutomationPreferences];
|
||||
}
|
||||
@@ -38,7 +42,7 @@
|
||||
NSError *error;
|
||||
if([MPAutotypeDoctor.defaultDoctor hasAccessibiltyPermissions:&error]) {
|
||||
self.accessibiltyStatusImageView.image = [NSImage imageNamed:NSImageNameStatusAvailable];
|
||||
self.accessibiltyStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK", "Status lable when no issue were found in accessibilty");
|
||||
self.accessibiltyStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK", "Status label when no issue were found in accessibilty");
|
||||
}
|
||||
else {
|
||||
self.accessibiltyStatusImageView.image = [NSImage imageNamed:NSImageNameStatusUnavailable];
|
||||
@@ -50,10 +54,12 @@
|
||||
}
|
||||
}
|
||||
if([MPAutotypeDoctor.defaultDoctor hasScreenRecordingPermissions:&error]) {
|
||||
self.requestScreenRecordingButton.enabled = NO;
|
||||
self.screenRecordingStatusImageView.image = [NSImage imageNamed:NSImageNameStatusAvailable];
|
||||
self.screenRecordingStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_SCREEN_RECORDING_PERMISSIONS_OK", "Status lable when no issue were found in screen recording permissions");
|
||||
self.screenRecordingStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_SCREEN_RECORDING_PERMISSIONS_OK", "Status label when no issue were found in screen recording permissions");
|
||||
}
|
||||
else {
|
||||
self.requestScreenRecordingButton.enabled = YES;
|
||||
self.screenRecordingStatusImageView.image = [NSImage imageNamed:NSImageNameStatusUnavailable];
|
||||
if(error && error.localizedDescription) {
|
||||
self.screenRecordingStatusTextField.stringValue = error.localizedDescription;
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
|
||||
@interface MPContextButton : NSSegmentedControl
|
||||
|
||||
typedef NS_ENUM(NSUInteger, MPContextButtonSegment) {
|
||||
MPContextButtonSegmentButton,
|
||||
MPContextButtonSegmentContextButton,
|
||||
MPContextButtonSegmentCount // do not use
|
||||
};
|
||||
|
||||
@property (nonatomic, strong) NSMenu *contextMenu;
|
||||
|
||||
- (void)setImage:(NSImage *)image;
|
||||
|
||||
@@ -53,14 +53,14 @@
|
||||
|
||||
self.focusRingType = NSFocusRingTypeNone;
|
||||
self.segmentStyle = NSSegmentStyleTexturedSquare;
|
||||
self.segmentCount = 2;
|
||||
self.segmentCount = MPContextButtonSegmentCount;
|
||||
cell.trackingMode = NSSegmentSwitchTrackingMomentary;
|
||||
[cell setWidth:31 forSegment:0];
|
||||
[cell setWidth:17 forSegment:1];
|
||||
[cell setWidth:31 forSegment:MPContextButtonSegmentButton];
|
||||
[cell setWidth:17 forSegment:MPContextButtonSegmentContextButton];
|
||||
cell.trackingMode = NSSegmentSwitchTrackingMomentary;
|
||||
|
||||
NSImage *contextTriangle = [NSBundle.mainBundle imageForResource:@"contextTriangleTemplate"];
|
||||
[self setImage:contextTriangle forSegment:1];
|
||||
[self setImage:contextTriangle forSegment:MPContextButtonSegmentContextButton];
|
||||
|
||||
cell.contextMenuAction = @selector(showContextMenu:);
|
||||
cell.contextMenuTarget = self;
|
||||
@@ -76,42 +76,42 @@
|
||||
Block the segment setter to prevent accidental settings
|
||||
*/
|
||||
- (void)setImage:(NSImage *)image forSegment:(NSInteger)segment {
|
||||
if(segment < 2) {
|
||||
if(segment < MPContextButtonSegmentCount) {
|
||||
[super setImage:image forSegment:segment];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setSegmentCount:(NSInteger)count {
|
||||
if(count == 2) {
|
||||
if(count == MPContextButtonSegmentCount) {
|
||||
super.segmentCount = count;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setImage:(NSImage *)image {
|
||||
[self setImage:image forSegment:0];
|
||||
[self setImage:image forSegment:MPContextButtonSegmentButton];
|
||||
}
|
||||
|
||||
- (void)showContextMenu:(id)sender {
|
||||
NSPoint point = self.frame.origin;
|
||||
point.x = [self.cell widthForSegment:0];
|
||||
point.x = [self.cell widthForSegment:MPContextButtonSegmentButton];
|
||||
point.y = NSHeight(self.frame) + 3;
|
||||
[_contextMenu popUpMenuPositioningItem:nil atLocation:point inView:self];
|
||||
}
|
||||
|
||||
- (void)setControlSize:(NSControlSize)controlSize {
|
||||
NSImageRep *rep = [[self imageForSegment:0] bestRepresentationForRect:NSMakeRect(0, 0, 100, 100) context:nil hints:nil];
|
||||
NSImageRep *rep = [[self imageForSegment:MPContextButtonSegmentButton] bestRepresentationForRect:NSMakeRect(0, 0, 100, 100) context:nil hints:nil];
|
||||
CGFloat scale = rep.size.width / rep.size.height;
|
||||
switch (controlSize) {
|
||||
case NSRegularControlSize:
|
||||
[self imageForSegment:0].size = NSMakeSize(16 * scale, 16);
|
||||
[self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(16 * scale, 16);
|
||||
break;
|
||||
|
||||
case NSSmallControlSize:
|
||||
[self imageForSegment:0].size = NSMakeSize(14 * scale, 14);
|
||||
[self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(14 * scale, 14);
|
||||
break;
|
||||
|
||||
case NSMiniControlSize:
|
||||
[self imageForSegment:0].size = NSMakeSize(8 * scale, 8);
|
||||
[self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(8 * scale, 8);
|
||||
|
||||
default:
|
||||
break;
|
||||
@@ -123,4 +123,9 @@
|
||||
return super.controlSize;
|
||||
}
|
||||
|
||||
- (void)_updateContextButtonState {
|
||||
BOOL hasContextMenu = (self.contextMenu != nil);
|
||||
[self setEnabled:hasContextMenu forSegment:MPContextButtonSegmentContextButton];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -557,6 +557,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
|
||||
NSMenu *customFieldMenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"ADD_CUSTOM_FIELD_CONTEXT_MENU", @"Menu displayed for adding special custom keys")];
|
||||
customFieldMenu.delegate = _addCustomFieldContextMenuDelegate;
|
||||
self.addCustomFieldButton.contextMenu = customFieldMenu;
|
||||
[self.addCustomFieldButton setEnabled:NO forSegment:MPContextButtonSegmentContextButton];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@@ -60,10 +60,14 @@
|
||||
self.window.alphaValue = 0;
|
||||
self.window.opaque = NO;
|
||||
self.window.hasShadow = YES;
|
||||
self.window.backgroundColor = NSColor.clearColor;
|
||||
|
||||
self.textField.cell.backgroundStyle = NSBackgroundStyleLowered;
|
||||
self.imageView.cell.backgroundStyle = NSBackgroundStyleDark;
|
||||
self.imageView.cell.backgroundStyle = NSBackgroundStyleEmphasized;
|
||||
((NSImageCell *)self.imageView.cell).imageAlignment = NSImageAlignCenter;
|
||||
if (@available(macOS 10.14, *)) {
|
||||
self.imageView.contentTintColor = NSColor.textColor;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)displayOverlayImage:(NSImage *)imageOrNil label:(NSString *)labelOrNil atView:(NSView *)view {
|
||||
|
||||
@@ -47,10 +47,11 @@
|
||||
if([self.delegate respondsToSelector:@selector(pathControl:willDisplayOpenPanel:)]) {
|
||||
[self.delegate pathControl:self willDisplayOpenPanel:panel];
|
||||
}
|
||||
NSModalResponse result = [panel runModal];
|
||||
if(result == NSModalResponseOK) {
|
||||
self.URL = panel.URLs.firstObject;
|
||||
}
|
||||
[panel beginWithCompletionHandler:^(NSModalResponse result) {
|
||||
if(result == NSModalResponseOK) {
|
||||
self.URL = panel.URLs.firstObject;
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)pathControl:(NSPathControl *)pathControl willPopUpMenu:(NSMenu *)menu {
|
||||
|
||||
@@ -102,7 +102,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
||||
@implementation MPSettingsHelper
|
||||
|
||||
+ (void)setupDefaults {
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:[self _standardDefaults]];
|
||||
[NSUserDefaults.standardUserDefaults registerDefaults:[self _standardDefaults]];
|
||||
}
|
||||
|
||||
+ (void)migrateDefaults {
|
||||
@@ -193,7 +193,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
||||
+ (void)_removeDeprecatedValues {
|
||||
/* Clear old style values */
|
||||
for(NSString *key in [self _deprecatedSettingsKeys]) {
|
||||
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
|
||||
[NSUserDefaults.standardUserDefaults removeObjectForKey:key];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -206,7 +206,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
||||
this was changed in 0.6. to parent.title
|
||||
|
||||
*/
|
||||
NSData *descriptorData = [[NSUserDefaults standardUserDefaults] dataForKey:kMPSettingsKeyEntryTableSortDescriptors];
|
||||
NSData *descriptorData = [NSUserDefaults.standardUserDefaults dataForKey:kMPSettingsKeyEntryTableSortDescriptors];
|
||||
if(!descriptorData) {
|
||||
return; // No user defaults
|
||||
}
|
||||
@@ -217,27 +217,35 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
||||
if(descriptor.selector == @selector(compare:)
|
||||
|| [descriptor.key isEqualToString:@"timeInfo.modificationDate"]
|
||||
|| [descriptor.key isEqualToString:@"parent.name"] ) {
|
||||
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kMPSettingsKeyEntryTableSortDescriptors];
|
||||
[NSUserDefaults.standardUserDefaults removeObjectForKey:kMPSettingsKeyEntryTableSortDescriptors];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)_migrateURLDoubleClickPreferences {
|
||||
/* Default was NO so if the key was not set, we also get NO, which is what we want */
|
||||
BOOL openURL = [[NSUserDefaults standardUserDefaults] boolForKey:kMPDeprecatedSettingsKeyDoubleClickURLToLaunch];
|
||||
if(NO == openURL) {
|
||||
[[NSUserDefaults standardUserDefaults] setInteger:MPDoubleClickURLActionOpen forKey:kMPSettingsKeyDoubleClickURLAction];
|
||||
/*
|
||||
Default was NO so if the key was not set the correct action now should be MPDoubleClickURLActionCopy
|
||||
But MPDoubleClickURLActionCopy is the default we cannot simply add this value.
|
||||
Hence we chose to only migrate a changed default and let the "old" default silenty be updated
|
||||
This is a worth trade-off since the other solution will always re-set the default
|
||||
*/
|
||||
if(nil == [NSUserDefaults.standardUserDefaults objectForKey:kMPDeprecatedSettingsKeyDoubleClickURLToLaunch]) {
|
||||
return; // the value was not set, do nothing since we cannot determine what to do
|
||||
}
|
||||
/* only update the settings if the defaults return an explicit set value */
|
||||
if([NSUserDefaults.standardUserDefaults boolForKey:kMPDeprecatedSettingsKeyDoubleClickURLToLaunch]) {
|
||||
[NSUserDefaults.standardUserDefaults setInteger:MPDoubleClickURLActionOpen forKey:kMPSettingsKeyDoubleClickURLAction];
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)_migrateEntrySearchFlags {
|
||||
/* Entry filters are now stored as archivd search context not just flags */
|
||||
NSInteger flags = [[NSUserDefaults standardUserDefaults] integerForKey:kMPDeprecatedSettingsKeyEntrySearchFilterMode];
|
||||
NSInteger flags = [NSUserDefaults.standardUserDefaults integerForKey:kMPDeprecatedSettingsKeyEntrySearchFilterMode];
|
||||
if(flags != 0) {
|
||||
MPEntrySearchContext *context = [[MPEntrySearchContext alloc] initWithString:nil flags:flags];
|
||||
NSData *contextData = [NSKeyedArchiver archivedDataWithRootObject:context];
|
||||
[[NSUserDefaults standardUserDefaults] setObject:contextData forKey:kMPSettingsKeyEntrySearchFilterContext];
|
||||
[NSUserDefaults.standardUserDefaults setObject:contextData forKey:kMPSettingsKeyEntrySearchFilterContext];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -246,7 +254,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
||||
Database file paths was stored as plain text in keyfile mapping.
|
||||
We only need to store the key file url in plain text, thus hashing the path is sufficent
|
||||
*/
|
||||
NSDictionary<NSString *, NSString *> *currentMapping = [[NSUserDefaults standardUserDefaults] dictionaryForKey:kMPSettingsKeyRememeberdKeysForDatabases];
|
||||
NSDictionary<NSString *, NSString *> *currentMapping = [NSUserDefaults.standardUserDefaults dictionaryForKey:kMPSettingsKeyRememeberdKeysForDatabases];
|
||||
if(!currentMapping) {
|
||||
return;
|
||||
}
|
||||
@@ -268,7 +276,7 @@ NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"Au
|
||||
}
|
||||
}
|
||||
if(didHash) {
|
||||
[[NSUserDefaults standardUserDefaults] setObject:hashedDict forKey:kMPSettingsKeyRememeberdKeysForDatabases];
|
||||
[NSUserDefaults.standardUserDefaults setObject:hashedDict forKey:kMPSettingsKeyRememeberdKeysForDatabases];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -238,12 +238,20 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
|
||||
|
||||
#pragma mark - NSSearchFieldDelegate
|
||||
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
|
||||
if(control != self.searchField) {
|
||||
return NO;
|
||||
}
|
||||
if(commandSelector == @selector(insertNewline:) || commandSelector == @selector(moveDown:)) {
|
||||
/* Dispatch the focus loss since doing it now will break recent search storage */
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[[NSApp targetForAction:@selector(focusEntries:) to:nil from:self] focusEntries:self];
|
||||
});
|
||||
}
|
||||
if(commandSelector == @selector(cancelOperation:) ) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[[NSApp targetForAction:@selector(exitSearch:) to:nil from:self] exitSearch:nil];
|
||||
});
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
@@ -294,7 +302,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
|
||||
[menu addItem:item];
|
||||
|
||||
[menu addItem:[NSMenuItem separatorItem]];
|
||||
|
||||
|
||||
item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"RECENT_SEARCHES", @"Recent searches menu item") action:NULL keyEquivalent:@""];
|
||||
item.tag = NSSearchFieldRecentsTitleMenuItemTag;
|
||||
[menu addItem:item];
|
||||
@@ -335,7 +343,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
|
||||
}
|
||||
|
||||
- (void)_didExitSearch:(NSNotification *)notification {
|
||||
[self.searchField setStringValue:@""];
|
||||
self.searchField.stringValue = @"";
|
||||
NSWindow *window = [self.searchField window];
|
||||
/* Resign first responder form search field only if it was the first responder */
|
||||
if(window.firstResponder == [self.searchField currentEditor]) {
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
//
|
||||
|
||||
#import "MPWelcomeViewController.h"
|
||||
#import "MPConstants.h"
|
||||
|
||||
@interface MPWelcomeViewController ()
|
||||
|
||||
@@ -26,17 +27,32 @@
|
||||
}
|
||||
|
||||
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
|
||||
return NSDocumentController.sharedDocumentController.recentDocumentURLs.count;
|
||||
return MAX(1, NSDocumentController.sharedDocumentController.recentDocumentURLs.count);
|
||||
}
|
||||
|
||||
- (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||
NSTableCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
|
||||
NSURL *url = NSDocumentController.sharedDocumentController.recentDocumentURLs[row];
|
||||
view.textField.stringValue = url.lastPathComponent;
|
||||
view.imageView.image = [NSWorkspace.sharedWorkspace iconForFile:url.path];
|
||||
NSArray<NSURL *> *recentURLS = NSDocumentController.sharedDocumentController.recentDocumentURLs;
|
||||
if(row > -1 && row < recentURLS.count) {
|
||||
NSURL *url = recentURLS[row];
|
||||
view.textField.enabled = YES;
|
||||
view.imageView.enabled = YES;
|
||||
view.textField.stringValue = url.lastPathComponent;
|
||||
view.imageView.image = [NSWorkspace.sharedWorkspace iconForFile:url.path];
|
||||
}
|
||||
else {
|
||||
view.textField.enabled = NO;
|
||||
view.imageView.enabled = NO;
|
||||
view.textField.stringValue = NSLocalizedString(@"WELCOME_WINDOW_NO_RECENT_DOCUMENTS", "Text displayed when no recent documents can be displayed in");
|
||||
view.imageView.image = [NSWorkspace.sharedWorkspace iconForFileType:MPKdbxDocumentUTI];
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row {
|
||||
return (NSDocumentController.sharedDocumentController.recentDocumentURLs.count > 0);
|
||||
}
|
||||
|
||||
- (IBAction)openRecentURL:(id)sender {
|
||||
NSInteger clicked = self.tableView.clickedRow;
|
||||
NSArray <NSURL *> *recentURLS = NSDocumentController.sharedDocumentController.recentDocumentURLs;
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSAppleEventsUsageDescription</key>
|
||||
<string>MacPass might use AppleEvents to perform Autotype functionality</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
@@ -71,6 +69,8 @@
|
||||
<string>https://github.com/MacPass/MacPass</string>
|
||||
<key>MPPluginRepositoryURL</key>
|
||||
<string>https://macpassapp.org/data/plugins.json</string>
|
||||
<key>NSAppleEventsUsageDescription</key>
|
||||
<string>MacPass might use AppleEvents to perform Autotype functionality</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2012-2019 HicknHack Software GmbH. All rights reserved.</string>
|
||||
<key>NSMainNibFile</key>
|
||||
@@ -92,6 +92,8 @@
|
||||
</array>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>KDBX Database</string>
|
||||
<key>UTTypeIconFile</key>
|
||||
<string>FileTypeIcon</string>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>com.hicknhack.macpass.kdbx</string>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
@@ -109,6 +111,8 @@
|
||||
</array>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>KDB Database</string>
|
||||
<key>UTTypeIconFile</key>
|
||||
<string>FileTypeIcon</string>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>com.hicknhack.macpass.kdb</string>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
|
||||
10
MacPass/MacPass.entitlements
Normal file
10
MacPass/MacPass.entitlements
Normal file
@@ -0,0 +1,10 @@
|
||||
<?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>com.apple.security.automation.apple-events</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-library-validation</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
18
MacPass/en.lproj/InfoPlist.strings
Normal file
18
MacPass/en.lproj/InfoPlist.strings
Normal file
@@ -0,0 +1,18 @@
|
||||
/* Bundle name */
|
||||
"CFBundleName" = "MacPass";
|
||||
|
||||
/* (No Comment) */
|
||||
"KDB Database" = "KDB Database";
|
||||
|
||||
/* (No Comment) */
|
||||
"KDBX Database" = "KDBX Database";
|
||||
|
||||
/* (No Comment) */
|
||||
"MacPass Plugin" = "MacPass Plugin";
|
||||
|
||||
/* (No Comment) */
|
||||
"NSHumanReadableCopyright" = "Copyright ©2012-2019 HicknHack Software GmbH. All rights reserved.";
|
||||
|
||||
/* (No Comment) */
|
||||
"XML" = "XML";
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Request Permissions…"; ObjectID = "1Nx-Cg-TCn"; */
|
||||
"1Nx-Cg-TCn.title" = "Запросить разрешения…";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application."; ObjectID = "6GI-KJ-Xue"; */
|
||||
"6GI-KJ-Xue.title" = "MacPass будет отправлять события нажатия клавиш в систему при выполнении Автоввода или Глобального Автоввода. Начиная с macOS 10.14 Mojave это возможно только в том случае, если приложению разрешено управление копьютером через универсальный доступ.";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will try to capture the left top most pixel on your screen to initate a request to record the screen. This pixel will not be stored and processed in any way."; ObjectID = "7of-1z-Nfk"; */
|
||||
"7of-1z-Nfk.title" = "MacPass будет читать заголовки окон чтобы найти совпадения при выполнении Глобального Автоввода. Начиная с macOS 10.15 Catalina невозможно прочитать заголовок окна, если пользователь не предоставил разрешения на запись экрана. Если вы используете MacOS 10.15 или выше, MacPass попытается захватить левый верхний пиксель на вашем экране, чтобы инициировать запрос на запись экрана. Этот пиксель не будет сохранен и обработан каким-либо образом.";
|
||||
/* Class = "NSTextFieldCell"; title = "MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will check if it can read every window title of currently visible windows. This test will not read the actual title. The titles aren't stored or processed in any way."; ObjectID = "7of-1z-Nfk"; */
|
||||
"7of-1z-Nfk.title" = "MacPass будет читать заголовки окон чтобы найти совпадения при выполнении Глобального Автоввода. Начиная с macOS 10.15 Catalina невозможно прочитать заголовок окна, если пользователь не предоставил разрешения на запись экрана. Если вы используете MacOS 10.15 или выше, MacPass проверит, возможно ли получить заголовки видимых окон. Заголовки не сохраняются и не обрабатываются каким-либо образом.";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Open Accessibilty Preferences…"; ObjectID = "8m1-vs-pd5"; */
|
||||
"8m1-vs-pd5.title" = "Открыть настройки универсального доступа…";
|
||||
@@ -10,9 +14,11 @@
|
||||
/* Class = "NSTextFieldCell"; title = "Screen Recording"; ObjectID = "9gr-mz-2I4"; */
|
||||
"9gr-mz-2I4.title" = "Запись экрана";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "To request Screen Recording permissions, MacPass will try to capture a 1 by 1 Pixel sized screenshot of the top left part of your screen. The data is not stored nor processed in any way."; ObjectID = "Mhg-rd-1hK"; */
|
||||
"Mhg-rd-1hK.title" = "Чтобы запросить разрешения на запись экрана, MacPass попытается сделать снимок экрана размером 1 на 1 пиксель в верхней левой части экрана. Эти данные не хранятся и не обрабатываются каким-либо образом.";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Accessibility"; ObjectID = "aIL-8W-63g"; */
|
||||
"aIL-8W-63g.title" = "Универсальный доступ";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Open Screen Sharing Preferences…"; ObjectID = "lgB-Ys-L9R"; */
|
||||
/* Class = "NSButtonCell"; title = "Open Screen Recording Preferences…"; ObjectID = "lgB-Ys-L9R"; */
|
||||
"lgB-Ys-L9R.title" = "Открыть настройки безопасности…";
|
||||
|
||||
|
||||
@@ -316,13 +316,19 @@
|
||||
"DRAG_GROUP" = "Перетащить группу";
|
||||
|
||||
/* Action name for duplicating entries */
|
||||
"DUPLICATE_ENTRIES_%ld" = "Дублирующиеся записи %ld";
|
||||
"DUPLICATE_ENTRIES_ACTION_NAME" = "Дублировать Записи";
|
||||
|
||||
/* Menu item to directly diplicate an entry */
|
||||
"DUPLICATE_ENTRY" = "Скопировать Запись";
|
||||
"DUPLICATE_ENTRY" = "Дублировать Запись";
|
||||
|
||||
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
|
||||
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Скопировать Запись…";
|
||||
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Дублировать Запись…";
|
||||
|
||||
/* Menu item to directly diplicate a group */
|
||||
"DUPLICATE_GROUP" = "Дублировать Группу";
|
||||
|
||||
/* Action name for duplicating groups */
|
||||
"DUPLICATE_GROUPS_ACTION_NAME" = "Дублировать Группу";
|
||||
|
||||
/* Menu item in the database outline context menu to change the template group
|
||||
Menu item on the add entry context menu to edit template groups */
|
||||
@@ -696,6 +702,9 @@
|
||||
/* Action button in Notification to show the Autotype Doctor */
|
||||
"SHOW_AUTOTYPE_DOCTOR" = "Показать помощник автоввода";
|
||||
|
||||
/* Menu item to show the entries group in the outline view */
|
||||
"SHOW_GROUP_IN_OUTLINE" = "Показать группу";
|
||||
|
||||
/* Menu item to show the history of the selected entry
|
||||
Toolbar item to toggle history display */
|
||||
"SHOW_HISTORY" = "Показать историю";
|
||||
|
||||
10
README.md
10
README.md
@@ -105,11 +105,13 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
||||
### Contributors
|
||||
|
||||
[ad](mailto:github.mnms@mamber.net),
|
||||
[Alessandro Vinciguerra](mailto:30745465+Arc676@users.noreply.github.com),
|
||||
[Alex Borisov](mailto:alex@alexborisov.org),
|
||||
[Alex Seeholzer](mailto:seeholzer@gmail.com),
|
||||
[amd](mailto:amd@gurge.com),
|
||||
[Andrew Schleifer](mailto:me@andrewschleifer.name),
|
||||
[AntoineCa](mailto:antoine@carrincazeaux.fr),
|
||||
[Anton Glezman](mailto:anton@glezman.ru),
|
||||
[Benjamin Steinwender](mailto:b@stbe.at),
|
||||
[binarious](mailto:bieder.martin@googlemail.com),
|
||||
[Can Rau](mailto:cansrau@gmail.com),
|
||||
@@ -118,9 +120,11 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
||||
[Chhom Seng](mailto:chhom.seng@gmail.com),
|
||||
[Christoph Leimbrock](mailto:christoph.leimbrock@gmx.de),
|
||||
[Cory Hutchison](mailto:cjhutchi@users.noreply.github.com),
|
||||
[César Arratia](mailto:buttcmd@gmail.com),
|
||||
[Daniele Polencic](mailto:daniele.polencic@gmail.com),
|
||||
[darnel](mailto:vojta.j@gmail.com),
|
||||
[Deiwin Sarjas](mailto:deiwin.sarjas@gmail.com),
|
||||
[Deniz Türkoglu](mailto:denizt@users.noreply.github.com),
|
||||
[Dennis Bolio](mailto:git@bolio.nl),
|
||||
[Dylan Smith](mailto:dylansmith@gmail.com),
|
||||
[eiermaaaan](mailto:37532252+eiermaaaan@users.noreply.github.com),
|
||||
@@ -129,7 +133,7 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
||||
[floriangouy](mailto:florian.gouy@gmail.com),
|
||||
[Francesco Servida](mailto:info@francescoservida.ch),
|
||||
[Frank Enderle](mailto:frank.enderle@anamica.de),
|
||||
[Frank Kooij](https://github.com/FrankKooij),
|
||||
[Frank Kooij](mailto:FrankKooij@users.noreply.github.com),
|
||||
[Gaétan Ryckeboer](mailto:gryckeboer@jouve.com),
|
||||
[Geigi](mailto:git@geigi.de),
|
||||
[Henri de Jong](mailto:henridejong@gmail.com),
|
||||
@@ -137,6 +141,7 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
||||
[Jannick Hemelhof](mailto:mister.jannick@gmail.com),
|
||||
[Jefftree](mailto:jeffrey.ying86@live.com),
|
||||
[Jellyfrog](mailto:Jellyfrog@users.noreply.github.com),
|
||||
[Jesse Reppin](mailto:mail@jessereppin.de),
|
||||
[Joanna Olsen](mailto:jo4flash@gmail.com),
|
||||
[Josh Halstead](mailto:jhalstead85@gmail.com),
|
||||
[Kurt](mailto:kurt@soapbox-software.com),
|
||||
@@ -156,7 +161,7 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
||||
[Nathan Landis](mailto:nathanlandis@gmail.com),
|
||||
[Nathaniel Madura](mailto:nmadura@umich.edu),
|
||||
[neuroine](mailto:d.dzieduch@gmail.com),
|
||||
[Patrik Thunström](mailto:magebarf@gmail.com),
|
||||
[Patrik Thunström](mailto:magebarf@gmail.com),
|
||||
[rdoering](mailto:rdoering.info@gmail.com),
|
||||
[remi6397](mailto:remi6397@gmail.com),
|
||||
[Roman Verchikov](mailto:roman-verchikov@users.noreply.github.com),
|
||||
@@ -166,6 +171,7 @@ The following list might not be complete, please refer to [merged Pull Requests]
|
||||
[thesoundofom](mailto:45923716+thesoundofom@users.noreply.github.com),
|
||||
[Thom](mailto:thomscode@gmail.com),
|
||||
[Thorsten Jacoby](mailto:tjacoby@gmail.com),
|
||||
[Veit-Hendrik Schlenker](mailto:git@vhschlenker.de),
|
||||
[Volcyy](mailto:Volcyy@users.noreply.github.com),
|
||||
[Yonatan Mittlefehldt](mailto:yono@toojuice.com),
|
||||
[Zero King](mailto:l2dy@icloud.com),
|
||||
|
||||
72
scripts/prepare_release.sh
Executable file
72
scripts/prepare_release.sh
Executable file
@@ -0,0 +1,72 @@
|
||||
#!/bin/bash
|
||||
|
||||
POSITIONAL=()
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
key="$1"
|
||||
|
||||
case $key in
|
||||
-s|--sign)
|
||||
IDENTITY="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
-u|--username)
|
||||
USERNAME="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
-p|--password)
|
||||
PASSWORD="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
-e|--entitlements)
|
||||
ENTITLEMENTS="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
*) # unknown option
|
||||
POSITIONAL+=("$1") # save it in an array for later
|
||||
shift # past argument
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
set -- "${POSITIONAL[@]}" # restore positional parameters
|
||||
|
||||
if [[ -z "${IDENTITY}" ]]; then
|
||||
echo "Missing identity"
|
||||
exit -1
|
||||
fi
|
||||
if [[ -z "${ENTITLEMENTS}" ]]; then
|
||||
echo "Missing entitlements"
|
||||
exit -1
|
||||
fi
|
||||
if [[ -z "${USERNAME}" ]]; then
|
||||
echo "Missing username"
|
||||
exit -1
|
||||
fi
|
||||
if [[ -z "${PASSWORD}" ]]; then
|
||||
echo "Missing password"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
DERIVED_DATA_FOLDER="${TMPDIR}"
|
||||
BUILD_FOLDER="${DERIVED_DATA_FOLDER}"/Build/Products/Release
|
||||
APP_BUNDLE=MacPass.app
|
||||
APP_BUNDLE_ZIP="${APP_BUNDLE}".zip
|
||||
cd ..
|
||||
echo "Building..."
|
||||
xcodebuild build -configuration Release -project MacPass.xcodeproj -scheme MacPass CODE_SIGNING_REQUIRED=NO -derivedDataPath "${DERIVED_DATA_FOLDER}"
|
||||
cd "${BUILD_FOLDER}"
|
||||
echo ""
|
||||
echo "Signing..."
|
||||
codesign --sign "${IDENTITY}" --options runtime --deep --force --entitlements "${ENTITLEMENTS}" "${APP_BUNDLE}"
|
||||
echo ""
|
||||
echo "Archiving..."
|
||||
ditto -c -k --keepParent "${APP_BUNDLE}" "${APP_BUNDLE_ZIP}"
|
||||
echo "Requesting Notarization..."
|
||||
xcrun altool --notarize-app --primary-bundle-id "com.hicknhacksoftware.MacPass.zip" --username "${USERNAME}" --password "${PASSWORD}" --file "${APP_BUNDLE_ZIP}"
|
||||
#xcrun stapler staple "${APP_BUNDLE}"
|
||||
#xmllint --xpath "/plist/dict/key[contains(text(),'success-message')]::following-sibling" status.xml
|
||||
Reference in New Issue
Block a user