From 971af0868c6d9acde839f8400265ec305f26df34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zsef=20Farkas?= Date: Mon, 6 Mar 2017 21:48:36 +0100 Subject: [PATCH] Linux permission setup Closes #260 --- .../privilege-checker.component.ts | 44 +++++++++++++++++-- electron/src/custom_types/sudo-prompt.d.ts | 1 + electron/src/vendor.ts | 3 ++ electron/src/webpack.config.js | 6 ++- package.json | 1 + .../50-uhk-bootloader-write-access.rules | 0 .../50-uhk-write-access.rules | 4 +- rules/setup-rules.sh | 6 +++ 8 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 electron/src/custom_types/sudo-prompt.d.ts create mode 100644 electron/src/vendor.ts rename 50-uhk-bootloader-write-access.rules => rules/50-uhk-bootloader-write-access.rules (100%) rename 50-uhk-write-access.rules => rules/50-uhk-write-access.rules (70%) create mode 100755 rules/setup-rules.sh diff --git a/electron/src/components/privilege-checker/privilege-checker.component.ts b/electron/src/components/privilege-checker/privilege-checker.component.ts index 399acbf7..529f0d68 100644 --- a/electron/src/components/privilege-checker/privilege-checker.component.ts +++ b/electron/src/components/privilege-checker/privilege-checker.component.ts @@ -2,12 +2,17 @@ import { Component } from '@angular/core'; import { Router } from '@angular/router'; import { Observable } from 'rxjs/Observable'; +import { ReplaySubject } from 'rxjs/ReplaySubject'; import 'rxjs/add/observable/of'; import 'rxjs/add/observable/throw'; import 'rxjs/add/operator/distinctUntilChanged'; import 'rxjs/add/operator/ignoreElements'; import 'rxjs/add/operator/takeWhile'; +import { remote } from 'electron'; +import * as path from 'path'; +import * as sudo from 'sudo-prompt'; + import { UhkDeviceService } from './../../services/uhk-device.service'; @Component({ @@ -27,13 +32,44 @@ export class PrivilegeCheckerComponent { router.navigate(['/detection']); } }); - } - checkPermissions(): Observable { - return Observable.of(true); + setUpPermissions(): void { + let permissionSetter: Observable; + switch (process.platform) { + case 'linux': + permissionSetter = this.setUpPermissionsOnLinux(); + break; + default: + permissionSetter = Observable.throw('Permissions couldn\'t be set. Invalid platform: ' + process.platform); + break; + } + permissionSetter.subscribe({ + error: e => console.error(e), + complete: () => { + console.log('Permissions has been successfully set'); + this.uhkDevice.initialize(); + this.router.navigate(['/']); + } + }); } - setUpPermissions() { } + private setUpPermissionsOnLinux(): Observable { + const subject = new ReplaySubject(); + const rootDir = path.resolve(path.join(remote.process.cwd(), remote.process.argv[1]), '..'); + const scriptPath = path.resolve(rootDir, 'rules/setup-rules.sh'); + const options = { + name: 'Setting UHK access rules' + }; + sudo.exec(`sh ${scriptPath}`, options, (error: any) => { + if (error) { + subject.error(error); + } else { + subject.complete(); + } + }); + + return subject.asObservable(); + } } diff --git a/electron/src/custom_types/sudo-prompt.d.ts b/electron/src/custom_types/sudo-prompt.d.ts new file mode 100644 index 00000000..2bafb92b --- /dev/null +++ b/electron/src/custom_types/sudo-prompt.d.ts @@ -0,0 +1 @@ +declare module 'sudo-prompt'; diff --git a/electron/src/vendor.ts b/electron/src/vendor.ts new file mode 100644 index 00000000..177b3a02 --- /dev/null +++ b/electron/src/vendor.ts @@ -0,0 +1,3 @@ +import './shared/vendor.ts'; + +import 'sudo-prompt'; diff --git a/electron/src/webpack.config.js b/electron/src/webpack.config.js index e4432cc1..f13aa897 100644 --- a/electron/src/webpack.config.js +++ b/electron/src/webpack.config.js @@ -10,7 +10,7 @@ var rootDir = path.resolve(__dirname, '../'); module.exports = { entry: { polyfills: path.resolve(rootDir, 'src/shared/polyfills.ts'), - vendor: path.resolve(rootDir, 'src/shared/vendor.ts'), + vendor: path.resolve(rootDir, 'src/vendor.ts'), app: path.resolve(rootDir, 'src/main.ts') }, output: { @@ -75,6 +75,10 @@ module.exports = { from: 'images', to: 'images' }, + { + from: 'rules', + to: 'rules' + }, { from: 'node_modules/usb', to: 'vendor/usb' diff --git a/package.json b/package.json index a6e78e5f..cc198dff 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "ng2-select2": "1.0.0-beta.10", "rxjs": "5.1.1", "select2": "^4.0.3", + "sudo-prompt": "^6.2.1", "typescript": "2.1.6", "usb": "git+https://github.com/aktary/node-usb.git", "xml-loader": "^1.1.0", diff --git a/50-uhk-bootloader-write-access.rules b/rules/50-uhk-bootloader-write-access.rules similarity index 100% rename from 50-uhk-bootloader-write-access.rules rename to rules/50-uhk-bootloader-write-access.rules diff --git a/50-uhk-write-access.rules b/rules/50-uhk-write-access.rules similarity index 70% rename from 50-uhk-write-access.rules rename to rules/50-uhk-write-access.rules index b4c35622..e86c7630 100644 --- a/50-uhk-write-access.rules +++ b/rules/50-uhk-write-access.rules @@ -1,5 +1,5 @@ # These are the udev rules for accessing the USB interfaces of the UHK as non-root users. # Copy this file to /etc/udev/rules.d and physically reconnect the UHK afterwards. # TODO: Restore VID to 16d0 for the latest prototype. -SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d2", ATTRS{idProduct}=="05e[abcd]", MODE:="0666" -KERNEL=="ttyACM*", ATTRS{idVendor}=="16d2", ATTRS{idProduct}=="05ec", MODE:="0666", SYMLINK+="uhk-right-bootloader" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d3", ATTRS{idProduct}=="05e[abcd]", MODE:="0666" +KERNEL=="ttyACM*", ATTRS{idVendor}=="16d3", ATTRS{idProduct}=="05ec", MODE:="0666", SYMLINK+="uhk-right-bootloader" diff --git a/rules/setup-rules.sh b/rules/setup-rules.sh new file mode 100755 index 00000000..ed497b4a --- /dev/null +++ b/rules/setup-rules.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +cd $(dirname $0) +cp 50-uhk-write-access.rules /etc/udev/rules.d +udevadm trigger +udevadm settle