Merge pull request #1388 from emqtt/emq24
Version 2.3.2 - Support for X.509 certificate based authentication
This commit is contained in:
commit
f452469bc5
|
@ -0,0 +1,455 @@
|
|||
MOZILLA PUBLIC LICENSE
|
||||
Version 1.1
|
||||
|
||||
---------------
|
||||
|
||||
1. Definitions.
|
||||
|
||||
1.0.1. "Commercial Use" means distribution or otherwise making the
|
||||
Covered Code available to a third party.
|
||||
|
||||
1.1. "Contributor" means each entity that creates or contributes to
|
||||
the creation of Modifications.
|
||||
|
||||
1.2. "Contributor Version" means the combination of the Original
|
||||
Code, prior Modifications used by a Contributor, and the Modifications
|
||||
made by that particular Contributor.
|
||||
|
||||
1.3. "Covered Code" means the Original Code or Modifications or the
|
||||
combination of the Original Code and Modifications, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.4. "Electronic Distribution Mechanism" means a mechanism generally
|
||||
accepted in the software development community for the electronic
|
||||
transfer of data.
|
||||
|
||||
1.5. "Executable" means Covered Code in any form other than Source
|
||||
Code.
|
||||
|
||||
1.6. "Initial Developer" means the individual or entity identified
|
||||
as the Initial Developer in the Source Code notice required by Exhibit
|
||||
A.
|
||||
|
||||
1.7. "Larger Work" means a work which combines Covered Code or
|
||||
portions thereof with code not governed by the terms of this License.
|
||||
|
||||
1.8. "License" means this document.
|
||||
|
||||
1.8.1. "Licensable" means having the right to grant, to the maximum
|
||||
extent possible, whether at the time of the initial grant or
|
||||
subsequently acquired, any and all of the rights conveyed herein.
|
||||
|
||||
1.9. "Modifications" means any addition to or deletion from the
|
||||
substance or structure of either the Original Code or any previous
|
||||
Modifications. When Covered Code is released as a series of files, a
|
||||
Modification is:
|
||||
A. Any addition to or deletion from the contents of a file
|
||||
containing Original Code or previous Modifications.
|
||||
|
||||
B. Any new file that contains any part of the Original Code or
|
||||
previous Modifications.
|
||||
|
||||
1.10. "Original Code" means Source Code of computer software code
|
||||
which is described in the Source Code notice required by Exhibit A as
|
||||
Original Code, and which, at the time of its release under this
|
||||
License is not already Covered Code governed by this License.
|
||||
|
||||
1.10.1. "Patent Claims" means any patent claim(s), now owned or
|
||||
hereafter acquired, including without limitation, method, process,
|
||||
and apparatus claims, in any patent Licensable by grantor.
|
||||
|
||||
1.11. "Source Code" means the preferred form of the Covered Code for
|
||||
making modifications to it, including all modules it contains, plus
|
||||
any associated interface definition files, scripts used to control
|
||||
compilation and installation of an Executable, or source code
|
||||
differential comparisons against either the Original Code or another
|
||||
well known, available Covered Code of the Contributor's choice. The
|
||||
Source Code can be in a compressed or archival form, provided the
|
||||
appropriate decompression or de-archiving software is widely available
|
||||
for no charge.
|
||||
|
||||
1.12. "You" (or "Your") means an individual or a legal entity
|
||||
exercising rights under, and complying with all of the terms of, this
|
||||
License or a future version of this License issued under Section 6.1.
|
||||
For legal entities, "You" includes any entity which controls, is
|
||||
controlled by, or is under common control with You. For purposes of
|
||||
this definition, "control" means (a) the power, direct or indirect,
|
||||
to cause the direction or management of such entity, whether by
|
||||
contract or otherwise, or (b) ownership of more than fifty percent
|
||||
(50%) of the outstanding shares or beneficial ownership of such
|
||||
entity.
|
||||
|
||||
2. Source Code License.
|
||||
|
||||
2.1. The Initial Developer Grant.
|
||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Initial Developer to use, reproduce,
|
||||
modify, display, perform, sublicense and distribute the Original
|
||||
Code (or portions thereof) with or without Modifications, and/or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patents Claims infringed by the making, using or
|
||||
selling of Original Code, to make, have made, use, practice,
|
||||
sell, and offer for sale, and/or otherwise dispose of the
|
||||
Original Code (or portions thereof).
|
||||
|
||||
(c) the licenses granted in this Section 2.1(a) and (b) are
|
||||
effective on the date Initial Developer first distributes
|
||||
Original Code under the terms of this License.
|
||||
|
||||
(d) Notwithstanding Section 2.1(b) above, no patent license is
|
||||
granted: 1) for code that You delete from the Original Code; 2)
|
||||
separate from the Original Code; or 3) for infringements caused
|
||||
by: i) the modification of the Original Code or ii) the
|
||||
combination of the Original Code with other software or devices.
|
||||
|
||||
2.2. Contributor Grant.
|
||||
Subject to third party intellectual property claims, each Contributor
|
||||
hereby grants You a world-wide, royalty-free, non-exclusive license
|
||||
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Contributor, to use, reproduce, modify,
|
||||
display, perform, sublicense and distribute the Modifications
|
||||
created by such Contributor (or portions thereof) either on an
|
||||
unmodified basis, with other Modifications, as Covered Code
|
||||
and/or as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims infringed by the making, using, or
|
||||
selling of Modifications made by that Contributor either alone
|
||||
and/or in combination with its Contributor Version (or portions
|
||||
of such combination), to make, use, sell, offer for sale, have
|
||||
made, and/or otherwise dispose of: 1) Modifications made by that
|
||||
Contributor (or portions thereof); and 2) the combination of
|
||||
Modifications made by that Contributor with its Contributor
|
||||
Version (or portions of such combination).
|
||||
|
||||
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
|
||||
effective on the date Contributor first makes Commercial Use of
|
||||
the Covered Code.
|
||||
|
||||
(d) Notwithstanding Section 2.2(b) above, no patent license is
|
||||
granted: 1) for any code that Contributor has deleted from the
|
||||
Contributor Version; 2) separate from the Contributor Version;
|
||||
3) for infringements caused by: i) third party modifications of
|
||||
Contributor Version or ii) the combination of Modifications made
|
||||
by that Contributor with other software (except as part of the
|
||||
Contributor Version) or other devices; or 4) under Patent Claims
|
||||
infringed by Covered Code in the absence of Modifications made by
|
||||
that Contributor.
|
||||
|
||||
3. Distribution Obligations.
|
||||
|
||||
3.1. Application of License.
|
||||
The Modifications which You create or to which You contribute are
|
||||
governed by the terms of this License, including without limitation
|
||||
Section 2.2. The Source Code version of Covered Code may be
|
||||
distributed only under the terms of this License or a future version
|
||||
of this License released under Section 6.1, and You must include a
|
||||
copy of this License with every copy of the Source Code You
|
||||
distribute. You may not offer or impose any terms on any Source Code
|
||||
version that alters or restricts the applicable version of this
|
||||
License or the recipients' rights hereunder. However, You may include
|
||||
an additional document offering the additional rights described in
|
||||
Section 3.5.
|
||||
|
||||
3.2. Availability of Source Code.
|
||||
Any Modification which You create or to which You contribute must be
|
||||
made available in Source Code form under the terms of this License
|
||||
either on the same media as an Executable version or via an accepted
|
||||
Electronic Distribution Mechanism to anyone to whom you made an
|
||||
Executable version available; and if made available via Electronic
|
||||
Distribution Mechanism, must remain available for at least twelve (12)
|
||||
months after the date it initially became available, or at least six
|
||||
(6) months after a subsequent version of that particular Modification
|
||||
has been made available to such recipients. You are responsible for
|
||||
ensuring that the Source Code version remains available even if the
|
||||
Electronic Distribution Mechanism is maintained by a third party.
|
||||
|
||||
3.3. Description of Modifications.
|
||||
You must cause all Covered Code to which You contribute to contain a
|
||||
file documenting the changes You made to create that Covered Code and
|
||||
the date of any change. You must include a prominent statement that
|
||||
the Modification is derived, directly or indirectly, from Original
|
||||
Code provided by the Initial Developer and including the name of the
|
||||
Initial Developer in (a) the Source Code, and (b) in any notice in an
|
||||
Executable version or related documentation in which You describe the
|
||||
origin or ownership of the Covered Code.
|
||||
|
||||
3.4. Intellectual Property Matters
|
||||
(a) Third Party Claims.
|
||||
If Contributor has knowledge that a license under a third party's
|
||||
intellectual property rights is required to exercise the rights
|
||||
granted by such Contributor under Sections 2.1 or 2.2,
|
||||
Contributor must include a text file with the Source Code
|
||||
distribution titled "LEGAL" which describes the claim and the
|
||||
party making the claim in sufficient detail that a recipient will
|
||||
know whom to contact. If Contributor obtains such knowledge after
|
||||
the Modification is made available as described in Section 3.2,
|
||||
Contributor shall promptly modify the LEGAL file in all copies
|
||||
Contributor makes available thereafter and shall take other steps
|
||||
(such as notifying appropriate mailing lists or newsgroups)
|
||||
reasonably calculated to inform those who received the Covered
|
||||
Code that new knowledge has been obtained.
|
||||
|
||||
(b) Contributor APIs.
|
||||
If Contributor's Modifications include an application programming
|
||||
interface and Contributor has knowledge of patent licenses which
|
||||
are reasonably necessary to implement that API, Contributor must
|
||||
also include this information in the LEGAL file.
|
||||
|
||||
(c) Representations.
|
||||
Contributor represents that, except as disclosed pursuant to
|
||||
Section 3.4(a) above, Contributor believes that Contributor's
|
||||
Modifications are Contributor's original creation(s) and/or
|
||||
Contributor has sufficient rights to grant the rights conveyed by
|
||||
this License.
|
||||
|
||||
3.5. Required Notices.
|
||||
You must duplicate the notice in Exhibit A in each file of the Source
|
||||
Code. If it is not possible to put such notice in a particular Source
|
||||
Code file due to its structure, then You must include such notice in a
|
||||
location (such as a relevant directory) where a user would be likely
|
||||
to look for such a notice. If You created one or more Modification(s)
|
||||
You may add your name as a Contributor to the notice described in
|
||||
Exhibit A. You must also duplicate this License in any documentation
|
||||
for the Source Code where You describe recipients' rights or ownership
|
||||
rights relating to Covered Code. You may choose to offer, and to
|
||||
charge a fee for, warranty, support, indemnity or liability
|
||||
obligations to one or more recipients of Covered Code. However, You
|
||||
may do so only on Your own behalf, and not on behalf of the Initial
|
||||
Developer or any Contributor. You must make it absolutely clear than
|
||||
any such warranty, support, indemnity or liability obligation is
|
||||
offered by You alone, and You hereby agree to indemnify the Initial
|
||||
Developer and every Contributor for any liability incurred by the
|
||||
Initial Developer or such Contributor as a result of warranty,
|
||||
support, indemnity or liability terms You offer.
|
||||
|
||||
3.6. Distribution of Executable Versions.
|
||||
You may distribute Covered Code in Executable form only if the
|
||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
||||
and if You include a notice stating that the Source Code version of
|
||||
the Covered Code is available under the terms of this License,
|
||||
including a description of how and where You have fulfilled the
|
||||
obligations of Section 3.2. The notice must be conspicuously included
|
||||
in any notice in an Executable version, related documentation or
|
||||
collateral in which You describe recipients' rights relating to the
|
||||
Covered Code. You may distribute the Executable version of Covered
|
||||
Code or ownership rights under a license of Your choice, which may
|
||||
contain terms different from this License, provided that You are in
|
||||
compliance with the terms of this License and that the license for the
|
||||
Executable version does not attempt to limit or alter the recipient's
|
||||
rights in the Source Code version from the rights set forth in this
|
||||
License. If You distribute the Executable version under a different
|
||||
license You must make it absolutely clear that any terms which differ
|
||||
from this License are offered by You alone, not by the Initial
|
||||
Developer or any Contributor. You hereby agree to indemnify the
|
||||
Initial Developer and every Contributor for any liability incurred by
|
||||
the Initial Developer or such Contributor as a result of any such
|
||||
terms You offer.
|
||||
|
||||
3.7. Larger Works.
|
||||
You may create a Larger Work by combining Covered Code with other code
|
||||
not governed by the terms of this License and distribute the Larger
|
||||
Work as a single product. In such a case, You must make sure the
|
||||
requirements of this License are fulfilled for the Covered Code.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation.
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Code due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description
|
||||
must be included in the LEGAL file described in Section 3.4 and must
|
||||
be included with all distributions of the Source Code. Except to the
|
||||
extent prohibited by statute or regulation, such description must be
|
||||
sufficiently detailed for a recipient of ordinary skill to be able to
|
||||
understand it.
|
||||
|
||||
5. Application of this License.
|
||||
|
||||
This License applies to code to which the Initial Developer has
|
||||
attached the notice in Exhibit A and to related Covered Code.
|
||||
|
||||
6. Versions of the License.
|
||||
|
||||
6.1. New Versions.
|
||||
Netscape Communications Corporation ("Netscape") may publish revised
|
||||
and/or new versions of the License from time to time. Each version
|
||||
will be given a distinguishing version number.
|
||||
|
||||
6.2. Effect of New Versions.
|
||||
Once Covered Code has been published under a particular version of the
|
||||
License, You may always continue to use it under the terms of that
|
||||
version. You may also choose to use such Covered Code under the terms
|
||||
of any subsequent version of the License published by Netscape. No one
|
||||
other than Netscape has the right to modify the terms applicable to
|
||||
Covered Code created under this License.
|
||||
|
||||
6.3. Derivative Works.
|
||||
If You create or use a modified version of this License (which you may
|
||||
only do in order to apply it to code which is not already Covered Code
|
||||
governed by this License), You must (a) rename Your license so that
|
||||
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
|
||||
"MPL", "NPL" or any confusingly similar phrase do not appear in your
|
||||
license (except to note that your license differs from this License)
|
||||
and (b) otherwise make it clear that Your version of the license
|
||||
contains terms which differ from the Mozilla Public License and
|
||||
Netscape Public License. (Filling in the name of the Initial
|
||||
Developer, Original Code or Contributor in the notice described in
|
||||
Exhibit A shall not of themselves be deemed to be modifications of
|
||||
this License.)
|
||||
|
||||
7. DISCLAIMER OF WARRANTY.
|
||||
|
||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||||
|
||||
8. TERMINATION.
|
||||
|
||||
8.1. This License and the rights granted hereunder will terminate
|
||||
automatically if You fail to comply with terms herein and fail to cure
|
||||
such breach within 30 days of becoming aware of the breach. All
|
||||
sublicenses to the Covered Code which are properly granted shall
|
||||
survive any termination of this License. Provisions which, by their
|
||||
nature, must remain in effect beyond the termination of this License
|
||||
shall survive.
|
||||
|
||||
8.2. If You initiate litigation by asserting a patent infringement
|
||||
claim (excluding declatory judgment actions) against Initial Developer
|
||||
or a Contributor (the Initial Developer or Contributor against whom
|
||||
You file such action is referred to as "Participant") alleging that:
|
||||
|
||||
(a) such Participant's Contributor Version directly or indirectly
|
||||
infringes any patent, then any and all rights granted by such
|
||||
Participant to You under Sections 2.1 and/or 2.2 of this License
|
||||
shall, upon 60 days notice from Participant terminate prospectively,
|
||||
unless if within 60 days after receipt of notice You either: (i)
|
||||
agree in writing to pay Participant a mutually agreeable reasonable
|
||||
royalty for Your past and future use of Modifications made by such
|
||||
Participant, or (ii) withdraw Your litigation claim with respect to
|
||||
the Contributor Version against such Participant. If within 60 days
|
||||
of notice, a reasonable royalty and payment arrangement are not
|
||||
mutually agreed upon in writing by the parties or the litigation claim
|
||||
is not withdrawn, the rights granted by Participant to You under
|
||||
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
|
||||
the 60 day notice period specified above.
|
||||
|
||||
(b) any software, hardware, or device, other than such Participant's
|
||||
Contributor Version, directly or indirectly infringes any patent, then
|
||||
any rights granted to You by such Participant under Sections 2.1(b)
|
||||
and 2.2(b) are revoked effective as of the date You first made, used,
|
||||
sold, distributed, or had made, Modifications made by that
|
||||
Participant.
|
||||
|
||||
8.3. If You assert a patent infringement claim against Participant
|
||||
alleging that such Participant's Contributor Version directly or
|
||||
indirectly infringes any patent where such claim is resolved (such as
|
||||
by license or settlement) prior to the initiation of patent
|
||||
infringement litigation, then the reasonable value of the licenses
|
||||
granted by such Participant under Sections 2.1 or 2.2 shall be taken
|
||||
into account in determining the amount or value of any payment or
|
||||
license.
|
||||
|
||||
8.4. In the event of termination under Sections 8.1 or 8.2 above,
|
||||
all end user license agreements (excluding distributors and resellers)
|
||||
which have been validly granted by You or any distributor hereunder
|
||||
prior to termination shall survive termination.
|
||||
|
||||
9. LIMITATION OF LIABILITY.
|
||||
|
||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
|
||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
|
||||
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
|
||||
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
|
||||
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
|
||||
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
|
||||
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
|
||||
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
10. U.S. GOVERNMENT END USERS.
|
||||
|
||||
The Covered Code is a "commercial item," as that term is defined in
|
||||
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
|
||||
software" and "commercial computer software documentation," as such
|
||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
||||
all U.S. Government End Users acquire Covered Code with only those
|
||||
rights set forth herein.
|
||||
|
||||
11. MISCELLANEOUS.
|
||||
|
||||
This License represents the complete agreement concerning subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. This License shall be governed by
|
||||
California law provisions (except to the extent applicable law, if
|
||||
any, provides otherwise), excluding its conflict-of-law provisions.
|
||||
With respect to disputes in which at least one party is a citizen of,
|
||||
or an entity chartered or registered to do business in the United
|
||||
States of America, any litigation relating to this License shall be
|
||||
subject to the jurisdiction of the Federal Courts of the Northern
|
||||
District of California, with venue lying in Santa Clara County,
|
||||
California, with the losing party responsible for costs, including
|
||||
without limitation, court costs and reasonable attorneys' fees and
|
||||
expenses. The application of the United Nations Convention on
|
||||
Contracts for the International Sale of Goods is expressly excluded.
|
||||
Any law or regulation which provides that the language of a contract
|
||||
shall be construed against the drafter shall not apply to this
|
||||
License.
|
||||
|
||||
12. RESPONSIBILITY FOR CLAIMS.
|
||||
|
||||
As between Initial Developer and the Contributors, each party is
|
||||
responsible for claims and damages arising, directly or indirectly,
|
||||
out of its utilization of rights under this License and You agree to
|
||||
work with Initial Developer and Contributors to distribute such
|
||||
responsibility on an equitable basis. Nothing herein is intended or
|
||||
shall be deemed to constitute any admission of liability.
|
||||
|
||||
13. MULTIPLE-LICENSED CODE.
|
||||
|
||||
Initial Developer may designate portions of the Covered Code as
|
||||
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
|
||||
Developer permits you to utilize portions of the Covered Code under
|
||||
Your choice of the NPL or the alternative licenses, if any, specified
|
||||
by the Initial Developer in the file described in Exhibit A.
|
||||
|
||||
EXHIBIT A -Mozilla Public License.
|
||||
|
||||
``The contents of this file are subject to the Mozilla Public License
|
||||
Version 1.1 (the "License"); you may not use this file except in
|
||||
compliance with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS"
|
||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing rights and limitations
|
||||
under the License.
|
||||
|
||||
The Original Code is RabbitMQ.
|
||||
|
||||
The Initial Developer of the Original Code is Pivotal Software, Inc.
|
||||
Copyright (c) 2007-2016 Pivotal Software, Inc. All rights reserved.''
|
||||
|
||||
[NOTE: The text of this Exhibit A may differ slightly from the text of
|
||||
the notices in the Source Code files of the Original Code. You should
|
||||
use the text of this Exhibit A rather than the text found in the
|
||||
Original Code Source Code for Your Modifications.]
|
|
@ -44,12 +44,13 @@
|
|||
clean_sess, proto_ver, proto_name, username, is_superuser,
|
||||
will_msg, keepalive, keepalive_backoff, max_clientid_len,
|
||||
session, stats_data, mountpoint, ws_initial_headers,
|
||||
is_bridge, connected_at}).
|
||||
peercert_username, is_bridge, connected_at}).
|
||||
|
||||
-type(proto_state() :: #proto_state{}).
|
||||
|
||||
-define(INFO_KEYS, [client_id, username, clean_sess, proto_ver, proto_name,
|
||||
keepalive, will_msg, ws_initial_headers, mountpoint, connected_at]).
|
||||
keepalive, will_msg, ws_initial_headers, mountpoint,
|
||||
peercert_username, connected_at]).
|
||||
|
||||
-define(STATS_KEYS, [recv_pkt, recv_msg, send_pkt, send_msg]).
|
||||
|
||||
|
@ -68,6 +69,7 @@ init(Peername, SendFun, Opts) ->
|
|||
max_clientid_len = MaxLen,
|
||||
is_superuser = false,
|
||||
client_pid = self(),
|
||||
peercert_username = false,
|
||||
ws_initial_headers = WsInitialHeaders,
|
||||
keepalive_backoff = Backoff,
|
||||
stats_data = #proto_stats{enable_stats = EnableStats}}.
|
||||
|
@ -79,9 +81,28 @@ enrich_opt([], _Conn, State) ->
|
|||
State;
|
||||
enrich_opt([{mountpoint, MountPoint} | ConnOpts], Conn, State) ->
|
||||
enrich_opt(ConnOpts, Conn, State#proto_state{mountpoint = MountPoint});
|
||||
enrich_opt([{peer_cert_as_username, N} | ConnOpts], Conn, State) ->
|
||||
case Conn:type() of
|
||||
ssl -> enrich_opt(ConnOpts, Conn, State#proto_state{
|
||||
peercert_username = peercert_username(N, Conn:peercert())});
|
||||
_ -> enrich_opt(ConnOpts, Conn, State)
|
||||
end;
|
||||
enrich_opt([_ | ConnOpts], Conn, State) ->
|
||||
enrich_opt(ConnOpts, Conn, State).
|
||||
|
||||
peercert_username(cn, Cert) ->
|
||||
case emqttd_ssl:peer_cert_common_name(Cert) of
|
||||
not_found -> undefined;
|
||||
CN -> iolist_to_binary(CN)
|
||||
end;
|
||||
peercert_username(dn, Cert) ->
|
||||
iolist_to_binary(emqttd_ssl:peer_cert_subject(Cert)).
|
||||
|
||||
repl_username_with_peercert(State = #proto_state{peercert_username = false}) ->
|
||||
State;
|
||||
repl_username_with_peercert(State = #proto_state{peercert_username = PeerCert}) ->
|
||||
State#proto_state{username = PeerCert}.
|
||||
|
||||
info(ProtoState) ->
|
||||
?record_to_proplist(proto_state, ProtoState, ?INFO_KEYS).
|
||||
|
||||
|
@ -183,15 +204,16 @@ process(?CONNECT_PACKET(Var), State0) ->
|
|||
client_id = ClientId,
|
||||
is_bridge = IsBridge} = Var,
|
||||
|
||||
State1 = State0#proto_state{proto_ver = ProtoVer,
|
||||
proto_name = ProtoName,
|
||||
username = Username,
|
||||
client_id = ClientId,
|
||||
clean_sess = CleanSess,
|
||||
keepalive = KeepAlive,
|
||||
will_msg = willmsg(Var, State0),
|
||||
is_bridge = IsBridge,
|
||||
connected_at = os:timestamp()},
|
||||
State1 = repl_username_with_peercert(
|
||||
State0#proto_state{proto_ver = ProtoVer,
|
||||
proto_name = ProtoName,
|
||||
username = Username,
|
||||
client_id = ClientId,
|
||||
clean_sess = CleanSess,
|
||||
keepalive = KeepAlive,
|
||||
will_msg = willmsg(Var, State0),
|
||||
is_bridge = IsBridge,
|
||||
connected_at = os:timestamp()}),
|
||||
|
||||
{ReturnCode1, SessPresent, State3} =
|
||||
case validate_connect(Var, State1) of
|
||||
|
|
|
@ -0,0 +1,259 @@
|
|||
%%--------------------------------------------------------------------
|
||||
%% Copyright (c) 2013-2017 EMQ Enterprise, Inc. (http://emqtt.io)
|
||||
%%
|
||||
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||
%% you may not use this file except in compliance with the License.
|
||||
%% You may obtain a copy of the License at
|
||||
%%
|
||||
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||
%%
|
||||
%% Unless required by applicable law or agreed to in writing, software
|
||||
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
%% See the License for the specific language governing permissions and
|
||||
%% limitations under the License.
|
||||
%%--------------------------------------------------------------------
|
||||
%%
|
||||
%% @doc SSL Utility Functions. This module is copied from rabbit_ssl.erl
|
||||
%%
|
||||
|
||||
-module(emqttd_ssl).
|
||||
|
||||
-include_lib("public_key/include/public_key.hrl").
|
||||
|
||||
-type(certificate() :: binary()).
|
||||
|
||||
-export([peer_cert_issuer/1, peer_cert_subject/1, peer_cert_common_name/1,
|
||||
peer_cert_subject_items/2, peer_cert_validity/1]).
|
||||
|
||||
%% Return a string describing the certificate's issuer.
|
||||
-spec(peer_cert_issuer(certificate()) -> string()).
|
||||
peer_cert_issuer(Cert) ->
|
||||
cert_info(fun(#'OTPCertificate' {
|
||||
tbsCertificate = #'OTPTBSCertificate' {
|
||||
issuer = Issuer }}) ->
|
||||
format_rdn_sequence(Issuer)
|
||||
end, Cert).
|
||||
|
||||
%% Return a string describing the certificate's subject, as per RFC4514.
|
||||
-spec(peer_cert_subject(certificate()) -> string()).
|
||||
peer_cert_subject(Cert) ->
|
||||
cert_info(fun(#'OTPCertificate' {
|
||||
tbsCertificate = #'OTPTBSCertificate' {
|
||||
subject = Subject }}) ->
|
||||
format_rdn_sequence(Subject)
|
||||
end, Cert).
|
||||
|
||||
-spec(peer_cert_common_name(certificate()) -> string() | 'not_found').
|
||||
peer_cert_common_name(Cert) ->
|
||||
case peer_cert_subject_items(Cert, ?'id-at-commonName') of
|
||||
not_found -> not_found;
|
||||
CNs -> string:join(CNs, ",")
|
||||
end.
|
||||
|
||||
%% Return the parts of the certificate's subject.
|
||||
-spec(peer_cert_subject_items(certificate(), tuple()) -> [string()] | 'undefined').
|
||||
peer_cert_subject_items(Cert, Type) ->
|
||||
cert_info(fun(#'OTPCertificate' {
|
||||
tbsCertificate = #'OTPTBSCertificate' {
|
||||
subject = Subject }}) ->
|
||||
find_by_type(Type, Subject)
|
||||
end, Cert).
|
||||
|
||||
%% Return a string describing the certificate's validity.
|
||||
-spec(peer_cert_validity(certificate()) -> string()).
|
||||
peer_cert_validity(Cert) ->
|
||||
cert_info(fun(#'OTPCertificate' {
|
||||
tbsCertificate = #'OTPTBSCertificate' {
|
||||
validity = {'Validity', Start, End} }}) ->
|
||||
format("~s - ~s", [format_asn1_value(Start),
|
||||
format_asn1_value(End)])
|
||||
end, Cert).
|
||||
|
||||
cert_info(F, {ok, Cert}) ->
|
||||
F(case public_key:pkix_decode_cert(Cert, otp) of
|
||||
{ok, DecCert} -> DecCert; %%pre R14B
|
||||
DecCert -> DecCert %%R14B onwards
|
||||
end).
|
||||
|
||||
find_by_type(Type, {rdnSequence, RDNs}) ->
|
||||
case [V || #'AttributeTypeAndValue'{type = T, value = V}
|
||||
<- lists:flatten(RDNs),
|
||||
T == Type] of
|
||||
[] -> not_found;
|
||||
L -> [format_asn1_value(V) || V <- L]
|
||||
end.
|
||||
|
||||
%%--------------------------------------------------------------------------
|
||||
%% Formatting functions.
|
||||
%%--------------------------------------------------------------------------
|
||||
|
||||
%% Format and rdnSequence as a RFC4514 subject string.
|
||||
format_rdn_sequence({rdnSequence, Seq}) ->
|
||||
string:join(lists:reverse([format_complex_rdn(RDN) || RDN <- Seq]), ",").
|
||||
|
||||
%% Format an RDN set.
|
||||
format_complex_rdn(RDNs) ->
|
||||
string:join([format_rdn(RDN) || RDN <- RDNs], "+").
|
||||
|
||||
%% Format an RDN. If the type name is unknown, use the dotted decimal
|
||||
%% representation. See RFC4514, section 2.3.
|
||||
format_rdn(#'AttributeTypeAndValue'{type = T, value = V}) ->
|
||||
FV = escape_rdn_value(format_asn1_value(V)),
|
||||
Fmts = [{?'id-at-surname' , "SN"},
|
||||
{?'id-at-givenName' , "GIVENNAME"},
|
||||
{?'id-at-initials' , "INITIALS"},
|
||||
{?'id-at-generationQualifier' , "GENERATIONQUALIFIER"},
|
||||
{?'id-at-commonName' , "CN"},
|
||||
{?'id-at-localityName' , "L"},
|
||||
{?'id-at-stateOrProvinceName' , "ST"},
|
||||
{?'id-at-organizationName' , "O"},
|
||||
{?'id-at-organizationalUnitName' , "OU"},
|
||||
{?'id-at-title' , "TITLE"},
|
||||
{?'id-at-countryName' , "C"},
|
||||
{?'id-at-serialNumber' , "SERIALNUMBER"},
|
||||
{?'id-at-pseudonym' , "PSEUDONYM"},
|
||||
{?'id-domainComponent' , "DC"},
|
||||
{?'id-emailAddress' , "EMAILADDRESS"},
|
||||
{?'street-address' , "STREET"},
|
||||
{{0,9,2342,19200300,100,1,1} , "UID"}], %% Not in public_key.hrl
|
||||
case proplists:lookup(T, Fmts) of
|
||||
{_, Fmt} ->
|
||||
format(Fmt ++ "=~s", [FV]);
|
||||
none when is_tuple(T) ->
|
||||
TypeL = [format("~w", [X]) || X <- tuple_to_list(T)],
|
||||
format("~s=~s", [string:join(TypeL, "."), FV]);
|
||||
none ->
|
||||
format("~p=~s", [T, FV])
|
||||
end.
|
||||
|
||||
%% Escape a string as per RFC4514.
|
||||
escape_rdn_value(V) ->
|
||||
escape_rdn_value(V, start).
|
||||
|
||||
escape_rdn_value([], _) ->
|
||||
[];
|
||||
escape_rdn_value([C | S], start) when C =:= $ ; C =:= $# ->
|
||||
[$\\, C | escape_rdn_value(S, middle)];
|
||||
escape_rdn_value(S, start) ->
|
||||
escape_rdn_value(S, middle);
|
||||
escape_rdn_value([$ ], middle) ->
|
||||
[$\\, $ ];
|
||||
escape_rdn_value([C | S], middle) when C =:= $"; C =:= $+; C =:= $,; C =:= $;;
|
||||
C =:= $<; C =:= $>; C =:= $\\ ->
|
||||
[$\\, C | escape_rdn_value(S, middle)];
|
||||
escape_rdn_value([C | S], middle) when C < 32 ; C >= 126 ->
|
||||
%% Of ASCII characters only U+0000 needs escaping, but for display
|
||||
%% purposes it's handy to escape all non-printable chars. All non-ASCII
|
||||
%% characters get converted to UTF-8 sequences and then escaped. We've
|
||||
%% already got a UTF-8 sequence here, so just escape it.
|
||||
rabbit_misc:format("\\~2.16.0B", [C]) ++ escape_rdn_value(S, middle);
|
||||
escape_rdn_value([C | S], middle) ->
|
||||
[C | escape_rdn_value(S, middle)].
|
||||
|
||||
%% Get the string representation of an OTPCertificate field.
|
||||
format_asn1_value({ST, S}) when ST =:= teletexString; ST =:= printableString;
|
||||
ST =:= universalString; ST =:= utf8String;
|
||||
ST =:= bmpString ->
|
||||
format_directory_string(ST, S);
|
||||
format_asn1_value({utcTime, [Y1, Y2, M1, M2, D1, D2, H1, H2,
|
||||
Min1, Min2, S1, S2, $Z]}) ->
|
||||
format("20~c~c-~c~c-~c~cT~c~c:~c~c:~c~cZ",
|
||||
[Y1, Y2, M1, M2, D1, D2, H1, H2, Min1, Min2, S1, S2]);
|
||||
%% We appear to get an untagged value back for an ia5string
|
||||
%% (e.g. domainComponent).
|
||||
format_asn1_value(V) when is_list(V) ->
|
||||
V;
|
||||
format_asn1_value(V) when is_binary(V) ->
|
||||
%% OTP does not decode some values when combined with an unknown
|
||||
%% type. That's probably wrong, so as a last ditch effort let's
|
||||
%% try manually decoding. 'DirectoryString' is semi-arbitrary -
|
||||
%% but it is the type which covers the various string types we
|
||||
%% handle below.
|
||||
try
|
||||
{ST, S} = public_key:der_decode('DirectoryString', V),
|
||||
format_directory_string(ST, S)
|
||||
catch _:_ ->
|
||||
format("~p", [V])
|
||||
end;
|
||||
format_asn1_value(V) ->
|
||||
format("~p", [V]).
|
||||
|
||||
%% DirectoryString { INTEGER : maxSize } ::= CHOICE {
|
||||
%% teletexString TeletexString (SIZE (1..maxSize)),
|
||||
%% printableString PrintableString (SIZE (1..maxSize)),
|
||||
%% bmpString BMPString (SIZE (1..maxSize)),
|
||||
%% universalString UniversalString (SIZE (1..maxSize)),
|
||||
%% uTF8String UTF8String (SIZE (1..maxSize)) }
|
||||
%%
|
||||
%% Precise definitions of printable / teletexString are hard to come
|
||||
%% by. This is what I reconstructed:
|
||||
%%
|
||||
%% printableString:
|
||||
%% "intended to represent the limited character sets available to
|
||||
%% mainframe input terminals"
|
||||
%% A-Z a-z 0-9 ' ( ) + , - . / : = ? [space]
|
||||
%% http://msdn.microsoft.com/en-us/library/bb540814(v=vs.85).aspx
|
||||
%%
|
||||
%% teletexString:
|
||||
%% "a sizable volume of software in the world treats TeletexString
|
||||
%% (T61String) as a simple 8-bit string with mostly Windows Latin 1
|
||||
%% (superset of iso-8859-1) encoding"
|
||||
%% http://www.mail-archive.com/asn1@asn1.org/msg00460.html
|
||||
%%
|
||||
%% (However according to that link X.680 actually defines
|
||||
%% TeletexString in some much more involved and crazy way. I suggest
|
||||
%% we treat it as ISO-8859-1 since Erlang does not support Windows
|
||||
%% Latin 1).
|
||||
%%
|
||||
%% bmpString:
|
||||
%% UCS-2 according to RFC 3641. Hence cannot represent Unicode
|
||||
%% characters above 65535 (outside the "Basic Multilingual Plane").
|
||||
%%
|
||||
%% universalString:
|
||||
%% UCS-4 according to RFC 3641.
|
||||
%%
|
||||
%% utf8String:
|
||||
%% UTF-8 according to RFC 3641.
|
||||
%%
|
||||
%% Within Rabbit we assume UTF-8 encoding. Since printableString is a
|
||||
%% subset of ASCII it is also a subset of UTF-8. The others need
|
||||
%% converting. Fortunately since the Erlang SSL library does the
|
||||
%% decoding for us (albeit into a weird format, see below), we just
|
||||
%% need to handle encoding into UTF-8. Note also that utf8Strings come
|
||||
%% back as binary.
|
||||
%%
|
||||
%% Note for testing: the default Ubuntu configuration for openssl will
|
||||
%% only create printableString or teletexString types no matter what
|
||||
%% you do. Edit string_mask in the [req] section of
|
||||
%% /etc/ssl/openssl.cnf to change this (see comments there). You
|
||||
%% probably also need to set utf8 = yes to get it to accept UTF-8 on
|
||||
%% the command line. Also note I could not get openssl to generate a
|
||||
%% universalString.
|
||||
|
||||
format_directory_string(printableString, S) -> S;
|
||||
format_directory_string(teletexString, S) -> utf8_list_from(S);
|
||||
format_directory_string(bmpString, S) -> utf8_list_from(S);
|
||||
format_directory_string(universalString, S) -> utf8_list_from(S);
|
||||
format_directory_string(utf8String, S) -> binary_to_list(S).
|
||||
|
||||
utf8_list_from(S) ->
|
||||
binary_to_list(
|
||||
unicode:characters_to_binary(flatten_ssl_list(S), utf32, utf8)).
|
||||
|
||||
%% The Erlang SSL implementation invents its own representation for
|
||||
%% non-ascii strings - looking like [97,{0,0,3,187}] (that's LATIN
|
||||
%% SMALL LETTER A followed by GREEK SMALL LETTER LAMDA). We convert
|
||||
%% this into a list of unicode characters, which we can tell
|
||||
%% unicode:characters_to_binary is utf32.
|
||||
|
||||
flatten_ssl_list(L) -> [flatten_ssl_list_item(I) || I <- L].
|
||||
|
||||
flatten_ssl_list_item({A, B, C, D}) ->
|
||||
A * (1 bsl 24) + B * (1 bsl 16) + C * (1 bsl 8) + D;
|
||||
flatten_ssl_list_item(N) when is_number (N) ->
|
||||
N.
|
||||
|
||||
format(Fmt, Args) ->
|
||||
lists:flatten(io_lib:format(Fmt, Args)).
|
||||
|
Loading…
Reference in New Issue