@Override
  public CommandResponse execute(JSONObject json, ClientRequestHandlerInterface handler)
      throws InvalidKeyException, InvalidKeySpecException, JSONException, NoSuchAlgorithmException,
          SignatureException, ParseException {
    String guid = json.getString(GNSProtocol.GUID.toString());
    String field = json.getString(GNSProtocol.FIELD.toString());
    String accessType = json.getString(GNSProtocol.ACL_TYPE.toString());
    // allows someone other than guid to read acl, defaults to guid
    String reader = json.optString(GNSProtocol.READER.toString(), guid);
    String signature = json.getString(GNSProtocol.SIGNATURE.toString());
    String message = json.getString(GNSProtocol.SIGNATUREFULLMESSAGE.toString());
    Date timestamp =
        json.has(GNSProtocol.TIMESTAMP.toString())
            ? Format.parseDateISO8601UTC(json.getString(GNSProtocol.TIMESTAMP.toString()))
            : null; // can be null on older client

    MetaDataTypeName access;
    if ((access = MetaDataTypeName.valueOf(accessType)) == null) {
      return new CommandResponse(
          ResponseCode.BAD_ACL_TYPE_ERROR,
          GNSProtocol.BAD_RESPONSE.toString()
              + " "
              + GNSProtocol.BAD_ACL_TYPE.toString()
              + "Should be one of "
              + Arrays.toString(MetaDataTypeName.values()));
    }
    return new CommandResponse(
        ResponseCode.NO_ERROR,
        Boolean.toString(
            FieldMetaData.fieldExists(
                access, guid, field, reader, signature, message, timestamp, handler)));
  }