Skip to content

Commit 74e5b3b

Browse files
author
yutingzeng
committed
增加使用字符串房间号生成privateMapKey
'#' will be ignored, and an empty message aborts the commit.
1 parent db093b1 commit 74e5b3b

File tree

2 files changed

+71
-14
lines changed

2 files changed

+71
-14
lines changed

src/main/java/com/tencentyun/TLSSigAPIv2.java

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,51 @@ public String genUserSig(String userid, long expire) {
5252
* @param expire - PrivateMapKey 票据的过期时间,单位是秒,比如 86400 生成的 PrivateMapKey 票据在一天后就无法再使用了。
5353
* @param roomid - 房间号,用于指定该 userid 可以进入的房间号
5454
* @param privilegeMap - 权限位,使用了一个字节中的 8 个比特位,分别代表八个具体的功能权限开关:
55-
* - 第 1 位:0000 0001 = 1,创建房间的权限
56-
* - 第 2 位:0000 0010 = 2,加入房间的权限
57-
* - 第 3 位:0000 0100 = 4,发送语音的权限
58-
* - 第 4 位:0000 1000 = 8,接收语音的权限
59-
* - 第 5 位:0001 0000 = 16,发送视频的权限
60-
* - 第 6 位:0010 0000 = 32,接收视频的权限
61-
* - 第 7 位:0100 0000 = 64,发送辅路(也就是屏幕分享)视频的权限
62-
* - 第 8 位:1000 0000 = 200,接收辅路(也就是屏幕分享)视频的权限
63-
* - privilegeMap == 1111 1111 == 255 代表该 userid 在该 roomid 房间内的所有功能权限。
64-
* - privilegeMap == 0010 1010 == 42 代表该 userid 拥有加入房间和接收音视频数据的权限,但不具备其他权限。
55+
* - 第 1 位:0000 0001 = 1,创建房间的权限
56+
* - 第 2 位:0000 0010 = 2,加入房间的权限
57+
* - 第 3 位:0000 0100 = 4,发送语音的权限
58+
* - 第 4 位:0000 1000 = 8,接收语音的权限
59+
* - 第 5 位:0001 0000 = 16,发送视频的权限
60+
* - 第 6 位:0010 0000 = 32,接收视频的权限
61+
* - 第 7 位:0100 0000 = 64,发送辅路(也就是屏幕分享)视频的权限
62+
* - 第 8 位:1000 0000 = 200,接收辅路(也就是屏幕分享)视频的权限
63+
* - privilegeMap == 1111 1111 == 255 代表该 userid 在该 roomid 房间内的所有功能权限。
64+
* - privilegeMap == 0010 1010 == 42 代表该 userid 拥有加入房间和接收音视频数据的权限,但不具备其他权限。
6565
* @return usersig - 生成带userbuf的签名
6666
*/
6767
public String genPrivateMapKey(String userid, long expire, long roomid, long privilegeMap) {
68-
byte[] userbuf = genUserBuf(userid, roomid, expire, privilegeMap, 0); //生成userbuf
68+
byte[] userbuf = genUserBuf(userid, roomid, expire, privilegeMap, 0, null); //生成userbuf
69+
return genUserSig(userid, expire, userbuf);
70+
}
71+
72+
/**
73+
* 【功能说明】
74+
* 用于签发 TRTC 进房参数中可选的 PrivateMapKey 权限票据。
75+
* PrivateMapKey 需要跟 UserSig 一起使用,但 PrivateMapKey 比 UserSig 有更强的权限控制能力:
76+
* - UserSig 只能控制某个 UserID 有无使用 TRTC 服务的权限,只要 UserSig 正确,其对应的 UserID 可以进出任意房间。
77+
* - PrivateMapKey 则是将 UserID 的权限控制的更加严格,包括能不能进入某个房间,能不能在该房间里上行音视频等等。
78+
* 如果要开启 PrivateMapKey 严格权限位校验,需要在【实时音视频控制台】/【应用管理】/【应用信息】中打开“启动权限密钥”开关。
79+
* <p>
80+
* 【参数说明】
81+
*
82+
* @param userid - 用户id,限制长度为32字节,只允许包含大小写英文字母(a-zA-Z)、数字(0-9)及下划线和连词符。
83+
* @param expire - PrivateMapKey 票据的过期时间,单位是秒,比如 86400 生成的 PrivateMapKey 票据在一天后就无法再使用了。
84+
* @param roomstr - 字符串房间号,用于指定该 userid 可以进入的房间号
85+
* @param privilegeMap - 权限位,使用了一个字节中的 8 个比特位,分别代表八个具体的功能权限开关:
86+
* - 第 1 位:0000 0001 = 1,创建房间的权限
87+
* - 第 2 位:0000 0010 = 2,加入房间的权限
88+
* - 第 3 位:0000 0100 = 4,发送语音的权限
89+
* - 第 4 位:0000 1000 = 8,接收语音的权限
90+
* - 第 5 位:0001 0000 = 16,发送视频的权限
91+
* - 第 6 位:0010 0000 = 32,接收视频的权限
92+
* - 第 7 位:0100 0000 = 64,发送辅路(也就是屏幕分享)视频的权限
93+
* - 第 8 位:1000 0000 = 200,接收辅路(也就是屏幕分享)视频的权限
94+
* - privilegeMap == 1111 1111 == 255 代表该 userid 在该 roomid 房间内的所有功能权限。
95+
* - privilegeMap == 0010 1010 == 42 代表该 userid 拥有加入房间和接收音视频数据的权限,但不具备其他权限。
96+
* @return usersig - 生成带userbuf的签名
97+
*/
98+
public String genPrivateMapKeyWithStringRoomID(String userid, long expire, String roomstr, long privilegeMap) {
99+
byte[] userbuf = genUserBuf(userid, 0, expire, privilegeMap, 0, roomstr); //生成userbuf
69100
return genUserSig(userid, expire, userbuf);
70101
}
71102

@@ -125,7 +156,7 @@ private String genUserSig(String userid, long expire, byte[] userbuf) {
125156
}
126157

127158
public byte[] genUserBuf(String account, long dwAuthID, long dwExpTime,
128-
long dwPrivilegeMap, long dwAccountType) {
159+
long dwPrivilegeMap, long dwAccountType, String RoomStr) {
129160
//视频校验位需要用到的字段,按照网络字节序放入buf中
130161
/*
131162
cVer unsigned char/1 版本号,填0
@@ -138,11 +169,20 @@ public byte[] genUserBuf(String account, long dwAuthID, long dwExpTime,
138169
dwAccountType unsigned int/4 第三方帐号类型
139170
*/
140171
int accountLength = account.length();
172+
int roomStrLength = RoomStr.length();
141173
int offset = 0;
142-
byte[] userbuf = new byte[1 + 2 + accountLength + 4 + 4 + 4 + 4 + 4];
174+
int bufLength = 1 + 2 + accountLength + 20 ;
175+
if (roomStrLength > 0) {
176+
bufLength = bufLength + 2 + roomStrLength;
177+
}
178+
byte[] userbuf = new byte[bufLength];
143179

144180
//cVer
145-
userbuf[offset++] = 0;
181+
if (roomStrLength > 0) {
182+
userbuf[offset++] = 1;
183+
} else {
184+
userbuf[offset++] = 0;
185+
}
146186

147187
//wAccountLen
148188
userbuf[offset++] = (byte) ((accountLength & 0xFF00) >> 8);
@@ -185,6 +225,17 @@ public byte[] genUserBuf(String account, long dwAuthID, long dwExpTime,
185225
userbuf[offset++] = (byte) ((dwAccountType & 0x0000FF00) >> 8);
186226
userbuf[offset++] = (byte) (dwAccountType & 0x000000FF);
187227

228+
229+
if (roomStrLength > 0) {
230+
//roomStrLen
231+
userbuf[offset++] = (byte) ((roomStrLength & 0xFF00) >> 8);
232+
userbuf[offset++] = (byte) (roomStrLength & 0x00FF);
233+
234+
//roomStr
235+
for (; offset < bufLength; ++offset) {
236+
userbuf[offset] = (byte) RoomStr.charAt(offset - (bufLength - roomStrLength));
237+
}
238+
}
188239
return userbuf;
189240
}
190241
}

src/test/com/tencentyun/TLSSigAPITest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ public void testGenSigWithUserBug() {
3636
TLSSigAPIv2 api = new TLSSigAPIv2(1400000000, "5bd2850fff3ecb11d7c805251c51ee463a25727bddc2385f3fa8bfee1bb93b5e");
3737
System.out.println(api.genPrivateMapKey("xiaojun", 180 * 86400, 10000, 255));
3838
}
39+
//使用userbuf和字符串房间号生产privatemapkey
40+
@Test
41+
public void testGenSigWithUserBug() {
42+
TLSSigAPIv2 api = new TLSSigAPIv2(1400000000, "5bd2850fff3ecb11d7c805251c51ee463a25727bddc2385f3fa8bfee1bb93b5e");
43+
System.out.println(api.genPrivateMapKeyWithStringRoomID("xiaojun", 180 * 86400, "100000000", 255));
44+
}
3945

4046
/**
4147
* Method: hmacsha256(String identifier, long currTime, long expire)

0 commit comments

Comments
 (0)