22
22
from .base import dump_report_data , user_choice , field_to_title , report_output_parser
23
23
from .enterprise import EnterpriseCommand
24
24
from .. import api , crypto , utils , loginv3 , constants
25
- from ..params import KeeperParams
26
25
from ..display import bcolors
27
26
from ..error import CommandError
28
- from ..proto import enterprise_pb2 , BI_pb2
27
+ from ..params import KeeperParams
28
+ from ..proto import enterprise_pb2 , BI_pb2 , APIRequest_pb2
29
29
30
30
31
31
def register_commands (commands ):
@@ -621,7 +621,7 @@ def get_daily_snapshots(params, year, month):
621
621
if addon .maxAddonId > 0 :
622
622
units [addon .maxAddonId * 10000 ] = addon .units
623
623
mc_id = record .mcEnterpriseId
624
- ds = datetime .datetime .utcfromtimestamp (record .date // 1000 )
624
+ ds = datetime .datetime .fromtimestamp (record .date // 1000 , tz = datetime . timezone . utc )
625
625
dt = ds .date ()
626
626
daily = DailySnapshot (mc_id , dt .toordinal ())
627
627
snapshot [daily ] = units
@@ -1208,18 +1208,7 @@ def execute(self, params, **kwargs):
1208
1208
(x for x in params .enterprise .get ('managed_companies' , []) if x ['mc_enterprise_name' ] == msp_node_name ),
1209
1209
None )
1210
1210
tree_key = params .enterprise ['unencrypted_tree_key' ]
1211
- if mc :
1212
- mc_id = mc ['mc_enterprise_id' ]
1213
- encrypted_tree_key = mc .get ('tree_key' )
1214
- if not encrypted_tree_key :
1215
- login_rq = enterprise_pb2 .LoginToMcRequest ()
1216
- login_rq .mcEnterpriseId = mc_id
1217
- login_rq .messageSessionUid = utils .base64_url_decode (params .session_token )
1218
- login_rs = api .communicate_rest (
1219
- params , login_rq , 'authentication/login_to_mc' , rs_type = enterprise_pb2 .LoginToMcResponse )
1220
- encrypted_tree_key = login_rs .encryptedTreeKey
1221
- mc_tree_key = crypto .decrypt_aes_v2 (utils .base64_url_decode (encrypted_tree_key ), tree_key )
1222
- else :
1211
+ if not mc :
1223
1212
mc_tree_key = utils .generate_aes_key ()
1224
1213
rq = {
1225
1214
'command' : 'enterprise_registration_by_msp' ,
@@ -1236,6 +1225,11 @@ def execute(self, params, **kwargs):
1236
1225
}
1237
1226
rs = api .communicate (params , rq )
1238
1227
mc_id = rs ['enterprise_id' ]
1228
+ else :
1229
+ mc_id = mc ['mc_enterprise_id' ]
1230
+
1231
+ mc_params = api .login_and_get_mc_params_login_v3 (params , mc_id )
1232
+ mc_tree_key = mc_params .enterprise ['unencrypted_tree_key' ]
1239
1233
1240
1234
mc_rq = enterprise_pb2 .NodeToManagedCompanyRequest ()
1241
1235
mc_rq .companyId = mc_id
@@ -1292,6 +1286,32 @@ def execute(self, params, **kwargs):
1292
1286
etkr .force = True
1293
1287
mc_rq .teamKeys .append (etkr )
1294
1288
1289
+ dk_rq = APIRequest_pb2 .UserDataKeyByNodeRequest ()
1290
+ dk_rq .nodeIds .extend (nodes_to_move )
1291
+ dk_rs = api .communicate_rest (params , dk_rq , 'enterprise/get_enterprise_user_data_key_by_node' ,
1292
+ rs_type = enterprise_pb2 .EnterpriseUserDataKeysByNodeResponse )
1293
+
1294
+ if len (dk_rs .keys ) > 0 :
1295
+ keys = params .enterprise ['keys' ]
1296
+ mc_keys = mc_params .enterprise ['keys' ]
1297
+ if 'ecc_encrypted_private_key' in keys and 'ecc_public_key' in mc_keys :
1298
+ encrypted_ec_private_key = utils .base64_url_decode (keys ['ecc_encrypted_private_key' ])
1299
+ ec_private_key = crypto .decrypt_aes_v2 (encrypted_ec_private_key , tree_key )
1300
+ private_key = crypto .load_ec_private_key (ec_private_key )
1301
+ mc_public_key = crypto .load_ec_public_key (utils .base64_url_decode (mc_keys ['ecc_public_key' ]))
1302
+
1303
+ for dk_node in dk_rs .keys :
1304
+ for dk in dk_node .keys :
1305
+ if dk .keyTypeId == 4 :
1306
+ enterprise_user_id = dk .enterpriseUserId
1307
+ if enterprise_user_id in users_to_move :
1308
+ encrypted_key = crypto .decrypt_ec (dk .userEncryptedDataKey , private_key )
1309
+ encrypted_key = crypto .encrypt_ec (encrypted_key , mc_public_key )
1310
+ re_dk = enterprise_pb2 .ReEncryptedUserDataKey ()
1311
+ re_dk .enterpriseUserId = enterprise_user_id
1312
+ re_dk .userEncryptedDataKey = encrypted_key
1313
+ mc_rq .usersDataKeys .append (re_dk )
1314
+
1295
1315
api .communicate_rest (params , mc_rq , 'enterprise/node_to_managed_company' )
1296
1316
logging .info (f'Node \" { msp_node_name } \" was converted to Managed Company' )
1297
1317
api .query_enterprise (params )
0 commit comments