1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * HTTP credentials test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright 2007-2016 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright 1997-2006 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
8*5e7646d2SAndroid Build Coastguard Worker */
9*5e7646d2SAndroid Build Coastguard Worker
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker */
13*5e7646d2SAndroid Build Coastguard Worker
14*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
15*5e7646d2SAndroid Build Coastguard Worker
16*5e7646d2SAndroid Build Coastguard Worker
17*5e7646d2SAndroid Build Coastguard Worker /*
18*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Main entry.
19*5e7646d2SAndroid Build Coastguard Worker */
20*5e7646d2SAndroid Build Coastguard Worker
21*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])22*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line arguments */
23*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
24*5e7646d2SAndroid Build Coastguard Worker {
25*5e7646d2SAndroid Build Coastguard Worker http_t *http; /* HTTP connection */
26*5e7646d2SAndroid Build Coastguard Worker char scheme[HTTP_MAX_URI], /* Scheme from URI */
27*5e7646d2SAndroid Build Coastguard Worker hostname[HTTP_MAX_URI], /* Hostname from URI */
28*5e7646d2SAndroid Build Coastguard Worker username[HTTP_MAX_URI], /* Username:password from URI */
29*5e7646d2SAndroid Build Coastguard Worker resource[HTTP_MAX_URI]; /* Resource from URI */
30*5e7646d2SAndroid Build Coastguard Worker int port; /* Port number from URI */
31*5e7646d2SAndroid Build Coastguard Worker http_trust_t trust; /* Trust evaluation for connection */
32*5e7646d2SAndroid Build Coastguard Worker cups_array_t *hcreds, /* Credentials from connection */
33*5e7646d2SAndroid Build Coastguard Worker *tcreds; /* Credentials from trust store */
34*5e7646d2SAndroid Build Coastguard Worker char hinfo[1024], /* String for connection credentials */
35*5e7646d2SAndroid Build Coastguard Worker tinfo[1024]; /* String for trust store credentials */
36*5e7646d2SAndroid Build Coastguard Worker static const char *trusts[] = /* Trust strings */
37*5e7646d2SAndroid Build Coastguard Worker { "OK", "Invalid", "Changed", "Expired", "Renewed", "Unknown" };
38*5e7646d2SAndroid Build Coastguard Worker
39*5e7646d2SAndroid Build Coastguard Worker
40*5e7646d2SAndroid Build Coastguard Worker /*
41*5e7646d2SAndroid Build Coastguard Worker * Check command-line...
42*5e7646d2SAndroid Build Coastguard Worker */
43*5e7646d2SAndroid Build Coastguard Worker
44*5e7646d2SAndroid Build Coastguard Worker if (argc != 2)
45*5e7646d2SAndroid Build Coastguard Worker {
46*5e7646d2SAndroid Build Coastguard Worker puts("Usage: ./testcreds hostname");
47*5e7646d2SAndroid Build Coastguard Worker puts(" ./testcreds https://hostname[:port]");
48*5e7646d2SAndroid Build Coastguard Worker return (1);
49*5e7646d2SAndroid Build Coastguard Worker }
50*5e7646d2SAndroid Build Coastguard Worker
51*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(argv[1], "https://", 8))
52*5e7646d2SAndroid Build Coastguard Worker {
53*5e7646d2SAndroid Build Coastguard Worker /*
54*5e7646d2SAndroid Build Coastguard Worker * Connect to the host and validate credentials...
55*5e7646d2SAndroid Build Coastguard Worker */
56*5e7646d2SAndroid Build Coastguard Worker
57*5e7646d2SAndroid Build Coastguard Worker if (httpSeparateURI(HTTP_URI_CODING_MOST, argv[1], scheme, sizeof(scheme), username, sizeof(username), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
58*5e7646d2SAndroid Build Coastguard Worker {
59*5e7646d2SAndroid Build Coastguard Worker printf("ERROR: Bad URI \"%s\".\n", argv[1]);
60*5e7646d2SAndroid Build Coastguard Worker return (1);
61*5e7646d2SAndroid Build Coastguard Worker }
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, HTTP_ENCRYPTION_ALWAYS, 1, 30000, NULL)) == NULL)
64*5e7646d2SAndroid Build Coastguard Worker {
65*5e7646d2SAndroid Build Coastguard Worker printf("ERROR: Unable to connect to \"%s\" on port %d: %s\n", hostname, port, cupsLastErrorString());
66*5e7646d2SAndroid Build Coastguard Worker return (1);
67*5e7646d2SAndroid Build Coastguard Worker }
68*5e7646d2SAndroid Build Coastguard Worker
69*5e7646d2SAndroid Build Coastguard Worker puts("HTTP Credentials:");
70*5e7646d2SAndroid Build Coastguard Worker if (!httpCopyCredentials(http, &hcreds))
71*5e7646d2SAndroid Build Coastguard Worker {
72*5e7646d2SAndroid Build Coastguard Worker trust = httpCredentialsGetTrust(hcreds, hostname);
73*5e7646d2SAndroid Build Coastguard Worker
74*5e7646d2SAndroid Build Coastguard Worker httpCredentialsString(hcreds, hinfo, sizeof(hinfo));
75*5e7646d2SAndroid Build Coastguard Worker
76*5e7646d2SAndroid Build Coastguard Worker printf(" Certificate Count: %d\n", cupsArrayCount(hcreds));
77*5e7646d2SAndroid Build Coastguard Worker if (trust == HTTP_TRUST_OK)
78*5e7646d2SAndroid Build Coastguard Worker puts(" Trust: OK");
79*5e7646d2SAndroid Build Coastguard Worker else
80*5e7646d2SAndroid Build Coastguard Worker printf(" Trust: %s (%s)\n", trusts[trust], cupsLastErrorString());
81*5e7646d2SAndroid Build Coastguard Worker printf(" Expiration: %s\n", httpGetDateString(httpCredentialsGetExpiration(hcreds)));
82*5e7646d2SAndroid Build Coastguard Worker printf(" IsValidName: %d\n", httpCredentialsAreValidForName(hcreds, hostname));
83*5e7646d2SAndroid Build Coastguard Worker printf(" String: \"%s\"\n", hinfo);
84*5e7646d2SAndroid Build Coastguard Worker
85*5e7646d2SAndroid Build Coastguard Worker httpFreeCredentials(hcreds);
86*5e7646d2SAndroid Build Coastguard Worker }
87*5e7646d2SAndroid Build Coastguard Worker else
88*5e7646d2SAndroid Build Coastguard Worker puts(" Not present (error).");
89*5e7646d2SAndroid Build Coastguard Worker
90*5e7646d2SAndroid Build Coastguard Worker puts("");
91*5e7646d2SAndroid Build Coastguard Worker }
92*5e7646d2SAndroid Build Coastguard Worker else
93*5e7646d2SAndroid Build Coastguard Worker {
94*5e7646d2SAndroid Build Coastguard Worker /*
95*5e7646d2SAndroid Build Coastguard Worker * Load stored credentials...
96*5e7646d2SAndroid Build Coastguard Worker */
97*5e7646d2SAndroid Build Coastguard Worker
98*5e7646d2SAndroid Build Coastguard Worker strlcpy(hostname, argv[1], sizeof(hostname));
99*5e7646d2SAndroid Build Coastguard Worker }
100*5e7646d2SAndroid Build Coastguard Worker
101*5e7646d2SAndroid Build Coastguard Worker printf("Trust Store for \"%s\":\n", hostname);
102*5e7646d2SAndroid Build Coastguard Worker
103*5e7646d2SAndroid Build Coastguard Worker if (!httpLoadCredentials(NULL, &tcreds, hostname))
104*5e7646d2SAndroid Build Coastguard Worker {
105*5e7646d2SAndroid Build Coastguard Worker httpCredentialsString(tcreds, tinfo, sizeof(tinfo));
106*5e7646d2SAndroid Build Coastguard Worker
107*5e7646d2SAndroid Build Coastguard Worker printf(" Certificate Count: %d\n", cupsArrayCount(tcreds));
108*5e7646d2SAndroid Build Coastguard Worker printf(" Expiration: %s\n", httpGetDateString(httpCredentialsGetExpiration(tcreds)));
109*5e7646d2SAndroid Build Coastguard Worker printf(" IsValidName: %d\n", httpCredentialsAreValidForName(tcreds, hostname));
110*5e7646d2SAndroid Build Coastguard Worker printf(" String: \"%s\"\n", tinfo);
111*5e7646d2SAndroid Build Coastguard Worker
112*5e7646d2SAndroid Build Coastguard Worker httpFreeCredentials(tcreds);
113*5e7646d2SAndroid Build Coastguard Worker }
114*5e7646d2SAndroid Build Coastguard Worker else
115*5e7646d2SAndroid Build Coastguard Worker puts(" Not present.");
116*5e7646d2SAndroid Build Coastguard Worker
117*5e7646d2SAndroid Build Coastguard Worker return (0);
118*5e7646d2SAndroid Build Coastguard Worker }
119