summaryrefslogtreecommitdiff
path: root/credential.h
diff options
context:
space:
mode:
Diffstat (limited to 'credential.h')
-rw-r--r--credential.h45
1 files changed, 40 insertions, 5 deletions
diff --git a/credential.h b/credential.h
index a5a3ee9..acc41ad 100644
--- a/credential.h
+++ b/credential.h
@@ -2,6 +2,7 @@
#define CREDENTIAL_H
#include "string-list.h"
+#include "strvec.h"
/**
* The credentials API provides an abstracted way of gathering username and
@@ -115,19 +116,40 @@ struct credential {
*/
struct string_list helpers;
+ /**
+ * A `strvec` of WWW-Authenticate header values. Each string
+ * is the value of a WWW-Authenticate header in an HTTP response,
+ * in the order they were received in the response.
+ */
+ struct strvec wwwauth_headers;
+
+ /**
+ * Internal use only. Keeps track of if we previously matched against a
+ * WWW-Authenticate header line in order to re-fold future continuation
+ * lines into one value.
+ */
+ unsigned header_is_last_match:1;
+
unsigned approved:1,
configured:1,
quit:1,
- use_http_path:1;
+ use_http_path:1,
+ username_from_proto:1;
char *username;
char *password;
char *protocol;
char *host;
char *path;
+ char *oauth_refresh_token;
+ timestamp_t password_expiry_utc;
};
-#define CREDENTIAL_INIT { STRING_LIST_INIT_DUP }
+#define CREDENTIAL_INIT { \
+ .helpers = STRING_LIST_INIT_DUP, \
+ .password_expiry_utc = TIME_MAX, \
+ .wwwauth_headers = STRVEC_INIT, \
+}
/* Initialize a credential structure, setting all fields to empty. */
void credential_init(struct credential *);
@@ -172,10 +194,23 @@ void credential_reject(struct credential *);
int credential_read(struct credential *, FILE *);
void credential_write(const struct credential *, FILE *);
-/* Parse a URL into broken-down credential fields. */
+/*
+ * Parse a url into a credential struct, replacing any existing contents.
+ *
+ * If the url can't be parsed (e.g., a missing "proto://" component), the
+ * resulting credential will be empty and the function will return an
+ * error (even in the "gently" form).
+ *
+ * If we encounter a component which cannot be represented as a credential
+ * value (e.g., because it contains a newline), the "gently" form will return
+ * an error but leave the broken state in the credential object for further
+ * examination. The non-gentle form will issue a warning to stderr and return
+ * an empty credential.
+ */
void credential_from_url(struct credential *, const char *url);
+int credential_from_url_gently(struct credential *, const char *url, int quiet);
-int credential_match(const struct credential *have,
- const struct credential *want);
+int credential_match(const struct credential *want,
+ const struct credential *have, int match_password);
#endif /* CREDENTIAL_H */