/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.ext.machine.server.ssh; import org.eclipse.che.api.core.ConflictException; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.core.model.user.User; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.notification.EventSubscriber; import org.eclipse.che.api.ssh.server.SshManager; import org.eclipse.che.api.user.server.UserManager; import org.eclipse.che.api.workspace.server.event.WorkspaceCreatedEvent; import org.eclipse.che.api.workspace.server.event.WorkspaceRemovedEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Singleton; /** * Creates SSH keyPair each time a workspace is created (and delete it when workspace is removed) * * @author Florent Benoit */ @Singleton // must be eager public class WorkspaceSshKeys { /** * Logger. */ private static final Logger LOG = LoggerFactory.getLogger(WorkspaceSshKeys.class); /** * The event service used to subscribe on create and delete events on any workspaces. */ private final EventService eventService; /** * SSH manager handling ssh keys. Used to generate ssh keypair or remove the default keypair when workspace is removed. */ private final SshManager sshManager; /** * User manager used to get user from given namespace. */ private final UserManager userManager; /** * Default injection by using event service and ssh manager. * * @param eventService * used to get CREATE/DELETE events for workspace * @param sshManager * used to generate/remove default ssh keys */ @Inject public WorkspaceSshKeys(final EventService eventService, final SshManager sshManager, final UserManager userManager) { this.eventService = eventService; this.sshManager = sshManager; this.userManager = userManager; } /** * When component is initialized, subscribe to workspace events in order to generate/delete ssh keys. */ @PostConstruct public void start() { eventService.subscribe(new EventSubscriber<WorkspaceCreatedEvent>() { @Override public void onEvent(WorkspaceCreatedEvent workspaceCreatedEvent) { final String userId; try { final User user = userManager.getByName(workspaceCreatedEvent.getWorkspace().getNamespace()); userId = user.getId(); } catch (NotFoundException | ServerException e) { LOG.error("Unable to get owner of the workspace {} with namespace {}", workspaceCreatedEvent.getWorkspace().getId(), workspaceCreatedEvent.getWorkspace().getNamespace()); return; } // Register default SSH keypair for this workspace. try { sshManager.generatePair(userId, "workspace", workspaceCreatedEvent.getWorkspace().getId()); } catch (ServerException | ConflictException e) { // Conflict shouldn't happen as workspace id is new each time. LOG.error("Unable to generate a default ssh pair for the workspace with ID {}", workspaceCreatedEvent.getWorkspace().getId(), e); } } }); eventService.subscribe(new EventSubscriber<WorkspaceRemovedEvent>() { @Override public void onEvent(WorkspaceRemovedEvent workspaceRemovedEvent) { final String userId; try { final User user = userManager.getByName(workspaceRemovedEvent.getWorkspace().getNamespace()); userId = user.getId(); } catch (NotFoundException | ServerException e) { LOG.error("Unable to get owner of the workspace {} with namespace {}", workspaceRemovedEvent.getWorkspace().getId(), workspaceRemovedEvent.getWorkspace().getNamespace()); return; } // Unregister default SSH keypair for this workspace (if any) try { sshManager.removePair(userId, "workspace", workspaceRemovedEvent.getWorkspace().getId()); } catch (NotFoundException e) { LOG.debug("Do not remove default keypair from workspace {} as it is not existing (workspace ID {})", workspaceRemovedEvent.getWorkspace().getConfig().getName(), workspaceRemovedEvent.getWorkspace().getId()); } catch (ServerException e) { LOG.error("Error when trying to remove default ssh pair for the workspace {} (workspace ID {})", workspaceRemovedEvent.getWorkspace().getConfig().getName(), workspaceRemovedEvent.getWorkspace().getId()); } } }); } }