diff --git a/src/Makefile.am b/src/Makefile.am index 460503b9..1c208874 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -48,7 +48,7 @@ ocserv_SOURCES = main.c main-auth.c worker-vpn.c worker-auth.c tlslib.c \ worker-bandwidth.c worker-bandwidth.h main-ctl.h \ vasprintf.c vasprintf.h worker-proxyproto.c config-ports.c \ proc-search.c proc-search.h http-heads.h ip-util.c ip-util.h \ - main-ban.c main-ban.h common-config.h base64-helper.c base64-helper.h \ + main-ban.c main-ban.h common-config.h \ str.c str.h gettime.h $(CCAN_SOURCES) $(HTTP_PARSER_SOURCES) \ sec-mod-acct.h setproctitle.c setproctitle.h sec-mod-resume.h \ sec-mod-cookies.c diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 8faa5dde..790ca648 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -7,7 +7,7 @@ AM_CPPFLAGS += -I$(srcdir)/../../gl/ -I$(builddir)/../../gl/ \ # Files common to ocserv and occtl. libcommon_a_SOURCES=common.c common.h system.c system.h \ - cloexec.c cloexec.h + cloexec.c cloexec.h base64-helper.c base64-helper.h libcommon_a_LIBS = ../../gl/libgnu.a $(NEEDED_LIBPROTOBUF_LIBS) noinst_LIBRARIES = libcommon.a diff --git a/src/base64-helper.c b/src/common/base64-helper.c similarity index 100% rename from src/base64-helper.c rename to src/common/base64-helper.c diff --git a/src/base64-helper.h b/src/common/base64-helper.h similarity index 100% rename from src/base64-helper.h rename to src/common/base64-helper.h diff --git a/src/ctl.proto b/src/ctl.proto index 48900c0d..f409cd7a 100644 --- a/src/ctl.proto +++ b/src/ctl.proto @@ -53,6 +53,8 @@ message user_info_rep required uint32 keepalive = 29; required bool restrict_to_routes = 30; repeated fw_port_st fw_ports = 31; + + required bytes sid = 32; /* the cookie */ } message user_list_rep diff --git a/src/ipc.proto b/src/ipc.proto index 4ead6697..0080d06d 100644 --- a/src/ipc.proto +++ b/src/ipc.proto @@ -290,7 +290,6 @@ message cookie_int_msg optional string groupname = 6; required string user_agent = 7; required string remote_ip = 8; - required string psid = 9; /* printable form of sid */ required uint32 status = 10; /* the authentication status (PS_*) */ } diff --git a/src/main-ctl-unix.c b/src/main-ctl-unix.c index 2c25c0cd..4cc70d51 100644 --- a/src/main-ctl-unix.c +++ b/src/main-ctl-unix.c @@ -356,6 +356,9 @@ static int append_user_info(method_ctx *ctx, rep->tls_ciphersuite = ctmp->tls_ciphersuite; rep->dtls_ciphersuite = ctmp->dtls_ciphersuite; + rep->sid.data = ctmp->sid; + rep->sid.len = sizeof(ctmp->sid); + rep->cstp_compr = ctmp->cstp_compr; rep->dtls_compr = ctmp->dtls_compr; if (ctmp->mtu > 0) { diff --git a/src/occtl/Makefile.am b/src/occtl/Makefile.am index 4098af7c..07cb7441 100644 --- a/src/occtl/Makefile.am +++ b/src/occtl/Makefile.am @@ -13,7 +13,8 @@ occtl_SOURCES = occtl.c pager.c occtl.h time.c cache.c ip-cache.c \ nl.c ctl.h print.c json.c json.h hex.c hex.h occtl_LDADD = ../../gl/libgnu.a ../common/libcommon.a $(LIBREADLINE_LIBS) \ $(LIBNL3_LIBS) $(NEEDED_LIBPROTOBUF_LIBS) $(LIBTALLOC_LIBS) ../ccan/libccan.a \ - ../libipc.a $(NEEDED_LIBPROTOBUF_LIBS) $(CODE_COVERAGE_LDFLAGS) + ../libipc.a $(NEEDED_LIBPROTOBUF_LIBS) $(CODE_COVERAGE_LDFLAGS) \ + $(LIBNETTLE_LIBS) occtl_SOURCES += unix.c diff --git a/src/occtl/unix.c b/src/occtl/unix.c index 551d0e10..9909dec8 100644 --- a/src/occtl/unix.c +++ b/src/occtl/unix.c @@ -43,8 +43,10 @@ #include #include #include +#include #include "hex.h" #include +#include static int common_info_cmd(UserListRep *args, FILE *out, cmd_params_st *params); @@ -609,6 +611,18 @@ int handle_list_users_cmd(struct unix_ctx *ctx, const char *arg, cmd_params_st * return ret; } +static char *cookie_to_str(void *cookie, unsigned cookie_size, unsigned small) +{ + static char psid[BASE64_ENCODE_RAW_LENGTH(SID_SIZE) + 1]; + + assert(cookie_size == SID_SIZE); + oc_base64_encode((char *)cookie, cookie_size, (char *)psid, sizeof(psid)); + + if (small) + psid[6] = 0; + return psid; +} + static void cookie_list(struct unix_ctx *ctx, SecmListCookiesReplyMsg *rep, FILE *out, cmd_params_st *params, unsigned all) @@ -640,19 +654,19 @@ void cookie_list(struct unix_ctx *ctx, SecmListCookiesReplyMsg *rep, FILE *out, if (t > 0) { tm = localtime(&t); strftime(str_since, sizeof(str_since), DATE_TIME_FMT, tm); + print_time_ival7(tmpbuf, time(0), t); } else { - str_since[0] = '?'; - str_since[1] = 0; + strlcpy(tmpbuf, "(active)", sizeof(tmpbuf)); } groupname = rep->cookies[i]->groupname; if (groupname == NULL || groupname[0] == 0) groupname = NO_GROUP; - print_time_ival7(tmpbuf, time(0), t); fprintf(out, "%.6s %8s %8s %14s %.24s %8s %8s\n", - rep->cookies[i]->psid, username, groupname, rep->cookies[i]->remote_ip, + cookie_to_str(rep->cookies[i]->sid.data, rep->cookies[i]->sid.len, 1), + username, groupname, rep->cookies[i]->remote_ip, rep->cookies[i]->user_agent, tmpbuf, ps_status_to_str(rep->cookies[i]->status, 1)); } } @@ -968,6 +982,7 @@ int common_info_cmd(UserListRep * args, FILE *out, cmd_params_st *params) groupname = NO_GROUP; print_pair_value(out, params, "Username", username, "Groupname", groupname, 1); + print_single_value(out, params, "State", ps_status_to_str(args->user[i]->status, 0), 1); if (args->user[i]->has_mtu != 0) print_pair_value(out, params, "Device", args->user[i]->tun, "MTU", int2str(tmpbuf, args->user[i]->mtu), 1); @@ -1014,6 +1029,10 @@ int common_info_cmd(UserListRep * args, FILE *out, cmd_params_st *params) print_time_ival7(tmpbuf, time(0), t); print_single_value_ex(out, params, "Connected at", str_since, tmpbuf, 1); + if (HAVE_JSON(params)) + print_single_value(out, params, "Raw cookie", cookie_to_str(args->user[i]->sid.data, args->user[i]->sid.len, 0), 1); + print_single_value(out, params, "Cookie", cookie_to_str(args->user[i]->sid.data, args->user[i]->sid.len, 1), 1); + print_single_value(out, params, "TLS ciphersuite", args->user[i]->tls_ciphersuite, 1); print_single_value(out, params, "DTLS cipher", args->user[i]->dtls_ciphersuite, 1); print_pair_value(out, params, "CSTP compression", args->user[i]->cstp_compr, "DTLS compression", args->user[i]->dtls_compr, 1); @@ -1105,11 +1124,15 @@ int cookie_info_cmd(SecmListCookiesReplyMsg * args, FILE *out, cmd_params_st *pa print_single_value_int(out, params, "session_is_open", args->cookies[i]->session_is_open, 1); print_single_value_int(out, params, "tls_auth_ok", args->cookies[i]->tls_auth_ok, 1); print_single_value(out, params, "State", ps_status_to_str(args->cookies[i]->status, 1), 1); - t = args->cookies[i]->last_modified; - tm = localtime(&t); - strftime(str_since, sizeof(str_since), DATE_TIME_FMT, tm); - print_single_value(out, params, "Last Modified", str_since, 0); + + if (t > 0) { + tm = localtime(&t); + strftime(str_since, sizeof(str_since), DATE_TIME_FMT, tm); + } else { + strlcpy(str_since, "(active)", sizeof(str_since)); + } + print_single_value(out, params, "Last Modified", str_since, 1); username = args->cookies[i]->username; if (username == NULL || username[0] == 0) @@ -1125,11 +1148,8 @@ int cookie_info_cmd(SecmListCookiesReplyMsg * args, FILE *out, cmd_params_st *pa print_single_value(out, params, "Last Modified", str_since, 1); - str_since[0] = 0; - hex_encode(args->cookies[i]->sid.data, args->cookies[i]->sid.len, str_since, sizeof(str_since)); - print_single_value(out, params, "cookie", str_since, 1); - print_single_value(out, params, "Printable cookie", args->cookies[i]->psid, 1); - + print_single_value(out, params, "Raw cookie", cookie_to_str(args->cookies[i]->sid.data, args->cookies[i]->sid.len, 0), 1); + print_single_value(out, params, "Cookie", cookie_to_str(args->cookies[i]->sid.data, args->cookies[i]->sid.len, 1), 1); print_end_block(out, params, i<(args->n_cookies-1)?1:0); diff --git a/src/ocpasswd/Makefile.am b/src/ocpasswd/Makefile.am index e4112829..828bb0a8 100644 --- a/src/ocpasswd/Makefile.am +++ b/src/ocpasswd/Makefile.am @@ -17,7 +17,8 @@ libcmd_ocpasswd_a_SOURCES = args.def args.c args.h ocpasswd_SOURCES = ocpasswd.c ocpasswd_LDADD = ../../gl/libgnu.a $(NEEDED_LIBOPTS) libcmd-ocpasswd.a -ocpasswd_LDADD += $(LIBGNUTLS_LIBS) $(LIBCRYPT) $(CODE_COVERAGE_LDFLAGS) +ocpasswd_LDADD += $(LIBGNUTLS_LIBS) $(LIBCRYPT) $(CODE_COVERAGE_LDFLAGS) \ + $(LIBNETTLE_LIBS) args.c: $(srcdir)/args.def $(builddir)/../version.inc $(AUTOGEN) $< diff --git a/src/sec-mod-cookies.c b/src/sec-mod-cookies.c index 2b931c99..a9c72f92 100644 --- a/src/sec-mod-cookies.c +++ b/src/sec-mod-cookies.c @@ -92,7 +92,6 @@ void handle_secm_list_cookies_reply(void *pool, int fd, sec_mod_st *sec) cookies[msg.n_cookies].groupname = t->acct_info.groupname; cookies[msg.n_cookies].user_agent = t->acct_info.user_agent; cookies[msg.n_cookies].remote_ip = t->acct_info.remote_ip; - cookies[msg.n_cookies].psid = t->acct_info.psid; cookies[msg.n_cookies].status = t->status; msg.cookies[msg.n_cookies] = &cookies[msg.n_cookies];