Mercurial Hosting > luan
annotate src/luan/modules/url/WwwAuthenticate.java @ 1575:0160650180bc
better http authentication
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 27 Jan 2021 15:31:26 -0700 |
parents | 27efb1fcbcb5 |
children | dbf63bef4b86 |
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 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
13 public final class WwwAuthenticate { |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
14 private static final Logger logger = LoggerFactory.getLogger(WwwAuthenticate.class); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
15 |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
16 public static List<WwwAuthenticate> parse(String header) throws ParseException { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
17 Parser parser = new Parser(header); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
18 List<WwwAuthenticate> auths = new ArrayList<WwwAuthenticate>(); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
19 do { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
20 auths.add(new WwwAuthenticate(parser,header)); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
21 } while( !parser.endOfInput() ); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
22 return auths; |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
23 } |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
24 |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
25 public final String type; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
26 public final Map<String,String> options = new HashMap<String,String>(); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
27 private final Parser parser; |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
28 |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
29 private WwwAuthenticate(Parser parser,String header) throws ParseException { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
30 this.parser = parser; |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
31 type = parseType(); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
32 if( !matchSpace() ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
33 throw new ParseException(parser,"space expected"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
34 do { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
35 while( matchSpace() ); |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
36 if( !parseOption() ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
37 return; |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
38 } while( parser.match(',') ); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
39 if( !parser.endOfInput() ) |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
40 throw new ParseException(parser,"unexpected input"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
41 } |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
42 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
43 private String parseType() throws ParseException { |
1575
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
44 int start = parser.currentIndex(); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
45 if( !parser.inCharRange('A','Z') ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
46 throw new ParseException(parser,"invalid type"); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
47 while( parser.inCharRange('a','z') ); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
48 return parser.textFrom(start); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
49 } |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
50 |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
51 private boolean parseOption() throws ParseException { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
52 int start = parser.begin(); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
53 while( parser.inCharRange('a','z') ); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
54 String name = parser.textFrom(start); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
55 if( name.length() == 0 ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
56 return parser.failure(); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
57 if( !parser.match('=') ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
58 throw new ParseException(parser,"'=' expected"); |
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 start = parser.currentIndex(); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
62 while( !parser.test('"') ) { |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
63 if( !parser.anyChar() ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
64 throw new ParseException(parser,"unexpected end of text"); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
65 } |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
66 String value = parser.textFrom(start); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
67 if( !parser.match('"') ) |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
68 throw new ParseException(parser,"'\"' expected"); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
69 options.put(name,value); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
70 while( matchSpace() ); |
0160650180bc
better http authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
71 return parser.success(); |
1317
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
72 } |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
73 |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
74 private boolean matchSpace() { |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
75 return parser.anyOf(" \t\r\n"); |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
76 } |
c286c1e36b81
add client digest authentication
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
77 } |