121 lines
4.0 KiB
JavaScript
121 lines
4.0 KiB
JavaScript
const { systemPreferences, shell, desktopCapturer } = require('electron');
|
|
const permissionRepository = require('../repositories/permission');
|
|
|
|
class PermissionService {
|
|
_getAuthService() {
|
|
return require('./authService');
|
|
}
|
|
|
|
async checkSystemPermissions() {
|
|
const permissions = {
|
|
microphone: 'unknown',
|
|
screen: 'unknown',
|
|
keychain: 'unknown',
|
|
needsSetup: true
|
|
};
|
|
|
|
try {
|
|
if (process.platform === 'darwin') {
|
|
permissions.microphone = systemPreferences.getMediaAccessStatus('microphone');
|
|
permissions.screen = systemPreferences.getMediaAccessStatus('screen');
|
|
permissions.keychain = await this.checkKeychainCompleted(this._getAuthService().getCurrentUserId()) ? 'granted' : 'unknown';
|
|
permissions.needsSetup = permissions.microphone !== 'granted' || permissions.screen !== 'granted' || permissions.keychain !== 'granted';
|
|
} else {
|
|
permissions.microphone = 'granted';
|
|
permissions.screen = 'granted';
|
|
permissions.keychain = 'granted';
|
|
permissions.needsSetup = false;
|
|
}
|
|
|
|
console.log('[Permissions] System permissions status:', permissions);
|
|
return permissions;
|
|
} catch (error) {
|
|
console.error('[Permissions] Error checking permissions:', error);
|
|
return {
|
|
microphone: 'unknown',
|
|
screen: 'unknown',
|
|
keychain: 'unknown',
|
|
needsSetup: true,
|
|
error: error.message
|
|
};
|
|
}
|
|
}
|
|
|
|
async requestMicrophonePermission() {
|
|
if (process.platform !== 'darwin') {
|
|
return { success: true };
|
|
}
|
|
|
|
try {
|
|
const status = systemPreferences.getMediaAccessStatus('microphone');
|
|
console.log('[Permissions] Microphone status:', status);
|
|
if (status === 'granted') {
|
|
return { success: true, status: 'granted' };
|
|
}
|
|
|
|
const granted = await systemPreferences.askForMediaAccess('microphone');
|
|
return {
|
|
success: granted,
|
|
status: granted ? 'granted' : 'denied'
|
|
};
|
|
} catch (error) {
|
|
console.error('[Permissions] Error requesting microphone permission:', error);
|
|
return {
|
|
success: false,
|
|
error: error.message
|
|
};
|
|
}
|
|
}
|
|
|
|
async openSystemPreferences(section) {
|
|
if (process.platform !== 'darwin') {
|
|
return { success: false, error: 'Not supported on this platform' };
|
|
}
|
|
|
|
try {
|
|
if (section === 'screen-recording') {
|
|
try {
|
|
console.log('[Permissions] Triggering screen capture request to register app...');
|
|
await desktopCapturer.getSources({
|
|
types: ['screen'],
|
|
thumbnailSize: { width: 1, height: 1 }
|
|
});
|
|
console.log('[Permissions] App registered for screen recording');
|
|
} catch (captureError) {
|
|
console.log('[Permissions] Screen capture request triggered (expected to fail):', captureError.message);
|
|
}
|
|
|
|
// await shell.openExternal('x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture');
|
|
}
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error('[Permissions] Error opening system preferences:', error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
async markKeychainCompleted() {
|
|
try {
|
|
await permissionRepository.markKeychainCompleted(this._getAuthService().getCurrentUserId());
|
|
console.log('[Permissions] Marked keychain as completed');
|
|
return { success: true };
|
|
} catch (error) {
|
|
console.error('[Permissions] Error marking keychain as completed:', error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
async checkKeychainCompleted(uid) {
|
|
try {
|
|
const completed = permissionRepository.checkKeychainCompleted(uid);
|
|
console.log('[Permissions] Keychain completed status:', completed);
|
|
return completed;
|
|
} catch (error) {
|
|
console.error('[Permissions] Error checking keychain completed status:', error);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
const permissionService = new PermissionService();
|
|
module.exports = permissionService;
|