【发布时间】:2018-10-24 15:42:45
【问题描述】:
我想阻止 DownloadManager 为 NetworkPolicyManager 禁止访问互联网的应用下载文件。我使用的自定义 ROM 通过将这样的条目写入 iptables 来强制执行此操作:
-A INPUT -i <interface> -m owner --uid-owner <UID> -j REJECT --reject-with icmp-port-unreachable
DownloadManager 是在他自己的 UID 下启动的,因此可以为无法访问 Internet 的应用程序下载文件。如果我也限制了 DownloadManager,其他应该能够访问 Internet 的应用程序无法通过 DownloadManager 下载文件作为附带损害。我的(长期)目标是通过关闭这个(安全)漏洞来为这个自定义 ROM 做出贡献。
我看了source code of DownloadManager,不明白enqueue方法中实际下载从哪里开始。在这个方法之后执行什么代码?我在其他方法中也找不到任何线索。
public long enqueue(Request request) {
ContentValues values = request.toContentValues(mPackageName);
Uri downloadUri = mResolver.insert(Downloads.Impl.CONTENT_URI, values);
long id = Long.parseLong(downloadUri.getLastPathSegment());
return id;
}
最后,我想修改 DownloadManager,使受限制应用排队的下载得到相应的状态设置,并在不使客户端应用(尝试开始下载的应用)崩溃的情况下停止。
COLUMN_STATUS = STATUS_FAILED = 1 << 4 = 16
COLUMN_REASON = ERROR_UNKNOWN = 1000 or ERROR_BLOCKED = 1010
但如果我不明白发生了什么,我就无法做到这一点。请帮助我理解代码或提示我正确的方向。
【问题讨论】:
-
"这个方法之后会执行什么代码?" ——没有,直接。实际下载由a separate app执行。