Mercurial Hosting > luan
annotate src/luan/modules/url/WwwAuthenticate.java @ 1810:3c43b07e12b7 default tip
minor
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 12 May 2024 22:00:42 -0600 |
parents | 49236f5ecc32 |
children |
rev | line source |
---|---|
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
1 package luan.modules.url; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
2 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
3 import java.util.Map; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
4 import java.util.HashMap; |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
5 import java.util.List; |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
6 import java.util.ArrayList; |
1402
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1317
diff
changeset
|
7 import goodjava.parser.Parser; |
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1317
diff
changeset
|
8 import goodjava.parser.ParseException; |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
9 import goodjava.logging.Logger; |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
10 import goodjava.logging.LoggerFactory; |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
11 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
12 |
1581 | 13 // https://tools.ietf.org/html/rfc7235#section-4.1 |
14 | |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
15 public final class WwwAuthenticate { |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
16 private static final Logger logger = LoggerFactory.getLogger(WwwAuthenticate.class); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
17 |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
18 public static List<WwwAuthenticate> parse(String header) throws ParseException { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
19 Parser parser = new Parser(header); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
20 List<WwwAuthenticate> auths = new ArrayList<WwwAuthenticate>(); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
21 do { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
22 auths.add(new WwwAuthenticate(parser,header)); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
23 } while( !parser.endOfInput() ); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
24 return auths; |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
25 } |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
26 |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
27 public final String type; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
28 public final Map<String,String> options = new HashMap<String,String>(); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
29 private final Parser parser; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
30 |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
31 private WwwAuthenticate(Parser parser,String header) throws ParseException { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
32 this.parser = parser; |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
33 type = parseType(); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
34 if( !matchSpace() ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
35 throw new ParseException(parser,"space expected"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
36 do { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
37 while( matchSpace() ); |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
38 if( !parseOption() ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
39 return; |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
40 } while( parser.match(',') ); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
41 if( !parser.endOfInput() ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
42 throw new ParseException(parser,"unexpected input"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
43 } |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
44 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
45 private String parseType() throws ParseException { |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
46 int start = parser.currentIndex(); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
47 if( !parser.inCharRange('A','Z') ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
48 throw new ParseException(parser,"invalid type"); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
49 while( parser.inCharRange('a','z') ); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
50 return parser.textFrom(start); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
51 } |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
52 |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
53 private boolean parseOption() throws ParseException { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
54 int start = parser.begin(); |
1782 | 55 while( parser.inCharRange('a','z') || parser.match('_') ); |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
56 String name = parser.textFrom(start); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
57 if( name.length() == 0 ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
58 return parser.failure(); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
59 if( !parser.match('=') ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
60 throw new ParseException(parser,"'=' expected"); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
61 if( !parser.match('"') ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
62 throw new ParseException(parser,"'\"' expected"); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
63 start = parser.currentIndex(); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
64 while( !parser.test('"') ) { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
65 if( !parser.anyChar() ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
66 throw new ParseException(parser,"unexpected end of text"); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
67 } |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
68 String value = parser.textFrom(start); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
69 if( !parser.match('"') ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
70 throw new ParseException(parser,"'\"' expected"); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
71 options.put(name,value); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
72 while( matchSpace() ); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
73 return parser.success(); |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
74 } |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
75 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
76 private boolean matchSpace() { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
77 return parser.anyOf(" \t\r\n"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
78 } |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
79 } |