From 38b35cd6d939a2b2b8cdcf84cdaa59d919f3870d Mon Sep 17 00:00:00 2001 From: SerhiiGadzhilov <71632867+SerhiiGadzhilov@users.noreply.github.com> Date: Thu, 19 Nov 2020 14:07:16 +0300 Subject: [PATCH 1/4] SYNERGY-551 update macOS installer. (#6844) * SYNERGY-551 Update macOS installer * New icon * SYNERGY-551 Update macOS installer. * SYNERGY-551 Update ChangeLog * Fix GitHub action for Windows build. * Using new version of setup-msbuild * Fixed env. variables --- .github/workflows/job-build-windows.yml | 10 +- CI/MacOS/installator_settings.py | 162 ++++++++++++++++++++++++ CI/MacOS/mac-build.yml | 12 +- ChangeLog | 1 + 4 files changed, 177 insertions(+), 8 deletions(-) create mode 100644 CI/MacOS/installator_settings.py diff --git a/.github/workflows/job-build-windows.yml b/.github/workflows/job-build-windows.yml index 2f138219d..f9c5b2cc2 100644 --- a/.github/workflows/job-build-windows.yml +++ b/.github/workflows/job-build-windows.yml @@ -16,6 +16,8 @@ jobs: BONJOUR_BASE_DIR: ${{ github.workspace }}\deps\bonjour QT_VERSION: 5.12.6 QT_BASE_URL: http://qt.mirror.constant.com/ + BONJOUR_SDK_HOME: ${{ github.workspace }}\deps\bonjour\BonjourSDK + CMAKE_PREFIX_PATH: ${{ github.workspace }}\deps\Qt\5.12.6\msvc2017_64\ steps: - uses: actions/checkout@v2 @@ -35,9 +37,6 @@ jobs: cd $env:QT_BASE_DIR\$env:QT_VERSION\msvc2017_64 dir - - name: set QT path - run: echo "::set-env name=CMAKE_PREFIX_PATH::$env:QT_BASE_DIR\$env:QT_VERSION\msvc2017_64\" - - name: Cache Bonjour id: cache-bonjour uses: actions/cache@v1 @@ -53,11 +52,8 @@ jobs: $client.DownloadFile("https://binaries.symless.com/bonjour/BonjourSDK.zip",".\bonjoursdk.zip") [System.IO.Compression.ZipFile]::ExtractToDirectory(".\bonjoursdk.zip", $env:BONJOUR_BASE_DIR) - - name: set Bonjour path - run: echo "::set-env name=BONJOUR_SDK_HOME::$env:BONJOUR_BASE_DIR\BonjourSDK" - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v1.0.1 + uses: microsoft/setup-msbuild@v1.0.2 - name: Build run: | diff --git a/CI/MacOS/installator_settings.py b/CI/MacOS/installator_settings.py new file mode 100644 index 000000000..31de00c03 --- /dev/null +++ b/CI/MacOS/installator_settings.py @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import biplist +import os.path + +# Use like this: dmgbuild -s settings.py "Test Volume" test.dmg +# dmgbuild -s settings.py -D app=/path/to/My.app "My Application" MyApp.dmg + +# .. Useful stuff .............................................................. + +application = defines.get('app', 'Synergy.app') +appname = os.path.basename(application) + +def icon_from_app(app_path): + plist_path = os.path.join(app_path, 'Contents', 'Info.plist') + plist = biplist.readPlist(plist_path) + icon_name = plist['CFBundleIconFile'] + icon_root,icon_ext = os.path.splitext(icon_name) + if not icon_ext: + icon_ext = '.icns' + icon_name = icon_root + icon_ext + return os.path.join(app_path, 'Contents', 'Resources', icon_name) + +# .. Basics .................................................................... + +# Volume format (see hdiutil create -help) +format = defines.get('format', 'UDBZ') + +# Volume size +size = defines.get('size', None) + +# Files to include +files = [ application ] + +# Symlinks to create +symlinks = { 'Applications': '/Applications' } + +# Volume icon +# +# You can either define icon, in which case that icon file will be copied to the +# image, *or* you can define badge_icon, in which case the icon file you specify +# will be used to badge the system's Removable Disk icon +# +#icon = '/path/to/icon.icns' +badge_icon = icon_from_app(application) + +# Where to put the icons +icon_locations = { + appname: (144, 190), + 'Applications': (455, 190), + '.background.png': (150, 450), + '.VolumeIcon.icns': (455, 450) + } + +# .. Window configuration ...................................................... + +# Background +# +# This is a STRING containing any of the following: +# +# #3344ff - web-style RGB color +# #34f - web-style RGB color, short form (#34f == #3344ff) +# rgb(1,0,0) - RGB color, each value is between 0 and 1 +# hsl(120,1,.5) - HSL (hue saturation lightness) color +# hwb(300,0,0) - HWB (hue whiteness blackness) color +# cmyk(0,1,0,0) - CMYK color +# goldenrod - X11/SVG named color +# builtin-arrow - A simple built-in background with a blue arrow +# /foo/bar/baz.png - The path to an image file +# +# The hue component in hsl() and hwb() may include a unit; it defaults to +# degrees ('deg'), but also supports radians ('rad') and gradians ('grad' +# or 'gon'). +# +# Other color components may be expressed either in the range 0 to 1, or +# as percentages (e.g. 60% is equivalent to 0.6). +background = defines.get('background', 'builtin-arrow') + +show_status_bar = False +show_tab_view = False +show_toolbar = False +show_pathbar = False +show_sidebar = False +sidebar_width = 180 + +# Window position in ((x, y), (w, h)) format +window_rect = ((200, 120), (620, 420)) + +# Select the default view; must be one of +# +# 'icon-view' +# 'list-view' +# 'column-view' +# 'coverflow' +# +default_view = 'icon-view' + +# General view configuration +show_icon_preview = False + +# Set these to True to force inclusion of icon/list view settings (otherwise +# we only include settings for the default view) +include_icon_view_settings = 'auto' +include_list_view_settings = 'auto' + +# .. Icon view configuration ................................................... + +arrange_by = None +grid_offset = (0, 0) +grid_spacing = 100 +scroll_position = (0, 0) +label_pos = 'bottom' # or 'right' +text_size = 16 +icon_size = 100 + +# .. List view configuration ................................................... + +# Column names are as follows: +# +# name +# date-modified +# date-created +# date-added +# date-last-opened +# size +# kind +# label +# version +# comments +# +list_icon_size = 16 +list_text_size = 12 +list_scroll_position = (0, 0) +list_sort_by = 'name' +list_use_relative_dates = True +list_calculate_all_sizes = False, +list_columns = ('name', 'date-modified', 'size', 'kind', 'date-added') +list_column_widths = { + 'name': 300, + 'date-modified': 181, + 'date-created': 181, + 'date-added': 181, + 'date-last-opened': 181, + 'size': 97, + 'kind': 115, + 'label': 100, + 'version': 75, + 'comments': 300, + } +list_column_sort_directions = { + 'name': 'ascending', + 'date-modified': 'descending', + 'date-created': 'descending', + 'date-added': 'descending', + 'date-last-opened': 'descending', + 'size': 'descending', + 'kind': 'ascending', + 'label': 'ascending', + 'version': 'ascending', + 'comments': 'ascending', + } \ No newline at end of file diff --git a/CI/MacOS/mac-build.yml b/CI/MacOS/mac-build.yml index 59ae5f3af..69cad1d92 100644 --- a/CI/MacOS/mac-build.yml +++ b/CI/MacOS/mac-build.yml @@ -11,6 +11,11 @@ steps: script: 'brew install qt' displayName: 'Installing QT' + - task: CmdLine@2 + inputs: + script: 'pip install dmgbuild' + displayName: 'Installing dmgbuild' + - task: CmdLine@2 inputs: script: | @@ -76,7 +81,12 @@ steps: - task: CmdLine@2 inputs: script: | - hdiutil create -volname Synergy -srcfolder $(Build.Repository.LocalPath)/build/bundle/ -ov -format UDZO $(SYNERGY_DMG_FILENAME) + dmgbuild \ + -s CI/MacOS/installator_settings.py \ + -D app=$(Build.Repository.LocalPath)/build/bundle/Synergy.app \ + -D background=$(Build.Repository.LocalPath)/build/bundle/Synergy.app/Contents/Resources/installer_background.png \ + "Synergy" \ + $(SYNERGY_DMG_FILENAME) mkdir pkg mv $(SYNERGY_DMG_FILENAME) pkg/ cd pkg diff --git a/ChangeLog b/ChangeLog index 04efeb976..1168e4460 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,7 @@ Bug fixes: Enhancements: - #6836 Enabling Github Code Scanning - #6841 Windows installer has been updated. +- #6844 macOS installer has been updated. v1.12.x-snapshot =========== From b3151ec1ce6342c4e187e6a3a35a170928208e88 Mon Sep 17 00:00:00 2001 From: SerhiiGadzhilov <71632867+SerhiiGadzhilov@users.noreply.github.com> Date: Thu, 19 Nov 2020 17:21:07 +0300 Subject: [PATCH 2/4] SYNERGY-556 TLS certificate is not created by default. (#6846) * SYNERGY-556 TLS certificate is not created by default for Synergy Enterprise. * SYNERGY-556 Update ChangeLog --- ChangeLog | 1 + src/gui/src/AppConfig.cpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index 1168e4460..a91fd115c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,7 @@ Bug fixes: - #6831 Incorporating Sonar's major - #6837 Memory leaks on macOS system - #6838 Enterprise asks for serial key on Linux system +- #6846 TLS certificate is not created by default for Synergy Enterprise. Enhancements: - #6836 Enabling Github Code Scanning diff --git a/src/gui/src/AppConfig.cpp b/src/gui/src/AppConfig.cpp index bf646aa7c..1eae3dcfe 100644 --- a/src/gui/src/AppConfig.cpp +++ b/src/gui/src/AppConfig.cpp @@ -269,6 +269,10 @@ void AppConfig::loadSettings() m_TLSCertificatePath = loadSetting(kTLSCertPath, certificateFilename).toString(); m_TLSKeyLength = loadSetting(kTLSKeyLength, "2048").toString(); + if (getCryptoEnabled()) { + generateCertificate(); + } + } void AppConfig::saveSettings() From 0e742345e0f40d63be42fc7022251853deb877dd Mon Sep 17 00:00:00 2001 From: Serhii Hadzhilov Date: Thu, 19 Nov 2020 18:46:18 +0200 Subject: [PATCH 3/4] SYNERGY-551 macOS installer. Added forgotten image --- .../Contents/Resources/installer_background.png | Bin 0 -> 9976 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dist/macos/bundle/Synergy.app/Contents/Resources/installer_background.png diff --git a/dist/macos/bundle/Synergy.app/Contents/Resources/installer_background.png b/dist/macos/bundle/Synergy.app/Contents/Resources/installer_background.png new file mode 100644 index 0000000000000000000000000000000000000000..d368e82e4a288092a5bd0c63843e1891cc0ac726 GIT binary patch literal 9976 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 literal 0 HcmV?d00001 From 9822d3ed361cd70d11a36ced4a76b538e002d070 Mon Sep 17 00:00:00 2001 From: Nick Bolton Date: Thu, 19 Nov 2020 16:54:18 +0000 Subject: [PATCH 4/4] Updated link to blog (to show newer posts) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1651163bd..c5edf8434 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This is the open source core component of Synergy, a keyboard and mouse sharing **[We're hiring!](https://careers.symless.com/)** *Join the Synergy Team (Node.js, React, C++)* -**News:** [We Are Putting UX First](https://symless.com/blog/putting-ux-first) (Symless Blog) +**News:** Visit the [Symless blog](https://symless.com/blog/) for updates ## Recommended