private Future<Void> checkTopic(final MqttContext context) { if (context.topic() == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST, "malformed topic name")); } else { return Future.succeededFuture(); } }
private Future<Void> checkTopic(final MqttContext context) { if (context.topic() == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST, "malformed topic name")); } else { return Future.succeededFuture(); } }
/** * Fails a routing context with HTTP status code 400 (Bad Request) and an optional message. * * @param ctx The vert.x routing context to fail. * @param msg The message to write to the response's body (may be {@code null}). * @throws NullPointerException if routing context is {@code null}. */ public static void badRequest(final RoutingContext ctx, final String msg) { failWithHeaders( ctx, new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST, msg), null); }
/** * Fails a routing context with HTTP status code 400 (Bad Request) and an optional message. * * @param ctx The vert.x routing context to fail. * @param msg The message to write to the response's body (may be {@code null}). * @throws NullPointerException if routing context is {@code null}. */ public static void badRequest(final RoutingContext ctx, final String msg) { failWithHeaders( ctx, new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST, msg), null); }
/** * {@inheritDoc} */ @Override public final void shutdown(final Handler<AsyncResult<Void>> completionHandler) { Objects.requireNonNull(completionHandler); if (shuttingDown.compareAndSet(Boolean.FALSE, Boolean.TRUE)) { closeConnection(completionHandler); } else { completionHandler.handle(Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_CONFLICT, "already shutting down"))); } }
/** * {@inheritDoc} */ @Override public final void disconnect(final Handler<AsyncResult<Void>> completionHandler) { Objects.requireNonNull(completionHandler); if (disconnecting.compareAndSet(Boolean.FALSE, Boolean.TRUE)) { closeConnection(completionHandler); } else { completionHandler.handle(Future.failedFuture( new ClientErrorException(HttpURLConnection.HTTP_CONFLICT, "already disconnecting"))); } }
/** * Processes a request for a non-standard operation. * <p> * Subclasses should override this method in order to support additional, custom * operations that are not defined by Hono's Credentials API. * <p> * This default implementation simply returns a future that is failed with a * {@link ClientErrorException} with an error code <em>400 Bad Request</em>. * * @param request The request to process. * @return A future indicating the outcome of the service invocation. */ protected Future<EventBusMessage> processCustomCredentialsMessage(final EventBusMessage request) { log.debug("invalid operation in request message [{}]", request.getOperation()); return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST)); }
/** * Processes a request for a non-standard operation. * <p> * Subclasses should override this method in order to support additional, custom * operations that are not defined by Hono's Credentials API. * <p> * This default implementation simply returns a future that is failed with a * {@link ClientErrorException} with an error code <em>400 Bad Request</em>. * * @param request The request to process. * @return A future indicating the outcome of the service invocation. */ protected Future<EventBusMessage> processCustomCredentialsMessage(final EventBusMessage request) { log.debug("invalid operation in request message [{}]", request.getOperation()); return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST)); };
@Override public final void authenticate(final JsonObject authInfo, final Handler<AsyncResult<User>> resultHandler) { final DeviceCredentials credentials = getCredentials(Objects.requireNonNull(authInfo)); if (credentials == null) { resultHandler.handle(Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_UNAUTHORIZED, "malformed credentials"))); } else { authenticate(credentials, s -> { if (s.succeeded()) { resultHandler.handle(Future.succeededFuture(s.result())); } else { resultHandler.handle(Future.failedFuture(s.cause())); } }); } }
@Override public Future<Boolean> isAuthorized(final HonoUser user, final ResourceIdentifier resource, final Activity intent) { Objects.requireNonNull(user); Objects.requireNonNull(resource); Objects.requireNonNull(intent); if (user.isExpired()) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_FORBIDDEN, "user information expired")); } else { return Future.succeededFuture(user.getAuthorities().isAuthorized(resource, intent)); } }
@Override public Future<Boolean> isAuthorized(final HonoUser user, final ResourceIdentifier resource, final String operation) { Objects.requireNonNull(user); Objects.requireNonNull(resource); Objects.requireNonNull(operation); if (user.isExpired()) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_FORBIDDEN, "user information expired")); } else { return Future.succeededFuture(user.getAuthorities().isAuthorized(resource, operation)); } } }
@Override public final void authenticate(final JsonObject authInfo, final Handler<AsyncResult<User>> resultHandler) { final T credentials = getCredentials(Objects.requireNonNull(authInfo)); if (credentials == null) { resultHandler.handle(Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_UNAUTHORIZED, "malformed credentials"))); } else { authenticate(credentials, TracingHelper.extractSpanContext(tracer, authInfo), s -> { if (s.succeeded()) { resultHandler.handle(Future.succeededFuture(s.result())); } else { resultHandler.handle(Future.failedFuture(s.cause())); } }); } }
@Override public Future<Boolean> isAuthorized(final HonoUser user, final ResourceIdentifier resource, final String operation) { Objects.requireNonNull(user); Objects.requireNonNull(resource); Objects.requireNonNull(operation); if (user.isExpired()) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_FORBIDDEN, "user information expired")); } else { return Future.succeededFuture(user.getAuthorities().isAuthorized(resource, operation)); } } }
@Override public Future<Boolean> isAuthorized(final HonoUser user, final ResourceIdentifier resource, final Activity intent) { Objects.requireNonNull(user); Objects.requireNonNull(resource); Objects.requireNonNull(intent); if (user.isExpired()) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_FORBIDDEN, "user information expired")); } else { return Future.succeededFuture(user.getAuthorities().isAuthorized(resource, intent)); } }
private static Future<ResourceIdentifier> getResourceIdentifier(final Source source) { if (source == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_NOT_FOUND, "no such node")); } else { return getResourceIdentifier(source.getAddress()); } }
private static Future<ResourceIdentifier> getResourceIdentifier(final String resource) { final Future<ResourceIdentifier> result = Future.future(); try { if (Strings.isNullOrEmpty(resource)) { result.fail(new ClientErrorException(HttpURLConnection.HTTP_NOT_FOUND, "no such node")); } else { result.complete(ResourceIdentifier.fromString(resource)); } } catch (Throwable e) { result.fail(e); } return result; }
/** * {@inheritDoc} */ @Override public final Future<HonoClient> connect( final ProtonClientOptions options, final Handler<ProtonConnection> disconnectHandler) { final Future<HonoClient> result = Future.future(); if (shuttingDown.get()) { result.fail(new ClientErrorException(HttpURLConnection.HTTP_CONFLICT, "client is already shut down")); } else { connect(options, result.completer(), disconnectHandler); } return result; }
void assertTenant(final RoutingContext ctx) { if (Device.class.isInstance(ctx.user())) { final Device device = (Device) ctx.user(); if (device.getTenantId().equals(getTenantParam(ctx))) { ctx.next(); } else { ctx.fail(new ClientErrorException(HttpURLConnection.HTTP_FORBIDDEN, "not authorized to upload data for device from other tenant")); } } else { handle401(ctx); } } }
void assertTenant(final RoutingContext ctx) { if (Device.class.isInstance(ctx.user())) { final Device device = (Device) ctx.user(); if (device.getTenantId().equals(getTenantParam(ctx))) { ctx.next(); } else { ctx.fail(new ClientErrorException(HttpURLConnection.HTTP_FORBIDDEN, "not authorized to upload data for device from other tenant")); } } else { handle401(ctx); } } }
private Future<EventBusMessage> processDeregisterRequest(final EventBusMessage request) { final String tenantId = request.getTenant(); final String deviceId = request.getDeviceId(); if (tenantId == null || deviceId == null) { return Future.failedFuture(new ClientErrorException(HttpURLConnection.HTTP_BAD_REQUEST)); } else { log.debug("deregistering device [{}] of tenant [{}]", deviceId, tenantId); final Future<RegistrationResult> result = Future.future(); removeDevice(tenantId, deviceId, result.completer()); return result.map(res -> { return request.getResponse(res.getStatus()) .setDeviceId(deviceId) .setCacheDirective(res.getCacheDirective()); }); } }