1515
1616import static com .google .common .base .Preconditions .checkArgument ;
1717import static io .netty .handler .codec .mqtt .MqttQoS .AT_MOST_ONCE ;
18- import static io .streamnative .pulsar .handlers .mqtt .Constants .AUTH_MTLS ;
1918import io .netty .buffer .Unpooled ;
2019import io .netty .channel .Channel ;
2120import io .netty .handler .codec .mqtt .MqttConnectMessage ;
4140import java .util .UUID ;
4241import java .util .stream .Collectors ;
4342import org .apache .commons .codec .binary .Hex ;
44- import org .apache .commons .lang3 .tuple .Pair ;
4543
4644/**
4745 * Mqtt message utils.
@@ -50,6 +48,8 @@ public class MqttMessageUtils {
5048
5149 public static final int CLIENT_IDENTIFIER_MAX_LENGTH = 23 ;
5250
51+ public static final String AUTHENTICATE_ROLE_KEY = "__mop_auth_role" ;
52+
5353 public static void checkState (MqttMessage msg ) {
5454 if (!msg .decoderResult ().isSuccess ()) {
5555 throw new IllegalStateException (msg .decoderResult ().cause ().getMessage ());
@@ -190,14 +190,10 @@ public static MqttPublishMessage createMqttWillMessage(WillMessage willMessage)
190190 }
191191
192192 public static MqttConnectMessage createMqttConnectMessage (MqttConnectMessage connectMessage ,
193- String authMethod ,
194193 String authData ) {
195194 final MqttConnectVariableHeader header = connectMessage .variableHeader ();
196195 MqttProperties properties = new MqttProperties ();
197- properties .add (new MqttProperties .StringProperty (MqttProperties .MqttPropertyType .AUTHENTICATION_METHOD .value ()
198- , authMethod ));
199- properties .add (new MqttProperties .BinaryProperty (MqttProperties .MqttPropertyType .AUTHENTICATION_DATA .value ()
200- , authData .getBytes ()));
196+ properties .add (new MqttProperties .UserProperty (AUTHENTICATE_ROLE_KEY , authData ));
201197 MqttConnectVariableHeader variableHeader = new MqttConnectVariableHeader (
202198 MqttVersion .MQTT_5 .protocolName (), MqttVersion .MQTT_5 .protocolLevel (), header .hasUserName (),
203199 header .hasPassword (), header .isWillRetain (), header .willQos (), header .isWillFlag (),
@@ -209,72 +205,58 @@ public static MqttConnectMessage createMqttConnectMessage(MqttConnectMessage con
209205 }
210206
211207 public static MqttPublishMessage createMqttPublishMessage (MqttPublishMessage publishMessage ,
212- String authMethod ,
213208 String authData ) {
214209 final MqttPublishVariableHeader header = publishMessage .variableHeader ();
215210 MqttProperties properties = new MqttProperties ();
216- properties .add (new MqttProperties .StringProperty (MqttProperties .MqttPropertyType .AUTHENTICATION_METHOD .value ()
217- , authMethod ));
218- properties .add (new MqttProperties .BinaryProperty (MqttProperties .MqttPropertyType .AUTHENTICATION_DATA .value ()
219- , authData .getBytes ()));
211+ properties .add (new MqttProperties .UserProperty (AUTHENTICATE_ROLE_KEY , authData ));
220212 MqttPublishVariableHeader variableHeader = new MqttPublishVariableHeader (
221213 header .topicName (), header .packetId (), properties );
222214 MqttPublishMessage newPublishMessage = new MqttPublishMessage (publishMessage .fixedHeader (), variableHeader ,
223215 publishMessage .payload ());
224216 return newPublishMessage ;
225217 }
226218
227- public static Optional <Pair < String , byte []>> getMtlsAuthMethodAndData (MqttConnectMessage connectMessage ) {
219+ public static Optional <String > getAuthenticationRole (MqttConnectMessage connectMessage ) {
228220 final MqttConnectVariableHeader header = connectMessage .variableHeader ();
229221 MqttProperties properties = header .properties ();
230- final MqttProperties .MqttProperty property = properties .getProperty (
231- MqttProperties .MqttPropertyType .AUTHENTICATION_METHOD .value ());
232- if (property != null && property .value () instanceof String
233- && ((String ) property .value ()).equalsIgnoreCase (AUTH_MTLS )) {
234- final MqttProperties .MqttProperty data = properties .getProperty (
235- MqttProperties .MqttPropertyType .AUTHENTICATION_DATA .value ());
236- return Optional .of (Pair .of ((String ) property .value (), (byte []) data .value ()));
222+ final MqttProperties .UserProperties data = (MqttProperties .UserProperties ) properties .getProperty (
223+ MqttProperties .MqttPropertyType .USER_PROPERTY .value ());
224+ if (data != null && data .value () instanceof List <MqttProperties .StringPair >) {
225+ return data .value ().stream ().filter (d -> d .key .equalsIgnoreCase (AUTHENTICATE_ROLE_KEY ))
226+ .map (e -> e .value ).findFirst ();
237227 }
238228 return Optional .empty ();
239229 }
240230
241- public static Optional <Pair < String , byte []>> getMtlsAuthMethodAndData (MqttPublishMessage publishMessage ) {
231+ public static Optional <String > getAuthenticationRole (MqttPublishMessage publishMessage ) {
242232 final MqttPublishVariableHeader header = publishMessage .variableHeader ();
243233 MqttProperties properties = header .properties ();
244- final MqttProperties .MqttProperty property = properties .getProperty (
245- MqttProperties .MqttPropertyType .AUTHENTICATION_METHOD .value ());
246- if (property != null && property .value () instanceof String
247- && ((String ) property .value ()).equalsIgnoreCase (AUTH_MTLS )) {
248- final MqttProperties .MqttProperty data = properties .getProperty (
249- MqttProperties .MqttPropertyType .AUTHENTICATION_DATA .value ());
250- return Optional .of (Pair .of ((String ) property .value (), (byte []) data .value ()));
251- }
234+ final MqttProperties .UserProperties data = (MqttProperties .UserProperties ) properties .getProperty (
235+ MqttProperties .MqttPropertyType .USER_PROPERTY .value ());
236+ if (data != null && data .value () instanceof List <MqttProperties .StringPair >) {
237+ return data .value ().stream ().filter (d -> d .key .equalsIgnoreCase (AUTHENTICATE_ROLE_KEY ))
238+ .map (e -> e .value ).findFirst ();
239+ }
252240 return Optional .empty ();
253241 }
254242
255- public static Optional <Pair < String , byte []>> getMtlsAuthMethodAndData (MqttSubscribeMessage subscribeMessage ) {
243+ public static Optional <String > getAuthenticationRole (MqttSubscribeMessage subscribeMessage ) {
256244 final MqttMessageIdAndPropertiesVariableHeader header = subscribeMessage .idAndPropertiesVariableHeader ();
257245 MqttProperties properties = header .properties ();
258- final MqttProperties .MqttProperty property = properties .getProperty (
259- MqttProperties .MqttPropertyType .AUTHENTICATION_METHOD .value ());
260- if (property != null && property .value () instanceof String
261- && ((String ) property .value ()).equalsIgnoreCase (AUTH_MTLS )) {
262- final MqttProperties .MqttProperty data = properties .getProperty (
263- MqttProperties .MqttPropertyType .AUTHENTICATION_DATA .value ());
264- return Optional .of (Pair .of ((String ) property .value (), (byte []) data .value ()));
246+ final MqttProperties .UserProperties data = (MqttProperties .UserProperties ) properties .getProperty (
247+ MqttProperties .MqttPropertyType .USER_PROPERTY .value ());
248+ if (data != null && data .value () instanceof List <MqttProperties .StringPair >) {
249+ return data .value ().stream ().filter (d -> d .key .equalsIgnoreCase (AUTHENTICATE_ROLE_KEY ))
250+ .map (e -> e .value ).findFirst ();
265251 }
266252 return Optional .empty ();
267253 }
268254
269255 public static MqttSubscribeMessage createMqttSubscribeMessage (MqttSubscribeMessage subscribeMessage ,
270- String authMethod ,
271256 String authData ) {
272257 final MqttMessageIdAndPropertiesVariableHeader header = subscribeMessage .idAndPropertiesVariableHeader ();
273258 MqttProperties properties = new MqttProperties ();
274- properties .add (new MqttProperties .StringProperty (MqttProperties .MqttPropertyType .AUTHENTICATION_METHOD .value ()
275- , authMethod ));
276- properties .add (new MqttProperties .BinaryProperty (MqttProperties .MqttPropertyType .AUTHENTICATION_DATA .value ()
277- , authData .getBytes ()));
259+ properties .add (new MqttProperties .UserProperty (AUTHENTICATE_ROLE_KEY , authData ));
278260 MqttMessageIdAndPropertiesVariableHeader variableHeader = new MqttMessageIdAndPropertiesVariableHeader (
279261 header .messageId (), properties );
280262 MqttSubscribeMessage newSubscribeMessage = new MqttSubscribeMessage (subscribeMessage .fixedHeader (),
0 commit comments