From 4bbd9a664d07a81d0c57ed31983bb2fae31d95dd Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 12 Nov 2019 17:46:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=81=BF=E5=85=8D=E5=85=AC=E6=9C=89?= =?UTF-8?q?=E4=BA=91=E7=BB=91=E5=AE=9A=E7=A7=98=E9=92=A5=E5=90=8E=E8=A7=A3?= =?UTF-8?q?=E5=AF=86=E5=AF=86=E7=A0=81=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/apis/compute/guest_const.go | 1 + pkg/compute/guestdrivers/managedvirtual.go | 8 ++------ pkg/compute/models/guest_actions.go | 24 ++++++++++++++++++++++ pkg/compute/models/guests.go | 1 + 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/pkg/apis/compute/guest_const.go b/pkg/apis/compute/guest_const.go index ab42290fe5..8574b3c3f4 100644 --- a/pkg/apis/compute/guest_const.go +++ b/pkg/apis/compute/guest_const.go @@ -224,6 +224,7 @@ const ( VM_METADATA_CREATE_PARAMS = "create_params" VM_METADATA_LOGIN_ACCOUNT = "login_account" VM_METADATA_LOGIN_KEY = "login_key" + VM_METADATA_LAST_LOGIN_KEY = "last_login_key" VM_METADATA_LOGIN_KEY_TIMESTAMP = "login_key_timestamp" VM_METADATA_OS_ARCH = "os_arch" VM_METADATA_OS_DISTRO = "os_distribution" diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 916e7e14ed..563cf9b78b 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -36,7 +36,6 @@ import ( "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/billing" "yunion.io/x/onecloud/pkg/util/cloudinit" - "yunion.io/x/onecloud/pkg/util/seclib2" ) type SManagedVirtualizedGuestDriver struct { @@ -488,11 +487,8 @@ func (self *SManagedVirtualizedGuestDriver) RemoteDeployGuestForDeploy(ctx conte return e } - //解绑秘钥后需要重置密码 - if deleteKeypair { - desc.Password = seclib2.RandomPassword2(12) - return iVM.DeployVM(ctx, desc.Name, desc.Account, desc.Password, desc.PublicKey, false, desc.Description) - } + //可以从秘钥解密旧密码 + desc.Password = guest.GetOldPassword(ctx, task.GetUserCred()) return nil }() if err != nil { diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 0e4abb5ae7..7d0fd38e50 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -23,6 +23,7 @@ import ( "strconv" "strings" "time" + "unicode" "yunion.io/x/jsonutils" "yunion.io/x/log" @@ -520,12 +521,35 @@ func (self *SGuest) AllowPerformDeploy(ctx context.Context, userCred mcclient.To return self.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, self, "deploy") } +func (self *SGuest) saveOldPassword(ctx context.Context, userCred mcclient.TokenCredential) { + loginKey := self.GetMetadata(api.VM_METADATA_LOGIN_KEY, userCred) + if len(loginKey) > 0 { + password, err := utils.DescryptAESBase64(self.Id, loginKey) + if err == nil && len(password) <= 30 { + for _, r := range password { + if !unicode.IsPrint(r) { + return + } + } + self.SetMetadata(ctx, api.VM_METADATA_LAST_LOGIN_KEY, loginKey, userCred) + } + } +} + +func (self *SGuest) GetOldPassword(ctx context.Context, userCred mcclient.TokenCredential) string { + loginSecret := self.GetMetadata(api.VM_METADATA_LAST_LOGIN_KEY, userCred) + password, _ := utils.DescryptAESBase64(self.Id, loginSecret) + return password +} + func (self *SGuest) PerformDeploy(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { kwargs, ok := data.(*jsonutils.JSONDict) if !ok { return nil, fmt.Errorf("Parse query body error") } + self.saveOldPassword(ctx, userCred) + if kwargs.Contains("__delete_keypair__") || kwargs.Contains("keypair") { var kpId string diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index e9f0911a9b..0423a70754 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -3929,6 +3929,7 @@ func (self *SGuest) SaveDeployInfo(ctx context.Context, userCred mcclient.TokenC info["os_language"] = lang } self.SetAllMetadata(ctx, info, userCred) + self.saveOldPassword(ctx, userCred) } func (self *SGuest) isAllDisksReady() bool {