update Kopia password (#4406)
<!-- PR description--> --- This PR is raised as part of splitting https://github.com/alcionai/corso/pull/4397 into smaller parts It cover connecting with Kopia and updating repos password #### Does this PR need a docs update or release note? - [ ] ⛔ No #### Type of change <!--- Please check the type of change your PR introduces: ---> - [ ] 🌻 Feature #### Issue(s) <!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. --> * https://github.com/alcionai/corso/issues/4061 #### Test Plan <!-- How will this be tested prior to merging.--> - [ ] 💪 Manual - [ ] ⚡ Unit test
This commit is contained in:
parent
83dec480e6
commit
fd3a4eb6ff
@ -578,3 +578,23 @@ func (w *conn) LoadSnapshot(
|
|||||||
func (w *conn) SnapshotRoot(man *snapshot.Manifest) (fs.Entry, error) {
|
func (w *conn) SnapshotRoot(man *snapshot.Manifest) (fs.Entry, error) {
|
||||||
return snapshotfs.SnapshotRoot(w.Repository, man)
|
return snapshotfs.SnapshotRoot(w.Repository, man)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *conn) UpdatePassword(ctx context.Context, password string, opts repository.Options) error {
|
||||||
|
if len(password) <= 0 {
|
||||||
|
return clues.New("empty password provided")
|
||||||
|
}
|
||||||
|
|
||||||
|
kopiaRef := NewConn(w.storage)
|
||||||
|
if err := kopiaRef.Connect(ctx, opts); err != nil {
|
||||||
|
return clues.Wrap(err, "connecting kopia client")
|
||||||
|
}
|
||||||
|
|
||||||
|
defer kopiaRef.Close(ctx)
|
||||||
|
|
||||||
|
kopiaRepo := kopiaRef.Repository.(repo.DirectRepository)
|
||||||
|
if err := kopiaRepo.FormatManager().ChangePassword(ctx, password); err != nil {
|
||||||
|
return clues.Wrap(err, "unable to update password")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@ -86,7 +86,7 @@ func New(
|
|||||||
st storage.Storage,
|
st storage.Storage,
|
||||||
opts control.Options,
|
opts control.Options,
|
||||||
configFileRepoID string,
|
configFileRepoID string,
|
||||||
) (repo *repository, err error) {
|
) (singleRepo *repository, err error) {
|
||||||
ctx = clues.Add(
|
ctx = clues.Add(
|
||||||
ctx,
|
ctx,
|
||||||
"acct_provider", acct.Provider.String(),
|
"acct_provider", acct.Provider.String(),
|
||||||
@ -253,6 +253,40 @@ func (r *repository) Connect(
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdatePassword will-
|
||||||
|
// - connect to the provider storage using existing password
|
||||||
|
// - update the repo with new password
|
||||||
|
func (r *repository) UpdatePassword(ctx context.Context, password string) (err error) {
|
||||||
|
ctx = clues.Add(
|
||||||
|
ctx,
|
||||||
|
"acct_provider", r.Account.Provider.String(),
|
||||||
|
"acct_id", clues.Hide(r.Account.ID()),
|
||||||
|
"storage_provider", r.Storage.Provider.String())
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if crErr := crash.Recovery(ctx, recover(), "repo connect"); crErr != nil {
|
||||||
|
err = crErr
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
progressBar := observe.MessageWithCompletion(ctx, "Connecting to repository")
|
||||||
|
defer close(progressBar)
|
||||||
|
|
||||||
|
kopiaRef := kopia.NewConn(r.Storage)
|
||||||
|
if err := kopiaRef.Connect(ctx, r.Opts.Repo); err != nil {
|
||||||
|
return clues.Wrap(err, "connecting kopia client")
|
||||||
|
}
|
||||||
|
|
||||||
|
err = kopiaRef.UpdatePassword(ctx, password, r.Opts.Repo)
|
||||||
|
if err != nil {
|
||||||
|
return clues.Wrap(err, "updating on kopia")
|
||||||
|
}
|
||||||
|
|
||||||
|
defer kopiaRef.Close(ctx)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (r *repository) Close(ctx context.Context) error {
|
func (r *repository) Close(ctx context.Context) error {
|
||||||
if err := r.Bus.Close(); err != nil {
|
if err := r.Bus.Close(); err != nil {
|
||||||
logger.Ctx(ctx).With("err", err).Debugw("closing the event bus", clues.In(ctx).Slice()...)
|
logger.Ctx(ctx).With("err", err).Debugw("closing the event bus", clues.In(ctx).Slice()...)
|
||||||
|
|||||||
@ -240,6 +240,44 @@ func (suite *RepositoryIntegrationSuite) TestConnect() {
|
|||||||
assert.NoError(t, err, clues.ToCore(err))
|
assert.NoError(t, err, clues.ToCore(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *RepositoryIntegrationSuite) TestRepository_UpdatePassword() {
|
||||||
|
t := suite.T()
|
||||||
|
|
||||||
|
ctx, flush := tester.NewContext(t)
|
||||||
|
defer flush()
|
||||||
|
|
||||||
|
acct := tconfig.NewM365Account(t)
|
||||||
|
|
||||||
|
// need to initialize the repository before we can test connecting to it.
|
||||||
|
st := storeTD.NewPrefixedS3Storage(t)
|
||||||
|
r, err := New(
|
||||||
|
ctx,
|
||||||
|
acct,
|
||||||
|
st,
|
||||||
|
control.DefaultOptions(),
|
||||||
|
NewRepoID)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
err = r.Initialize(ctx, InitConfig{})
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
// now re-connect
|
||||||
|
err = r.Connect(ctx, ConnConfig{})
|
||||||
|
assert.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
err = r.UpdatePassword(ctx, "newpass")
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
tmp := st.Config["common_corsoPassphrase"]
|
||||||
|
st.Config["common_corsoPassphrase"] = "newpass"
|
||||||
|
|
||||||
|
// now reconnect with new pass
|
||||||
|
err = r.Connect(ctx, ConnConfig{})
|
||||||
|
assert.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
st.Config["common_corsoPassphrase"] = tmp
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *RepositoryIntegrationSuite) TestConnect_sameID() {
|
func (suite *RepositoryIntegrationSuite) TestConnect_sameID() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user