Skip to content

Commit d63b689

Browse files
committed
node_to_managed_company fails under some conditions. KC-825
1 parent e8b2809 commit d63b689

File tree

3 files changed

+673
-593
lines changed

3 files changed

+673
-593
lines changed

keepercommander/commands/msp.py

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
from .base import dump_report_data, user_choice, field_to_title, report_output_parser
2323
from .enterprise import EnterpriseCommand
2424
from .. import api, crypto, utils, loginv3, constants
25-
from ..params import KeeperParams
2625
from ..display import bcolors
2726
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
2929

3030

3131
def register_commands(commands):
@@ -621,7 +621,7 @@ def get_daily_snapshots(params, year, month):
621621
if addon.maxAddonId > 0:
622622
units[addon.maxAddonId * 10000] = addon.units
623623
mc_id = record.mcEnterpriseId
624-
ds = datetime.datetime.utcfromtimestamp(record.date // 1000)
624+
ds = datetime.datetime.fromtimestamp(record.date // 1000, tz=datetime.timezone.utc)
625625
dt = ds.date()
626626
daily = DailySnapshot(mc_id, dt.toordinal())
627627
snapshot[daily] = units
@@ -1208,18 +1208,7 @@ def execute(self, params, **kwargs):
12081208
(x for x in params.enterprise.get('managed_companies', []) if x['mc_enterprise_name'] == msp_node_name),
12091209
None)
12101210
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:
12231212
mc_tree_key = utils.generate_aes_key()
12241213
rq = {
12251214
'command': 'enterprise_registration_by_msp',
@@ -1236,6 +1225,11 @@ def execute(self, params, **kwargs):
12361225
}
12371226
rs = api.communicate(params, rq)
12381227
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']
12391233

12401234
mc_rq = enterprise_pb2.NodeToManagedCompanyRequest()
12411235
mc_rq.companyId = mc_id
@@ -1292,6 +1286,32 @@ def execute(self, params, **kwargs):
12921286
etkr.force = True
12931287
mc_rq.teamKeys.append(etkr)
12941288

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+
12951315
api.communicate_rest(params, mc_rq, 'enterprise/node_to_managed_company')
12961316
logging.info(f'Node \"{msp_node_name}\" was converted to Managed Company')
12971317
api.query_enterprise(params)

0 commit comments

Comments
 (0)