0bed9b5c52
Currently the messenger calls out to a get_authorizer con op, which will create a new authorizer if it doesn't yet have one. In the meantime, when we rotate our service keys, the authorizer doesn't get updated. Eventually it will be rejected by the server on a new connection attempt and get invalidated, and we will then rebuild a new authorizer, but this is not ideal. Instead, if we do have an authorizer, call a new update_authorizer op that will verify that the current authorizer is using the latest secret. If it is not, we will build a new one that does. This avoids the transient failure. This fixes one of the sorry sequence of events for bug http://tracker.ceph.com/issues/4282 Signed-off-by: Sage Weil <sage@inktank.com> Reviewed-by: Alex Elder <elder@inktank.com>
51 lines
875 B
C
51 lines
875 B
C
#ifndef _FS_CEPH_AUTH_X_H
|
|
#define _FS_CEPH_AUTH_X_H
|
|
|
|
#include <linux/rbtree.h>
|
|
|
|
#include <linux/ceph/auth.h>
|
|
|
|
#include "crypto.h"
|
|
#include "auth_x_protocol.h"
|
|
|
|
/*
|
|
* Handle ticket for a single service.
|
|
*/
|
|
struct ceph_x_ticket_handler {
|
|
struct rb_node node;
|
|
unsigned int service;
|
|
|
|
struct ceph_crypto_key session_key;
|
|
struct ceph_timespec validity;
|
|
|
|
u64 secret_id;
|
|
struct ceph_buffer *ticket_blob;
|
|
|
|
unsigned long renew_after, expires;
|
|
};
|
|
|
|
|
|
struct ceph_x_authorizer {
|
|
struct ceph_buffer *buf;
|
|
unsigned int service;
|
|
u64 nonce;
|
|
u64 secret_id;
|
|
char reply_buf[128]; /* big enough for encrypted blob */
|
|
};
|
|
|
|
struct ceph_x_info {
|
|
struct ceph_crypto_key secret;
|
|
|
|
bool starting;
|
|
u64 server_challenge;
|
|
|
|
unsigned int have_keys;
|
|
struct rb_root ticket_handlers;
|
|
|
|
struct ceph_x_authorizer auth_authorizer;
|
|
};
|
|
|
|
extern int ceph_x_init(struct ceph_auth_client *ac);
|
|
|
|
#endif
|
|
|