com.kaltura.client.ClientBase Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of kalturaApiClient Show documentation
Show all versions of kalturaApiClient Show documentation
KalturaClient is a library of Java classes that can be used to interact
with the Kaltura REST API. More information about the REST API can be
found at http://corp.kaltura.com/Products/Kaltura-API Many of the Java classes
in this library are auto-generated from a schema that defines the objects that
are used to interect with the API. The current schema can be found at
http://www.kaltura.com/api_v3/api_schema.php
// ===================================================================================================
// _ __ _ _
// | |/ /__ _| | |_ _ _ _ _ __ _
// | ' _` | | _| || | '_/ _` |
// |_|\_\__,_|_|\__|\_,_|_| \__,_|
//
// This file is part of the Kaltura Collaborative Media Suite which allows users
// to do with audio, video, and animation what Wiki platfroms allow them to do with
// text.
//
// Copyright (C) 2006-2011 Kaltura Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
//
// @ignore
// ===================================================================================================
package com.kaltura.client;
import com.kaltura.client.enums.SessionType;
import com.kaltura.client.utils.EncryptionUtils;
import com.kaltura.client.utils.request.ConnectionConfiguration;
import org.apache.commons.codec.binary.Base64;
import java.net.URLEncoder;
import java.security.GeneralSecurityException;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
@SuppressWarnings("serial")
public class ClientBase extends ClientConfigBase {
private static final String UTF8_CHARSET = "UTF-8";
// KS v2 constants
private static final String FIELD_EXPIRY = "_e";
private static final String FIELD_USER = "_u";
private static final String FIELD_TYPE = "_t";
private static final int RANDOM_SIZE = 16;
public static final int EXPIRY = 86400;
private static ILogger logger = Logger.getLogger(ClientBase.class);
public ClientBase(ConnectionConfiguration configuration) {
super(configuration);
}
public String generateSession(String adminSecretForSigning, String userId, SessionType type, int partnerId) throws Exception
{
return this.generateSession(adminSecretForSigning, userId, type, partnerId, EXPIRY);
}
public String generateSession(String adminSecretForSigning, String userId, SessionType type, int partnerId, int expiry) throws Exception
{
return this.generateSession(adminSecretForSigning, userId, type, partnerId, expiry, "");
}
/** generate "ks" to be used fro requests - OVP */
public String generateSession(String adminSecretForSigning, String userId, SessionType type, int partnerId, int expiry, String privileges) throws Exception
{
try
{
// initialize required values
int rand = (int)(Math.random() * 32000);
expiry += (int)(System.currentTimeMillis() / 1000);
// build info string
StringBuilder sbInfo = new StringBuilder();
sbInfo.append(partnerId).append(";"); // index 0 - partner ID
sbInfo.append(partnerId).append(";"); // index 1 - partner pattern - using partner ID
sbInfo.append(expiry).append(";"); // index 2 - expiration timestamp
sbInfo.append(type.getValue()).append(";"); // index 3 - session type
sbInfo.append(rand).append(";"); // index 4 - random number
sbInfo.append(userId).append(";"); // index 5 - user ID
sbInfo.append(privileges); // index 6 - privileges
byte[] infoSignature = EncryptionUtils.encryptSHA1(adminSecretForSigning + (sbInfo.toString()));
// convert signature to hex:
String signature = convertToHex(infoSignature);
// build final string to base64 encode
StringBuilder sbToEncode = new StringBuilder();
sbToEncode.append(signature.toString()).append("|").append(sbInfo.toString());
// encode the signature and info with base64
String hashedString = new String(Base64.encodeBase64(sbToEncode.toString().getBytes()));
// remove line breaks in the session string
String ks = hashedString.replace("\n", "");
ks = hashedString.replace("\r", "");
// return the generated session key (KS)
return ks;
} catch (NoSuchAlgorithmException ex)
{
throw new Exception(ex);
}
}
private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a' + (halfbyte - 10)));
halfbyte = data[i] & 0x0F;
} while(two_halfs++ < 1);
}
return buf.toString();
}
public String generateSessionV2(String adminSecretForSigning, String userId, SessionType type, int partnerId, int expiry, String privileges) throws Exception
{
try {
// build fields array
Params fields = new Params();
String[] privilegesArr = privileges.split(",");
for (String curPriv : privilegesArr) {
String privilege = curPriv.trim();
if(privilege.length() == 0)
continue;
if(privilege.equals("*"))
privilege = "all:*";
String[] splittedPriv = privilege.split(":");
if(splittedPriv.length>1) {
fields.add(splittedPriv[0], URLEncoder.encode(splittedPriv[1], UTF8_CHARSET));
} else {
fields.add(splittedPriv[0], "");
}
}
Integer expiryInt = (int)(System.currentTimeMillis() / 1000) + expiry;
String expStr = expiryInt.toString();
fields.add(FIELD_EXPIRY, expStr);
fields.add(FIELD_TYPE, Integer.toString(type.getValue()));
fields.add(FIELD_USER, userId);
// build fields string
byte[] randomBytes = createRandomByteArray(RANDOM_SIZE);
byte[] fieldsByteArray = fields.toQueryString().getBytes();
int totalLength = randomBytes.length + fieldsByteArray.length;
byte[] fieldsAndRandomBytes = new byte[totalLength];
System.arraycopy(randomBytes, 0, fieldsAndRandomBytes, 0, randomBytes.length);
System.arraycopy(fieldsByteArray, 0, fieldsAndRandomBytes, randomBytes.length, fieldsByteArray.length);
byte[] infoSignature = EncryptionUtils.encryptSHA1(fieldsAndRandomBytes);
byte[] input = new byte[infoSignature.length + fieldsAndRandomBytes.length];
System.arraycopy(infoSignature, 0, input, 0, infoSignature.length);
System.arraycopy(fieldsAndRandomBytes,0,input,infoSignature.length, fieldsAndRandomBytes.length);
// encrypt and encode
byte[] encryptedFields = EncryptionUtils.encryptAES(adminSecretForSigning, input);
String prefix = "v2|" + partnerId + "|";
byte[] output = new byte[encryptedFields.length + prefix.length()];
System.arraycopy(prefix.getBytes(), 0, output, 0, prefix.length());
System.arraycopy(encryptedFields,0,output,prefix.length(), encryptedFields.length);
String encodedKs = new String(Base64.encodeBase64(output));
encodedKs = encodedKs.replaceAll("\\+", "-");
encodedKs = encodedKs.replaceAll("/", "_");
encodedKs = encodedKs.replace("\n", "");
encodedKs = encodedKs.replace("\r", "");
return encodedKs;
} catch (GeneralSecurityException ex) {
logger.error("Failed to generate v2 session.");
throw new Exception(ex);
}
}
private byte[] createRandomByteArray(int size) {
byte[] b = new byte[size];
new Random().nextBytes(b);
return b;
}
}