diff --git a/Gruntfile.js b/Gruntfile.js index 10b19b9e..4053a99b 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -47,7 +47,8 @@ module.exports = function (grunt) { const webpackOptions = { date, beta: !!grunt.option('beta'), - sha + sha, + appleTeamId: getCodeSignConfig()?.teamId }; const windowsAppVersionString = { @@ -755,7 +756,7 @@ module.exports = function (grunt) { cmakeConfigure: ['-DCMAKE_OSX_ARCHITECTURES=x86_64'] }, files: { - 'tmp/desktop/KeeWeb-darwin-x64/KeeWeb.app/Contents/MacOS/keeweb-native-messaging-host': + 'tmp/desktop/KeeWeb-darwin-x64/KeeWeb.app/Contents/MacOS/util/keeweb-native-messaging-host': 'extension/native-messaging-host' } }, @@ -765,7 +766,7 @@ module.exports = function (grunt) { cmakeConfigure: ['-DCMAKE_OSX_ARCHITECTURES=arm64'] }, files: { - 'tmp/desktop/KeeWeb-darwin-arm64/KeeWeb.app/Contents/MacOS/keeweb-native-messaging-host': + 'tmp/desktop/KeeWeb-darwin-arm64/KeeWeb.app/Contents/MacOS/util/keeweb-native-messaging-host': 'extension/native-messaging-host' } }, diff --git a/app/scripts/comp/extension/browser-extension-connector.js b/app/scripts/comp/extension/browser-extension-connector.js index 5a3bacb6..ddd03013 100644 --- a/app/scripts/comp/extension/browser-extension-connector.js +++ b/app/scripts/comp/extension/browser-extension-connector.js @@ -55,9 +55,21 @@ const BrowserExtensionConnector = { window.removeEventListener('message', this.browserWindowMessage); }, + isSocketNameTooLong(socketName) { + const maxLength = process.platform === 'win32' ? 256 : 104; + return socketName.length > maxLength; + }, + startDesktopAppListener() { - Launcher.closeOldBrowserExtensionSocket(() => { + Launcher.prepareBrowserExtensionSocket(() => { const sockName = Launcher.getBrowserExtensionSocketName(); + if (this.isSocketNameTooLong(sockName)) { + logger.error( + "Socket name is too big, browser connection won't be possible, probably OS username is very long.", + sockName + ); + return; + } const { createServer } = Launcher.req('net'); this.connectedSockets = []; this.connectedSocketState = new WeakMap(); diff --git a/app/scripts/comp/launcher/launcher-electron.js b/app/scripts/comp/launcher/launcher-electron.js index 4198e38a..91018413 100644 --- a/app/scripts/comp/launcher/launcher-electron.js +++ b/app/scripts/comp/launcher/launcher-electron.js @@ -290,16 +290,23 @@ const Launcher = { return this.getMainWindow().isMaximized(); }, getBrowserExtensionSocketName() { - const userInfo = this.req('os').userInfo(); - if (process.platform === 'win32') { - return `\\\\.\\pipe\\keeweb-browser-${userInfo.username}`; + const { username, uid } = this.req('os').userInfo(); + if (process.platform === 'darwin') { + const teamId = RuntimeInfo.appleTeamId; + return `/Users/${username}/Library/Group Containers/${teamId}.keeweb/browser.sock`; + } else if (process.platform === 'win32') { + return `\\\\.\\pipe\\keeweb-browser-${username}`; } else { - const sockFileName = `keeweb-browser-${userInfo.uid}.sock`; + const sockFileName = `keeweb-browser-${uid}.sock`; return this.joinPath(this.remoteApp().getPath('temp'), sockFileName); } }, - closeOldBrowserExtensionSocket(done) { - if (process.platform === 'win32') { + prepareBrowserExtensionSocket(done) { + if (process.platform === 'darwin') { + const dir = this.req('path').dirname(this.getBrowserExtensionSocketName()); + const fs = this.req('fs'); + fs.mkdir(dir, () => done()); + } else if (process.platform === 'win32') { done(); } else { this.deleteFile(this.getBrowserExtensionSocketName(), done); diff --git a/app/scripts/const/runtime-info.js b/app/scripts/const/runtime-info.js index 78eb8253..1ac7bc37 100644 --- a/app/scripts/const/runtime-info.js +++ b/app/scripts/const/runtime-info.js @@ -3,7 +3,8 @@ const RuntimeInfo = { beta: !!'@@BETA', buildDate: '@@DATE', commit: '@@COMMIT', - devMode: '@@DEVMODE' + devMode: '@@DEVMODE', + appleTeamId: '@@APPLE_TEAM_ID' }; export { RuntimeInfo }; diff --git a/build/webpack.config.js b/build/webpack.config.js index 8492ff13..bce2169d 100644 --- a/build/webpack.config.js +++ b/build/webpack.config.js @@ -130,7 +130,8 @@ function config(options) { search: /@@COMMIT/g, replace: options.sha }, - { search: /@@DEVMODE/g, replace: devMode ? '1' : '' } + { search: /@@DEVMODE/g, replace: devMode ? '1' : '' }, + { search: /@@APPLE_TEAM_ID/g, replace: options.appleTeamId } ] } }, diff --git a/extension/native-messaging-host/src/native-messaging-host.cpp b/extension/native-messaging-host/src/native-messaging-host.cpp index 368b57a5..c878fc9d 100644 --- a/extension/native-messaging-host/src/native-messaging-host.cpp +++ b/extension/native-messaging-host/src/native-messaging-host.cpp @@ -204,6 +204,9 @@ std::string keeweb_pipe_name() { } else { #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) pipe_name = "\\\\.\\pipe\\keeweb-browser-" + std::string{user_info.username}; +#elif __APPLE__ + pipe_name = "/Users/" + std::string{user_info.username} + + "/Library/Group Containers/3LE7JZ657W.keeweb/browser.sock"; #else pipe_name = std::filesystem::temp_directory_path() / ("keeweb-browser-" + std::to_string(user_info.uid) + ".sock"); diff --git a/extension/native-messaging-host/test/native-messaging-host-test.mjs b/extension/native-messaging-host/test/native-messaging-host-test.mjs index 7665809a..02f8a979 100644 --- a/extension/native-messaging-host/test/native-messaging-host-test.mjs +++ b/extension/native-messaging-host/test/native-messaging-host-test.mjs @@ -11,7 +11,10 @@ describe('KeeWeb extension native module host', function () { const userInfo = os.userInfo(); let sockPath; let hostPath; - if (process.platform === 'win32') { + if (process.platform === 'darwin') { + sockPath = `/Users/${userInfo.username}/Library/Group Containers/3LE7JZ657W.keeweb/browser.sock`; + hostPath = 'build/keeweb-native-messaging-host'; + } else if (process.platform === 'win32') { sockPath = `\\\\.\\pipe\\keeweb-browser-${userInfo.username}`; hostPath = 'build\\Debug\\keeweb-native-messaging-host.exe'; } else { diff --git a/package/osx/entitlements.plist b/package/osx/entitlements.plist index 4c344984..f53ea84f 100644 --- a/package/osx/entitlements.plist +++ b/package/osx/entitlements.plist @@ -12,6 +12,10 @@ 3LE7JZ657W.net.antelle.keeweb + com.apple.security.application-groups + + 3LE7JZ657W.keeweb + com.apple.application-identifier 3LE7JZ657W.net.antelle.keeweb com.apple.developer.team-identifier