shlist

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

commit e4197ef15923b45596b6f1d719310633334199c3
parent 8090208f4f034bebe00dfce4ba7a6538b30f54c5
Author: kyle <kyle@0x30.net>
Date:   Sat,  2 Jan 2016 22:37:39 -0700

sl: add beginnings of friend_delete message

- friend_delete clears associations in the friends table
- it also clears them in the mutual_friends tables

Diffstat:
Mgen_msgs.sh | 1+
Mserver/msgs.pl | 19+++++++++++--------
Mserver/sl | 35+++++++++++++++++++++++++++++++----
Mserver/tests/bad_payload/server.log.good | 1+
Aserver/tests/friend_delete_unit/Makefile | 1+
Aserver/tests/friend_delete_unit/server.log.good | 9+++++++++
Aserver/tests/friend_delete_unit/test.pl | 43+++++++++++++++++++++++++++++++++++++++++++
Mserver/tests/msgs.pl | 19+++++++++++--------
8 files changed, 108 insertions(+), 20 deletions(-)

diff --git a/gen_msgs.sh b/gen_msgs.sh @@ -5,6 +5,7 @@ msg_types=" device_add device_ok friend_add + friend_delete list_add list_join list_leave diff --git a/server/msgs.pl b/server/msgs.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -# generated 'Sat Jan 2 16:41:19 MST 2016' +# generated Sat Jan 2 17:25:28 MST 2016 use strict; use warnings; @@ -8,18 +8,20 @@ our %msg_num = ( device_add => 0, device_ok => 1, friend_add => 2, - list_add => 3, - list_join => 4, - list_leave => 5, - lists_get => 6, - lists_get_other => 7, - list_items_get => 8, - list_item_add => 9, + friend_delete => 3, + list_add => 4, + list_join => 5, + list_leave => 6, + lists_get => 7, + lists_get_other => 8, + list_items_get => 9, + list_item_add => 10, ); our @msg_str = ( 'device_add', 'device_ok', 'friend_add', + 'friend_delete', 'list_add', 'list_join', 'list_leave', @@ -32,6 +34,7 @@ our @msg_func = ( \&msg_device_add, \&msg_device_ok, \&msg_friend_add, + \&msg_friend_delete, \&msg_list_add, \&msg_list_join, \&msg_list_leave, diff --git a/server/sl b/server/sl @@ -387,11 +387,38 @@ sub msg_friend_add { sub msg_friend_delete { my ($sth, $msg) = @_; - return "err\0unimplemented"; - # delete all friends, remove mutual friend references - # $friends_delete_sth->execute($device_id); - # $mutual_friends_delete_sth->execute($device_id, $device_id); + my ($err, $device_id, $friend) = split_fields($msg, 2); + return "err\0$err" if ($err); + + $err = device_id_valid($sth, $device_id); + return "err\0$err" if ($err); + + unless (looks_like_number($friend)) { + log_print("bad friends number '$friend'\n"); + return "err\0friends phone number is not a valid phone number"; + } + + $$sth{friends_select}->execute($device_id, $friend); + if ($$sth{friends_select}->fetchrow_array()) { + log_print("removing '$friend' from friends list\n"); + $$sth{friends_delete}->execute($device_id, $friend); + } + else { + log_print("tried deleting friend '$friend' but they weren't a friend\n"); + return "err\0friend sent for deletion was not a friend"; + } + + # now delete any mutual friend references + $$sth{ph_num_exists}->execute($friend); + if (my ($friend_id) = $$sth{ph_num_exists}->fetchrow_array()) { + my $friend_fp = fingerprint($friend_id); + log_print("friend '$friend' was registered as '$friend_fp'\n"); + $$sth{mutual_friends_delete}->execute($device_id, $friend_id); + $$sth{mutual_friends_delete}->execute($friend_id, $device_id); + } + + return "ok\0$friend"; } sub msg_lists_get { diff --git a/server/tests/bad_payload/server.log.good b/server/tests/bad_payload/server.log.good @@ -7,6 +7,7 @@ ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' device_add: got 0 fields, expected 2 device_ok: got 0 fields, expected 1 friend_add: got 0 fields, expected 2 +friend_delete: got 0 fields, expected 2 list_add: got 0 fields, expected 2 list_item_add: got 0 fields, expected 1 list_items_get: got 0 fields, expected 2 diff --git a/server/tests/friend_delete_unit/Makefile b/server/tests/friend_delete_unit/Makefile @@ -0,0 +1 @@ +include ../test.mk diff --git a/server/tests/friend_delete_unit/server.log.good b/server/tests/friend_delete_unit/server.log.good @@ -0,0 +1,9 @@ +accepting connections on <ip>:<port> (pid = <digits>) +new connection (pid = <digits>) +ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' +friend_delete: unknown device <base64> +device_add: success, <digits>:<base64> os <base64> +friend_delete: tried deleting friend <digits> but they weren't a friend +friend_delete: bad friends number <base64> +friend_delete: bad friends number <digits> +disconnected! diff --git a/server/tests/friend_delete_unit/test.pl b/server/tests/friend_delete_unit/test.pl @@ -0,0 +1,43 @@ +#!/usr/bin/perl -I../ +use strict; +use warnings; +use test; + +my $sock = new_socket(); + +# try deleting a friend with an unknown device id +send_msg($sock, 'friend_delete', "baddeviceid\0phnum"); +my ($payload) = recv_msg($sock, 'friend_delete'); + +# expecting error because device id is bad +my $msg = check_status($payload, 'err'); +my $msg_good = 'the client sent an unknown device id'; +fail "unexpected message '$msg', expected '$msg_good'" if ($msg ne $msg_good); + +# get a valid registration to use for the next tests +send_msg($sock, 'device_add', rand_phnum() . "\0unix"); +($payload) = recv_msg($sock, 'device_add'); + +my $device_id = check_status($payload, 'ok'); + +# try deleting someone who is not your friend +send_msg($sock, 'friend_delete', "$device_id\0" . rand_phnum()); +($payload) = recv_msg($sock, 'friend_delete'); + +$msg = check_status($payload, 'err'); +$msg_good = 'friend sent for deletion was not a friend'; +fail "unexpected message '$msg', expected '$msg_good'" if ($msg ne $msg_good); + +# also verify that a non numeric friends phone number isn't accepted +send_msg($sock, 'friend_delete', "$device_id\0someshitnum123"); +($payload) = recv_msg($sock, 'friend_delete'); + +$msg = check_status($payload, 'err'); +$msg_good = 'friends phone number is not a valid phone number'; +fail "unexpected message '$msg', expected '$msg_good'" if ($msg ne $msg_good); + +# also verify an empty phone number isn't accepted +send_msg($sock, 'friend_delete', "$device_id\0"); +($payload) = recv_msg($sock, 'friend_delete'); + +check_status($payload, 'err'); diff --git a/server/tests/msgs.pl b/server/tests/msgs.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -# generated 'Sat Jan 2 16:41:19 MST 2016' +# generated Sat Jan 2 17:25:28 MST 2016 use strict; use warnings; @@ -8,18 +8,20 @@ our %msg_num = ( device_add => 0, device_ok => 1, friend_add => 2, - list_add => 3, - list_join => 4, - list_leave => 5, - lists_get => 6, - lists_get_other => 7, - list_items_get => 8, - list_item_add => 9, + friend_delete => 3, + list_add => 4, + list_join => 5, + list_leave => 6, + lists_get => 7, + lists_get_other => 8, + list_items_get => 9, + list_item_add => 10, ); our @msg_str = ( 'device_add', 'device_ok', 'friend_add', + 'friend_delete', 'list_add', 'list_join', 'list_leave', @@ -32,6 +34,7 @@ our @msg_func = ( \&msg_device_add, \&msg_device_ok, \&msg_friend_add, + \&msg_friend_delete, \&msg_list_add, \&msg_list_join, \&msg_list_leave,