blob: 410ed568350d867de38bd841e1ccb789e1abb54b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.ivy.util;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import org.apache.ivy.Ivy;
public final class CredentialsUtil {
@SuppressWarnings("serial")
private static final class CredentialPanel extends JPanel {
private static final int FIELD_LENGTH = 20;
private JTextField userNameField = new JTextField(FIELD_LENGTH);
private JTextField passwordField = new JPasswordField(FIELD_LENGTH);
private JCheckBox rememberDataCB = new JCheckBox("remember my information");
CredentialPanel(Credentials credentials, File passfile) {
GridBagLayout layout = new GridBagLayout();
setLayout(layout);
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(2, 2, 2, 2);
c.gridx = 1;
c.gridheight = 1;
c.gridwidth = 2;
String prompt = credentials.getRealm() != null ? "Enter username and password for \""
+ credentials.getRealm() + "\" at " + credentials.getHost()
: "Enter username and password for " + credentials.getHost();
add(new JLabel(prompt), c);
c.gridy = 1;
c.gridwidth = 1;
add(new JLabel("username: "), c);
c.gridx = 2;
add(userNameField, c);
c.gridx = 1;
c.gridy++;
if (credentials.getUserName() != null) {
userNameField.setText(credentials.getUserName());
}
if (credentials.getPasswd() == null) {
add(new JLabel("passwd: "), c);
c.gridx = 2;
add(passwordField, c);
c.gridx = 1;
c.gridy++;
} else {
passwordField.setText(credentials.getPasswd());
}
if (passfile != null) {
c.gridwidth = 2;
add(rememberDataCB, c);
c.gridy++;
}
c.gridwidth = 2;
add(new JLabel(), c); // spacer
}
}
public static Credentials promptCredentials(Credentials c, File passfile) {
c = loadPassfile(c, passfile);
if (c.getUserName() != null && c.getPasswd() != null) {
return c;
}
CredentialPanel credentialPanel = new CredentialPanel(c, passfile);
if (JOptionPane.showOptionDialog(null, credentialPanel, c.getHost() + " credentials",
JOptionPane.OK_CANCEL_OPTION, 0, new ImageIcon(Ivy.class.getResource("logo.png")),
null, JOptionPane.OK_OPTION) == JOptionPane.OK_OPTION) {
String username = credentialPanel.userNameField.getText();
String passwd = credentialPanel.passwordField.getText();
if (credentialPanel.rememberDataCB.isSelected()) {
Properties props = new EncryptedProperties();
props.setProperty("username", username);
props.setProperty("passwd", passwd);
try (FileOutputStream fos = new FileOutputStream(passfile)) {
props.store(fos, "");
} catch (Exception e) {
Message.warn("error occurred while saving password file " + passfile, e);
}
}
c = new Credentials(c.getRealm(), c.getHost(), username, passwd);
}
return c;
}
public static Credentials loadPassfile(Credentials c, File passfile) {
if (passfile != null && passfile.exists()) {
Properties props = new EncryptedProperties();
try (FileInputStream fis = new FileInputStream(passfile)) {
props.load(fis);
String username = c.getUserName();
String passwd = c.getPasswd();
if (username == null) {
username = props.getProperty("username");
}
if (passwd == null) {
passwd = props.getProperty("passwd");
}
return new Credentials(c.getRealm(), c.getHost(), username, passwd);
} catch (IOException e) {
Message.warn("error occurred while loading password file " + passfile, e);
}
}
return c;
}
private CredentialsUtil() {
}
}