/*
*
* Panbox - encryption for cloud storage
* Copyright (C) 2014-2015 by Fraunhofer SIT and Sirrix AG
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Additonally, third party code may be provided with notices and open source
* licenses from communities and third parties that govern the use of those
* portions, and any licenses granted hereunder do not alter any rights and
* obligations you may have under such open source licenses, however, the
* disclaimer of warranty and limitation of liability provisions of the GPLv3
* will apply to all the product.
*
*/
package org.panbox.desktop.common.urihandler;
import java.io.File;
import java.io.FileFilter;
import java.net.URI;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.ResourceBundle;
import javax.swing.JOptionPane;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
import org.panbox.PanboxConstants;
import org.panbox.Settings;
import org.panbox.core.csp.CSPAdapterFactory;
import org.panbox.core.csp.ICSPClientIntegration;
import org.panbox.core.csp.StorageBackendType;
import org.panbox.desktop.common.gui.AddShareDialog;
import org.panbox.desktop.common.gui.OperationAbortedException;
import org.panbox.desktop.common.gui.PanboxClientGUI;
import org.panbox.desktop.common.sharemgmt.ShareManagerImpl;
/**
* @author palige
*
* handler class for process share inviation links
*
*/
public class PanboxURICmdShareInvitation extends PanboxURICmd {
private final static String NAME = "ShareInvitation";
public PanboxURICmdShareInvitation(byte[]... params) throws Exception {
super(params);
if (params.length == 2) {
this.sid = new String(params[0], PanboxConstants.STANDARD_CHARSET);
this.stype = new String(params[1], PanboxConstants.STANDARD_CHARSET);
} else {
throw new Exception("Invalid params " + Arrays.toString(params));
}
}
private String sid, stype;
private final static Logger logger = Logger
.getLogger(PanboxURICmdShareInvitation.class);
private static ResourceBundle bundle = ResourceBundle.getBundle(
"org.panbox.desktop.common.gui.Messages", Settings.getInstance()
.getLocale());
public static URI getPanboxLink(String sid, String stype) {
StringBuilder b = new StringBuilder();
b.append(NAME);
b.append("?");
b.append(Base64.encodeBase64URLSafeString(sid.getBytes(Charset
.forName(PanboxConstants.STANDARD_CHARSET))));
b.append(":");
b.append(Base64.encodeBase64URLSafeString(stype.getBytes(Charset
.forName(PanboxConstants.STANDARD_CHARSET))));
return URI.create(PanboxConstants.PANBOX_URL_PREFIX + b.toString());
}
private final class UUIDFilter implements FileFilter {
String uuid;
public UUIDFilter(String uuid) {
this.uuid = uuid;
}
@Override
public boolean accept(File pathname) {
return (pathname.isDirectory() && (new File(pathname,
PanboxConstants.PANBOX_SHARE_METADATA_DIRECTORY
+ File.separator
+ PanboxConstants.PANBOX_SHARE_UUID_PREFIX
+ this.uuid).exists()));
}
}
@Override
public String getName() {
return NAME;
}
@Override
public void execute() throws Exception {
logger.info("Trying to process share invitaion with params shareid="
+ sid + ", share type=" + stype);
// check if there exists a share with the given sid for the
// given share type
try {
StorageBackendType backendType = StorageBackendType.valueOf(stype);
CSPAdapterFactory fac = CSPAdapterFactory.getInstance(backendType);
if (fac != null) {
ICSPClientIntegration client = fac.getClientAdapter();
File syncDir = client.getCurrentSyncDir();
if ((syncDir != null) && (syncDir.exists())
&& (syncDir.canRead())) {
// search for directory with given sid
File[] subdirs = syncDir.listFiles(new UUIDFilter(sid));
if ((subdirs == null) || (subdirs.length == 0)) {
logger.warn("No share detected for UUID " + sid);
JOptionPane
.showMessageDialog(
null,
bundle.getString("PanboxURICmdShareInvitation.shareNotFoundMessage"),
bundle.getString("PanboxURICmdShareInvitation.shareNotFoundMessageTitle"),
JOptionPane.WARNING_MESSAGE);
} else if (subdirs.length > 1) {
logger.error("Multiple shares detected for UUID " + sid);
} else {
logger.info("Share detected for UUID " + sid
+ " at location "
+ subdirs[0].getAbsolutePath()
+ ". Starting AddShareDialog ...");
if (!ShareManagerImpl.getInstance().sharePathAvailable(
subdirs[0].getAbsolutePath())) {
JOptionPane
.showMessageDialog(
null,
bundle.getString("PanboxURICmdShareInvitation.shareAlreadyImported"));
} else {
// if this succeeded, try opening import
// dialog
PanboxClientGUI g = PanboxHTTPServer
.getPanboxClient().getMainWindow();
if (!g.isVisible())
g.setVisible(true);
AddShareDialog d = new AddShareDialog(g,
backendType, subdirs[0]);
d.setLocationRelativeTo(g);
d.setVisible(true);
try {
g.addShare(d.getResult());
} catch (OperationAbortedException e) {
// do nothing if operation was aborted
}
}
}
} else {
logger.error("Unable to access current synchronization directory for share type "
+ stype);
}
} else {
logger.error("Unable to init adapters for share type " + stype);
}
} catch (IllegalArgumentException e) {
logger.error("Received inviation with unknown share type " + stype,
e);
throw new Exception("Unknown share type " + stype);
}
}
}