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:
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,