mirror of
https://github.com/lxsang/antd-tunnel-plugin
synced 2024-11-16 09:48:21 +01:00
allow user identification in publisher
This commit is contained in:
parent
9406c4d33e
commit
6a4682c571
@ -1,5 +1,5 @@
|
|||||||
# initialise autoconf and set up some basic information about the program we’re packaging
|
# initialise autoconf and set up some basic information about the program we’re packaging
|
||||||
AC_INIT([tunnel], [0.1.0b], [xsang.le@gmail.com])
|
AC_INIT([tunnel], [0.1.1b], [xsang.le@gmail.com])
|
||||||
|
|
||||||
# We’re going to use automake for this project
|
# We’re going to use automake for this project
|
||||||
# [subdir-objects] if needed
|
# [subdir-objects] if needed
|
||||||
|
BIN
dist/tunnel-0.1.1b.tar.gz
vendored
Normal file
BIN
dist/tunnel-0.1.1b.tar.gz
vendored
Normal file
Binary file not shown.
26
tunnel.c
26
tunnel.c
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#define MAX_CHANNEL_ID 65535u
|
#define MAX_CHANNEL_ID 65535u
|
||||||
#define KEY_LEN 40
|
#define KEY_LEN 40
|
||||||
|
#define USER_LEN 64
|
||||||
#define MAX_SESSION_TIMEOUT (15u * 60u) //15 min
|
#define MAX_SESSION_TIMEOUT (15u * 60u) //15 min
|
||||||
#define PING_INTERVAL 10u // 10s
|
#define PING_INTERVAL 10u // 10s
|
||||||
#define PROCESS_TIMEOUT 30000u //30 ms
|
#define PROCESS_TIMEOUT 30000u //30 ms
|
||||||
@ -74,12 +75,15 @@ typedef struct
|
|||||||
* |MSG TYPE(1)| CHANNEL ID (2)| CLIENT ID (2)| data(m) |
|
* |MSG TYPE(1)| CHANNEL ID (2)| CLIENT ID (2)| data(m) |
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
char hash[KEY_LEN + 1]; // sha1sum + terminal byte
|
char hash[KEY_LEN + 1]; // sha1sum + terminal byte
|
||||||
|
char user[USER_LEN + 1];
|
||||||
time_t last_update;
|
time_t last_update;
|
||||||
} antd_tunnel_key_t;
|
} antd_tunnel_key_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
bst_node_t *channels;
|
bst_node_t *channels;
|
||||||
bst_node_t *keychain;
|
bst_node_t *keychain;
|
||||||
@ -484,6 +488,7 @@ static void update_keychain(int listen_fd)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
(void)memset(key_p->hash, 0, KEY_LEN + 1);
|
(void)memset(key_p->hash, 0, KEY_LEN + 1);
|
||||||
|
(void)memset(key_p->user, 0, USER_LEN + 1);
|
||||||
int size;
|
int size;
|
||||||
if ((size = read(listen_fd, key_p->hash, KEY_LEN)) == -1)
|
if ((size = read(listen_fd, key_p->hash, KEY_LEN)) == -1)
|
||||||
{
|
{
|
||||||
@ -497,6 +502,12 @@ static void update_keychain(int listen_fd)
|
|||||||
free(key_p);
|
free(key_p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if ((size = read(listen_fd, key_p->user, USER_LEN)) == -1)
|
||||||
|
{
|
||||||
|
ERROR("Unable to read user from keychain FIFO: %s", strerror(errno));
|
||||||
|
free(key_p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// looking for key in the keychain
|
// looking for key in the keychain
|
||||||
int hash_val = simple_hash(key_p->hash);
|
int hash_val = simple_hash(key_p->hash);
|
||||||
pthread_mutex_lock(&g_tunnel.lock);
|
pthread_mutex_lock(&g_tunnel.lock);
|
||||||
@ -505,13 +516,13 @@ static void update_keychain(int listen_fd)
|
|||||||
{
|
{
|
||||||
key_p->last_update = time(NULL);
|
key_p->last_update = time(NULL);
|
||||||
g_tunnel.keychain = bst_insert(g_tunnel.keychain, hash_val, (void *)key_p);
|
g_tunnel.keychain = bst_insert(g_tunnel.keychain, hash_val, (void *)key_p);
|
||||||
LOG("New key added to the keychain (%d)", hash_val);
|
LOG("New key added to the keychain (%d) for user", hash_val, key_p->user);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
antd_tunnel_key_t *existing_key = (antd_tunnel_key_t *)node->data;
|
antd_tunnel_key_t *existing_key = (antd_tunnel_key_t *)node->data;
|
||||||
existing_key->last_update = time(NULL);
|
existing_key->last_update = time(NULL);
|
||||||
LOG("Update existing key in the keychain");
|
LOG("Update existing key in the keychain for user %s", existing_key->user);
|
||||||
free(key_p);
|
free(key_p);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&g_tunnel.lock);
|
pthread_mutex_unlock(&g_tunnel.lock);
|
||||||
@ -804,7 +815,7 @@ void destroy()
|
|||||||
(void)unlink(path);
|
(void)unlink(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void process_client_message(antd_tunnel_msg_t *msg, antd_client_t *client)
|
static void process_client_message(antd_tunnel_msg_t *msg, antd_client_t *client, antd_tunnel_key_t * key)
|
||||||
{
|
{
|
||||||
char buff[BUFFLEN + 1];
|
char buff[BUFFLEN + 1];
|
||||||
bst_node_t *node;
|
bst_node_t *node;
|
||||||
@ -886,6 +897,9 @@ static void process_client_message(antd_tunnel_msg_t *msg, antd_client_t *client
|
|||||||
ERROR("Unable to send subscribe OK message to client");
|
ERROR("Unable to send subscribe OK message to client");
|
||||||
}
|
}
|
||||||
msg->header.client_id = g_tunnel.id_allocator;
|
msg->header.client_id = g_tunnel.id_allocator;
|
||||||
|
msg->header.size = strlen(key->user) + 1;
|
||||||
|
(void)memset(buff,0, BUFFLEN + 1);
|
||||||
|
(void)memcpy(buff, key->user, msg->header.size - 1);
|
||||||
msg->header.type = CHANNEL_SUBSCRIBE;
|
msg->header.type = CHANNEL_SUBSCRIBE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1150,7 +1164,7 @@ void *handle(void *rq_data)
|
|||||||
msg.data = buffer + offset;
|
msg.data = buffer + offset;
|
||||||
// now we have the message
|
// now we have the message
|
||||||
pthread_mutex_lock(&g_tunnel.lock);
|
pthread_mutex_lock(&g_tunnel.lock);
|
||||||
process_client_message(&msg, rq->client);
|
process_client_message(&msg, rq->client, key_p);
|
||||||
pthread_mutex_unlock(&g_tunnel.lock);
|
pthread_mutex_unlock(&g_tunnel.lock);
|
||||||
}
|
}
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
Loading…
Reference in New Issue
Block a user