if file extension doesn’t exist. try to guess from content type. fixes #3939
This commit is contained in:
		
							parent
							
								
									99cb23fe14
								
							
						
					
					
						commit
						303e205276
					
				@ -4,6 +4,7 @@ import android.os.PowerManager;
 | 
				
			|||||||
import android.support.annotation.Nullable;
 | 
					import android.support.annotation.Nullable;
 | 
				
			||||||
import android.util.Log;
 | 
					import android.util.Log;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.common.base.Strings;
 | 
				
			||||||
import com.google.common.io.ByteStreams;
 | 
					import com.google.common.io.ByteStreams;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.BufferedInputStream;
 | 
					import java.io.BufferedInputStream;
 | 
				
			||||||
@ -30,16 +31,16 @@ import eu.siacs.conversations.services.AbstractConnectionManager;
 | 
				
			|||||||
import eu.siacs.conversations.services.XmppConnectionService;
 | 
					import eu.siacs.conversations.services.XmppConnectionService;
 | 
				
			||||||
import eu.siacs.conversations.utils.CryptoHelper;
 | 
					import eu.siacs.conversations.utils.CryptoHelper;
 | 
				
			||||||
import eu.siacs.conversations.utils.FileWriterException;
 | 
					import eu.siacs.conversations.utils.FileWriterException;
 | 
				
			||||||
 | 
					import eu.siacs.conversations.utils.MimeUtils;
 | 
				
			||||||
import eu.siacs.conversations.utils.WakeLockHelper;
 | 
					import eu.siacs.conversations.utils.WakeLockHelper;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 | 
					import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 | 
				
			||||||
import eu.siacs.conversations.xmpp.Jid;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class HttpDownloadConnection implements Transferable {
 | 
					public class HttpDownloadConnection implements Transferable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final Message message;
 | 
					    private final Message message;
 | 
				
			||||||
    private final boolean mUseTor;
 | 
					    private final boolean mUseTor;
 | 
				
			||||||
    private HttpConnectionManager mHttpConnectionManager;
 | 
					    private final HttpConnectionManager mHttpConnectionManager;
 | 
				
			||||||
    private XmppConnectionService mXmppConnectionService;
 | 
					    private final XmppConnectionService mXmppConnectionService;
 | 
				
			||||||
    private URL mUrl;
 | 
					    private URL mUrl;
 | 
				
			||||||
    private DownloadableFile file;
 | 
					    private DownloadableFile file;
 | 
				
			||||||
    private int mStatus = Transferable.STATUS_UNKNOWN;
 | 
					    private int mStatus = Transferable.STATUS_UNKNOWN;
 | 
				
			||||||
@ -97,23 +98,13 @@ public class HttpDownloadConnection implements Transferable {
 | 
				
			|||||||
                    && message.getEncryption() != Message.ENCRYPTION_AXOLOTL) {
 | 
					                    && message.getEncryption() != Message.ENCRYPTION_AXOLOTL) {
 | 
				
			||||||
                this.message.setEncryption(Message.ENCRYPTION_NONE);
 | 
					                this.message.setEncryption(Message.ENCRYPTION_NONE);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            final String ext;
 | 
					            final String ext = extension.getExtension();
 | 
				
			||||||
            if (VALID_CRYPTO_EXTENSIONS.contains(extension.main)) {
 | 
					            if (ext != null) {
 | 
				
			||||||
                ext = extension.secondary;
 | 
					                message.setRelativeFilePath(String.format("%s.%s", message.getUuid(), ext));
 | 
				
			||||||
            } else {
 | 
					            } else if (Strings.isNullOrEmpty(message.getRelativeFilePath())) {
 | 
				
			||||||
                ext = extension.main;
 | 
					                message.setRelativeFilePath(message.getUuid());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            message.setRelativeFilePath(message.getUuid() + (ext != null ? ("." + ext) : ""));
 | 
					            setupFile();
 | 
				
			||||||
            final String reference = mUrl.getRef();
 | 
					 | 
				
			||||||
            if (reference != null && AesGcmURLStreamHandler.IV_KEY.matcher(reference).matches()) {
 | 
					 | 
				
			||||||
                this.file = new DownloadableFile(mXmppConnectionService.getCacheDir().getAbsolutePath() + "/" + message.getUuid());
 | 
					 | 
				
			||||||
                this.file.setKeyAndIv(CryptoHelper.hexToBytes(reference));
 | 
					 | 
				
			||||||
                Log.d(Config.LOGTAG, "create temporary OMEMO encrypted file: " + this.file.getAbsolutePath() + "(" + message.getMimeType() + ")");
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                this.file = mXmppConnectionService.getFileBackend().getFile(message, false);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (this.message.getEncryption() == Message.ENCRYPTION_AXOLOTL && this.file.getKey() == null) {
 | 
					            if (this.message.getEncryption() == Message.ENCRYPTION_AXOLOTL && this.file.getKey() == null) {
 | 
				
			||||||
                this.message.setEncryption(Message.ENCRYPTION_NONE);
 | 
					                this.message.setEncryption(Message.ENCRYPTION_NONE);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -130,6 +121,17 @@ public class HttpDownloadConnection implements Transferable {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void setupFile() {
 | 
				
			||||||
 | 
					        final String reference = mUrl.getRef();
 | 
				
			||||||
 | 
					        if (reference != null && AesGcmURLStreamHandler.IV_KEY.matcher(reference).matches()) {
 | 
				
			||||||
 | 
					            this.file = new DownloadableFile(mXmppConnectionService.getCacheDir().getAbsolutePath() + "/" + message.getUuid());
 | 
				
			||||||
 | 
					            this.file.setKeyAndIv(CryptoHelper.hexToBytes(reference));
 | 
				
			||||||
 | 
					            Log.d(Config.LOGTAG, "create temporary OMEMO encrypted file: " + this.file.getAbsolutePath() + "(" + message.getMimeType() + ")");
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            this.file = mXmppConnectionService.getFileBackend().getFile(message, false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void download(boolean interactive) {
 | 
					    private void download(boolean interactive) {
 | 
				
			||||||
        new Thread(new FileDownloader(interactive)).start();
 | 
					        new Thread(new FileDownloader(interactive)).start();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -363,6 +365,16 @@ public class HttpDownloadConnection implements Transferable {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    contentLength = connection.getHeaderField("Content-Length");
 | 
					                    contentLength = connection.getHeaderField("Content-Length");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                final String contentType = connection.getContentType();
 | 
				
			||||||
 | 
					                final AbstractConnectionManager.Extension extension = AbstractConnectionManager.Extension.of(mUrl.getPath());
 | 
				
			||||||
 | 
					                if (Strings.isNullOrEmpty(extension.getExtension()) && contentType != null) {
 | 
				
			||||||
 | 
					                    final String fileExtension = MimeUtils.guessExtensionFromMimeType(contentType);
 | 
				
			||||||
 | 
					                    if (fileExtension != null) {
 | 
				
			||||||
 | 
					                        message.setRelativeFilePath(String.format("%s.%s", message.getUuid(), fileExtension));
 | 
				
			||||||
 | 
					                        Log.d(Config.LOGTAG, "rewriting name after not finding extension in url but in content type");
 | 
				
			||||||
 | 
					                        setupFile();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                connection.disconnect();
 | 
					                connection.disconnect();
 | 
				
			||||||
                if (contentLength == null) {
 | 
					                if (contentLength == null) {
 | 
				
			||||||
                    throw new IOException("no content-length found in HEAD response");
 | 
					                    throw new IOException("no content-length found in HEAD response");
 | 
				
			||||||
 | 
				
			|||||||
@ -30,6 +30,8 @@ import eu.siacs.conversations.R;
 | 
				
			|||||||
import eu.siacs.conversations.entities.DownloadableFile;
 | 
					import eu.siacs.conversations.entities.DownloadableFile;
 | 
				
			||||||
import eu.siacs.conversations.utils.Compatibility;
 | 
					import eu.siacs.conversations.utils.Compatibility;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static eu.siacs.conversations.entities.Transferable.VALID_CRYPTO_EXTENSIONS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class AbstractConnectionManager {
 | 
					public class AbstractConnectionManager {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static final int UI_REFRESH_THRESHOLD = 250;
 | 
					    private static final int UI_REFRESH_THRESHOLD = 250;
 | 
				
			||||||
@ -106,6 +108,14 @@ public class AbstractConnectionManager {
 | 
				
			|||||||
            this.secondary = secondary;
 | 
					            this.secondary = secondary;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public String getExtension() {
 | 
				
			||||||
 | 
					            if (VALID_CRYPTO_EXTENSIONS.contains(main)) {
 | 
				
			||||||
 | 
					                return secondary;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                return main;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public static Extension of(String path) {
 | 
					        public static Extension of(String path) {
 | 
				
			||||||
            final int pos = path.lastIndexOf('/');
 | 
					            final int pos = path.lastIndexOf('/');
 | 
				
			||||||
            final String filename = path.substring(pos + 1).toLowerCase();
 | 
					            final String filename = path.substring(pos + 1).toLowerCase();
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user