Skip to content

Commit 4618d20

Browse files
authored
Merge pull request thenoobsbr#18 from JSGInray/bugfix/2.0.0/MultipleQob
thenoobsbr#17 fix wrong qob reply
2 parents 4ae01ee + 3739126 commit 4618d20

2 files changed

Lines changed: 25 additions & 2 deletions

File tree

src/DigestAuthenticator/DigestAuthenticatorManager.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ internal class DigestAuthenticatorManager
4747
/// </summary>
4848
private string? _realm;
4949

50+
/// <summary>
51+
/// The opaque that is returned by the first digest request (without the data).
52+
/// </summary>
53+
private string? _opaque;
54+
5055
static DigestAuthenticatorManager()
5156
{
5257
_assemblyVersion = Assembly.GetAssembly(typeof(DigestAuthenticatorManager)).GetName().Version;
@@ -130,6 +135,7 @@ public string GetDigestHeader(string digestUri, Method method)
130135
$"uri=\"{digestUri}\"," +
131136
"algorithm=MD5," +
132137
$"response=\"{digestResponse}\"," +
138+
(!string.IsNullOrWhiteSpace(_opaque) ? $"opaque=\"{_opaque}\"," : string.Empty) +
133139
$"qop={_qop}," +
134140
$"nc={DigestHeader.NONCE_COUNT:00000000}," +
135141
$"cnonce=\"{_cnonce}\"";
@@ -184,5 +190,14 @@ private void GetDigestDataFromFailResponse(RestResponse response)
184190
_realm = digestHeader.Realm;
185191
_nonce = digestHeader.Nonce;
186192
_qop = digestHeader.Qop;
193+
if (!string.IsNullOrWhiteSpace(_qop) && _qop!.Contains(','))
194+
{
195+
_qop = _qop!
196+
.Split(',')
197+
.Select(q => q.Trim())
198+
.FirstOrDefault(q => q.Equals("auth", StringComparison.OrdinalIgnoreCase)) // prefer "auth" if the server offered several
199+
?? _qop.Split(',')[0].Trim();
200+
}
201+
_opaque = digestHeader.Opaque;
187202
}
188203
}

src/DigestAuthenticator/DigestHeader.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ internal class DigestHeader
1414

1515
public const string REALM = "realm";
1616

17+
public const string OPAQUE = "opaque";
18+
1719
public const string REGEX_PATTERN =
1820
"realm=\"(?<realm>.*?)\"|qop=(?:\"(?<qop>.*?)\"|(?<qop>[^\",\\s]+))|nonce=\"(?<nonce>.*?)\"|stale=\"(?<stale>.*?)\"|opaque=\"(?<opaque>.*?)\"|domain=\"(?<domain>.*?)\"";
19-
21+
2022
private static readonly Regex _regex;
2123

2224
static DigestHeader()
@@ -50,6 +52,11 @@ public DigestHeader(string authenticateHeader, ILogger logger)
5052
{
5153
Nonce = m.Groups[NONCE].Value;
5254
}
55+
56+
if (m.Groups[OPAQUE].Success)
57+
{
58+
Opaque = m.Groups[OPAQUE].Value;
59+
}
5360
}
5461

5562
if (AllDataCorrectFilled())
@@ -65,10 +72,11 @@ public DigestHeader(string authenticateHeader, ILogger logger)
6572
public string? Nonce { get; }
6673
public string? Qop { get; }
6774
public string? Realm { get; }
75+
public string? Opaque { get; }
6876

6977
public override string ToString()
7078
{
71-
return $"{nameof(Realm)}=\"{Realm}\"&{nameof(Nonce)}=\"{Nonce}\"&{nameof(Qop)}=\"{Qop}\"";
79+
return $"{nameof(Realm)}=\"{Realm}\"&{nameof(Nonce)}=\"{Nonce}\"&{nameof(Qop)}=\"{Qop}\"&{nameof(Opaque)}=\"{Opaque}\"";
7280
}
7381

7482
private bool AllDataCorrectFilled()

0 commit comments

Comments
 (0)