From d1e591b448a28a6352988fad016f96e3e463487c Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Thu, 12 Jul 2018 22:05:18 +0800 Subject: [PATCH] =?UTF-8?q?ftps=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/arialyy/aria/core/FtpUrlEntity.java | 29 +++++ .../aria/core/common/ProtocolType.java | 39 +++++++ .../common/{ => ftp}/AbsFtpInfoThread.java | 89 +++++++++++---- .../common/{ => ftp}/AbsFtpThreadTask.java | 50 +++++++-- .../aria/core/common/ftp/FTPSSLConfig.java | 104 ++++++++++++++++++ .../{delegate => common/ftp}/FtpDelegate.java | 32 +++--- .../common/ftp/SSLSessionReuseFTPSClient.java | 54 +++++++++ .../http}/HttpHeaderDelegate.java | 26 ++--- .../core/download/DownloadGroupTarget.java | 44 +++++++- .../aria/core/download/DownloadTarget.java | 28 ++--- .../core/download/FtpDirDownloadTarget.java | 9 +- .../aria/core/download/FtpDownloadTarget.java | 18 ++- .../download/downloader/ConnectionHelp.java | 43 ++++---- .../download/downloader/FtpDirInfoThread.java | 2 +- .../downloader/FtpFileInfoThread.java | 2 +- .../download/downloader/FtpThreadTask.java | 2 +- .../com/arialyy/aria/core/inf/AbsTarget.java | 31 +++++- .../aria/core/inf/IHttpHeaderTarget.java | 4 + .../com/arialyy/aria/core/inf/ITarget.java | 43 +------- .../aria/core/upload/FtpUploadTarget.java | 6 +- .../aria/core/upload/UploadTarget.java | 11 +- .../upload/uploader/FtpFileInfoThread.java | 2 +- .../core/upload/uploader/FtpThreadTask.java | 2 +- .../java/com/arialyy/aria/orm/DBConfig.java | 2 +- .../com/arialyy/aria/util/SSLContextUtil.java | 53 +++++++-- DEV_LOG.md | 4 + app/src/main/AndroidManifest.xml | 4 +- .../download/group/DownloadGroupActivity.java | 5 +- .../simple/download/group/GroupModule.java | 5 +- .../arialyy/simple/test/AnyRunActivity.java | 7 +- .../arialyy/simple/test/AnyRunnModule.java | 7 +- 31 files changed, 574 insertions(+), 183 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java rename Aria/src/main/java/com/arialyy/aria/core/common/{ => ftp}/AbsFtpInfoThread.java (78%) rename Aria/src/main/java/com/arialyy/aria/core/common/{ => ftp}/AbsFtpThreadTask.java (73%) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/ftp/FTPSSLConfig.java rename Aria/src/main/java/com/arialyy/aria/core/{delegate => common/ftp}/FtpDelegate.java (63%) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/common/ftp/SSLSessionReuseFTPSClient.java rename Aria/src/main/java/com/arialyy/aria/core/{delegate => common/http}/HttpHeaderDelegate.java (87%) diff --git a/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java b/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java index da821979..eaa7173c 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java +++ b/Aria/src/main/java/com/arialyy/aria/core/FtpUrlEntity.java @@ -17,6 +17,7 @@ */ package com.arialyy.aria.core; +import com.arialyy.aria.orm.annotation.Ignore; import java.net.InetAddress; /** @@ -32,6 +33,12 @@ public class FtpUrlEntity implements Cloneable { public String account; + /** + * 是否是ftps + * {@code true}ftps协议的地址,{@code false}不是ftps协议的地址 + */ + public boolean isFtps = false; + /** * 原始url */ @@ -46,9 +53,11 @@ public class FtpUrlEntity implements Cloneable { * 登录的用户名 */ public String user; + /** * 密码 */ + @Ignore public String password; /** @@ -71,6 +80,26 @@ public class FtpUrlEntity implements Cloneable { */ public InetAddress validAddr; + /** + * 证书路径 + */ + public String storePath; + + /** + * 证书密码 + */ + public String storePass; + + /** + * SSL协议 + */ + public String SSLProtocol; + + /** + * 私钥别名 + */ + public String keyAlias; + @Override public FtpUrlEntity clone() { FtpUrlEntity entity = null; try { diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java b/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java new file mode 100644 index 00000000..740e85ee --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ProtocolType.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) + * + * Licensed 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 + * + * http://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 com.arialyy.aria.core.common; + +import android.support.annotation.StringDef; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@StringDef({ + ProtocolType.Default, + ProtocolType.SSL, + ProtocolType.SSLv3, + ProtocolType.TLS, + ProtocolType.TLSv1, + ProtocolType.TLSv1_1, + ProtocolType.TLSv1_2 +}) +@Retention(RetentionPolicy.SOURCE) public @interface ProtocolType { + String Default = "Default"; + String SSL = "SSL"; + String SSLv3 = "SSLv3"; + String TLS = "TLS"; + String TLSv1 = "TLSv1"; + String TLSv1_1 = "TLSv1.1"; + String TLSv1_2 = "TLSv1.2"; +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFtpInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java similarity index 78% rename from Aria/src/main/java/com/arialyy/aria/core/common/AbsFtpInfoThread.java rename to Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java index c2b649ec..799bdb87 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFtpInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/AbsFtpInfoThread.java @@ -13,26 +13,31 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.arialyy.aria.core.common; +package com.arialyy.aria.core.common.ftp; import android.text.TextUtils; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.FtpUrlEntity; +import com.arialyy.aria.core.common.OnFileInfoCallback; +import com.arialyy.aria.core.common.ProtocolType; import com.arialyy.aria.core.inf.AbsEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.upload.UploadEntity; import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.Regular; +import com.arialyy.aria.util.SSLContextUtil; import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.net.ssl.SSLContext; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; +import org.apache.commons.net.ftp.FTPSClient; /** * Created by Aria.Lao on 2017/7/25. @@ -78,9 +83,11 @@ public abstract class AbsFtpInfoThread 0) { - client = new FTPClient(); + client = newInstanceClient(urlEntity); InetAddress ip = InetAddress.getByName(urlEntity.hostName); client.setConnectTimeout(mConnectTimeOut); // 连接10s超时 client.connect(ip, Integer.parseInt(urlEntity.port)); @@ -182,7 +185,13 @@ public abstract class AbsFtpInfoThread> extends AbsThreadTask { private final String TAG = "AbsFtpThreadTask"; - protected String charSet, port; + protected String charSet; /** * D_FTP 服务器编码 */ @@ -55,7 +62,7 @@ public abstract class AbsFtpThreadTask implements ITarget { + private final String TAG = "FTPSSLConfig"; + private TARGET mTarget; + private FtpUrlEntity mUrlEntity; + + public FTPSSLConfig(TARGET target) { + mTarget = target; + mUrlEntity = mTarget.getTaskEntity().getUrlEntity(); + } + + /** + * 设置协议类型 + * + * @param protocol {@link ProtocolType} + */ + public FTPSSLConfig setProtocol(@ProtocolType String protocol) { + if (TextUtils.isEmpty(protocol)) { + throw new NullPointerException("协议为空"); + } + mUrlEntity.SSLProtocol = protocol; + return this; + } + + /** + * 设置证书别名 + * + * @param keyAlias 别名 + */ + public FTPSSLConfig setAlias(String keyAlias) { + if (TextUtils.isEmpty(keyAlias)) { + throw new NullPointerException("别名为空"); + } + mUrlEntity.keyAlias = keyAlias; + return this; + } + + /** + * 设置证书密码 + * + * @param storePass 私钥密码 + */ + public FTPSSLConfig setStorePass(String storePass) { + if (TextUtils.isEmpty(storePass)) { + throw new NullPointerException("证书密码为空"); + } + mUrlEntity.storePass = storePass; + return this; + } + + /** + * 设置证书路径 + * + * @param storePath 证书路径 + */ + public FTPSSLConfig setStorePath(String storePath) { + if (TextUtils.isEmpty(storePath)) { + throw new NullPointerException("证书路径为空"); + } + mUrlEntity.storePath = storePath; + return this; + } + + @Override public void start() { + mTarget.start(); + } + + @Override public void stop() { + mTarget.stop(); + } + + @Override public void resume() { + mTarget.resume(); + } + + @Override public void cancel() { + mTarget.cancel(); + } +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/delegate/FtpDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java similarity index 63% rename from Aria/src/main/java/com/arialyy/aria/core/delegate/FtpDelegate.java rename to Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java index 736a53c8..80e1c284 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/delegate/FtpDelegate.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/ftp/FtpDelegate.java @@ -13,35 +13,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.arialyy.aria.core.delegate; +package com.arialyy.aria.core.common.ftp; import android.text.TextUtils; -import com.arialyy.aria.core.inf.AbsEntity; -import com.arialyy.aria.core.inf.AbsTaskEntity; +import com.arialyy.aria.core.FtpUrlEntity; +import com.arialyy.aria.core.inf.AbsTarget; import com.arialyy.aria.core.inf.IFtpTarget; -import com.arialyy.aria.core.inf.ITarget; import com.arialyy.aria.util.ALog; /** * Created by laoyuyu on 2018/3/9. * ftp 委托 */ -public class FtpDelegate> - implements IFtpTarget { +public class FtpDelegate implements IFtpTarget { private static final String TAG = "FtpDelegate"; - private ENTITY mEntity; - private TASK_ENTITY mTaskEntity; + private FtpUrlEntity mUrlEntity; private TARGET mTarget; - public FtpDelegate(TARGET target, TASK_ENTITY taskEntity) { + public FtpDelegate(TARGET target) { mTarget = target; - mTaskEntity = taskEntity; - mEntity = mTaskEntity.getEntity(); + mUrlEntity = target.getTaskEntity().getUrlEntity(); } @Override public TARGET charSet(String charSet) { - if (TextUtils.isEmpty(charSet)) return mTarget; - mTaskEntity.setCharSet(charSet); + if (TextUtils.isEmpty(charSet)) { + throw new NullPointerException("字符编码为空"); + } + mTarget.getTaskEntity().setCharSet(charSet); return mTarget; } @@ -57,10 +55,10 @@ public class FtpDelegate> +public class HttpHeaderDelegate implements IHttpHeaderTarget { private static final String TAG = "HttpHeaderDelegate"; - private ENTITY mEntity; - private TASK_ENTITY mTaskEntity; private TARGET mTarget; - public HttpHeaderDelegate(TARGET target, TASK_ENTITY taskEntity) { + public HttpHeaderDelegate(TARGET target) { mTarget = target; - mTaskEntity = taskEntity; - - mEntity = mTaskEntity.getEntity(); } /** @@ -61,7 +56,7 @@ public class HttpHeaderDelegate implements IHttpHeaderTarget { - private HttpHeaderDelegate - mDelegate; + private HttpHeaderDelegate mDelegate; /** * 子任务下载地址, */ @@ -71,7 +71,35 @@ public class DownloadGroupTarget extends BaseGroupTarget im if (mEntity != null) { mDirPathTemp = mEntity.getDirPath(); } - mDelegate = new HttpHeaderDelegate<>(this, mTaskEntity); + mDelegate = new HttpHeaderDelegate<>(this); + } + + /** + * 更新组合任务下载地址 + * + * @param urls 新的组合任务下载地址列表 + */ + @CheckResult + public DownloadGroupTarget updateUrls(List urls) { + if (urls == null || urls.isEmpty()) { + throw new NullPointerException("下载地址列表为空"); + } + if (urls.size() != mUrls.size()) { + throw new IllegalArgumentException("新下载地址数量和旧下载地址数量不一致"); + } + mUrls.clear(); + mUrls.addAll(urls); + mGroupName = CommonUtil.getMd5Code(urls); + mEntity.setGroupName(mGroupName); + mTaskEntity.setKey(mGroupName); + mEntity.update(); + if (mEntity.getSubEntities() != null && !mEntity.getSubEntities().isEmpty()) { + for (DownloadEntity de : mEntity.getSubEntities()) { + de.setGroupName(mGroupName); + de.update(); + } + } + return this; } /** @@ -268,6 +296,7 @@ public class DownloadGroupTarget extends BaseGroupTarget im return true; } + @CheckResult @Override public DownloadGroupTarget addHeader(@NonNull String key, @NonNull String value) { for (DownloadTaskEntity subTask : mTaskEntity.getSubTaskEntities()) { mDelegate.addHeader(subTask, key, value); @@ -275,6 +304,7 @@ public class DownloadGroupTarget extends BaseGroupTarget im return mDelegate.addHeader(key, value); } + @CheckResult @Override public DownloadGroupTarget addHeaders(Map headers) { for (DownloadTaskEntity subTask : mTaskEntity.getSubTaskEntities()) { mDelegate.addHeaders(subTask, headers); @@ -282,10 +312,16 @@ public class DownloadGroupTarget extends BaseGroupTarget im return mDelegate.addHeaders(headers); } + @CheckResult @Override public DownloadGroupTarget setRequestMode(RequestEnum requestEnum) { for (DownloadTaskEntity subTask : mTaskEntity.getSubTaskEntities()) { subTask.setRequestEnum(requestEnum); } return mDelegate.setRequestMode(requestEnum); } + + @CheckResult + @Override public DownloadGroupTarget setUrlProxy(Proxy proxy) { + return mDelegate.setUrlProxy(proxy); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java index 5014e30c..b20ccebd 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java @@ -18,7 +18,7 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import com.arialyy.aria.core.common.RequestEnum; -import com.arialyy.aria.core.delegate.HttpHeaderDelegate; +import com.arialyy.aria.core.common.http.HttpHeaderDelegate; import com.arialyy.aria.core.inf.IHttpHeaderTarget; import java.net.Proxy; import java.util.Map; @@ -29,7 +29,7 @@ import java.util.Map; */ public class DownloadTarget extends BaseNormalTarget implements IHttpHeaderTarget { - private HttpHeaderDelegate mDelegate; + private HttpHeaderDelegate mDelegate; DownloadTarget(DownloadEntity entity, String targetName) { @@ -38,7 +38,7 @@ public class DownloadTarget extends BaseNormalTarget DownloadTarget(String url, String targetName) { initTarget(url, targetName); - mDelegate = new HttpHeaderDelegate<>(this, mTaskEntity); + mDelegate = new HttpHeaderDelegate<>(this); } /** @@ -53,17 +53,6 @@ public class DownloadTarget extends BaseNormalTarget return this; } - /** - * 设置URL的代理 - * - * @param proxy {@link Proxy} - */ - @CheckResult - public DownloadTarget setUrlProxy(Proxy proxy) { - mTaskEntity.setProxy(proxy); - return this; - } - /** * 设置文件存储路径 * 该api后续版本会删除 @@ -100,6 +89,17 @@ public class DownloadTarget extends BaseNormalTarget return HTTP; } + + /** + * 设置URL的代理 + * + * @param proxy {@link Proxy} + */ + @CheckResult + @Override public DownloadTarget setUrlProxy(Proxy proxy) { + return mDelegate.setUrlProxy(proxy); + } + @CheckResult @Override public DownloadTarget addHeader(@NonNull String key, @NonNull String value) { return mDelegate.addHeader(key, value); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java index a5978483..758d8cb5 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDirDownloadTarget.java @@ -17,7 +17,7 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.text.TextUtils; -import com.arialyy.aria.core.delegate.FtpDelegate; +import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.core.manager.TEManager; @@ -29,7 +29,7 @@ import com.arialyy.aria.util.ALog; */ public class FtpDirDownloadTarget extends BaseGroupTarget implements IFtpTarget { - private FtpDelegate mDelegate; + private FtpDelegate mDelegate; FtpDirDownloadTarget(String url, String targetName) { mTargetName = targetName; @@ -44,7 +44,7 @@ public class FtpDirDownloadTarget extends BaseGroupTarget if (mEntity != null) { mDirPathTemp = mEntity.getDirPath(); } - mDelegate = new FtpDelegate<>(this, mTaskEntity); + mDelegate = new FtpDelegate<>(this); } @Override protected int getTargetType() { @@ -90,14 +90,17 @@ public class FtpDirDownloadTarget extends BaseGroupTarget } return true; } + @CheckResult @Override public FtpDirDownloadTarget charSet(String charSet) { return mDelegate.charSet(charSet); } + @CheckResult @Override public FtpDirDownloadTarget login(String userName, String password) { return mDelegate.login(userName, password); } + @CheckResult @Override public FtpDirDownloadTarget login(String userName, String password, String account) { return mDelegate.login(userName, password, account); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java index 6d73b43c..3637f347 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/FtpDownloadTarget.java @@ -17,7 +17,8 @@ package com.arialyy.aria.core.download; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; -import com.arialyy.aria.core.delegate.FtpDelegate; +import com.arialyy.aria.core.common.ftp.FTPSSLConfig; +import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.util.CommonUtil; @@ -28,7 +29,7 @@ import com.arialyy.aria.util.CommonUtil; */ public class FtpDownloadTarget extends BaseNormalTarget implements IFtpTarget { - private FtpDelegate mDelegate; + private FtpDelegate mDelegate; public FtpDownloadTarget(DownloadEntity entity, String targetName) { this(entity.getUrl(), targetName); @@ -45,7 +46,18 @@ public class FtpDownloadTarget extends BaseNormalTarget mTaskEntity.setUrlEntity(CommonUtil.getFtpUrlInfo(url)); mTaskEntity.setRequestType(AbsTaskEntity.D_FTP); - mDelegate = new FtpDelegate<>(this, mTaskEntity); + mDelegate = new FtpDelegate<>(this); + } + + /** + * 是否是FTPS协议 + * 如果是FTPS协议,需要使用{@link FTPSSLConfig#setPrivateKeyPath(String)}、{@link FTPSSLConfig#setCertPath(String)} + * 设置证书信息 + */ + @CheckResult + public FTPSSLConfig asFtps() { + mTaskEntity.getUrlEntity().isFtps = true; + return new FTPSSLConfig<>(this); } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java index 01277969..6b9250f1 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/ConnectionHelp.java @@ -16,6 +16,7 @@ package com.arialyy.aria.core.download.downloader; import android.text.TextUtils; +import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.common.RequestEnum; import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.inf.AbsTaskEntity; @@ -26,8 +27,6 @@ import java.net.HttpURLConnection; import java.net.ProtocolException; import java.net.URL; import java.net.URLConnection; -import java.util.List; -import java.util.Map; import java.util.Set; import java.util.zip.GZIPInputStream; import java.util.zip.InflaterInputStream; @@ -75,9 +74,11 @@ class ConnectionHelp { urlConn = url.openConnection(); } if (urlConn instanceof HttpsURLConnection) { + AriaManager manager = AriaManager.getInstance(AriaManager.APP); conn = (HttpsURLConnection) urlConn; SSLContext sslContext = - SSLContextUtil.getSSLContext(SSLContextUtil.CA_ALIAS, SSLContextUtil.CA_PATH); + SSLContextUtil.getSSLContextFromAssets(manager.getDownloadConfig().getCaName(), + manager.getDownloadConfig().getCaPath()); if (sslContext == null) { sslContext = SSLContextUtil.getDefaultSLLContext(); } @@ -126,24 +127,24 @@ class ConnectionHelp { if (conn.getRequestProperty("Accept") == null) { StringBuilder accept = new StringBuilder(); //accept - //.append("image/gif, ") - //.append("image/jpeg, ") - //.append("image/pjpeg, ") - //.append("image/webp, ") - //.append("image/apng, ") - //.append("application/xml, ") - //.append("application/xaml+xml, ") - //.append("application/xhtml+xml, ") - //.append("application/x-shockwave-flash, ") - //.append("application/x-ms-xbap, ") - //.append("application/x-ms-application, ") - //.append("application/msword, ") - //.append("application/vnd.ms-excel, ") - //.append("application/vnd.ms-xpsdocument, ") - //.append("application/vnd.ms-powerpoint, ") - //.append("text/plain, ") - //.append("text/html, ") - //.append("*/*"); + //.append("image/gif, ") + //.append("image/jpeg, ") + //.append("image/pjpeg, ") + //.append("image/webp, ") + //.append("image/apng, ") + //.append("application/xml, ") + //.append("application/xaml+xml, ") + //.append("application/xhtml+xml, ") + //.append("application/x-shockwave-flash, ") + //.append("application/x-ms-xbap, ") + //.append("application/x-ms-application, ") + //.append("application/msword, ") + //.append("application/vnd.ms-excel, ") + //.append("application/vnd.ms-xpsdocument, ") + //.append("application/vnd.ms-powerpoint, ") + //.append("text/plain, ") + //.append("text/html, ") + //.append("*/*"); conn.setRequestProperty("Accept", "*/*"); } //302获取重定向地址 diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java index 7c6ab6eb..65797d49 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirInfoThread.java @@ -16,9 +16,9 @@ package com.arialyy.aria.core.download.downloader; import com.arialyy.aria.core.FtpUrlEntity; -import com.arialyy.aria.core.common.AbsFtpInfoThread; import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; +import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadGroupEntity; import com.arialyy.aria.core.download.DownloadGroupTaskEntity; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java index acb3371a..1e1ca043 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpFileInfoThread.java @@ -15,7 +15,7 @@ */ package com.arialyy.aria.core.download.downloader; -import com.arialyy.aria.core.common.AbsFtpInfoThread; +import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; import com.arialyy.aria.core.download.DownloadEntity; diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java index 4d2390e8..82389993 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java @@ -16,7 +16,7 @@ package com.arialyy.aria.core.download.downloader; import com.arialyy.aria.core.AriaManager; -import com.arialyy.aria.core.common.AbsFtpThreadTask; +import com.arialyy.aria.core.common.ftp.AbsFtpThreadTask; import com.arialyy.aria.core.common.StateConstance; import com.arialyy.aria.core.common.SubThreadConfig; import com.arialyy.aria.core.download.DownloadEntity; diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java index 4be6c97f..4bf7d9a9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTarget.java @@ -37,7 +37,7 @@ import java.util.List; * Created by AriaL on 2017/7/3. */ public abstract class AbsTarget - implements ITarget { + implements ITarget { protected String TAG; protected ENTITY mEntity; protected TASK_ENTITY mTaskEntity; @@ -82,12 +82,18 @@ public abstract class AbsTarget { */ @CheckResult TARGET setRequestMode(RequestEnum requestEnum); + + @CheckResult + TARGET setUrlProxy(Proxy proxy); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java index 8b4b998a..8176258a 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ITarget.java @@ -18,48 +18,7 @@ package com.arialyy.aria.core.inf; /** * Created by AriaL on 2017/6/29. */ -public interface ITarget { - /** - * 获取任务状态 - * - * @return {@link IEntity} - */ - int getTaskState(); - - /** - * 任务是否在执行 - * - * @return {@code true} 任务正在执行 - */ - boolean isRunning(); - - /** - * 任务是否存在 - * - * @return {@code true} 任务存在 - */ - boolean taskExists(); - - /** - * 任务文件大小 - */ - long getSize(); - - /** - * 转换后的大小 - */ - String getConvertSize(); - - /** - * 获取任务进度百分比 - */ - int getPercent(); - - /** - * 获取任务进度,如果任务存在,则返回当前进度 - */ - long getCurrentProgress(); - +public interface ITarget { /** * 开始下载 */ diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java index 060d6b88..06793fd7 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/FtpUploadTarget.java @@ -18,7 +18,7 @@ package com.arialyy.aria.core.upload; import android.support.annotation.CheckResult; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.command.normal.NormalCmdFactory; -import com.arialyy.aria.core.delegate.FtpDelegate; +import com.arialyy.aria.core.common.ftp.FtpDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IFtpTarget; import com.arialyy.aria.util.CommonUtil; @@ -29,7 +29,7 @@ import com.arialyy.aria.util.CommonUtil; */ public class FtpUploadTarget extends BaseNormalTarget implements IFtpTarget { - private FtpDelegate mDelegate; + private FtpDelegate mDelegate; private String mAccount, mUser, mPw; private boolean needLogin = false; @@ -42,7 +42,7 @@ public class FtpUploadTarget extends BaseNormalTarget private void initTask(String filePath) { initTarget(filePath); mTaskEntity.setRequestType(AbsTaskEntity.U_FTP); - mDelegate = new FtpDelegate<>(this, mTaskEntity); + mDelegate = new FtpDelegate<>(this); } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java index a87e1bee..734ff20a 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTarget.java @@ -18,9 +18,10 @@ package com.arialyy.aria.core.upload; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import com.arialyy.aria.core.common.RequestEnum; -import com.arialyy.aria.core.delegate.HttpHeaderDelegate; +import com.arialyy.aria.core.common.http.HttpHeaderDelegate; import com.arialyy.aria.core.inf.AbsTaskEntity; import com.arialyy.aria.core.inf.IHttpHeaderTarget; +import java.net.Proxy; import java.util.Map; /** @@ -29,7 +30,7 @@ import java.util.Map; */ public class UploadTarget extends BaseNormalTarget implements IHttpHeaderTarget { - private HttpHeaderDelegate mDelegate; + private HttpHeaderDelegate mDelegate; UploadTarget(String filePath, String targetName) { this.mTargetName = targetName; @@ -42,7 +43,7 @@ public class UploadTarget extends BaseNormalTarget //http暂时不支持断点上传 mTaskEntity.setSupportBP(false); mTaskEntity.setRequestType(AbsTaskEntity.U_HTTP); - mDelegate = new HttpHeaderDelegate<>(this, mTaskEntity); + mDelegate = new HttpHeaderDelegate<>(this); } /** @@ -90,4 +91,8 @@ public class UploadTarget extends BaseNormalTarget @Override public UploadTarget setRequestMode(RequestEnum requestEnum) { return mDelegate.setRequestMode(requestEnum); } + + @Override public UploadTarget setUrlProxy(Proxy proxy) { + return mDelegate.setUrlProxy(proxy); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java index 2ad915da..efbceba2 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpFileInfoThread.java @@ -15,7 +15,7 @@ */ package com.arialyy.aria.core.upload.uploader; -import com.arialyy.aria.core.common.AbsFtpInfoThread; +import com.arialyy.aria.core.common.ftp.AbsFtpInfoThread; import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.OnFileInfoCallback; import com.arialyy.aria.core.common.TaskRecord; diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java index efe780a5..511d6f7d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/FtpThreadTask.java @@ -16,7 +16,7 @@ package com.arialyy.aria.core.upload.uploader; import com.arialyy.aria.core.AriaManager; -import com.arialyy.aria.core.common.AbsFtpThreadTask; +import com.arialyy.aria.core.common.ftp.AbsFtpThreadTask; import com.arialyy.aria.core.common.StateConstance; import com.arialyy.aria.core.common.SubThreadConfig; import com.arialyy.aria.core.inf.IEventListener; diff --git a/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java b/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java index 11271b97..fc6f89c1 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/DBConfig.java @@ -35,7 +35,7 @@ class DBConfig { /*adb pull /mnt/sdcard/Android/data/com.arialyy.simple/files/DB/AriaLyyDb d:/db*/ static Map mapping = new HashMap<>(); static String DB_NAME; - static int VERSION = 40; + static int VERSION = 41; /** * 是否将数据库保存在Sd卡,{@code true} 是 diff --git a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java index df832458..9a2e465c 100644 --- a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java @@ -17,6 +17,7 @@ package com.arialyy.aria.util; import android.text.TextUtils; import com.arialyy.aria.core.AriaManager; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.KeyManagementException; @@ -42,30 +43,46 @@ import javax.net.ssl.X509TrustManager; * SSL证书工具 */ public class SSLContextUtil { + private static final String TAG = "SSLContextUtil"; - public static String CA_PATH, CA_ALIAS; + /** + * 从assets目录下加载证书 + * + * @param caAlias CA证书别名 + * @param caPath 保存在assets目录下的CA证书完整路径 + */ + public static SSLContext getSSLContextFromAssets(String caAlias, String caPath) { + try { + InputStream caInput = AriaManager.APP.getAssets().open(caPath); + Certificate ca = loadCert(caInput); + return createContext(caAlias, ca); + } catch (IOException | CertificateException e) { + e.printStackTrace(); + } + return null; + } /** * 颁发服务器证书的 CA 未知 * * @param caAlias CA证书别名 - * @param caPath 保存在assets目录下的CA证书完整路径 + * @param caPath CA证书路径 */ public static SSLContext getSSLContext(String caAlias, String caPath) { if (TextUtils.isEmpty(caAlias) || TextUtils.isEmpty(caPath)) { return null; } - // Load CAs from an InputStream - // (could be from a resource or ByteArrayInputStream or ...) - CertificateFactory cf = null; try { - cf = CertificateFactory.getInstance("X.509"); - InputStream caInput = AriaManager.APP.getAssets().open(caPath); - Certificate ca; - ca = cf.generateCertificate(caInput); - System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN()); + Certificate ca = loadCert(new FileInputStream(caPath)); + return createContext(caAlias, ca); + } catch (CertificateException | IOException e) { + e.printStackTrace(); + } + return null; + } - // Create a KeyStore containing our trusted CAs + private static SSLContext createContext(String caAlias, Certificate ca) { + try { String keyStoreType = KeyStore.getDefaultType(); KeyStore keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(null, null); @@ -89,6 +106,20 @@ public class SSLContextUtil { return null; } + /** + * 加载CA证书 + * + * @param is CA证书文件流 + * @throws CertificateException + */ + private static Certificate loadCert(InputStream is) throws CertificateException, IOException { + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + Certificate ca = cf.generateCertificate(is); + ALog.d(TAG, String.format("ca【%s】", ((X509Certificate) ca).getSubjectDN())); + is.close(); + return ca; + } + /** * 服务器证书不是由 CA 签署的,而是自签署时,获取默认的SSL */ diff --git a/DEV_LOG.md b/DEV_LOG.md index 2f1c8d47..bf17d87b 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -1,4 +1,8 @@ ## 开发日志 + + v_3.4.8 + - 组合任务新增`updateUrls(List)`用于修改组合子任务的url,[see](https://aria.laoyuyu.me/aria_doc/api/task_handle.html#%E6%9B%B4%E6%96%B0%E4%BB%BB%E5%8A%A1url) + - 出于安全考虑,FTP数据库去掉密码的保存 + - 增加FTPS支持 [see]() + v_3.4.7 - 修复分块任务异常操作导致的问题 + v_3.4.6 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7550c3f4..a79260ea 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,9 +17,9 @@ - + diff --git a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java index 1e936757..452d3a99 100644 --- a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java @@ -32,6 +32,7 @@ import com.arialyy.simple.R; import com.arialyy.simple.base.BaseActivity; import com.arialyy.simple.databinding.ActivityDownloadGroupBinding; import com.arialyy.simple.widget.SubStateLinearLayout; +import java.util.ArrayList; import java.util.List; /** @@ -80,6 +81,8 @@ public class DownloadGroupActivity extends BaseActivity temp = new ArrayList<>(); + temp.add("https://d.pcs.baidu.com/file/130335545f3f4d9cc38afe709c19af5a?fid=1411168371-250528-1010657263806840&dstime=1531134714&rt=sh&sign=FDtAERVY-DCb740ccc5511e5e8fedcff06b081203-h8KgJ6gl4oY9UR6NqvwJsT4nVSM%3D&expires=8h&chkv=1&chkbd=0&chkpc=et&dp-logid=4401996296756616039&dp-callid=0&r=279987343"); Aria.download(this) .loadGroup(mUrls) .setDirPath( @@ -88,7 +91,7 @@ public class DownloadGroupActivity extends BaseActivity getUrls1() { List urls = new ArrayList<>(); - String[] str = getContext().getResources().getStringArray(R.array.group_urls); - Collections.addAll(urls, str); + //String[] str = getContext().getResources().getStringArray(R.array.group_urls); + //Collections.addAll(urls, str); + urls.add("https://d.pcs.baidu.com/file/130335545f3f4d9cc38afe709c19af5a?fid=1411168371-250528-1010657263806840&dstime=1531134607&rt=sh&sign=FDtAERVY-DCb740ccc5511e5e8fedcff06b081203-sNCujT7lC42aMcfiHcgqAzYHuw4%3D&expires=8h&chkv=1&chkbd=0&chkpc=et&dp-logid=4401967667009194668&dp-callid=0&r=540192514"); return urls; } diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java index caa1047b..2df1eb6a 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunActivity.java @@ -28,7 +28,8 @@ public class AnyRunActivity extends BaseActivity { //private final String URL = "ftp://192.168.29.140:21/download/AriaPrj.rar"; //String URL = "https://dl.genymotion.com/releases/genymotion-2.12.1/genymotion-2.12.1-vbox.exe"; //String URL = "ftp://192.168.29.140:21/download/SDK_Demo-release.apk"; - String URL = "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"; + String URL = "ftps://192.168.29.140:990/download/SDK_Demo-release.apk"; + //String URL = "http://d.quanscreen.com/k/down/resourceDownLoad?resourceId=1994&clientId=A000011106034058176"; //String URL = "ftp://z:z@dygod18.com:21211/[电影天堂www.dy2018.com]猩球崛起3:终极之战BD国英双语中英双字.mkv"; //private String URL = "https://www.bilibili.com/bangumi/play/ep77693"; //private String URL = "http://cn-hbsjz-cmcc-v-03.acgvideo.com/upgcxcode/63/82/5108263/5108263-1-80.flv?expires=1530178500&platform=pc&ssig=vr7gLl0duyqWqSMnIpzaDA&oi=3746029570&nfa=BpfiWF+i4mNW8KzjZFHzBQ==&dynamic=1&hfa=2030547937&hfb=Yjk5ZmZjM2M1YzY4ZjAwYTMzMTIzYmIyNWY4ODJkNWI=&trid=3476be01a9254115b15f8cc7198600fe&nfc=1"; @@ -50,8 +51,8 @@ public class AnyRunActivity extends BaseActivity { public void onClick(View view) { switch (view.getId()) { case R.id.start: - module.start(URL); - //module.startFtp(URL); + //module.start(URL); + module.startFtp(URL); break; case R.id.stop: module.stop(URL); diff --git a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java index 40f2632f..1af461d3 100644 --- a/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java +++ b/app/src/main/java/com/arialyy/simple/test/AnyRunnModule.java @@ -10,7 +10,6 @@ import com.arialyy.aria.core.download.DownloadTask; import com.arialyy.aria.util.CommonUtil; import com.arialyy.frame.util.show.L; import java.io.File; -import java.net.Proxy; /** * Created by laoyuyu on 2018/4/13. @@ -79,7 +78,11 @@ public class AnyRunnModule { Aria.download(this) .loadFtp(url) .login("lao", "123456") - .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/") + .setFilePath(Environment.getExternalStorageDirectory().getPath() + "/Download/") + .asFtps() + .setStorePath("/mnt/sdcard/Download/server.crt") + .setAlias("www.laoyuyu.me") + .setStorePass("123456") .start(); }