package com.qiniu.pili;
import com.qiniu.pili.utils.HMac;
import com.qiniu.pili.utils.UrlSafeBase64;
import java.net.URL;
final class Mac {
private String accessKey;
private String secretKey;
public Mac(String accessKey, String secretKey) {
this.accessKey = accessKey;
this.secretKey = secretKey;
}
public String sign(String data) throws Exception {
byte[] sum = HMac.HmacSHA1Encrypt(data, this.secretKey);
String sign = UrlSafeBase64.encodeToString(sum);
return this.accessKey + ":" + sign;
}
public String signRequest(URL url, String method, byte[] body, String contentType) throws Exception {
StringBuilder sb = new StringBuilder();
sb.append(String.format("%s %s", method, url.getPath()));
if (url.getQuery() != null) {
sb.append(String.format("?%s", url.getQuery()));
}
sb.append(String.format("\nHost: %s", url.getHost()));
if (url.getPort() > 0) {
sb.append(String.format(":%d", url.getPort()));
}
if (contentType != null) {
sb.append(String.format("\nContent-Type: %s", contentType));
}
// body
sb.append("\n\n");
if (incBody(body, contentType)) {
sb.append(new String(body));
}
byte[] sum = HMac.HmacSHA1Encrypt(sb.toString(), this.secretKey);
String sign = UrlSafeBase64.encodeToString(sum);
return this.accessKey + ":" + sign;
}
private boolean incBody(byte[] body, String contentType) {
int maxContentLength = 1024 * 1024;
boolean typeOK = contentType != null && !contentType.equals("application/octet-stream");
boolean lengthOK = body != null && body.length > 0 && body.length < maxContentLength;
return typeOK && lengthOK;
}
//连麦 RoomToken
public String signRoomToken(String roomAccess) throws Exception {
String encodedRoomAcc = UrlSafeBase64.encodeToString(roomAccess);
byte[] sign = HMac.HmacSHA1Encrypt(encodedRoomAcc, this.secretKey);
String encodedSign = UrlSafeBase64.encodeToString(sign);
return this.accessKey + ":" + encodedSign+":"+encodedRoomAcc;
}
}