package org.mconf.bbb.api;
import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class JoinService0Dot8 extends JoinServiceBase {
private static final Logger log = LoggerFactory.getLogger(JoinService0Dot8.class);
private String salt;
private long timestamp = 0,
lastRequest = 0;
public void setSalt(String salt) {
if (!salt.equals(this.salt)) {
this.salt = salt;
// if the salt is changed, we need to reset the timestamp stuff
this.timestamp = 0;
this.lastRequest = 0;
}
}
public String getSalt() {
return this.salt;
}
@Override
protected String getCreateMeetingUrl(String meetingID) {
String parameters = "action=create" + "&meetingID=" + urlEncode(meetingID) + "×tamp=" + timestamp;
return "?" + parameters + "&checksum=" + checksum(parameters + salt);
}
@Override
public int createMeeting(String meetingID) { //.
int code = updateTimestamp();
if (code != E_OK)
return code;
return super.createMeeting(meetingID);
}
@Override
protected String getDemoPath() {
return "/demo/mobile.jsp";
}
@Override
protected String getJoinUrl(Meeting meeting, String name, boolean moderator) {
String parameters = "action=join"
+ "&meetingID=" + urlEncode(meeting.getMeetingID())
+ "&fullName=" + urlEncode(name)
+ "&password=" + urlEncode(moderator? meeting.getModeratorPW(): meeting.getAttendeePW())
+ "×tamp=" + timestamp;
return "?" + parameters + "&checksum=" + checksum(parameters + salt);
}
@Override
public int join(String meetingID, String name, boolean moderator) { //.
int code = updateTimestamp();
if (code != E_OK)
return code;
return super.join(meetingID, name, moderator);
}
@Override
protected String getLoadUrl() {
String parameters = "action=getMeetings" + "×tamp=" + timestamp;
return "?" + parameters + "&checksum=" + checksum(parameters + salt);
}
@Override
public int load() { //.
int code = updateTimestamp();
if (code != E_OK)
return code;
return super.load();
}
private int parseTimestamp(String str) { //.
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new ByteArrayInputStream(str.getBytes("UTF-8")));
doc.getDocumentElement().normalize();
Element nodeResponse = (Element) doc.getElementsByTagName("response").item(0);
String returncode = nodeResponse.getElementsByTagName("returncode").item(0).getFirstChild().getNodeValue();
if (returncode.equals("SUCCESS")) {
timestamp = Long.parseLong(nodeResponse.getElementsByTagName("timestamp").item(0).getFirstChild().getNodeValue());
return E_OK;
}
else
{
log.debug("Failed getting the timestamp");
log.debug("Start parsing the message key");
String messageKey = nodeResponse.getElementsByTagName("messageKey").item(0).getFirstChild().getNodeValue();
int errorCode = getErrorCode(messageKey);
log.debug("{}",errorCode);
log.debug(str);
return errorCode;
}
}
catch (Exception e)
{
e.printStackTrace();
log.warn("Failed to parse: {}", str);
return E_INVALID_TIMESTAMP; //que constante?
}
}
private int getTimestamp() { //.
String parameters = "action=getTimestamp";
String timestampUrl = getFullDemoPath() + "?" + parameters + "&checksum=" + checksum(parameters + salt);
log.debug("getTimestamp URL: " + timestampUrl);
String response = "Unknown error";
try {
response = getUrl(timestampUrl);
log.debug("getTimestamp response: " + response);
return parseTimestamp(response);
} catch (Exception e) {
e.printStackTrace();
log.error("Can't get the timestamp from {}", serverUrl);
timestamp = 0;
return E_INVALID_TIMESTAMP; //que constante?
}
}
private int updateTimestamp() { //.
int code;
if (System.currentTimeMillis() < lastRequest + 55000)
return E_OK;
else {
code = getTimestamp();
if (code == E_OK) {
lastRequest = System.currentTimeMillis();
return E_OK;
} else {
log.error("Invalid security key");
}
}
return code;
}
@Override
public String getVersion() {
return "0.8";
}
private int getErrorCode(String message)
{
if(message.equals("checksumError"))
return E_INVALID_CHECKSUM; //could return E_INVALID_CHECKSUM;
if(message.equals("invalidTimestamp"))
return E_INVALID_TIMESTAMP;
if(message.equals("emptySecurityKey"))
return E_EMPTY_SECURITY_KEY;
if(message.equals("missingParamMeetingID"))
return E_MISSING_PARAM_MEETINGID;
if(message.equals("missingParamFullName"))
return E_MISSING_PARAM_FULLNAME;
if(message.equals("invalidPassword"))
return E_MISSING_PARAM_PASSWORD;
if(message.equals("missingParamTimestamp"))
return E_MISSING_PARAM_TIMESTAMP;
if(message.equals("invalidAction"))
return E_INVALID_URL;
else
return E_UNKNOWN_ERROR;
}
}