ProxyAuth
Linux PAM to authenticate device via Bluetooth device
pam_bt_trust.c
Go to the documentation of this file.
1 #include "pam_bt_trust.h"
2 
3 int find_trusted_paired_device(FILE *log_fp, char **trusted_devices, int num_of_devices, char **paired_devices, int num_of_paired, char **detected_dev) {
4  if (!trusted_devices || !paired_devices) {
5  return 0;
6  }
7  int trusted_dev_found = 0;
8 
9  for (int i = 0; i < num_of_paired; i++) {
10  if (is_dev_trusted(log_fp, paired_devices[i], trusted_devices, num_of_devices)) {
11  if (log_fp) {
12  fprintf(log_fp, "Trusted Device: %s\n", paired_devices[i]);
13  }
14  if ((*detected_dev = malloc(sizeof(char) * (BT_MAC_LEN + 1)))) {
15  strncpy(*detected_dev, paired_devices[i], BT_MAC_LEN);
16  (*detected_dev)[BT_MAC_LEN] = '\0';
17  }
18  trusted_dev_found = 1;
19  break;
20  }
21  }
22 
23  return trusted_dev_found;
24 }
25 
26 FILE *get_trusted_dev_file(const char *trusted_dir_path, const char *username, FILE *log_fp) {
27  if (!trusted_dir_path || !username) {
28  return NULL;
29  }
30 
31  FILE *trusted_dev_fp = NULL;
32 
33  const unsigned int buf_size = PATH_MAX + LOGIN_NAME_MAX;
34  char file_name[buf_size]; //assumes LOGIN_NAME_MAX <= NAME_MAX
35  unsigned int copy_len = 0;
36  unsigned int len = 0;
37  strcpy(file_name, "");
38 
39  if (strlen(trusted_dir_path) > 0) {
40  copy_len = strlen(trusted_dir_path);
41  copy_len = copy_len > (PATH_MAX -1) ? (PATH_MAX - 1): copy_len; //PATH_MAX includes null-terminator
42  strncat(file_name, trusted_dir_path, copy_len);
43  len = copy_len;
44  }
45 
46  assert(strlen(file_name) < buf_size);
47 
48  if (strlen(username) > 0) {
49  copy_len = strlen(username);
50  copy_len = (copy_len > LOGIN_NAME_MAX) ? LOGIN_NAME_MAX : copy_len;
51  strncat(file_name, username, copy_len);
52  len += copy_len;
53  }
54 
55  assert(strlen(file_name) < buf_size);
56 
57  //I am paranoid
58  if (len > buf_size) {
59  file_name[buf_size-1] = '\0';
60  }
61  else {
62  file_name[len] = '\0';
63  }
64 
65  if (!(check_config(log_fp, file_name, 0))) {
66  return NULL;
67  }
68 
69  if (!(trusted_dev_fp = fopen(file_name, "r"))) {
70  perror("There are no trusted device");
71  if (log_fp) {
72  fprintf(log_fp, "File: %s does not exist. There are no trusted device for the user: %s\n", file_name, username);
73 
74  }
75  fprintf(stderr, "File: %s does not exist. There are no trusted device for the user: %s\n", file_name, username);
76  return NULL;
77  }
78  return trusted_dev_fp;
79 }
80 
81 void set_trusted_devices(FILE *trusted_dev_fp, char **trusted_devices, int num_trusted_devices) {
82  int i = 0;
83 
84  char *line = NULL;
85  char **dev = NULL;
86  size_t len = 0;
87  ssize_t read;
88 
89  if (trusted_dev_fp && trusted_devices && num_trusted_devices > 0) {
90  fseek(trusted_dev_fp, 0, SEEK_SET);
91  while ((read = getline(&line, &len, trusted_dev_fp)) != -1 && i < num_trusted_devices) {
92  if (strcmp(line, "\n") != 0) {
93  dev = trusted_devices + i;
94  line[BT_MAC_LEN] = '\0';
95  if ((*dev = malloc(sizeof(char) * (BT_MAC_LEN + 1)))) {
96  strncpy(*dev, line, BT_MAC_LEN);
97  (*dev)[BT_MAC_LEN] = '\0';
98  i++;
99  }
100  }
101  }
102  }
103 
104  if (line) {
105  free(line);
106  }
107 }
108 
109 char **find_trusted_devices(FILE *log_fp, const char *trusted_dir_path, const char *username, int *num_of_devices) {
110  char **trusted_devices = NULL;
111  FILE *trusted_dev_fp = NULL;
112  int num_of_devices_lc = 0;
113 
114  if (!trusted_dir_path || !username || !num_of_devices) {
115  goto find_trusted_devices_terminate;
116  }
117 
118  /*** Check if the trusted device directory exist and has the correct permissions ***/
119  if (check_config(log_fp, trusted_dir_path, 1) <= 0) {
120  goto find_trusted_devices_terminate;
121  }
122  /***************************************************/
123 
124  if (!(trusted_dev_fp = get_trusted_dev_file(trusted_dir_path, username, log_fp))) {
125  goto find_trusted_devices_terminate;
126  }
127 
128  if (!(num_of_devices_lc = get_num_lines(trusted_dev_fp))) {
129  goto find_trusted_devices_terminate;
130  }
131 
132  if (!(trusted_devices = malloc(sizeof(char *) * num_of_devices_lc))) {
133  perror("malloc");
134  goto find_trusted_devices_terminate;
135  }
136 
137  set_trusted_devices(trusted_dev_fp, trusted_devices, num_of_devices_lc);
138 
139 find_trusted_devices_terminate:
140  if (trusted_dev_fp) {
141  fclose(trusted_dev_fp);
142  }
143 
144  *num_of_devices = num_of_devices_lc;
145  return trusted_devices;
146 }
147 
148 int bluetooth_login(FILE *log_fp, const char *trusted_dir_path, const char *username, char **detected_dev) {
149  int bluetooth_status = 0;
150  char curr_time[50];
151 
152  int num_of_devices = 0;
153  int num_of_paired = 0;
154 
155  char **trusted_devices = NULL;
156  char **paired_devices = get_paired_devices(&num_of_paired);
157  *detected_dev = NULL;
158 
159  if (!(trusted_devices = find_trusted_devices(log_fp, trusted_dir_path, username, &num_of_devices))) {
160  goto bluetooth_login_terminate;
161  }
162 
163  /*** LOGIN TIME ***/
164  get_login_time(curr_time);
165  /*******************/
166 
167  if (log_fp) {
168  fprintf(log_fp, "%s: Call find device\n", curr_time);
169  }
170 
171  if (paired_devices && (bluetooth_status = find_trusted_paired_device(log_fp, trusted_devices, num_of_devices, paired_devices, num_of_paired, detected_dev))) {
172  if (log_fp && *detected_dev) {
173  fprintf(log_fp, "%s: Device %s found\n", curr_time, *detected_dev);
174  }
175  }
176  else {
177  if (log_fp) {
178  fprintf(log_fp, "%s: No trusted devices was found %d\n", curr_time, bluetooth_status);
179  }
180  }
181 
182 bluetooth_login_terminate:
183  if (trusted_devices) {
184  free_device_list(trusted_devices, num_of_devices);
185  }
186 
187  if (paired_devices) {
188  free_device_list(paired_devices, num_of_paired);
189  }
190 
191  return bluetooth_status;
192 }
void free_device_list(char **device_list, int num_of_devices)
Definition: pam_bt_misc.c:55
const char * trusted_dir_path
Definition: pam_bt_misc.c:3
int is_dev_trusted(FILE *log_fp, char *dev, char **trusted_devices, int num_of_devices)
Definition: pam_bt_misc.c:46
#define BT_MAC_LEN
Definition: pam_bt_misc.h:9
char ** get_paired_devices(int *num_of_paired)
Definition: pam_bt_pair.c:86
int bluetooth_login(FILE *log_fp, const char *trusted_dir_path, const char *username, char **detected_dev)
Definition: pam_bt_trust.c:148
char ** find_trusted_devices(FILE *log_fp, const char *trusted_dir_path, const char *username, int *num_of_devices)
Definition: pam_bt_trust.c:109
FILE * get_trusted_dev_file(const char *trusted_dir_path, const char *username, FILE *log_fp)
Definition: pam_bt_trust.c:26
int find_trusted_paired_device(FILE *log_fp, char **trusted_devices, int num_of_devices, char **paired_devices, int num_of_paired, char **detected_dev)
Definition: pam_bt_trust.c:3
void set_trusted_devices(FILE *trusted_dev_fp, char **trusted_devices, int num_trusted_devices)
Definition: pam_bt_trust.c:81
int get_num_lines(FILE *fp)
Definition: pam_misc.c:13
void get_login_time(char *curr_time)
Definition: pam_misc.c:3
int check_config(FILE *log_fp, const char *const file, const int is_dir)
: Where security checks and security tools are placed
Definition: pam_sec.c:3