@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)));
  }
  @Override
  public CommandResponse execute(JSONObject json, ClientRequestHandlerInterface handler)
      throws InvalidKeyException, InvalidKeySpecException, JSONException, NoSuchAlgorithmException,
          SignatureException, UnsupportedEncodingException {
    String name = json.getString(GNSProtocol.NAME.toString());
    String publicKey = json.getString(GNSProtocol.PUBLIC_KEY.toString());
    String password = json.getString(GNSProtocol.PASSWORD.toString());
    String signature = json.optString(GNSProtocol.SIGNATURE.toString(), null);
    String message = json.optString(GNSProtocol.SIGNATUREFULLMESSAGE.toString(), null);

    String guid = SharedGuidUtils.createGuidStringFromBase64PublicKey(publicKey);
    if (!NSAccessSupport.verifySignature(publicKey, signature, message)) {
      return new CommandResponse(
          ResponseCode.SIGNATURE_ERROR,
          GNSProtocol.BAD_RESPONSE.toString() + " " + GNSProtocol.BAD_SIGNATURE.toString());
    }
    try {
      // Add the account but don't enable email verification
      CommandResponse result =
          AccountAccess.addAccount(
              handler.getHttpServerHostPortString(),
              name,
              guid,
              publicKey,
              password,
              false,
              handler);
      if (result.getExceptionOrErrorCode().isOKResult()) {
        // Everything is hunkey dorey so return the new guid
        return new CommandResponse(ResponseCode.NO_ERROR, guid);
      } else {
        assert (result.getExceptionOrErrorCode() != null);
        // Otherwise return the error response.
        return result;
      }
    } catch (ClientException | IOException e) {
      return new CommandResponse(
          ResponseCode.UNSPECIFIED_ERROR,
          GNSProtocol.BAD_RESPONSE.toString()
              + " "
              + GNSProtocol.UNSPECIFIED_ERROR.toString()
              + " "
              + e.getMessage());
    }
  }