001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019package org.apache.maven.scm.provider.git.jgit.command; 020 021import java.util.Arrays; 022 023import org.codehaus.plexus.components.interactivity.Prompter; 024import org.codehaus.plexus.components.interactivity.PrompterException; 025import org.eclipse.jgit.errors.UnsupportedCredentialItem; 026import org.eclipse.jgit.transport.CredentialItem; 027import org.eclipse.jgit.transport.CredentialsProvider; 028import org.eclipse.jgit.transport.URIish; 029 030/** 031 * {@link CredentialsProvider} leveraging the {@link Prompter} component. 032 */ 033public class PlexusInteractivityCredentialsProvider extends CredentialsProvider { 034 private boolean interactive; 035 private final Prompter prompter; 036 037 public PlexusInteractivityCredentialsProvider(Prompter prompter) { 038 this.interactive = true; 039 this.prompter = prompter; 040 } 041 042 @Override 043 public boolean get(URIish uri, CredentialItem... items) { 044 for (CredentialItem item : items) { 045 try { 046 get(uri, item); 047 } catch (PrompterException e) { 048 throw new IllegalStateException("Cannot prompt user", e); 049 } 050 } 051 return true; 052 } 053 054 private void get(URIish uri, CredentialItem item) throws PrompterException { 055 if (item instanceof CredentialItem.InformationalMessage) { 056 // works even in non-interactive mode 057 prompter.showMessage(item.getPromptText()); 058 } else { 059 if (!interactive) { 060 throw new UnsupportedCredentialItem( 061 uri, "Cannot provide '" + item.getClass() + "' in non-interactive mode"); 062 } 063 if (item instanceof CredentialItem.YesNoType) { 064 CredentialItem.YesNoType yesNoItem = (CredentialItem.YesNoType) item; 065 String value = prompter.prompt(item.getPromptText(), Arrays.asList("yes", "no")); 066 yesNoItem.setValue(value.equals("yes")); 067 } else if (item instanceof CredentialItem.Password) { 068 CredentialItem.Password passwordItem = (CredentialItem.Password) item; 069 String password = prompter.promptForPassword(passwordItem.getPromptText()); 070 passwordItem.setValue(password.toCharArray()); 071 } else if (item instanceof CredentialItem.Username) { 072 CredentialItem.Username usernameItem = (CredentialItem.Username) item; 073 String username = prompter.prompt(usernameItem.getPromptText()); 074 usernameItem.setValue(username); 075 } else if (item instanceof CredentialItem.StringType) { 076 CredentialItem.StringType stringItem = (CredentialItem.StringType) item; 077 String value = prompter.prompt(stringItem.getPromptText()); 078 stringItem.setValue(value); 079 } else if (item instanceof CredentialItem.CharArrayType) { 080 CredentialItem.CharArrayType charArrayItem = (CredentialItem.CharArrayType) item; 081 String value = prompter.prompt(charArrayItem.getPromptText()); 082 charArrayItem.setValue(value.toCharArray()); 083 } else { 084 throw new UnsupportedCredentialItem( 085 uri, "This provider does not support items of type '" + item.getClass() + "'"); 086 } 087 } 088 } 089 090 public void setInteractive(boolean interactive) { 091 this.interactive = interactive; 092 } 093 094 @Override 095 public boolean isInteractive() { 096 return interactive; 097 } 098 099 @Override 100 public boolean supports(CredentialItem... items) { 101 return true; 102 } 103}