shlist

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

commit 4a76d8d5e9b24fe01d97fe583e8dafa9f0779d1e
parent 4e6da10836c7bd1abf503115db08366fba88662a
Author: kyle <kyle@0x30.net>
Date:   Mon, 28 Dec 2015 13:33:31 -0700

sl: make new_device take mandatory os field

- re-reading push notification stuff i remembered we need to track device os's
  - we track the device os so that we use the right push notification service
- make new_device take phone number and operating system fields
  - both are mandatory
- also add devices table field for push notification token
  - will be used later
- update tests that use the new_device message type (almost all of them do)

Diffstat:
Msl | 21+++++++++++++++------
Mtests/add_friend/server.log.good | 2+-
Mtests/add_friend/test.pl | 2+-
Mtests/add_friend_bad_num/server.log.good | 2+-
Mtests/add_friend_bad_num/test.pl | 2+-
Mtests/double_register/server.log.good | 2+-
Mtests/double_register/test.pl | 4++--
Mtests/join_friends_list/server.log.good | 4++--
Mtests/join_friends_list/test.pl | 4++--
Mtests/leave_list_self/server.log.good | 2+-
Mtests/leave_list_self/test.pl | 2+-
Mtests/list_request_basic/server.log.good | 2+-
Mtests/list_request_basic/test.pl | 2+-
Mtests/msg_ok/server.log.good | 2+-
Mtests/msg_ok/test.pl | 2+-
Mtests/mutual_friends_basic/server.log.good | 4++--
Mtests/mutual_friends_basic/test.pl | 4++--
Mtests/new_device/server.log.good | 2+-
Mtests/new_device/test.pl | 4++--
Mtests/new_list/server.log.good | 2+-
Mtests/new_list/test.pl | 2+-
Mtests/new_list_missing_name/server.log.good | 2+-
Mtests/new_list_missing_name/test.pl | 2+-
Mtests/two_lists_same_name/server.log.good | 2+-
Mtests/two_lists_same_name/test.pl | 2+-
25 files changed, 45 insertions(+), 36 deletions(-)

diff --git a/sl b/sl @@ -179,8 +179,7 @@ sub msg_new_device my ($dbh, $sth_ref, $msg) = @_; my %sth = %$sth_ref; - # single field - my $ph_num = $msg; + my ($ph_num, $os) = unpack("Z*Z*", $msg); unless (looks_like_number($ph_num)) { log_print("new_device: phone number '$ph_num' invalid\n"); @@ -190,14 +189,23 @@ sub msg_new_device log_print("new_device: phone number '$ph_num' already exists\n"); return "err\0the sent phone number already exists"; } + unless (defined $os) { + log_print("new_device: no operating system field sent\n"); + return "err\0no operating system field sent"; + } + if ($os ne 'unix' && $os ne 'android' && $os ne 'ios') { + log_print("new_device: unknown operating system '$os'\n"); + return "err\0operating system not supported"; + } # make a new device id, the client will supply this on all # further communication # XXX: need to check the db to make sure this isn't duplicate my $token = sha256_base64(arc4random_bytes(32)); - $sth{new_device}->execute($token, $ph_num, time); - log_print("new_device: success '$ph_num' '" .fingerprint($token). "'\n"); + $sth{new_device}->execute($token, $ph_num, $os, time); + my $fp = fingerprint($token); + log_print("new_device: success, '$ph_num':'$fp' os '$os'\n"); return "ok\0$token"; } @@ -576,7 +584,8 @@ sub create_tables { $db_handle->do(qq{create table if not exists devices( device_id text not null primary key, phone_num int not null, - type text, + os text, + push_token text, first_seen int not null) }) or die $DBI::errstr; @@ -635,7 +644,7 @@ sub prepare_stmt_handles { $stmt_handles{delete_list} = $dbh->prepare($sql); # devices table queries - $sql = qq{insert into devices (device_id, phone_num, first_seen) values (?, ?, ?)}; + $sql = qq{insert into devices (device_id, phone_num, os, first_seen) values (?, ?, ?, ?)}; $stmt_handles{new_device} = $dbh->prepare($sql); $sql = qq{select * from devices where phone_num = ?}; diff --git a/tests/add_friend/server.log.good b/tests/add_friend/server.log.good @@ -1,6 +1,6 @@ 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> +new_device: success, <digits>:<base64> os <base64> add_friend: <base64> adding <digits> disconnected! diff --git a/tests/add_friend/test.pl b/tests/add_friend/test.pl @@ -9,7 +9,7 @@ use test; my $sock = new_socket(); -send_msg($sock, 'new_device', "4038675309"); +send_msg($sock, 'new_device', "4038675309\0unix"); my ($msg_data) = recv_msg($sock, 'new_device'); my $device_id = check_status($msg_data, 'ok'); diff --git a/tests/add_friend_bad_num/server.log.good b/tests/add_friend_bad_num/server.log.good @@ -1,7 +1,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> +new_device: success, <digits>:<base64> os <base64> add_friend: <base64> adding <base64> add_friend: bad friends number <base64> disconnected! diff --git a/tests/add_friend_bad_num/test.pl b/tests/add_friend_bad_num/test.pl @@ -9,7 +9,7 @@ use test; my $sock = new_socket(); -send_msg($sock, 'new_device', "4038675309"); +send_msg($sock, 'new_device', "4038675309\0unix"); my ($msg_data) = recv_msg($sock, 'new_device'); my $device_id = check_status($msg_data, 'ok'); diff --git a/tests/double_register/server.log.good b/tests/double_register/server.log.good @@ -1,6 +1,6 @@ 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> +new_device: success, <digits>:<base64> os <base64> new_device: phone number <digits> already exists disconnected! diff --git a/tests/double_register/test.pl b/tests/double_register/test.pl @@ -6,12 +6,12 @@ use test; my $sock = new_socket(); my $phnum = '4038675309'; -send_msg($sock, 'new_device', $phnum); +send_msg($sock, 'new_device', "$phnum\0unix"); my ($msg_data) = recv_msg($sock, 'new_device'); check_status($msg_data, 'ok'); -send_msg($sock, 'new_device', $phnum); +send_msg($sock, 'new_device', "$phnum\0unix"); ($msg_data) = recv_msg($sock, 'new_device'); my $msg = check_status($msg_data, 'err'); diff --git a/tests/join_friends_list/server.log.good b/tests/join_friends_list/server.log.good @@ -1,7 +1,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> +new_device: success, <digits>:<base64> os <base64> add_friend: <base64> adding <digits> add_friend: added friend is a member add_friend: friends device id is <base64> @@ -16,7 +16,7 @@ list_get: list has 0 items disconnected! new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -new_device: success <digits> <base64> +new_device: success, <digits>:<base64> os <base64> add_friend: <base64> adding <digits> add_friend: added friend is a member add_friend: friends device id is <base64> diff --git a/tests/join_friends_list/test.pl b/tests/join_friends_list/test.pl @@ -7,10 +7,10 @@ my ($sock_1, $sock_2) = (new_socket(), new_socket()); my ($phnum_1, $phnum_2) = ("4038675309", "4037082094"); # create device 1 and 2 -send_msg($sock_1, 'new_device', $phnum_1); +send_msg($sock_1, 'new_device', "$phnum_1\0unix"); my ($msg_data1) = recv_msg($sock_1, 'new_device'); -send_msg($sock_2, 'new_device', $phnum_2); +send_msg($sock_2, 'new_device', "$phnum_2\0unix"); my ($msg_data2) = recv_msg($sock_2, 'new_device'); my $device_id1 = check_status($msg_data1, 'ok'); diff --git a/tests/leave_list_self/server.log.good b/tests/leave_list_self/server.log.good @@ -1,7 +1,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> +new_device: success, <digits>:<base64> os <base64> new_list: <string> new_list: adding first member devid = <base64> new_list: fingerprint = <base64> diff --git a/tests/leave_list_self/test.pl b/tests/leave_list_self/test.pl @@ -11,7 +11,7 @@ use test; my $sock = new_socket(); -send_msg($sock, 'new_device', "4038675309"); +send_msg($sock, 'new_device', "4038675309\0unix"); my ($msg_data) = recv_msg($sock, 'new_device'); my $device_id = check_status($msg_data, 'ok'); diff --git a/tests/list_request_basic/server.log.good b/tests/list_request_basic/server.log.good @@ -1,7 +1,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> +new_device: success, <digits>:<base64> os <base64> new_list: <string> new_list: adding first member devid = <base64> new_list: fingerprint = <base64> diff --git a/tests/list_request_basic/test.pl b/tests/list_request_basic/test.pl @@ -12,7 +12,7 @@ use test; my $phone_num = "4038675309"; my $sock = new_socket(); -send_msg($sock, 'new_device', $phone_num); +send_msg($sock, 'new_device', "$phone_num\0unix"); my ($msg_data) = recv_msg($sock, 'new_device'); my $device_id = check_status($msg_data, 'ok'); diff --git a/tests/msg_ok/server.log.good b/tests/msg_ok/server.log.good @@ -1,6 +1,6 @@ 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> +new_device: success, <digits>:<base64> os <base64> ok: device <base64> checking in disconnected! diff --git a/tests/msg_ok/test.pl b/tests/msg_ok/test.pl @@ -5,7 +5,7 @@ use test; my $sock = new_socket(); -send_msg($sock, 'new_device', "4038675309"); +send_msg($sock, 'new_device', "4038675309\0unix"); my ($msg_data, $length) = recv_msg($sock, 'new_device'); my $device_id = check_status($msg_data, 'ok'); diff --git a/tests/mutual_friends_basic/server.log.good b/tests/mutual_friends_basic/server.log.good @@ -1,7 +1,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> +new_device: success, <digits>:<base64> os <base64> add_friend: <base64> adding <digits> add_friend: added friend is a member add_friend: friends device id is <base64> @@ -12,7 +12,7 @@ list_get_other: found list <string> disconnected! new connection (pid = <digits>) ssl ok, ver = 'TLSv1_2' cipher = 'ECDHE-RSA-AES128-SHA256' -new_device: success <digits> <base64> +new_device: success, <digits>:<base64> os <base64> add_friend: <base64> adding <digits> add_friend: added friend is a member add_friend: friends device id is <base64> diff --git a/tests/mutual_friends_basic/test.pl b/tests/mutual_friends_basic/test.pl @@ -12,10 +12,10 @@ use test; my ($sock_1, $sock_2) = (new_socket(), new_socket()); my ($phnum_1, $phnum_2) = ("4038675309", "4037082094"); -send_msg($sock_1, 'new_device', $phnum_1); +send_msg($sock_1, 'new_device', "$phnum_1\0unix"); my ($msg_1) = recv_msg($sock_1, 'new_device'); -send_msg($sock_2, 'new_device', $phnum_2); +send_msg($sock_2, 'new_device', "$phnum_2\0unix"); my ($msg_2) = recv_msg($sock_2, 'new_device'); my $device_id1 = check_status($msg_1, 'ok'); diff --git a/tests/new_device/server.log.good b/tests/new_device/server.log.good @@ -1,6 +1,6 @@ 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> +new_device: success, <digits>:<base64> os <base64> new_device: phone number '403867530&' invalid disconnected! diff --git a/tests/new_device/test.pl b/tests/new_device/test.pl @@ -6,7 +6,7 @@ use test; # send a valid number and verify response is ok my $sock = new_socket(); -send_msg($sock, 'new_device', "4038675309"); +send_msg($sock, 'new_device', "4038675309\0unix"); my ($msg_data, $length) = recv_msg($sock, 'new_device'); my $msg = check_status($msg_data, 'ok'); @@ -14,7 +14,7 @@ fail "expected response length of 46, got $length" if ($length != 46); fail "response '$msg' not base64" unless ($msg =~ m/^[a-zA-Z0-9+\/=]+$/); # send a bad phone number and verify error response -send_msg($sock, 'new_device', "403867530&"); +send_msg($sock, 'new_device', "403867530&\0unix"); ($msg_data) = recv_msg($sock, 'new_device'); $msg = check_status($msg_data, 'err'); diff --git a/tests/new_list/server.log.good b/tests/new_list/server.log.good @@ -1,7 +1,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> +new_device: success, <digits>:<base64> os <base64> new_list: <string> new_list: adding first member devid = <base64> new_list: fingerprint = <base64> diff --git a/tests/new_list/test.pl b/tests/new_list/test.pl @@ -11,7 +11,7 @@ use test; my $sock = new_socket(); my $phnum = "4038675309"; -send_msg($sock, 'new_device', $phnum); +send_msg($sock, 'new_device', "$phnum\0unix"); my ($payload, $length) = recv_msg($sock, 'new_device'); my $device_id = check_status($payload, 'ok'); diff --git a/tests/new_list_missing_name/server.log.good b/tests/new_list_missing_name/server.log.good @@ -1,6 +1,6 @@ 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> +new_device: success, <digits>:<base64> os <base64> new_list: error, no name disconnected! diff --git a/tests/new_list_missing_name/test.pl b/tests/new_list_missing_name/test.pl @@ -9,7 +9,7 @@ use test; my $sock = new_socket(); -send_msg($sock, 'new_device', "4038675309"); +send_msg($sock, 'new_device', "4038675309\0unix"); my ($msg_data, $length) = recv_msg($sock, 'new_device'); my $device_id = check_status($msg_data, 'ok'); diff --git a/tests/two_lists_same_name/server.log.good b/tests/two_lists_same_name/server.log.good @@ -1,7 +1,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> +new_device: success, <digits>:<base64> os <base64> new_list: <string> new_list: adding first member devid = <base64> new_list: fingerprint = <base64> diff --git a/tests/two_lists_same_name/test.pl b/tests/two_lists_same_name/test.pl @@ -10,7 +10,7 @@ use test; my $sock = new_socket(); -send_msg($sock, 'new_device', "4038675309"); +send_msg($sock, 'new_device', "4038675309\0unix"); my ($msg_data, $length) = recv_msg($sock, 'new_device'); my $device_id = check_status($msg_data, 'ok');