azure-core-amqp
Loading...
Searching...
No Matches
connection_string_credential.hpp
1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#pragma once
5
6#include "network/sasl_transport.hpp"
7
8#include <azure/core/credentials/credentials.hpp>
9
10#include <chrono>
11#include <memory>
12#include <stdexcept>
13#include <string>
14
15namespace Azure { namespace Core { namespace Amqp { namespace _internal {
16 //
17 // A ServiceBus connection string has the following format:
18 // "Endpoint=sb://<namespace>.servicebus.windows.net/;SharedAccessKeyName=<KeyName>;SharedAccessKey=<KeyValue>;EntityPath=<entity>"
19 //
20
21 class ConnectionStringParser final {
22 public:
23 ConnectionStringParser(const std::string& connectionString)
24 {
25 ParseConnectionString(connectionString);
26 }
27 ConnectionStringParser(const ConnectionStringParser&) = default;
28 ConnectionStringParser& operator=(const ConnectionStringParser&) = default;
29 ConnectionStringParser(ConnectionStringParser&&) = default;
30 ConnectionStringParser& operator=(ConnectionStringParser&&) = default;
31 ~ConnectionStringParser() = default;
32
33 std::string const& GetEndpoint() const { return m_endpoint; }
34 std::string const& GetSharedAccessKeyName() const { return m_sharedAccessKeyName; }
35 std::string const& GetSharedAccessKey() const { return m_sharedAccessKey; }
36 std::string const& GetEntityPath() const { return m_entityPath; }
37 std::string const& GetHostName() const { return m_hostName; }
38 uint16_t GetPort() const { return m_port; }
39 bool UseDevelopmentEmulator() const { return m_useDevelopmentEmulator; }
40
41 private:
42 void ParseConnectionString(const std::string& connectionString);
43 std::string m_endpoint;
44 std::string m_sharedAccessKeyName;
45 std::string m_sharedAccessKey;
46 std::string m_uri;
47 std::string m_hostName;
48 bool m_useDevelopmentEmulator{false};
49 uint16_t m_port{};
50 std::string m_entityPath;
51 };
52
56 class ServiceBusSasConnectionStringCredential final : public Credentials::TokenCredential {
57 public:
68 ServiceBusSasConnectionStringCredential(
69 const std::string& connectionString,
70 const std::string& entityPath = {})
71 : TokenCredential("ServiceBusSasConnectionStringCredential"),
72 m_connectionParser(connectionString)
73 {
74 // If we weren't able to determine the entity path from the ConnectionStringCredential
75 // constructor, use the entity path passed in by the user.
76 if (m_connectionParser.GetEntityPath().empty())
77 {
78 m_entityPath = entityPath;
79 }
80 else if (!entityPath.empty() && m_connectionParser.GetEntityPath() != entityPath)
81 {
82 // If the user provided an entity path, but it doesn't match the one in the connection
83 // string, throw.
84 throw std::invalid_argument(
85 "Entity Path provided: '" + entityPath
86 + "' does not match connection string entity path: '"
87 + m_connectionParser.GetEntityPath() + "'.");
88 }
89 }
90
96 ServiceBusSasConnectionStringCredential(const ServiceBusSasConnectionStringCredential& other)
97 = delete;
98
106 ServiceBusSasConnectionStringCredential& operator=(
107 const ServiceBusSasConnectionStringCredential& other)
108 = delete;
109
115 ServiceBusSasConnectionStringCredential(
116 ServiceBusSasConnectionStringCredential&& other) noexcept = delete;
117
123 ServiceBusSasConnectionStringCredential& operator=(
124 ServiceBusSasConnectionStringCredential&& other) noexcept = delete;
125
127 ~ServiceBusSasConnectionStringCredential() override = default;
128
131 std::string GetAudience();
132
138 virtual std::shared_ptr<Network::_internal::Transport> GetTransport() const;
139
140 std::string const& GetEndpoint() const { return m_connectionParser.GetEndpoint(); }
141 std::string const& GetSharedAccessKeyName() const
142 {
143 return m_connectionParser.GetSharedAccessKeyName();
144 }
145 std::string const& GetSharedAccessKey() const
146 {
147 return m_connectionParser.GetSharedAccessKey();
148 }
149 std::string const& GetEntityPath() const { return m_connectionParser.GetEntityPath(); }
150 std::string const& GetHostName() const { return m_connectionParser.GetHostName(); }
151 uint16_t GetPort() const { return m_connectionParser.GetPort(); }
152
153 bool UseDevelopmentEmulator() { return m_connectionParser.UseDevelopmentEmulator(); }
154
165 Credentials::AccessToken GetToken(
166 Credentials::TokenRequestContext const& tokenRequestContext,
167 Context const& context) const override;
168
169 private:
170 ConnectionStringParser m_connectionParser;
171 std::string m_entityPath;
172
175 // * credential.
176 // *
177 // * @param expiresOn The expiration time for the SAS token.
178 // */
179 std::string GenerateSasToken(std::chrono::system_clock::time_point const& expiresOn) const;
180 };
181
182}}}} // namespace Azure::Core::Amqp::_internal