package com.owera.xaps.tr069; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.sql.SQLException; import java.util.Map; import java.util.Map.Entry; import com.owera.xaps.base.Log; import com.owera.xaps.base.db.DBAccess; import com.owera.xaps.dbi.Job; import com.owera.xaps.dbi.JobParameter; import com.owera.xaps.dbi.UnittypeParameter; import com.owera.xaps.dbi.UnittypeParameters; import com.owera.xaps.dbi.util.SystemParameters; import com.owera.xaps.tr069.xml.ParameterValueStruct; public class ParameterKey { private String cpeKey; private String serverKey; public String getCpeKey() { return cpeKey; } public void setCpeKey(String cpeKey) { this.cpeKey = cpeKey; } public String getServerKey() { return serverKey; } public void setServerKey(HTTPReqResData reqRes) throws NoSuchAlgorithmException, SQLException { this.serverKey = calculateParameterKey(reqRes); } public boolean isEqual() { if (cpeKey != null && serverKey != null && cpeKey.equals(serverKey)) return true; return false; } private static String calculateParameterKey(HTTPReqResData reqRes) throws SQLException, NoSuchAlgorithmException { SessionData sessionData = reqRes.getSessionData(); // Map<String, ParameterInfoStruct> infoMap = sessionData.getDbAccess().readInfoMap(sessionData.getUnittype().getUnittypeName()); UnittypeParameters utps = sessionData.getUnittype().getUnittypeParameters(); Map<String, ParameterValueStruct> fromDB = sessionData.getFromDB(); if (sessionData.getJobParams() == null) { // already populated job params in fromDB. String jobId = sessionData.getOweraParameters().getValue(SystemParameters.JOB_CURRENT); if (jobId != null && !jobId.trim().equals("")) { Job job = DBAccess.getJob(sessionData, jobId); if (job != null) { Log.debug(ParameterKey.class, "Current job has jobId: " + job.getId() + " -> verification stage, must retrieve job parameters (with RW-flag) to calculate parameterkey correctly"); Map<String, JobParameter> jobParams = job.getDefaultParameters(); for (Entry<String, JobParameter> jobParamEntry : jobParams.entrySet()) { if (jobParamEntry.getValue().getParameter().getUnittypeParameter().getFlag().isReadWrite()) { ParameterValueStruct jobParamPvs = new ParameterValueStruct(jobParamEntry.getKey(), jobParamEntry.getValue().getParameter().getValue()); fromDB.put(jobParamEntry.getKey(), jobParamPvs); } } } } } String values = ""; for (Entry<String, ParameterValueStruct> entry : fromDB.entrySet()) { String utpName = entry.getKey(); // ParameterInfoStruct pis = infoMap.get(utpName); UnittypeParameter utp = utps.getByName(utpName); // if (pis != null && pis.isWritable()) { if (utp != null && utp.getFlag().isReadWrite()) { if (utpName.indexOf("PeriodicInformInterval") > -1) continue; if (entry.getValue().getValue().equals("ExtraCPEParam")) continue; values += entry.getValue().getValue(); } } if (values.equals("")) { Log.debug(ParameterKey.class, "No device parameter values found, ACS parameterkey = \"No data in DB\""); return "No data in DB"; } else { MessageDigest md = MessageDigest.getInstance("SHA"); byte[] hash = md.digest(values.getBytes()); String parameterKey = ""; for (byte b : hash) { String hex = Integer.toHexString(b + 128); if (hex.length() == 1) hex = "0" + hex; parameterKey += hex; } String pk = parameterKey.substring(0, 32); Log.debug(ParameterKey.class, "The values to be hashed: " + values + " -> ACS parameterkey = " + pk); return pk; } } }