Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
295c7ea4
Commit
295c7ea4
authored
Jun 13, 2019
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
拦截hls播放请求,转换成kBroadcastMediaPlayed事件
parent
618cf795
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
44 行增加
和
16 行删除
+44
-16
server/WebHook.cpp
+44
-16
没有找到文件。
server/WebHook.cpp
查看文件 @
295c7ea4
...
...
@@ -72,6 +72,7 @@ const char kOnShellLogin[] = HOOK_FIELD"on_shell_login";
const
char
kOnStreamNoneReader
[]
=
HOOK_FIELD
"on_stream_none_reader"
;
const
char
kOnHttpAccess
[]
=
HOOK_FIELD
"on_http_access"
;
const
char
kAdminParams
[]
=
HOOK_FIELD
"admin_params"
;
const
char
kAccessFileExceptHls
[]
=
HOOK_FIELD
"access_file_except_hls"
;
onceToken
token
([](){
mINI
::
Instance
()[
kEnable
]
=
true
;
...
...
@@ -88,6 +89,7 @@ onceToken token([](){
mINI
::
Instance
()[
kOnStreamNoneReader
]
=
"https://127.0.0.1/index/hook/on_stream_none_reader"
;
mINI
::
Instance
()[
kOnHttpAccess
]
=
"https://127.0.0.1/index/hook/on_http_access"
;
mINI
::
Instance
()[
kAdminParams
]
=
"secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc"
;
mINI
::
Instance
()[
kAccessFileExceptHls
]
=
true
;
},
nullptr
);
}
//namespace Hook
...
...
@@ -192,6 +194,7 @@ void installWebHook(){
GET_CONFIG
(
string
,
hook_shell_login
,
Hook
::
kOnShellLogin
);
GET_CONFIG
(
string
,
hook_stream_none_reader
,
Hook
::
kOnStreamNoneReader
);
GET_CONFIG
(
string
,
hook_http_access
,
Hook
::
kOnHttpAccess
);
GET_CONFIG
(
bool
,
access_file_except_hls
,
Hook
::
kAccessFileExceptHls
);
NoticeCenter
::
Instance
().
addListener
(
nullptr
,
Broadcast
::
kBroadcastMediaPublish
,[](
BroadcastMediaPublishArgs
){
...
...
@@ -395,25 +398,39 @@ void installWebHook(){
uid
=
params
[
"token"
];
return
;
}
if
(
!
params
[
"uid"
].
empty
()){
//根据uid追踪用户
uid
=
params
[
"uid"
];
return
;
if
(
!
parser
.
Params
().
empty
()){
//根据url参数来追踪用户
uid
=
parser
.
Params
();
}
});
if
(
!
params
[
"user"
].
empty
()){
//根据user追踪用户
uid
=
params
[
"user"
];
return
;
//字符串是否以xx结尾
static
auto
end_of
=
[](
const
string
&
str
,
const
string
&
substr
){
auto
pos
=
str
.
rfind
(
substr
);
return
pos
!=
string
::
npos
&&
pos
==
str
.
size
()
-
substr
.
size
();
};
//拦截hls的播放请求
static
auto
checkHls
=
[](
BroadcastHttpAccessArgs
){
if
(
!
end_of
(
args
.
_streamid
,(
"/hls.m3u8"
)))
{
//不是hls
return
false
;
}
//访问的.m3u8结尾,我们转换成kBroadcastMediaPlayed事件
Broadcast
::
AuthInvoker
mediaAuthInvoker
=
[
invoker
,
path
](
const
string
&
err
){
if
(
err
.
empty
()
){
//鉴权通过,允许播放一个小时
invoker
(
path
.
substr
(
0
,
path
.
rfind
(
"/"
)
+
1
),
60
*
60
);
}
else
{
//鉴权失败,10秒内不允许播放hls
invoker
(
""
,
10
);
}
};
if
(
!
params
[
"secret"
].
empty
()){
//根据secret追踪用户
uid
=
params
[
"secret"
];
return
;
}
});
auto
args_copy
=
args
;
replace
(
args_copy
.
_streamid
,
"/hls.m3u8"
,
""
);
return
NoticeCenter
::
Instance
().
emitEvent
(
Broadcast
::
kBroadcastMediaPlayed
,
args_copy
,
mediaAuthInvoker
,
sender
);
};
//http客户端访问文件鉴权事件
...
...
@@ -426,6 +443,17 @@ void installWebHook(){
//需要指出的是,假如http客户端支持cookie,并且判定客户端没有权限,那么在该cookie有效期内,
//不管该客户端是否变换url参数都将无法再次访问该文件,所以如果判定无权限的情况下,可以把cookie有效期设置短一点
NoticeCenter
::
Instance
().
addListener
(
nullptr
,
Broadcast
::
kBroadcastHttpAccess
,[](
BroadcastHttpAccessArgs
){
if
(
checkHls
(
parser
,
args
,
path
,
is_dir
,
invoker
,
sender
)){
//是hls的播放鉴权,拦截之
return
;
}
if
(
!
access_file_except_hls
){
//不允许访问hls之外的文件
invoker
(
""
,
60
*
60
);
return
;
}
if
(
sender
.
get_peer_ip
()
==
"127.0.0.1"
&&
args
.
_param_strs
==
hook_adminparams
){
//如果是本机或超级管理员访问,那么不做访问鉴权;权限有效期1个小时
invoker
(
"/"
,
60
*
60
);
...
...
@@ -446,7 +474,7 @@ void installWebHook(){
body
[
"is_dir"
]
=
is_dir
;
body
[
"params"
]
=
parser
.
Params
();
for
(
auto
&
pr
:
parser
.
getValues
()){
body
[
string
(
"header."
)
+
pr
.
first
]
=
pr
.
second
;
body
[
string
(
"header."
)
+
pr
.
first
]
=
pr
.
second
;
}
//执行hook
do_http_hook
(
hook_http_access
,
body
,
[
invoker
](
const
Value
&
obj
,
const
string
&
err
){
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论