Skip to content

Commit f6c94d1

Browse files
authored
Hash email (#22)
* Refactor person table and related procedures to use hashed and encrypted email fields * Add missing comma in person SQL procedure for proper query syntax * Fix parameter naming in register_person procedure for consistency * Update mock data in person.sql to use hashed and encrypted email fields * Increase VARCHAR length for hashed and encrypted email fields in person table and related procedures
1 parent 443bb45 commit f6c94d1

File tree

7 files changed

+28
-83
lines changed

7 files changed

+28
-83
lines changed

database.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ CREATE OR REPLACE TABLE lang (
1414
CREATE OR REPLACE TABLE person (
1515
person_id INT AUTO_INCREMENT PRIMARY KEY,
1616
person_name VARCHAR(100) UNIQUE,
17-
email VARCHAR(100) UNIQUE,
17+
hashed_email VARCHAR(255) UNIQUE,
18+
encrypted_email VARCHAR(255) UNIQUE,
1819
hashed_password VARCHAR(100),
1920
registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
2021
last_login TIMESTAMP NULL,

functions/mask_email.sql

Lines changed: 0 additions & 59 deletions
This file was deleted.

functions/person_exists.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ DELIMITER //
55

66
CREATE OR REPLACE FUNCTION person_exists(
77
IN p_person_id INT,
8-
IN p_email VARCHAR(100)
8+
IN p_email_hash VARCHAR(100)
99
) RETURNS BOOLEAN
1010
BEGIN
1111
DECLARE v_exists BOOLEAN;
1212

1313
SELECT EXISTS (
1414
SELECT 1
1515
FROM person
16-
WHERE (person_id = p_person_id OR email = p_email)
16+
WHERE (person_id = p_person_id OR hashed_email = p_email_hash)
1717
) INTO v_exists;
1818

1919
RETURN v_exists;

procedures/auth.sql

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ DELIMITER //
55

66
CREATE OR REPLACE PROCEDURE register_person(
77
IN p_name VARCHAR(100),
8-
IN p_email VARCHAR(100),
8+
IN p_hashed_email VARCHAR(255),
9+
IN p_encrypted_email VARCHAR(255),
910
IN p_hashed_password VARBINARY(255),
1011
IN p_language_iso_code CHAR(2)
1112
)
@@ -26,7 +27,7 @@ BEGIN
2627
-- Check if the email already exists
2728
SELECT COUNT(*) INTO v_email_exists
2829
FROM person
29-
WHERE email = p_email;
30+
WHERE hashed_email = p_hashed_email;
3031

3132
IF v_email_exists > 0 THEN
3233
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Email already exists';
@@ -38,28 +39,28 @@ BEGIN
3839
WHERE iso_code = p_language_iso_code;
3940

4041
-- Insert the new person into the database
41-
INSERT INTO person (person_name, email, hashed_password, language_id)
42-
VALUES (p_name, p_email, p_hashed_password, v_language_id);
42+
INSERT INTO person (person_name, hashed_email, encrypted_email, hashed_password, language_id)
43+
VALUES (p_name, p_hashed_email, p_encrypted_email, p_hashed_password, v_language_id);
4344
END //
4445

4546
CREATE OR REPLACE PROCEDURE login_person(
4647
IN p_person_id INT,
47-
IN p_email VARCHAR(100)
48+
IN p_hashed_email VARCHAR(255)
4849
)
4950
BEGIN
5051
DECLARE v_person_id INT;
5152
DECLARE v_hashed_password VARCHAR(100);
5253

5354
-- Check if the person exists
54-
IF NOT person_exists(p_person_id, p_email) THEN
55+
IF NOT person_exists(p_person_id, p_hashed_email) THEN
5556
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'User not found';
5657
END IF;
5758

5859
-- Retrieve the person_id, hashed salted password
5960
SELECT person_id, hashed_password
6061
INTO v_person_id, v_hashed_password
6162
FROM person
62-
WHERE (person_id = p_person_id OR email = p_email);
63+
WHERE (person_id = p_person_id OR hashed_email = p_hashed_email);
6364

6465
-- Return the result set
6566
SELECT v_person_id AS person_id, v_hashed_password AS hashed_password;
@@ -73,10 +74,10 @@ BEGIN
7374
END //
7475

7576
CREATE OR REPLACE PROCEDURE login_person_by_email(
76-
IN p_email VARCHAR(100)
77+
IN p_hashed_email VARCHAR(255)
7778
)
7879
BEGIN
79-
CALL login_person(NULL, p_email);
80+
CALL login_person(NULL, p_hashed_email);
8081
END //
8182

8283
DELIMITER ;

procedures/get/person.sql

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ BEGIN
1010
person_id,
1111
person_name,
1212
language_id,
13-
mask_email(email) AS masked_email
13+
encrypted_email
1414
FROM person;
1515
END //
1616

@@ -20,24 +20,24 @@ BEGIN
2020
person_id,
2121
person_name,
2222
language_id,
23-
mask_email(email) AS masked_email
23+
encrypted_email
2424
FROM person
2525
WHERE person_id = p_person_id;
2626
END //
2727

28-
CREATE OR REPLACE PROCEDURE get_person_by_email(IN p_email VARCHAR(100))
28+
CREATE OR REPLACE PROCEDURE get_person_by_email(IN p_hashed_email VARCHAR(255))
2929
BEGIN
3030
SELECT person_id, person_name, language_id
3131
FROM person
32-
WHERE email = p_email;
32+
WHERE hashed_email = p_hashed_email;
3333
END //
3434

3535
CREATE OR REPLACE PROCEDURE get_person_activity_summary(IN p_person_id INT)
3636
BEGIN
3737
SELECT
3838
p.person_id,
3939
p.name,
40-
mask_email(p.email) AS masked_email,
40+
p.encrypted_email,
4141
(SELECT COUNT(*) FROM comment c WHERE c.person_id = p.person_id) AS total_comments,
4242
(SELECT COUNT(*)
4343
FROM comment_like cl

procedures/update/person.sql

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ END //
1515
CREATE OR REPLACE PROCEDURE update_person(
1616
IN p_person_id INT,
1717
IN p_name VARCHAR(100),
18-
IN p_email VARCHAR(100),
18+
IN p_hashed_email VARCHAR(255),
19+
IN p_encrypted_email VARCHAR(255),
1920
IN p_hashed_password VARBINARY(255),
2021
IN p_language_iso_code CHAR(2)
2122
)
@@ -27,7 +28,7 @@ BEGIN
2728
-- Check if the person name or email already exists
2829
SELECT
2930
SUM(person_name = p_name AND person_id != p_person_id),
30-
SUM(email = p_email AND person_id != p_person_id)
31+
SUM(hashed_email = p_hashed_email AND person_id != p_person_id)
3132
INTO name_exists, email_exists
3233
FROM person;
3334

@@ -56,7 +57,8 @@ BEGIN
5657
UPDATE person
5758
SET
5859
person_name = COALESCE(p_name, person_name),
59-
email = COALESCE(p_email, email),
60+
hashed_email = COALESCE(p_hashed_email, hashed_email),
61+
encrypted_email = COALESCE(p_encrypted_email, encrypted_email),
6062
hashed_password = COALESCE(p_hashed_password, hashed_password),
6163
language_id = COALESCE(v_language_id, language_id)
6264
WHERE person_id = p_person_id;

setup/z_mock/person.sql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
USE smartcooking;
33

44
-- Fill the database with mock data
5-
CALL register_person('John Doe', 'john.doe@mock.data', 'password', 'en');
6-
CALL register_person('Jane Smith', 'jane.smith@mock.data', 'password', 'fr');
7-
CALL register_person('Alice Brown', 'alice.brown@mock.data', 'password', 'es');
8-
CALL register_person('Bob White', 'bob.white@mock.data', 'password', 'en');
5+
CALL register_person('John Doe', 'hashed_email1', 'encrypted_email1', 'password', 'en');
6+
CALL register_person('Jane Smith', 'hashed_email2', 'encrypted_email2', 'password', 'fr');
7+
CALL register_person('Alice Brown', 'hashed_email3', 'encrypted_email3', 'password', 'es');
8+
CALL register_person('Bob White', 'hashed_email4', 'encrypted_email4', 'password', 'en');

0 commit comments

Comments
 (0)