package io.fathom.cloud.commands; import io.fathom.cloud.CloudException; import io.fathom.cloud.server.auth.Auth; import io.fathom.cloud.services.AuthService; import java.util.List; import javax.inject.Inject; import org.kohsuke.args4j.Option; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class AuthenticatedCmdlet extends TypedCmdlet { private static final Logger log = LoggerFactory.getLogger(AuthenticatedCmdlet.class); public AuthenticatedCmdlet(String command) { super(command); } @Option(name = "-u", usage = "username", required = true) public String username; @Option(name = "-p", usage = "password", required = true) public String password; @Option(name = "-proj", usage = "project", required = false) public String projectName; @Inject protected AuthService authService; protected Auth getAuth(String project) throws CloudException { Auth unscoped = getUnscopedAuth(); List<Long> projectIds = authService.resolveProjectName(unscoped, project); if (projectIds.size() == 0) { throw new IllegalArgumentException("Cannot find project"); } if (projectIds.size() != 1) { throw new IllegalArgumentException("The project name is ambiguous"); } Long projectId = projectIds.get(0); Auth auth = authService.authenticate(projectId, username, password); if (auth == null) { throw new IllegalArgumentException("Cannot authenticate to project"); } return auth; } Auth unscopedAuth; protected Auth getUnscopedAuth() throws CloudException { if (unscopedAuth == null) { Auth unscoped = authService.authenticate(null, username, password); if (unscoped == null) { throw new IllegalArgumentException("Cannot authenticate"); } this.unscopedAuth = unscoped; } return unscopedAuth; } protected Auth getAuth() throws CloudException { if (projectName == null) { return getUnscopedAuth(); } else { return getAuth(projectName); } } }