/**
* Copyright 2013 multibit.org
*
* Licensed under the MIT license (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://opensource.org/licenses/mit-license.php
*
* 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.multibit.viewsystem.swing.action;
import com.google.bitcoin.core.Address;
import com.google.bitcoin.core.AddressFormatException;
import com.google.bitcoin.core.ECKey;
import com.google.bitcoin.core.WrongNetworkException;
import org.multibit.controller.bitcoin.BitcoinController;
import org.multibit.model.bitcoin.WalletBusyListener;
import org.multibit.utils.WhitespaceTrimmer;
import org.multibit.viewsystem.swing.MultiBitFrame;
import org.multibit.viewsystem.swing.view.panels.VerifyMessagePanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.security.SignatureException;
/**
* This {@link Action} verifies a signed message.
*/
public class VerifyMessageSubmitAction extends MultiBitSubmitAction implements WalletBusyListener {
private static final Logger log = LoggerFactory.getLogger(ImportPrivateKeysSubmitAction.class);
private static final long serialVersionUID = 1923333087598757765L;
private MultiBitFrame mainFrame;
private VerifyMessagePanel verifyMessagePanel;
/**
* Creates a new {@link VerifyMessageSubmitAction}.
*/
public VerifyMessageSubmitAction(BitcoinController bitcoinController, MultiBitFrame mainFrame,
VerifyMessagePanel verifyMessagePanel, ImageIcon icon) {
super(bitcoinController, "verifyMessageAction.text", "verifyMessageAction.tooltip", "verifyMessageAction.mnemonicKey", icon);
this.mainFrame = mainFrame;
this.verifyMessagePanel = verifyMessagePanel;
// This action is a WalletBusyListener.
super.bitcoinController.registerWalletBusyListener(this);
walletBusyChange(super.bitcoinController.getModel().getActivePerWalletModelData().isBusy());
}
/**
* Verify the message.
*/
@Override
public void actionPerformed(ActionEvent event) {
if (verifyMessagePanel == null) {
return;
}
String addressText = null;
if (verifyMessagePanel.getAddressTextArea() != null) {
addressText = verifyMessagePanel.getAddressTextArea().getText();
if (addressText != null) {
addressText = WhitespaceTrimmer.trim(addressText);
}
}
String messageText = null;
if (verifyMessagePanel.getMessageTextArea() != null) {
messageText = verifyMessagePanel.getMessageTextArea().getText();
}
String signatureText = null;
if (verifyMessagePanel.getSignatureTextArea() != null) {
signatureText = verifyMessagePanel.getSignatureTextArea().getText();
}
log.debug("addressText = '" + addressText + "'");
log.debug("messageText = '" + messageText + "'");
log.debug("signatureText = '" + signatureText + "'");
if (addressText == null || "".equals(addressText)) {
verifyMessagePanel.setMessageText1(controller.getLocaliser().getString("verifyMessageAction.noAddress"));
verifyMessagePanel.setMessageText2(" ");
return;
}
if (messageText == null || "".equals(messageText.trim())) {
verifyMessagePanel.setMessageText1(controller.getLocaliser().getString("verifyMessageAction.noMessage"));
verifyMessagePanel.setMessageText2(" ");
return;
}
if (signatureText == null || "".equals(signatureText.trim())) {
verifyMessagePanel.setMessageText1(controller.getLocaliser().getString("verifyMessageAction.noSignature"));
verifyMessagePanel.setMessageText2(" ");
return;
}
try {
Address expectedAddress = new Address(bitcoinController.getModel().getNetworkParameters(), addressText);
ECKey key = ECKey.signedMessageToKey(messageText, signatureText);
Address gotAddress = key.toAddress(bitcoinController.getModel().getNetworkParameters());
if (expectedAddress != null && expectedAddress.equals(gotAddress)) {
log.debug("The message was signed by the specified address");
verifyMessagePanel.setMessageText1(controller.getLocaliser().getString("verifyMessageAction.success"));
verifyMessagePanel.setMessageText2(" ");
} else {
log.debug("The message was NOT signed by the specified address");
verifyMessagePanel.setMessageText1(controller.getLocaliser().getString("verifyMessageAction.failure"));
verifyMessagePanel.setMessageText2(" ");
}
} catch (WrongNetworkException e) {
logError(e);
} catch (AddressFormatException e) {
logError(e);
} catch (SignatureException e) {
logError(e);
}
}
private void logError(Exception e) {
e.printStackTrace();
verifyMessagePanel.setMessageText1(controller.getLocaliser().getString("verifyMessageAction.error"));
verifyMessagePanel.setMessageText2(controller.getLocaliser().getString("deleteWalletConfirmDialog.walletDeleteError2",
new String[] {e.getClass().getCanonicalName() + " " + e.getMessage()}));
}
@Override
public void walletBusyChange(boolean newWalletIsBusy) {
}
}