55from __future__ import annotations
66
77from enum import Enum
8- from pydantic import BaseModel , ConfigDict , Field
9- from typing import List , Literal , Optional , Union
8+ from pydantic import BaseModel , BeforeValidator , ConfigDict , Field , PlainSerializer
9+ from typing import Annotated , List , Literal , Optional , Union
10+
11+
12+ def serialize_binary_data (value : bytes ) -> list [int ]:
13+ return list (value )
14+
15+
16+ def deserialize_binary_data (value ):
17+ if isinstance (value , list ):
18+ if all (isinstance (x , int ) and 0 <= x <= 255 for x in value ):
19+ return bytes (value )
20+ raise ValueError ("All elements must be integers in the range 0-255 (u8)." )
21+ elif isinstance (value , bytes ):
22+ return value
23+ raise TypeError ("Content must be a list of integers (0-255) or bytes." )
24+
25+
26+ class DocumentCreateParams (BaseModel ):
27+ name : str
28+ """
29+ the name of the file
30+ """
31+ content : Annotated [
32+ bytes ,
33+ BeforeValidator (deserialize_binary_data ),
34+ PlainSerializer (serialize_binary_data ),
35+ ]
36+ """
37+ the content of the file
38+ """
39+
40+
41+ class FileAttributes (BaseModel ):
42+ name : str
43+ """
44+ The name of the file
45+ """
46+ id : str
47+ """
48+ The ID of the file retrieved from the server
49+ """
50+ size : int
51+ """
52+ The size of the file in bytes
53+ """
54+
55+
56+ class FileCreateParams (BaseModel ):
57+ model_config = ConfigDict (populate_by_name = True )
58+
59+ name : str
60+ """
61+ the name of the file
62+ """
63+ content : Annotated [
64+ bytes ,
65+ BeforeValidator (deserialize_binary_data ),
66+ PlainSerializer (serialize_binary_data ),
67+ ]
68+ """
69+ the content of the file
70+ """
71+ section_id : str = Field (alias = "sectionId" )
72+ """
73+ the section id where the file should be stored
74+ """
75+ field_id : str = Field (alias = "fieldId" )
76+ """
77+ the field id where the file should be stored
78+ """
1079
1180
1281class GeneratePasswordResponse (BaseModel ):
@@ -58,11 +127,15 @@ class ItemFieldType(str, Enum):
58127 TOTP = "Totp"
59128 EMAIL = "Email"
60129 REFERENCE = "Reference"
130+ SSHKEY = "SshKey"
131+ MENU = "Menu"
132+ MONTHYEAR = "MonthYear"
61133 UNSUPPORTED = "Unsupported"
62134
63135
64136class ItemFieldDetailsTypes (str , Enum ):
65137 OTP = "Otp"
138+ SSH_KEY = "SshKey"
66139
67140
68141class ItemFieldDetailsOtp (BaseModel ):
@@ -74,8 +147,17 @@ class ItemFieldDetailsOtp(BaseModel):
74147 content : OtpFieldDetails
75148
76149
150+ class ItemFieldDetailsSshKey (BaseModel ):
151+ """
152+ Computed SSH Key attributes
153+ """
154+
155+ type : Literal [ItemFieldDetailsTypes .SSH_KEY ] = ItemFieldDetailsTypes .SSH_KEY
156+ content : Optional [SshKeyAttributes ]
157+
158+
77159# Field type-specific attributes.
78- ItemFieldDetails = ItemFieldDetailsOtp
160+ ItemFieldDetails = Union [ ItemFieldDetailsOtp , ItemFieldDetailsSshKey ]
79161
80162
81163class ItemField (BaseModel ):
@@ -167,6 +249,23 @@ class Website(BaseModel):
167249 """
168250
169251
252+ class ItemFile (BaseModel ):
253+ model_config = ConfigDict (populate_by_name = True )
254+
255+ attributes : FileAttributes
256+ """
257+ the attributes of the file
258+ """
259+ section_id : str = Field (alias = "sectionId" )
260+ """
261+ the section id where the file should be stored
262+ """
263+ field_id : str = Field (alias = "fieldId" )
264+ """
265+ the field id where the file should be stored
266+ """
267+
268+
170269class Item (BaseModel ):
171270 """
172271 Represents a 1Password item.
@@ -214,6 +313,14 @@ class Item(BaseModel):
214313 """
215314 The item's version
216315 """
316+ files : List [ItemFile ]
317+ """
318+ The item's file fields
319+ """
320+ document : Optional [FileAttributes ] = Field (default = None )
321+ """
322+ The document file for the Document item category
323+ """
217324
218325
219326class ItemCreateParams (BaseModel ):
@@ -251,6 +358,14 @@ class ItemCreateParams(BaseModel):
251358 """
252359 The websites used for autofilling for items of the Login and Password categories.
253360 """
361+ files : Optional [List [FileCreateParams ]] = Field (default = None )
362+ """
363+ The item's files stored as fields
364+ """
365+ document : Optional [DocumentCreateParams ] = Field (default = None )
366+ """
367+ The document file for the Document item category
368+ """
254369
255370
256371class ItemOverview (BaseModel ):
@@ -453,6 +568,23 @@ class OtpFieldDetails(BaseModel):
453568 """
454569
455570
571+ class SshKeyAttributes (BaseModel ):
572+ model_config = ConfigDict (populate_by_name = True )
573+
574+ public_key : str = Field (alias = "publicKey" )
575+ """
576+ The public part of the SSH Key
577+ """
578+ fingerprint : str
579+ """
580+ The fingerprint of the SSH Key
581+ """
582+ key_type : str = Field (alias = "keyType" )
583+ """
584+ The key type ("Ed25519" or "RSA, {length}-bit")
585+ """
586+
587+
456588class VaultOverview (BaseModel ):
457589 """
458590 Represents a decrypted 1Password vault.
0 commit comments