/*
* BIRD -- Password handling
*
- * Copyright 1999 Pavel Machek <pavel@ucw.cz>
+ * (c) 1999 Pavel Machek <pavel@ucw.cz>
+ * (c) 2004 Ondrej Filip <feela@network.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
#include "nest/bird.h"
#include "nest/password.h"
+#include "lib/string.h"
+#include "lib/mac.h"
struct password_item *last_password_item = NULL;
-static int
-password_goodness(struct password_item *i)
+struct password_item *
+password_find(list *l, int first_fit)
{
- if (i->from > now)
- return 0;
- if (i->to < now)
- return 0;
- if (i->passive < now)
- return 1;
- return 2;
+ struct password_item *pi;
+ struct password_item *pf = NULL;
+
+ if (l)
+ {
+ WALK_LIST(pi, *l)
+ {
+ if ((pi->genfrom < now_real) && (pi->gento > now_real))
+ {
+ if (first_fit)
+ return pi;
+
+ if (!pf || pf->genfrom < pi->genfrom)
+ pf = pi;
+ }
+ }
+ }
+ return pf;
}
struct password_item *
-get_best_password(struct password_item *head, int flags)
+password_find_by_id(list *l, uint id)
{
- int good = -1;
- struct password_item *best = NULL;
-
- while (head) {
- int cur = password_goodness(head);
- if (cur > good) {
- good = cur;
- best = head;
- }
- }
- return best;
+ struct password_item *pi;
+
+ if (!l)
+ return NULL;
+
+ WALK_LIST(pi, *l)
+ if ((pi->id == id) && (pi->accfrom <= now_real) && (now_real < pi->accto))
+ return pi;
+
+ return NULL;
}
-void
-password_strncpy(char *to, char *from, int len)
+struct password_item *
+password_find_by_value(list *l, char *pass, uint size)
{
- int i;
- for (i=0; i<len; i++) {
- *to++ = *from;
- if (*from)
- from++;
- }
+ struct password_item *pi;
+
+ if (!l)
+ return NULL;
+
+ WALK_LIST(pi, *l)
+ if (password_verify(pi, pass, size) && (pi->accfrom <= now_real) && (now_real < pi->accto))
+ return pi;
+
+ return NULL;
}
+uint
+max_mac_length(list *l)
+{
+ struct password_item *pi;
+ uint val = 0;
+
+ if (!l)
+ return 0;
+
+ WALK_LIST(pi, *l)
+ val = MAX(val, mac_type_length(pi->alg));
+
+ return val;
+}