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 * 033 */ 034public class PlexusInteractivityCredentialsProvider extends CredentialsProvider { 035 private boolean interactive; 036 private final Prompter prompter; 037 038 public PlexusInteractivityCredentialsProvider(Prompter prompter) { 039 this.interactive = true; 040 this.prompter = prompter; 041 } 042 043 @Override 044 public boolean get(URIish uri, CredentialItem... items) { 045 for (CredentialItem item : items) { 046 try { 047 get(uri, item); 048 } catch (PrompterException e) { 049 throw new IllegalStateException("Cannot prompt user", e); 050 } 051 } 052 return true; 053 } 054 055 private void get(URIish uri, CredentialItem item) throws PrompterException { 056 if (item instanceof CredentialItem.InformationalMessage) { 057 // works even in non-interactive mode 058 prompter.showMessage(item.getPromptText()); 059 } else { 060 if (!interactive) { 061 throw new UnsupportedCredentialItem( 062 uri, "Cannot provide '" + item.getClass() + "' in non-interactive mode"); 063 } 064 if (item instanceof CredentialItem.YesNoType) { 065 CredentialItem.YesNoType yesNoItem = (CredentialItem.YesNoType) item; 066 String value = prompter.prompt(item.getPromptText(), Arrays.asList("yes", "no")); 067 yesNoItem.setValue(value.equals("yes")); 068 } else if (item instanceof CredentialItem.Password) { 069 CredentialItem.Password passwordItem = (CredentialItem.Password) item; 070 String password = prompter.promptForPassword(passwordItem.getPromptText()); 071 passwordItem.setValue(password.toCharArray()); 072 } else if (item instanceof CredentialItem.Username) { 073 CredentialItem.Username usernameItem = (CredentialItem.Username) item; 074 String username = prompter.prompt(usernameItem.getPromptText()); 075 usernameItem.setValue(username); 076 } else if (item instanceof CredentialItem.StringType) { 077 CredentialItem.StringType stringItem = (CredentialItem.StringType) item; 078 String value = prompter.prompt(stringItem.getPromptText()); 079 stringItem.setValue(value); 080 } else if (item instanceof CredentialItem.CharArrayType) { 081 CredentialItem.CharArrayType charArrayItem = (CredentialItem.CharArrayType) item; 082 String value = prompter.prompt(charArrayItem.getPromptText()); 083 charArrayItem.setValue(value.toCharArray()); 084 } else { 085 throw new UnsupportedCredentialItem( 086 uri, "This provider does not support items of type '" + item.getClass() + "'"); 087 } 088 } 089 } 090 091 public void setInteractive(boolean interactive) { 092 this.interactive = interactive; 093 } 094 095 @Override 096 public boolean isInteractive() { 097 return interactive; 098 } 099 100 @Override 101 public boolean supports(CredentialItem... items) { 102 return true; 103 } 104}