1 | // Copyright (c) 2018, Yubico AB | |
2 | // All rights reserved. | |
3 | // | |
4 | // Redistribution and use in source and binary forms, with or without | |
5 | // modification, are permitted provided that the following conditions are met: | |
6 | // | |
7 | // 1. Redistributions of source code must retain the above copyright notice, this | |
8 | // list of conditions and the following disclaimer. | |
9 | // | |
10 | // 2. Redistributions in binary form must reproduce the above copyright notice, | |
11 | // this list of conditions and the following disclaimer in the documentation | |
12 | // and/or other materials provided with the distribution. | |
13 | // | |
14 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
15 | // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
16 | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
17 | // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
18 | // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
19 | // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
20 | // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
21 | // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
22 | // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
23 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
24 | ||
25 | package com.yubico.webauthn.data; | |
26 | ||
27 | import com.fasterxml.jackson.annotation.JsonCreator; | |
28 | import com.fasterxml.jackson.annotation.JsonProperty; | |
29 | import lombok.Builder; | |
30 | import lombok.Getter; | |
31 | import lombok.NonNull; | |
32 | import lombok.Value; | |
33 | ||
34 | /** | |
35 | * Describes a user account, with which public key credentials can be associated. | |
36 | * | |
37 | * @see <a | |
38 | * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#dictdef-publickeycredentialuserentity">§5.4.3. | |
39 | * User Account Parameters for Credential Generation (dictionary PublicKeyCredentialUserEntity) | |
40 | * </a> | |
41 | */ | |
42 | @Value | |
43 | @Builder(toBuilder = true) | |
44 | public class UserIdentity implements PublicKeyCredentialEntity { | |
45 | ||
46 | /** | |
47 | * A human-palatable identifier for a user account. It is intended only for display, i.e., aiding | |
48 | * the user in determining the difference between user accounts with similar {@link | |
49 | * #displayName}s. | |
50 | * | |
51 | * <p>For example: "alexm", "alex.p.mueller@example.com" or "+14255551234". | |
52 | */ | |
53 | @NonNull | |
54 | @Getter(onMethod = @__({@Override})) | |
55 | private final String name; | |
56 | ||
57 | /** | |
58 | * A human-palatable name for the user account, intended only for display. For example, "Alex P. | |
59 | * Müller" or "田中 倫". The Relying Party SHOULD let the user choose this, and SHOULD NOT restrict | |
60 | * the choice more than necessary. | |
61 | * | |
62 | * <ul> | |
63 | * <li>Relying Parties SHOULD perform enforcement, as prescribed in Section 2.3 of [RFC8266] for | |
64 | * the Nickname Profile of the PRECIS FreeformClass [RFC8264], when setting {@link | |
65 | * #displayName}'s value, or displaying the value to the user. | |
66 | * <li>Clients SHOULD perform enforcement, as prescribed in Section 2.3 of [RFC8266] for the | |
67 | * Nickname Profile of the PRECIS FreeformClass [RFC8264], on {@link #displayName}'s value | |
68 | * prior to displaying the value to the user or including the value as a parameter of the | |
69 | * <code>authenticatorMakeCredential</code> operation. | |
70 | * </ul> | |
71 | * | |
72 | * <p>When clients, client platforms, or authenticators display a {@link #displayName}'s value, | |
73 | * they should always use UI elements to provide a clear boundary around the displayed value, and | |
74 | * not allow overflow into other elements. | |
75 | * | |
76 | * <p>Authenticators MUST accept and store a 64-byte minimum length for a {@link #displayName} | |
77 | * member's value. Authenticators MAY truncate a {@link #displayName} member's value to a length | |
78 | * equal to or greater than 64 bytes. | |
79 | * | |
80 | * @see <a href="https://tools.ietf.org/html/rfc8264">RFC 8264</a> | |
81 | * @see <a href="https://tools.ietf.org/html/rfc8266">RFC 8266</a> | |
82 | */ | |
83 | @NonNull private final String displayName; | |
84 | ||
85 | /** | |
86 | * The <a href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#user-handle">user handle</a> | |
87 | * for the account, specified by the Relying Party. | |
88 | * | |
89 | * <p>A user handle is an opaque byte sequence with a maximum size of 64 bytes. User handles are | |
90 | * not meant to be displayed to users. The user handle SHOULD NOT contain personally identifying | |
91 | * information about the user, such as a username or e-mail address; see <a | |
92 | * href="https://www.w3.org/TR/2021/REC-webauthn-2-20210408/#sctn-user-handle-privacy">§14.9 User | |
93 | * Handle Contents</a> for details. | |
94 | * | |
95 | * <p>To ensure secure operation, authentication and authorization decisions MUST be made on the | |
96 | * basis of this {@link #id} member, not the {@link #displayName} nor {@link #name} members. See | |
97 | * <a href="https://tools.ietf.org/html/rfc8266#section-6.1">Section 6.1 of RFC 8266</a>. | |
98 | * | |
99 | * <p>An authenticator will never contain more than one credential for a given Relying Party under | |
100 | * the same user handle. | |
101 | */ | |
102 | @NonNull private final ByteArray id; | |
103 | ||
104 | @JsonCreator | |
105 | private UserIdentity( | |
106 |
1
1. <init> : negated conditional → KILLED |
@NonNull @JsonProperty("name") String name, |
107 |
1
1. <init> : negated conditional → KILLED |
@NonNull @JsonProperty("displayName") String displayName, |
108 |
1
1. <init> : negated conditional → KILLED |
@NonNull @JsonProperty("id") ByteArray id) { |
109 | this.name = name; | |
110 | this.displayName = displayName; | |
111 | this.id = id; | |
112 | } | |
113 | ||
114 | public static UserIdentityBuilder.MandatoryStages builder() { | |
115 |
1
1. builder : replaced return value with null for com/yubico/webauthn/data/UserIdentity::builder → KILLED |
return new UserIdentityBuilder.MandatoryStages(); |
116 | } | |
117 | ||
118 | public static class UserIdentityBuilder { | |
119 | ||
120 | public static class MandatoryStages { | |
121 | private final UserIdentityBuilder builder = new UserIdentityBuilder(); | |
122 | ||
123 | /** | |
124 | * {@link UserIdentityBuilder#name(String) name} is a required parameter. | |
125 | * | |
126 | * @see UserIdentityBuilder#name(String) | |
127 | */ | |
128 | public Step2 name(String name) { | |
129 | builder.name(name); | |
130 |
1
1. name : replaced return value with null for com/yubico/webauthn/data/UserIdentity$UserIdentityBuilder$MandatoryStages::name → KILLED |
return new Step2(); |
131 | } | |
132 | ||
133 | public class Step2 { | |
134 | /** | |
135 | * {@link UserIdentityBuilder#displayName(String) displayName} is a required parameter. | |
136 | * | |
137 | * @see UserIdentityBuilder#displayName(String) | |
138 | */ | |
139 | public Step3 displayName(String displayName) { | |
140 | builder.displayName(displayName); | |
141 |
1
1. displayName : replaced return value with null for com/yubico/webauthn/data/UserIdentity$UserIdentityBuilder$MandatoryStages$Step2::displayName → KILLED |
return new Step3(); |
142 | } | |
143 | } | |
144 | ||
145 | public class Step3 { | |
146 | /** | |
147 | * {@link UserIdentityBuilder#id(ByteArray) id} is a required parameter. | |
148 | * | |
149 | * @see UserIdentityBuilder#id(ByteArray) | |
150 | */ | |
151 | public UserIdentityBuilder id(ByteArray id) { | |
152 |
1
1. id : replaced return value with null for com/yubico/webauthn/data/UserIdentity$UserIdentityBuilder$MandatoryStages$Step3::id → KILLED |
return builder.id(id); |
153 | } | |
154 | } | |
155 | } | |
156 | } | |
157 | } | |
Mutations | ||
106 |
1.1 |
|
107 |
1.1 |
|
108 |
1.1 |
|
115 |
1.1 |
|
130 |
1.1 |
|
141 |
1.1 |
|
152 |
1.1 |