fix: 修复 ssh 私钥推送等问题

pull/9213/head
Eric 2022-12-13 14:26:59 +08:00 committed by Eric_Lee
parent 024beca690
commit 8979228e0b
2 changed files with 14 additions and 10 deletions

View File

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import io
import os import os
import uuid import uuid
from hashlib import md5 from hashlib import md5
@ -18,7 +17,9 @@ from common.utils import random_string
from common.utils import ( from common.utils import (
ssh_key_string_to_obj, ssh_key_gen, get_logger, lazyproperty ssh_key_string_to_obj, ssh_key_gen, get_logger, lazyproperty
) )
from common.utils.encode import parse_ssh_public_key_str from common.utils.encode import (
parse_ssh_public_key_str, parse_ssh_private_key_str
)
from orgs.mixins.models import OrgModelMixin from orgs.mixins.models import OrgModelMixin
logger = get_logger(__file__) logger = get_logger(__file__)
@ -86,24 +87,27 @@ class AuthMixin:
@property @property
def private_key_file(self): def private_key_file(self):
if not self.private_key_obj: if not self.private_key:
return None
private_key_str = parse_ssh_private_key_str(self.private_key,
password=self.password)
if not private_key_str:
return None return None
project_dir = settings.PROJECT_DIR project_dir = settings.PROJECT_DIR
tmp_dir = os.path.join(project_dir, 'tmp') tmp_dir = os.path.join(project_dir, 'tmp')
key_name = '.' + md5(self.private_key.encode('utf-8')).hexdigest() key_name = '.' + md5(self.private_key.encode('utf-8')).hexdigest()
key_path = os.path.join(tmp_dir, key_name) key_path = os.path.join(tmp_dir, key_name)
if not os.path.exists(key_path): if not os.path.exists(key_path):
self.private_key_obj.write_private_key_file(key_path) with open(key_path, 'w') as f:
f.write(private_key_str)
os.chmod(key_path, 0o400) os.chmod(key_path, 0o400)
return key_path return key_path
def get_private_key(self): def get_private_key(self):
if not self.private_key_obj: if not self.private_key:
return None return None
string_io = io.StringIO() return parse_ssh_private_key_str(self.private_key,
self.private_key_obj.write_private_key(string_io) password=self.password)
private_key = string_io.getvalue()
return private_key
@property @property
def public_key_obj(self): def public_key_obj(self):

View File

@ -79,7 +79,7 @@ _supported_paramiko_ssh_key_types = (
def ssh_key_string_to_obj(text, password=None): def ssh_key_string_to_obj(text, password=None):
key = None key = None
for ssh_key_type in _supported_paramiko_ssh_key_types: for ssh_key_type in _supported_paramiko_ssh_key_types:
if not isinstance(ssh_key_type, paramiko.PKey): if not issubclass(ssh_key_type, paramiko.PKey):
continue continue
try: try:
key = ssh_key_type.from_private_key(StringIO(text), password=password) key = ssh_key_type.from_private_key(StringIO(text), password=password)