| // Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'package:shelf/shelf.dart' as shelf; |
| import 'package:test/test.dart'; |
| |
| import '../descriptor.dart' as d; |
| import '../test_pub.dart'; |
| |
| void respondWithWwwAuthenticate(String headerValue) { |
| globalServer.expect('GET', '/api/packages/versions/new', (request) { |
| return shelf.Response(403, headers: {'www-authenticate': headerValue}); |
| }); |
| } |
| |
| Future<void> expectPubErrorMessage(dynamic matcher) { |
| return runPub( |
| args: ['lish'], |
| environment: { |
| 'PUB_HOSTED_URL': globalServer.url, |
| '_PUB_TEST_AUTH_METHOD': 'token', |
| }, |
| exitCode: 65, |
| input: ['y'], |
| error: matcher, |
| ); |
| } |
| |
| void main() { |
| setUp(() async { |
| await d.validPackage.create(); |
| await servePackages(); |
| await d.tokensFile({ |
| 'version': 1, |
| 'hosted': [ |
| {'url': globalServer.url, 'token': 'access token'}, |
| ] |
| }).create(); |
| }); |
| |
| test('prints www-authenticate message', () async { |
| respondWithWwwAuthenticate('bearer realm="pub", message="custom message"'); |
| await expectPubErrorMessage(contains('custom message')); |
| }); |
| |
| test('sanitizes and prints dirty www-authenticate message', () { |
| // Unable to test this case because shelf does not allow characters [1] |
| // that pub cli supposed to sanitize. |
| // |
| // [1] https://github.com/dart-lang/sdk/blob/main/sdk/lib/_http/http_headers.dart#L653-L662 |
| }); |
| |
| test('trims and prints long www-authenticate message', () async { |
| var message = List.generate(2048, (_) => 'a').join(); |
| |
| respondWithWwwAuthenticate('bearer realm="pub", message="$message"'); |
| await expectPubErrorMessage(allOf( |
| isNot(contains(message)), |
| contains(message.substring(0, 1024)), |
| )); |
| }); |
| |
| test('does not prints message if realm is not equals to pub', () async { |
| respondWithWwwAuthenticate('bearer realm="web", message="custom message"'); |
| await expectPubErrorMessage(isNot(contains('custom message'))); |
| }); |
| |
| test('does not prints message if challenge is not equals to bearer', |
| () async { |
| respondWithWwwAuthenticate('basic realm="pub", message="custom message"'); |
| await expectPubErrorMessage(isNot(contains('custom message'))); |
| }); |
| |
| test('prints message for bearer challenge for pub realm only', () async { |
| respondWithWwwAuthenticate( |
| 'basic realm="pub", message="enter username and password", ' |
| 'newAuth message="use web portal to login", ' |
| 'bearer realm="api", message="contact IT dept to enroll", ' |
| 'bearer realm="pub", ' |
| 'bearer realm="pub", message="pub realm message"', |
| ); |
| await expectPubErrorMessage(contains('pub realm message')); |
| }); |
| } |