22# Copyright (c) Microsoft Corporation. All rights reserved.
33# Licensed under the MIT License. See License.txt in the project root for license information.
44# --------------------------------------------------------------------------------------------
5+ # pylint: disable=too-many-statements
6+
7+ import logging
58
69from knack .util import CLIError # pylint: disable=unused-import
710from knack .log import get_logger
811
9- import logging
10-
1112# Set up logging
1213logging .basicConfig (level = logging .INFO )
1314logger = get_logger (__name__ )
1415
1516
16- def generate_nexus_identity_keys () -> None :
17+ def generate_nexus_identity_keys (algorithm = None ) :
1718
1819 import os
1920 import subprocess
@@ -30,6 +31,13 @@ def generate_nexus_identity_keys() -> None:
3031 # Generate SSH key
3132 if sys .platform .startswith ("win" ) or sys .platform .startswith ("linux" ):
3233
34+ algoToBeUsed = "ed25519-sk"
35+ key_name = "id_ed25519_sk"
36+
37+ if algorithm and algorithm == "ecdsa-sk" :
38+ algoToBeUsed = "ecdsa-sk"
39+ key_name = "id_ecdsa_sk"
40+
3341 if sys .platform .startswith ("win" ):
3442 dir_path = os .path .expanduser ("~\\ .ssh" )
3543 elif sys .platform .startswith ("linux" ):
@@ -42,54 +50,63 @@ def generate_nexus_identity_keys() -> None:
4250 os .makedirs (dir_path )
4351 except OSError as e :
4452 logger .error ("Error creating directory: %s" , e )
45- raise CLIError (f"Error creating directory: { e } " )
53+ raise CLIError (f"Error creating directory: { e } " ) from e
4654
4755 # Generate ed25519-sk key
48- subprocess .run (['ssh-keygen' ,
49- '-t' ,
50- 'ed25519-sk' ,
51- '-O' ,
52- 'resident' ,
53- '-O' ,
54- 'verify-required' ,
55- '-f' ,
56- os .path .join (dir_path , "id_ed25519_sk" )],
57- check = False )
58-
59- # read the key from the file
56+ subprocess .run (
57+ [
58+ "ssh-keygen" ,
59+ "-t" ,
60+ algoToBeUsed ,
61+ "-O" ,
62+ "resident" ,
63+ "-O" ,
64+ "verify-required" ,
65+ "-C" ,
66+ "NexusIdentitySSHKey" ,
67+ "-f" ,
68+ os .path .join (dir_path , key_name ),
69+ ],
70+ check = False ,
71+ )
72+
73+ # read the key from the file
6074 try :
6175 # Read public key
62- with open (os .path .join (dir_path , "id_ed25519_sk.pub" ), "r" ) as key_file :
76+ file_path = key_name + ".pub"
77+ with open (
78+ os .path .join (dir_path , file_path ), "r" , encoding = "utf-8"
79+ ) as key_file :
6380 public_key = key_file .read ()
6481 except FileNotFoundError as e :
65- raise CLIError (f"Error reading public key: { e } " )
82+ raise CLIError (f"Error reading public key: { e } " ) from e
6683 except OSError as e :
67- raise CLIError (f"Unexpected error reading public key: { e } " )
84+ raise CLIError (f"Unexpected error reading public key: { e } " ) from e
6885
6986 try :
7087 credential = AzureCliCredential ()
71- scopes = ['https://graph.microsoft.com//.default' ]
72- graph_client = GraphServiceClient (
73- credentials = credential , scopes = scopes )
88+ scopes = ["https://graph.microsoft.com//.default" ]
89+ graph_client = GraphServiceClient (credentials = credential , scopes = scopes )
7490
7591 except ClientAuthenticationError as e :
7692 logger .error ("Authentication failed: %s" , e )
77- raise CLIError (f"Authentication failed: { e } " )
93+ raise CLIError (f"Authentication failed: { e } " ) from e
7894 except Exception as e :
7995 logger .error ("An unexpected error occurred: %s" , e )
80- raise CLIError (f"An unexpected error occurred: { e } " )
96+ raise CLIError (f"An unexpected error occurred: { e } " ) from e
8197
8298 async def me ():
8399 extension_id = "com.nexusidentity.keys"
84100
85101 # Get user object
86102 user = await graph_client .me .get ()
87103
88- # Get extensions assoicated with the user
104+ # Get extensions associated with the user
89105 extensions = await graph_client .me .extensions .get ()
90106
91107 extension_exists = any (
92- extension .id == extension_id for extension in extensions .value )
108+ extension .id == extension_id for extension in extensions .value
109+ )
93110
94111 try :
95112 # Update or create extension
@@ -98,31 +115,36 @@ async def me():
98115 odata_type = "microsoft.graph.openTypeExtension" ,
99116 additional_data = {
100117 "extension_name" : extension_id ,
101- "publicKey" : public_key
102- }
118+ "publicKey" : public_key ,
119+ },
103120 )
104- await graph_client .me .extensions .by_extension_id (extension_id ).patch (request_body )
121+ await graph_client .me .extensions .by_extension_id (
122+ extension_id
123+ ).patch (request_body )
105124
106- print (f"Successfully updated public key to Microsoft Entra Id account { user .mail } " )
125+ print (
126+ f"Successfully updated public key to Microsoft Entra Id account { user .mail } "
127+ )
107128 else :
108129 request_body = OpenTypeExtension (
109130 odata_type = "microsoft.graph.openTypeExtension" ,
110131 extension_name = extension_id ,
111- additional_data = {
112- "publicKey" : public_key
113- }
132+ additional_data = {"publicKey" : public_key },
114133 )
115134 await graph_client .me .extensions .post (request_body )
116135
117- print (f"Successfully uploaded public key to Microsoft Entra Id account { user .mail } " )
136+ print (
137+ f"Successfully uploaded public key to Microsoft Entra Id account { user .mail } "
138+ )
118139 except ODataError as e :
119140 logger .error ("Error updating extension: %s" , e )
120- raise CLIError (f"Error updating extension: { e } " )
121- except ( HttpResponseError ) as e :
141+ raise CLIError (f"Error updating extension: { e } " ) from e
142+ except HttpResponseError as e :
122143 logger .error ("Failed to update or create extension: %s" , e )
123- raise CLIError (f"Failed to update or create extension: { e } " )
144+ raise CLIError (f"Failed to update or create extension: { e } " ) from e
124145
125146 asyncio .run (me ())
126147 else :
127148 logger .warning (
128- "This command is currently supported only on Windows and linux platforms" )
149+ "This command is currently supported only on Windows and linux platforms"
150+ )
0 commit comments