Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_43355755
engine
提交
9cbf50a5
E
engine
项目概览
weixin_43355755
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
9cbf50a5
编写于
7月 09, 2021
作者:
W
Wyte Krongapiradee
提交者:
GitHub
7月 08, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Avoid unintended clipboard access (#27215)
上级
dfd43abb
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
52 addition
and
5 deletion
+52
-5
shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java
...rm/android/io/flutter/plugin/platform/PlatformPlugin.java
+18
-4
shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java
...d/test/io/flutter/plugin/platform/PlatformPluginTest.java
+34
-1
未找到文件。
shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java
浏览文件 @
9cbf50a5
...
...
@@ -7,6 +7,7 @@ package io.flutter.plugin.platform;
import
android.app.Activity
;
import
android.app.ActivityManager.TaskDescription
;
import
android.content.ClipData
;
import
android.content.ClipDescription
;
import
android.content.ClipboardManager
;
import
android.content.Context
;
import
android.os.Build
;
...
...
@@ -124,10 +125,7 @@ public class PlatformPlugin {
@Override
public
boolean
clipboardHasStrings
()
{
CharSequence
data
=
PlatformPlugin
.
this
.
getClipboardData
(
PlatformChannel
.
ClipboardContentFormat
.
PLAIN_TEXT
);
return
data
!=
null
&&
data
.
length
()
>
0
;
return
PlatformPlugin
.
this
.
clipboardHasStrings
();
}
};
...
...
@@ -490,4 +488,20 @@ public class PlatformPlugin {
ClipData
clip
=
ClipData
.
newPlainText
(
"text label?"
,
text
);
clipboard
.
setPrimaryClip
(
clip
);
}
private
boolean
clipboardHasStrings
()
{
ClipboardManager
clipboard
=
(
ClipboardManager
)
activity
.
getSystemService
(
Context
.
CLIPBOARD_SERVICE
);
// Android 12 introduces a toast message that appears when an app reads the clipboard. To avoid
// unintended access, call the appropriate APIs to receive information about the current content
// that's on the clipboard (rather than the actual content itself).
if
(!
clipboard
.
hasPrimaryClip
())
{
return
false
;
}
ClipDescription
description
=
clipboard
.
getPrimaryClipDescription
();
if
(
description
==
null
)
{
return
false
;
}
return
description
.
hasMimeType
(
"text/*"
);
}
}
shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java
浏览文件 @
9cbf50a5
...
...
@@ -7,6 +7,7 @@ import static org.junit.Assert.assertNull;
import
static
org
.
junit
.
Assert
.
assertTrue
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
mockito
.
Mockito
.
never
;
import
static
org
.
mockito
.
Mockito
.
spy
;
import
static
org
.
mockito
.
Mockito
.
times
;
import
static
org
.
mockito
.
Mockito
.
verify
;
import
static
org
.
mockito
.
Mockito
.
when
;
...
...
@@ -96,10 +97,11 @@ public class PlatformPluginTest {
assertEquals
(
dataInputStream
.
read
(),
uriInputStream
.
read
());
}
@Config
(
sdk
=
28
)
@Test
public
void
platformPlugin_hasStrings
()
{
ClipboardManager
clipboardManager
=
RuntimeEnvironment
.
application
.
getSystemService
(
ClipboardManager
.
class
);
spy
(
RuntimeEnvironment
.
application
.
getSystemService
(
ClipboardManager
.
class
)
);
View
fakeDecorView
=
mock
(
View
.
class
);
Window
fakeWindow
=
mock
(
Window
.
class
);
...
...
@@ -110,13 +112,44 @@ public class PlatformPluginTest {
PlatformChannel
fakePlatformChannel
=
mock
(
PlatformChannel
.
class
);
PlatformPlugin
platformPlugin
=
new
PlatformPlugin
(
fakeActivity
,
fakePlatformChannel
);
// Plain text
ClipData
clip
=
ClipData
.
newPlainText
(
"label"
,
"Text"
);
clipboardManager
.
setPrimaryClip
(
clip
);
assertTrue
(
platformPlugin
.
mPlatformMessageHandler
.
clipboardHasStrings
());
// Empty plain text
clip
=
ClipData
.
newPlainText
(
""
,
""
);
clipboardManager
.
setPrimaryClip
(
clip
);
// Without actually accessing clipboard data (preferred behavior), it is not possible to
// distinguish between empty and non-empty string contents.
assertTrue
(
platformPlugin
.
mPlatformMessageHandler
.
clipboardHasStrings
());
// HTML text
clip
=
ClipData
.
newHtmlText
(
"motto"
,
"Don't be evil"
,
"<b>Don't</b> be evil"
);
clipboardManager
.
setPrimaryClip
(
clip
);
assertTrue
(
platformPlugin
.
mPlatformMessageHandler
.
clipboardHasStrings
());
// Text MIME type
clip
=
new
ClipData
(
"label"
,
new
String
[]
{
"text/something"
},
new
ClipData
.
Item
(
"content"
));
clipboardManager
.
setPrimaryClip
(
clip
);
assertTrue
(
platformPlugin
.
mPlatformMessageHandler
.
clipboardHasStrings
());
// Other MIME type
clip
=
new
ClipData
(
"label"
,
new
String
[]
{
"application/octet-stream"
},
new
ClipData
.
Item
(
"content"
));
clipboardManager
.
setPrimaryClip
(
clip
);
assertFalse
(
platformPlugin
.
mPlatformMessageHandler
.
clipboardHasStrings
());
if
(
Build
.
VERSION
.
SDK_INT
>=
28
)
{
// Empty clipboard
clipboardManager
.
clearPrimaryClip
();
assertFalse
(
platformPlugin
.
mPlatformMessageHandler
.
clipboardHasStrings
());
}
// Verify that the clipboard contents are never accessed.
verify
(
clipboardManager
,
never
()).
getPrimaryClip
();
verify
(
clipboardManager
,
never
()).
getText
();
}
@Config
(
sdk
=
29
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录