shlist

share and manage lists between multiple people
Log | Files | Refs

commit d53a495f2289ca2a5ed728a69ab213a04b6e1701
parent 1674fc47dc334fd86522cf24df2b230908ee03b5
Author: kyle <kyle@0x30.net>
Date:   Sat,  2 Jan 2016 12:28:09 -0700

sl: introduce log_set_msg to add a logging prefix

- log_set_msg() will add a message type string logging prefix
  - that means every log_print() call after that will have that prefix
- use this to remove string boilerplate in the message handler functions

Diffstat:
Msl | 90++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Mtests/join_list_unit/server.log.good | 2+-
Mtests/payload_invalid/server.log.good | 20++++++++++----------
3 files changed, 63 insertions(+), 49 deletions(-)

diff --git a/sl b/sl @@ -13,6 +13,7 @@ use Scalar::Util qw(looks_like_number); require "msgs.pl"; our (%msg_num, @msg_str, @msg_func, $protocol_ver); +my $log_msg_type = ''; my %args; getopts("p:t", \%args); @@ -83,6 +84,7 @@ while (my $client_sock = $listen_sock->accept()) { while (1) { my ($msg_type, $msg) = recv_msg($client_sock); + log_set_msg($msg_str[$msg_type]); $dbh->begin_work; my $reply = $msg_func[$msg_type]->($sths, $msg); @@ -98,6 +100,7 @@ while (my $client_sock = $listen_sock->accept()) { $reply = "err\0database transaction aborted"; } + log_set_msg(''); send_msg($client_sock, $msg_type, $reply); } } @@ -182,17 +185,17 @@ sub msg_new_device { return "err\0$err" if ($err); unless (looks_like_number($ph_num)) { - log_print("new_device: phone number '$ph_num' invalid\n"); + log_print("phone number '$ph_num' invalid\n"); return "err\0the sent phone number is not a number"; } $$sth{ph_num_exists}->execute($ph_num); if ($$sth{ph_num_exists}->fetchrow_array()) { - log_print("new_device: phone number '$ph_num' already exists\n"); + log_print("phone number '$ph_num' already exists\n"); return "err\0the sent phone number already exists"; } if ($os ne 'unix' && $os ne 'android' && $os ne 'ios') { - log_print("new_device: unknown operating system '$os'\n"); + log_print("unknown operating system '$os'\n"); return "err\0operating system not supported"; } @@ -203,7 +206,7 @@ sub msg_new_device { $$sth{new_device}->execute($token, $ph_num, $os, time); my $fp = fingerprint($token); - log_print("new_device: success, '$ph_num':'$fp' os '$os'\n"); + log_print("success, '$ph_num':'$fp' os '$os'\n"); return "ok\0$token"; } @@ -218,12 +221,12 @@ sub msg_new_list { return "err\0$err" if ($err); my $devid_fp = fingerprint($device_id); - log_print("new_list: '$list_name'\n"); - log_print("new_list: adding first member devid = '$devid_fp'\n"); + log_print("'$list_name'\n"); + log_print("adding first member devid = '$devid_fp'\n"); my $time = time; my $list_id = sha256_base64(arc4random_bytes(32)); - log_print("new_list: fingerprint = '" .fingerprint($list_id). "'\n"); + log_print("fingerprint = '" .fingerprint($list_id). "'\n"); # add new list with single list member $$sth{new_list}->execute($list_id, $list_name, $time, $time); @@ -273,17 +276,17 @@ sub msg_join_list { $err = list_id_valid($sth, $list_id); return "err\0$err" if ($err); - log_print("join_list: device '$device_id'\n"); - log_print("join_list: list '$list_id'\n"); + log_print("device '$device_id'\n"); + log_print("list '$list_id'\n"); my $time = time; $$sth{check_list_member}->execute($list_id, $device_id); if (!$$sth{check_list_member}->fetchrow_array()) { $$sth{new_list_member}->execute($list_id, $device_id, $time); - log_print("join_list: device '$device_id' has been added to list '$list_id'\n"); + log_print("device '$device_id' has been added to list '$list_id'\n"); } else { - log_print("join_list: tried to create a duplicate list member entry for device '$device_id' and list '$list_id'\n"); + log_print("tried to create a duplicate list member entry for device '$device_id' and list '$list_id'\n"); return "err\0the device is already part of this list"; } @@ -299,16 +302,16 @@ sub msg_leave_list { $err = device_id_valid($sth, $device_id); return "err\0$err" if ($err); - log_print("leave_list: device '$device_id'\n"); - log_print("leave_list: list '$list_id'\n"); + log_print("device '$device_id'\n"); + log_print("list '$list_id'\n"); $$sth{check_list_member}->execute($list_id, $device_id); if ($$sth{check_list_member}->fetchrow_array()) { $$sth{remove_list_member}->execute($list_id, $device_id); - log_print("leave_list: device '$device_id' has been removed from list '$list_id'\n"); + log_print("device '$device_id' has been removed from list '$list_id'\n"); } else { - log_print("leave_list: warn: tried to leave a list the user was not in for device '$device_id' and list '$list_id'\n"); + log_print("warn: tried to leave a list the user was not in for device '$device_id' and list '$list_id'\n"); } $$sth{check_list_member}->finish(); @@ -317,7 +320,7 @@ sub msg_leave_list { my $alive = 1; if (!$$sth{get_list_members}->fetchrow_array()) { - log_print("leave_list: list '$list_id' is empty... deleting\n"); + log_print("list '$list_id' is empty... deleting\n"); $$sth{delete_list}->execute($list_id); $$sth{delete_list_data}->execute($list_id); $alive = 0; @@ -337,10 +340,10 @@ sub msg_add_friend { return "err\0$err" if ($err); my $devid_fp = fingerprint($device_id); - log_print("add_friend: '$devid_fp' adding '$friend'\n"); + log_print("'$devid_fp' adding '$friend'\n"); unless (looks_like_number($friend)) { - log_print("add_friend: bad friends number '$friend'\n"); + log_print("bad friends number '$friend'\n"); return "err\0friends phone number is not a valid phone number"; } @@ -351,15 +354,15 @@ sub msg_add_friend { $$sth{ph_num_exists}->execute($friend); if (my ($fr_devid) = $$sth{ph_num_exists}->fetchrow_array()) { my $friends_fp = fingerprint($fr_devid); - log_print("add_friend: added friend is a member\n"); - log_print("add_friend: friends device id is '$friends_fp'\n"); + log_print("added friend is a member\n"); + log_print("friends device id is '$friends_fp'\n"); my $phnum = get_phone_number($sth, $device_id); # check if my phone number is in their friends list $$sth{friends_map_select}->execute($fr_devid, $phnum); if ($$sth{friends_map_select}->fetchrow_array()) { - log_print("add_friend: found mutual friendship\n"); + log_print("found mutual friendship\n"); $$sth{mutual_friend_insert}->execute($device_id, $fr_devid); $$sth{mutual_friend_insert}->execute($fr_devid, $device_id); } @@ -387,14 +390,14 @@ sub msg_list_get { return "err\0$err" if ($err); my $devid_fp = fingerprint($device_id); - log_print("list_get: gathering lists for '$devid_fp'\n"); + log_print("gathering lists for '$devid_fp'\n"); my @lists; $$sth{get_lists}->execute($device_id); while (my ($list_id, $list_name) = $$sth{get_lists}->fetchrow_array()) { my $list_fp = fingerprint($list_id); - log_print("list_get: found list '$list_name' '$list_fp'\n"); + log_print("found list '$list_name' '$list_fp'\n"); # find all members of this list my @members; @@ -403,7 +406,7 @@ sub msg_list_get { push @members, get_phone_number($sth, $device_id); } my $members = join("\0", @members); - log_print("list_get: list has ". @members ." members\n"); + log_print("list has ". @members ." members\n"); # find how many items are complete in this list my $num_items = 0; @@ -413,7 +416,7 @@ sub msg_list_get { # XXX: actually check the item status $num_items++; } - log_print("list_get: list has $num_items items\n"); + log_print("list has $num_items items\n"); push @lists, "$list_id\0$list_name\0$num_items\0$members"; } @@ -431,7 +434,7 @@ sub msg_list_get_other { return "err\0$err" if ($err); my $devid_fp = fingerprint($device_id); - log_print("list_get_other: gathering lists for '$devid_fp'\n"); + log_print("gathering lists for '$devid_fp'\n"); my @list_ids; $$sth{get_lists}->execute($device_id); @@ -445,7 +448,7 @@ sub msg_list_get_other { while (my ($friend_id) = $$sth{mutual_friend_select}->fetchrow_array()) { my $friend_fp = fingerprint($friend_id); - log_print("list_get_other: found mutual friend '$friend_fp'\n"); + log_print("found mutual friend '$friend_fp'\n"); # we can't send device id's back to the client my $friend_phnum = get_phone_number($sth, $friend_id); @@ -459,7 +462,7 @@ sub msg_list_get_other { push(@{ $members{$id} }, $friend_phnum); $names{$id} = $name; - log_print("list_get_other: found list '$name'\n"); + log_print("found list '$name'\n"); } } @@ -481,7 +484,7 @@ sub msg_list_items { return "err\0$err" if ($err); if (!$list_id) { - log_print("list_items: received null list id"); + log_print("received null list id"); return "err\0the sent list id was empty"; } # unless ($dbh->selectrow_array($sth{check_list_member}, undef, $list_id, $device_id)) { @@ -489,14 +492,14 @@ sub msg_list_items { # log_print("list_items: $device_id not a member of $list_id\n"); # return "err\0the sent device id is not a member of the list"; # } - log_print("list_items: $device_id request items for $list_id\n"); + log_print("$device_id request items for $list_id\n"); $$sth{get_list_items}->execute($list_id); my @items; while (my ($list_id, $pos, $name, $status, $owner, undef) = $$sth{get_list_items}->fetchrow_array()) { - log_print("list_items: list item #$pos $name\n"); + log_print("list item #$pos $name\n"); push @items, "$pos:$name:$owner:$status"; } @@ -516,7 +519,7 @@ sub msg_ok return "err\0$err" if ($err); my $fp = fingerprint($device_id); - log_print("ok: device '$fp' checking in\n"); + log_print("device '$fp' checking in\n"); return "ok\0"; } @@ -532,7 +535,7 @@ sub split_fields { my @fields = split("\0", $msg, $total_fields); if (@fields != $total_fields) { my $fields = @fields; - log_print("split_fields: got $fields fields, expected $total_fields\n"); + log_print("got $fields fields, expected $total_fields\n"); return ("wrong number of arguments"); } @@ -559,13 +562,13 @@ sub device_id_valid my ($sth, $device_id) = @_; unless ($device_id =~ m/^[a-zA-Z0-9+\/=]*$/) { - log_print("device_id: '$device_id' not base64\n"); + log_print("'$device_id' not base64\n"); return "the client sent a device id that wasn't base64"; } $$sth{device_id_exists}->execute($device_id); unless ($$sth{device_id_exists}->fetchrow_array()) { - log_print("device_id: unknown device '$device_id'\n"); + log_print("unknown device '$device_id'\n"); return "the client sent an unknown device id"; } @@ -576,13 +579,13 @@ sub list_id_valid { my ($sth, $list_id) = @_; unless ($list_id =~ m/^[a-zA-Z0-9+\/=]*$/) { - log_print("list_id_valid: '$list_id' not base64\n"); + log_print("'$list_id' not base64\n"); return "the client sent a list id that was not base64"; } $$sth{list_select}->execute($list_id); unless ($$sth{list_select}->fetchrow_array()) { - log_print("list_id_valid: unknown list '$list_id'\n"); + log_print("unknown list '$list_id'\n"); return "the client sent an unknown list id"; } @@ -737,9 +740,20 @@ sub log_set_peer_host_port { ($addr, $port) = ($sock->peerhost(), $sock->peerport()); } +sub log_set_msg { + my ($msg_type) = @_; + + if ($msg_type ne '') { + $log_msg_type = "$msg_type: "; + } + else { + $log_msg_type = ''; + } +} + sub log_print { my $ftime = strftime("%F %T", localtime); - printf "%s %-15s %-5s> ", $ftime, $addr, $port; + printf "%s %-15s %-5s> %s", $ftime, $addr, $port, $log_msg_type; # we print potentially unsafe strings here, don't use printf print @_; } diff --git a/tests/join_list_unit/server.log.good b/tests/join_list_unit/server.log.good @@ -2,7 +2,7 @@ accepting connections on <ip>:<port> (pid = <digits>) new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' new_device: success, <digits>:<base64> os <base64> -list_id_valid: unknown list <base64> +join_list: unknown list <base64> new_list: <string> new_list: adding first member devid = <base64> new_list: fingerprint = <base64> diff --git a/tests/payload_invalid/server.log.good b/tests/payload_invalid/server.log.good @@ -4,14 +4,14 @@ ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' error: 7000 byte message too large new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -split_fields: got 0 fields, expected 2 -split_fields: got 0 fields, expected 2 -split_fields: got 0 fields, expected 2 -split_fields: got 0 fields, expected 1 -split_fields: got 0 fields, expected 1 -split_fields: got 0 fields, expected 2 -split_fields: got 0 fields, expected 2 -split_fields: got 0 fields, expected 2 -split_fields: got 0 fields, expected 1 -split_fields: got 0 fields, expected 1 +add_friend: got 0 fields, expected 2 +join_list: got 0 fields, expected 2 +leave_list: got 0 fields, expected 2 +list_get: got 0 fields, expected 1 +list_get_other: got 0 fields, expected 1 +list_items: got 0 fields, expected 2 +new_device: got 0 fields, expected 2 +new_list: got 0 fields, expected 2 +new_list_item: got 0 fields, expected 1 +ok: got 0 fields, expected 1 disconnected!