Line data Source code
1 : /* SPDX-License-Identifier: GPL-3.0-or-later */
2 : /* Copyright 2026 Peter Csaszar */
3 :
4 : #include "pii_redact.h"
5 : #include <string.h>
6 : #include <stdio.h>
7 :
8 5 : void redact_phone(const char *phone, char *out, size_t cap) {
9 5 : if (!out || cap == 0) return;
10 5 : if (!phone || phone[0] == '\0') {
11 2 : snprintf(out, cap, "(null)");
12 2 : return;
13 : }
14 :
15 : /* Skip leading '+' for length accounting */
16 3 : const char *digits = phone;
17 3 : int has_plus = (phone[0] == '+');
18 3 : if (has_plus) digits++;
19 :
20 3 : size_t dlen = strlen(digits);
21 :
22 : /* If too short to redact meaningfully, mask entirely */
23 3 : if (dlen < 5) {
24 1 : snprintf(out, cap, "+****");
25 1 : return;
26 : }
27 :
28 : /* Show last 4 digits, mask the rest with '*' */
29 2 : size_t keep = 4;
30 2 : size_t mask = dlen - keep;
31 :
32 : /* + <mask stars> <last 4> NUL */
33 2 : size_t needed = 1 + mask + keep + 1;
34 2 : if (needed > cap) {
35 : /* Not enough room — full mask */
36 0 : snprintf(out, cap, "+****");
37 0 : return;
38 : }
39 :
40 2 : size_t pos = 0;
41 2 : out[pos++] = '+';
42 17 : for (size_t i = 0; i < mask; i++) out[pos++] = '*';
43 : /* copy last 4 digits */
44 10 : for (size_t i = 0; i < keep; i++) out[pos++] = digits[mask + i];
45 2 : out[pos] = '\0';
46 : }
|