@Override
  public void onHTTPRequest(IVHost vhost, IHTTPRequest req, IHTTPResponse resp) {
    int clientId;
    HashMap<String, HashMap<String, String>> returnMap =
        new HashMap<String, HashMap<String, String>>();
    HashMap<String, String> returnKeyValues = new HashMap<String, String>();
    String strClientId;

    if (!doHTTPAuthentication(vhost, req, resp) || req.getMethod().equalsIgnoreCase("get")) return;

    req.parseBodyForParams();
    strClientId = req.getParameter("clientId");
    returnKeyValues.put("type", null);
    returnKeyValues.put("msg", "Request unsuccessful");
    returnKeyValues.put("isPublic", "true");
    returnMap.put("error", returnKeyValues);

    if (strClientId != null) {
      WMSLoggerFactory.getLogger(null)
          .info("*** Attempting to stop stream with clientId " + strClientId);
      try {
        clientId = Integer.parseInt(strClientId);
        IClient client = vhost.getClient(clientId);
        if (client != null) {
          client.setShutdownClient(true);
          returnMap.remove("error");
          returnKeyValues.remove("type");
          returnKeyValues.remove("msg");
          returnKeyValues.remove("isPublic");
          returnKeyValues.put("result", "Id " + clientId + " killed");
          returnMap.put("success", returnKeyValues);
        }
      } catch (NumberFormatException e) {
        WMSLoggerFactory.getLogger(null).error("******* NaN: " + strClientId);
        returnKeyValues.put("type", "NumberFormatException");
        returnKeyValues.put("msg", "NaN: " + strClientId);
        returnKeyValues.put("isPublic", "true");
        returnMap.put("error", returnKeyValues);
      }
    }

    JSONSerializer serializer = new JSONSerializer().exclude("*.class");
    String returnJSONStr = serializer.serialize(returnMap);

    try {
      resp.setHeader("Content-Type", "application/json");
      OutputStream out = resp.getOutputStream();
      byte[] outBytes = returnJSONStr.getBytes();
      out.write(outBytes);
    } catch (Exception e) {
      WMSLoggerFactory.getLogger(null).error("*** HTTPProvider failed: " + e.toString());
    }
  }
  public boolean checkPermissions(IClient client, RequestFunction function, AMFDataList params) {
    boolean doesStreamExist = false;
    boolean authorized = false;

    String streamName;
    try {
      streamName = params.getString(PARAM1).split("\\?")[0];
    } catch (Exception ex) {
      return false;
    }

    IMediaStream stream = client.getAppInstance().getStreams().getStream(streamName);

    getLogger().info("Checking stream Name: " + streamName);

    doesStreamExist = (stream != null);

    if (doesStreamExist) {
      authorized = false;
    } else {
      authorized = true;
    }

    // add other permission checking

    getLogger().info("Authorized: " + authorized);

    return authorized;
  }
  public void releaseStream(IClient client, RequestFunction function, AMFDataList params) {
    boolean bAuthorized = false;

    try {
      bAuthorized = checkPermissions(client, function, params);
    } catch (Exception ex) {
      // some error
    }

    if (bAuthorized != true) {
      sendClientOnStatusError(client, "NetStream.Publish.Denied", "Invalid credentials supplied");
      client.setShutdownClient(true);
    } else {
      invokePrevious(client, function, params);
    }
  }
 public void onConnect(IClient iclient, RequestFunction requestfunction, AMFDataList amfdatalist) {
   String s = iclient.getQueryStr();
   String s1 = "Unknown reason";
   String s2 = null;
   boolean flag = false;
   if (s == null) s1 = "Query string null";
   else if (s.length() == 0) {
     s1 = "Query string empty";
   } else {
     Map map = URLUtils.parseQueryStr(s, true);
     s2 = URLUtils.getParamValue(map, "secureToken");
     if (s2 == null)
       s1 =
           (new StringBuilder())
               .append("Query string mising secureToken (")
               .append(s)
               .append(")")
               .toString();
   }
   if (s2 == null && amfdatalist.size() > 3) {
     AMFData amfdata = amfdatalist.get(amfdatalist.size() - 1);
     if (amfdata.getType() == 2) {
       s2 = amfdatalist.getString(amfdatalist.size() - 1);
       s1 = "Unknown reason";
     }
   }
   if (s2 != null) {
     SecureTokenManager securetokenmanager = SecureTokenManager.getInstance(iclient.getVHost());
     Map map1 = securetokenmanager.getTokenList();
     SecureToken securetoken = (SecureToken) map1.get(s2);
     if (securetoken == null) {
       s1 =
           (new StringBuilder())
               .append("SecureToken not found (")
               .append(s2)
               .append(")")
               .toString();
     } else {
       int i = securetoken.incUsageCount();
       if (i == 1) {
         securetoken.setClient(iclient);
         securetokenmanager.registerClient(iclient, securetoken);
         iclient.acceptConnection("SecureToken valid");
         flag = true;
       } else {
         IClient iclient1 = securetoken.getClient();
         if (iclient1 != null) {
           s1 =
               (new StringBuilder())
                   .append("SecureToken already used by client (")
                   .append(iclient1.getClientId())
                   .append(")")
                   .toString();
           SecureTokenDef securetokendef = securetoken.getSecureTokenDef();
           if (securetokendef != null) {
             if (securetokendef.isDoKill())
               iclient1.getVHost().removeClient(iclient1.getClientId());
             if (securetokendef.isDoNotify()) {
               AMFDataObj amfdataobj = new AMFDataObj();
               amfdataobj.put("status", new AMFDataItem("error"));
               amfdataobj.put("reason", new AMFDataItem(s1));
               amfdataobj.put("clientId", new AMFDataItem(iclient.getClientId()));
               amfdataobj.put("ipAddress", new AMFDataItem(iclient.getIp()));
               amfdataobj.put("date", new AMFDataItem(new Date()));
               iclient1.call("onSecureToken", null, new Object[] {amfdataobj});
             }
           }
         } else {
           s1 =
               (new StringBuilder())
                   .append("SecureToken usage count is wrong (")
                   .append(securetoken.getUsageCount())
                   .append(")")
                   .toString();
         }
       }
     }
   }
   if (!flag) {
     iclient.rejectConnection(s1);
     // WMSLoggerFactory.getLogger(com/wowza/wms/plugin/security/ModuleSecureToken2).info((new
     // StringBuilder()).append("SecureToken: Connection refused
     // (").append(iclient.getClientId()).append("): ").append(s1).toString());
   }
 }
 public void onDisconnect(IClient iclient) {
   SecureTokenManager securetokenmanager = SecureTokenManager.getInstance(iclient.getVHost());
   securetokenmanager.unregisterClient(iclient);
 }