IDEA-160370 Settings export saves passwords for Error Reporting

This commit is contained in:
Vladimir Krivosheev
2016-09-05 12:31:42 +02:00
parent 28ae441a00
commit 36d4233f2a
6 changed files with 136 additions and 150 deletions
@@ -29,7 +29,7 @@ import java.util.concurrent.atomic.AtomicReference
/**
* requestor is deprecated. Never use it in new code.
*/
data class CredentialAttributes(val serviceName: String, val userName: String? = null, val requestor: Class<*>? = null) {
data class CredentialAttributes @JvmOverloads constructor(val serviceName: String, val userName: String? = null, val requestor: Class<*>? = null) {
}
// user cannot be empty, but password can be
@@ -38,6 +38,8 @@ class Credentials(user: String?, val password: OneTimeString? = null) {
constructor(user: String?, password: CharArray?) : this(user, password?.let { OneTimeString(it) })
constructor(user: String?, password: ByteArray?) : this(user, password?.let { OneTimeString(password) })
val userName = user.nullize()
fun getPasswordAsString() = password?.toString()
@@ -15,58 +15,43 @@
*/
package com.intellij.diagnostic;
import com.intellij.openapi.components.NamedComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMExternalizable;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.util.Base64;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import com.intellij.credentialStore.CredentialAttributes;
import com.intellij.credentialStore.Credentials;
import com.intellij.ide.passwordSafe.PasswordSafe;
import com.intellij.openapi.components.*;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.Nullable;
public class ErrorReportConfigurable implements JDOMExternalizable, NamedComponent {
public String ITN_LOGIN = "";
public String ITN_PASSWORD_CRYPT = "";
public boolean KEEP_ITN_PASSWORD = false;
import java.util.Base64;
public String EMAIL = "";
@State(name = "ErrorReportConfigurable", storages = @Storage(value = "other.xml", deprecated = true, roamingType = RoamingType.DISABLED))
class ErrorReportConfigurable implements PersistentStateComponent<ErrorReportConfigurable.State> {
public static final String SERVICE_NAME = "IntelliJ Platform — JetBrains Account";
static class State {
public String ITN_LOGIN;
public String ITN_PASSWORD_CRYPT;
}
public static ErrorReportConfigurable getInstance() {
return ServiceManager.getService(ErrorReportConfigurable.class);
}
@Nullable
@Override
public void readExternal(Element element) throws InvalidDataException {
DefaultJDOMExternalizer.readExternal(this, element);
if (!KEEP_ITN_PASSWORD) {
ITN_PASSWORD_CRYPT = "";
public State getState() {
return new State();
}
@Override
public void loadState(State state) {
if (!StringUtil.isEmpty(state.ITN_LOGIN) || !StringUtil.isEmpty(state.ITN_PASSWORD_CRYPT)) {
PasswordSafe.getInstance().set(new CredentialAttributes(SERVICE_NAME, state.ITN_LOGIN), new Credentials(state.ITN_LOGIN, Base64.getDecoder().decode(state.ITN_PASSWORD_CRYPT)));
}
}
@Override
public void writeExternal(Element element) throws WriteExternalException {
String itnPassword = ITN_PASSWORD_CRYPT;
if (!KEEP_ITN_PASSWORD) {
ITN_PASSWORD_CRYPT = "";
}
DefaultJDOMExternalizer.writeExternal(this, element);
ITN_PASSWORD_CRYPT = itnPassword;
}
@Override
@NotNull
public String getComponentName() {
return "ErrorReportConfigurable";
}
public String getPlainItnPassword() {
return new String(Base64.decode(getInstance().ITN_PASSWORD_CRYPT), CharsetToolkit.UTF8_CHARSET);
}
public void setPlainItnPassword(String password) {
ITN_PASSWORD_CRYPT = Base64.encode(password.getBytes(CharsetToolkit.UTF8_CHARSET));
@Nullable
public static Credentials getCredentials() {
return PasswordSafe.getInstance().get(new CredentialAttributes(SERVICE_NAME));
}
}
@@ -16,6 +16,8 @@
package com.intellij.diagnostic;
import com.intellij.CommonBundle;
import com.intellij.credentialStore.CredentialAttributesKt;
import com.intellij.credentialStore.Credentials;
import com.intellij.errorreport.bean.ErrorBean;
import com.intellij.errorreport.error.InternalEAPException;
import com.intellij.errorreport.error.NoSuchEAPUserException;
@@ -28,7 +30,6 @@ import com.intellij.idea.IdeaLogger;
import com.intellij.notification.NotificationListener;
import com.intellij.notification.NotificationType;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.ErrorReportSubmitter;
import com.intellij.openapi.diagnostic.IdeaLoggingEvent;
@@ -77,15 +78,13 @@ public class ITNReporter extends ErrorReportSubmitter {
final Consumer<SubmittedReportInfo> callback,
final ErrorBean errorBean,
final String description) {
final DataContext dataContext = DataManager.getInstance().getDataContext(parentComponent);
final Project project = CommonDataKeys.PROJECT.getData(dataContext);
ErrorReportConfigurable settings = ErrorReportConfigurable.getInstance();
if (!settings.KEEP_ITN_PASSWORD && !StringUtil.isEmpty(settings.ITN_LOGIN) && StringUtil.isEmpty(settings.getPlainItnPassword())) {
JetBrainsAccountDialog dlg = new JetBrainsAccountDialog(parentComponent);
if (!dlg.showAndGet()) {
Credentials credentials = ErrorReportConfigurable.getCredentials();
if (!CredentialAttributesKt.isFulfilled(credentials)) {
if (!new JetBrainsAccountDialog(parentComponent).showAndGet()) {
return false;
}
credentials = ErrorReportConfigurable.getCredentials();
}
errorBean.setDescription(description);
@@ -95,17 +94,7 @@ public class ITNReporter extends ErrorReportSubmitter {
errorBean.setPreviousException(previousExceptionThreadId);
}
Throwable t = event.getThrowable();
if (t != null) {
final PluginId pluginId = IdeErrorsDialog.findPluginId(t);
if (pluginId != null) {
final IdeaPluginDescriptor ideaPluginDescriptor = PluginManager.getPlugin(pluginId);
if (ideaPluginDescriptor != null && (!ideaPluginDescriptor.isBundled() || ideaPluginDescriptor.allowBundledUpdate())) {
errorBean.setPluginName(ideaPluginDescriptor.getName());
errorBean.setPluginVersion(ideaPluginDescriptor.getVersion());
}
}
}
setPluginInfo(event, errorBean);
Object data = event.getData();
if (data instanceof AbstractMessage) {
@@ -113,13 +102,14 @@ public class ITNReporter extends ErrorReportSubmitter {
errorBean.setAttachments(((AbstractMessage)data).getIncludedAttachments());
}
String login = settings.ITN_LOGIN;
String password = settings.getPlainItnPassword();
String login = credentials == null ? null : credentials.getUserName();
String password = credentials == null ? null : credentials.getPasswordAsString();
if (StringUtil.isEmptyOrSpaces(login) && StringUtil.isEmptyOrSpaces(password)) {
login = "idea_anonymous";
password = "guest";
}
Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(parentComponent));
ITNProxy.sendError(project, login, password, errorBean, threadId -> {
updatePreviousThreadId(threadId);
String url = ITNProxy.getBrowseUrl(threadId);
@@ -175,6 +165,20 @@ public class ITNReporter extends ErrorReportSubmitter {
return true;
}
public static void setPluginInfo(IdeaLoggingEvent event, ErrorBean errorBean) {
Throwable t = event.getThrowable();
if (t != null) {
final PluginId pluginId = IdeErrorsDialog.findPluginId(t);
if (pluginId != null) {
final IdeaPluginDescriptor ideaPluginDescriptor = PluginManager.getPlugin(pluginId);
if (ideaPluginDescriptor != null && (!ideaPluginDescriptor.isBundled() || ideaPluginDescriptor.allowBundledUpdate())) {
errorBean.setPluginName(ideaPluginDescriptor.getName());
errorBean.setPluginVersion(ideaPluginDescriptor.getVersion());
}
}
}
}
private static void updatePreviousThreadId(Integer threadId) {
previousExceptionThreadId = threadId;
}
@@ -17,6 +17,8 @@ package com.intellij.diagnostic;
import com.intellij.CommonBundle;
import com.intellij.ExtensionPoints;
import com.intellij.credentialStore.CredentialAttributesKt;
import com.intellij.credentialStore.Credentials;
import com.intellij.diagnostic.errordialog.*;
import com.intellij.icons.AllIcons;
import com.intellij.ide.DataManager;
@@ -52,7 +54,6 @@ import com.intellij.openapi.wm.IdeFrame;
import com.intellij.ui.HeaderlessTabbedPane;
import com.intellij.ui.HyperlinkLabel;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.util.Consumer;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.text.DateFormatUtil;
import com.intellij.util.ui.UIUtil;
@@ -71,6 +72,7 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
@@ -80,7 +82,7 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
private static final Logger LOG = Logger.getInstance(IdeErrorsDialog.class.getName());
private final boolean myInternalMode;
@NonNls private static final String ACTIVE_TAB_OPTION = IdeErrorsDialog.class.getName() + "activeTab";
public static DataKey<String> CURRENT_TRACE_KEY = DataKey.create("current_stack_trace_key");
public static final DataKey<String> CURRENT_TRACE_KEY = DataKey.create("current_stack_trace_key");
public static final int COMPONENTS_WIDTH = 670;
public static Collection<Developer> ourDevelopersList = Collections.emptyList();
@@ -287,7 +289,7 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
}
};
if (!myInternalMode) {
myDetailsTabForm = new DetailsTabForm(null, myInternalMode);
myDetailsTabForm = new DetailsTabForm(null, false);
myCommentsTabForm = new CommentsTabForm();
myCommentsTabForm.addCommentsListener(commentsListener);
myTabs.addTab(DiagnosticBundle.message("error.comments.tab.title"), myCommentsTabForm.getContentPane());
@@ -298,7 +300,7 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
if (analyzePlatformAction != null) {
myAnalyzeAction = new AnalyzeAction(analyzePlatformAction);
}
myDetailsTabForm = new DetailsTabForm(myAnalyzeAction, myInternalMode);
myDetailsTabForm = new DetailsTabForm(myAnalyzeAction, true);
myDetailsTabForm.setCommentsAreaVisible(true);
myDetailsTabForm.addCommentsListener(commentsListener);
}
@@ -465,15 +467,16 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
private void updateCredentialsPane(AbstractMessage message) {
if (message != null) {
final ErrorReportSubmitter submitter = getSubmitter(message.getThrowable());
ErrorReportSubmitter submitter = getSubmitter(message.getThrowable());
if (submitter instanceof ITNReporter) {
myCredentialsPanel.setVisible(true);
String userName = ErrorReportConfigurable.getInstance().ITN_LOGIN;
if (StringUtil.isEmpty(userName)) {
myCredentialsLabel.setHtmlText(DiagnosticBundle.message("diagnostic.error.report.submit.error.anonymously"));
Credentials credentials = ErrorReportConfigurable.getCredentials();
if (CredentialAttributesKt.isFulfilled(credentials)) {
assert credentials != null;
myCredentialsLabel.setHtmlText(DiagnosticBundle.message("diagnostic.error.report.submit.report.as", credentials.getUserName()));
}
else {
myCredentialsLabel.setHtmlText(DiagnosticBundle.message("diagnostic.error.report.submit.report.as", userName));
myCredentialsLabel.setHtmlText(DiagnosticBundle.message("diagnostic.error.report.submit.error.anonymously"));
}
return;
}
@@ -647,7 +650,7 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
myDetailsTabForm.setAssigneeId(message == null ? null : message.getAssigneeId());
List<Attachment> attachments = message != null ? message.getAllAttachments() : Collections.<Attachment>emptyList();
List<Attachment> attachments = message != null ? message.getAllAttachments() : Collections.emptyList();
if (!attachments.isEmpty()) {
if (myTabs.indexOfComponent(myAttachmentsTabForm.getContentPane()) == -1) {
myTabs.addTab(DiagnosticBundle.message("error.attachments.tab.title"), myAttachmentsTabForm.getContentPane());
@@ -672,7 +675,7 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
return throwable.getMessage();
}
else {
return new StringBuffer().append(message.getMessage()).append("\n").append(message.getThrowableText()).toString();
return message.getMessage() + "\n" + message.getThrowableText();
}
}
@@ -767,8 +770,8 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
}
}
if (PluginManager.isPluginClass(className)) {
return PluginManager.getPluginByClassName(className);
if (PluginManagerCore.isPluginClass(className)) {
return PluginManagerCore.getPluginByClassName(className);
}
}
}
@@ -777,8 +780,8 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
if (t.getMessage() != null) {
String className = t.getMessage();
if (PluginManager.isPluginClass(className)) {
return PluginManager.getPluginByClassName(className);
if (PluginManagerCore.isPluginClass(className)) {
return PluginManagerCore.getPluginByClassName(className);
}
}
}
@@ -791,8 +794,8 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
pos = s.lastIndexOf('.');
if (pos >= 0) {
s = s.substring(0, pos);
if (PluginManager.isPluginClass(s)) {
return PluginManager.getPluginByClassName(s);
if (PluginManagerCore.isPluginClass(s)) {
return PluginManagerCore.getPluginByClassName(s);
}
}
}
@@ -800,8 +803,8 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
else if (t instanceof ExtensionException) {
String className = ((ExtensionException)t).getExtensionClass().getName();
if (PluginManager.isPluginClass(className)) {
return PluginManager.getPluginByClassName(className);
if (PluginManagerCore.isPluginClass(className)) {
return PluginManagerCore.getPluginByClassName(className);
}
}
@@ -1016,8 +1019,8 @@ public class IdeErrorsDialog extends DialogWrapper implements MessagePoolListene
private static String md5(String buffer, @NonNls String key) throws NoSuchAlgorithmException {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(buffer.getBytes());
byte[] code = md5.digest(key.getBytes());
md5.update(buffer.getBytes(StandardCharsets.UTF_8));
byte[] code = md5.digest(key.getBytes(StandardCharsets.UTF_8));
BigInteger bi = new BigInteger(code).abs();
return bi.abs().toString(16);
}
@@ -15,9 +15,13 @@
*/
package com.intellij.diagnostic;
import com.intellij.credentialStore.CredentialAttributes;
import com.intellij.credentialStore.Credentials;
import com.intellij.ide.BrowserUtil;
import com.intellij.ide.passwordSafe.PasswordSafe;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.ClickListener;
import com.intellij.util.net.HttpConfigurable;
import org.jetbrains.annotations.NotNull;
@@ -28,20 +32,8 @@ import java.awt.event.MouseEvent;
public class JetBrainsAccountDialog extends DialogWrapper {
private JTextField myItnLoginTextField;
private JPasswordField myItnPasswordTextField;
private JCheckBox myRememberITNPasswordCheckBox;
public void storeInfo() {
ErrorReportConfigurable.getInstance().ITN_LOGIN = myItnLoginTextField.getText();
ErrorReportConfigurable.getInstance().setPlainItnPassword(new String(myItnPasswordTextField.getPassword()));
ErrorReportConfigurable.getInstance().KEEP_ITN_PASSWORD = myRememberITNPasswordCheckBox.isSelected();
}
public void loadInfo() {
myItnLoginTextField.setText(ErrorReportConfigurable.getInstance().ITN_LOGIN);
myItnPasswordTextField.setText(ErrorReportConfigurable.getInstance().getPlainItnPassword());
myRememberITNPasswordCheckBox.setSelected(ErrorReportConfigurable.getInstance().KEEP_ITN_PASSWORD);
}
private JPasswordField myPasswordText;
private JCheckBox myRememberCheckBox;
public JetBrainsAccountDialog(Component parent) throws HeadlessException {
super(parent, false);
@@ -82,7 +74,13 @@ public class JetBrainsAccountDialog extends DialogWrapper {
mySendingSettingsLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
loadInfo();
Credentials credentials = ErrorReportConfigurable.getCredentials();
String userName = credentials == null ? null : credentials.getUserName();
myItnLoginTextField.setText(userName);
String password = credentials == null ? null : credentials.getPasswordAsString();
myPasswordText.setText(password);
// if no user name - never stored and so, defaults to remember. if user name set, but no password, so, previously was stored without password
myRememberCheckBox.setSelected(StringUtil.isEmpty(userName) || !StringUtil.isEmpty(password));
new ClickListener() {
@Override
@@ -98,7 +96,11 @@ public class JetBrainsAccountDialog extends DialogWrapper {
@Override
protected void doOKAction() {
storeInfo();
String userName = myItnLoginTextField.getText();
if (!StringUtil.isEmpty(userName)) {
PasswordSafe.getInstance().set(new CredentialAttributes(ErrorReportConfigurable.SERVICE_NAME, userName),
new Credentials(userName, myRememberCheckBox.isSelected() ? myPasswordText.getPassword() : null));
}
super.doOKAction();
}
@@ -8,7 +8,7 @@
<properties/>
<border type="none"/>
<children>
<grid id="46178" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="46178" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="2" left="4" bottom="0" right="4"/>
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -17,55 +17,11 @@
<clientProperties>
<BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithIndent"/>
</clientProperties>
<border type="etched" title-resource-bundle="messages/DiagnosticBundle" title-key="diagnostic.error.report.login.group"/>
<border type="none"/>
<children>
<grid id="feb2" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<component id="4f69e" class="javax.swing.JCheckBox" binding="myRememberCheckBox">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="fbdcc" class="javax.swing.JLabel">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<labelFor value="b3002"/>
<text resource-bundle="messages/DiagnosticBundle" key="diagnostic.error.report.login.password"/>
</properties>
</component>
<component id="87071" class="javax.swing.JLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<labelFor value="e3ed"/>
<text resource-bundle="messages/DiagnosticBundle" key="diagnostic.error.report.login.name"/>
</properties>
</component>
<component id="e3ed" class="javax.swing.JTextField" binding="myItnLoginTextField">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="150" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
<component id="b3002" class="javax.swing.JPasswordField" binding="myItnPasswordTextField">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="150" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
</children>
</grid>
<component id="4f69e" class="javax.swing.JCheckBox" binding="myRememberITNPasswordCheckBox">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="2" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text resource-bundle="messages/DiagnosticBundle" key="diagnostic.error.report.login.remember.password.checkbox"/>
@@ -73,12 +29,46 @@
</component>
<component id="2c912" class="javax.swing.JLabel" binding="myCreateAccountLabel">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="3" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="&lt;html&gt;&lt;a href=&quot;#&quot;&gt;Create or manage your JetBrains Account&lt;/a&gt;&lt;/html&gt;"/>
</properties>
</component>
<component id="fbdcc" class="javax.swing.JLabel">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<labelFor value="b3002"/>
<text resource-bundle="messages/DiagnosticBundle" key="diagnostic.error.report.login.password"/>
</properties>
</component>
<component id="87071" class="javax.swing.JLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<labelFor value="e3ed"/>
<text resource-bundle="messages/DiagnosticBundle" key="diagnostic.error.report.login.name"/>
</properties>
</component>
<component id="e3ed" class="javax.swing.JTextField" binding="myItnLoginTextField">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="150" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
<component id="b3002" class="javax.swing.JPasswordField" binding="myPasswordText">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="150" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
</children>
</grid>
<component id="115f0" class="javax.swing.JLabel" binding="mySendingSettingsLabel">