/********************************************************************************
 * Copyright (C) 2018-2020 Red Hat, Inc. and others.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the Eclipse
 * Public License v. 2.0 are satisfied: GNU General Public License, version 2
 * with the GNU Classpath Exception which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 ********************************************************************************/ import { join } from 'path' ; import { homedir } from 'os' ; import { injectable } from 'inversify' ; import * as drivelist from 'drivelist' ; import { EnvVariable , EnvVariablesServer } from '../../common/env-variables' ; import { isWindows } from '../../common/os' ; import { FileUri } from '../file-uri' ; @ injectable ( ) export class EnvVariablesServerImpl implements EnvVariablesServer { protected readonly envs : { [ key ] : EnvVariable ; } = { } ; protected readonly homeDirUri = FileUri . create ( homedir ( ) ) . toString ( ) ; protected readonly configDirUri : Promise < string > ; constructor ( ) { this . configDirUri = this . createConfigDirUri ( ) ; this . configDirUri . then ( configDirUri => console . log ( `Configuration directory URI: '${ configDirUri }'` ) ) ; const prEnv = process . env ; Object . keys ( prEnv ) . forEach ( ( key ) => { let keyName = key ; if ( isWindows ) { keyName = key . toLowerCase ( ) ; } this . envs [ keyName ] = { 'name' : keyName , 'value' : prEnv [ key ] } ; } ) ; } protected async createConfigDirUri ( ) { return FileUri . create ( process . env . THEIA_CONFIG_DIR || join ( homedir ( ) , '.theia' ) ) . toString ( ) ; } async getExecPath ( ) { return process . execPath ; } async getVariables ( ) { return Object . keys ( this . envs ) . map ( key => this . envs [ key ] ) ; } async getValue ( key ) { if ( isWindows ) { key = key . toLowerCase ( ) ; } return this . envs [ key ] ; } getConfigDirUri ( ) { return this . configDirUri ; } async getHomeDirUri ( ) { return this . homeDirUri ; } async getDrives ( ) { const uris = [ ] ; const drives = await drivelist . list ( ) ; for ( const drive of drives ) { for ( const mountpoint of drive . mountpoints ) { if ( this . filterHiddenPartitions ( mountpoint . path ) ) { uris . push ( FileUri . create ( mountpoint . path ) . toString ( ) ) ; } } } return uris ; } /**
     * Filters hidden and system partitions.
     */ protected filterHiddenPartitions ( path ) { if ( path === '/private/var/vm' ) { return false ; } if ( path === '/boot/efi' ) { return false ; } return true ; } }