diff --git a/changelog/unreleased/fix-put-relative.md b/changelog/unreleased/fix-put-relative.md new file mode 100644 index 0000000000..7c825b53f6 --- /dev/null +++ b/changelog/unreleased/fix-put-relative.md @@ -0,0 +1,5 @@ +Bugfix: Fix put relative wopi operation for microsoft + +We fixed a bug in the put relative wopi operation for microsoft. The response now contains the correct properties. + +https://github.com/owncloud/ocis/pull/10403 diff --git a/services/collaboration/pkg/connector/connector.go b/services/collaboration/pkg/connector/connector.go index 0e1e821bfb..27a7ea8e64 100644 --- a/services/collaboration/pkg/connector/connector.go +++ b/services/collaboration/pkg/connector/connector.go @@ -112,12 +112,14 @@ func NewResponseSuccessBodyName(name string) *ConnectorResponse { // contain "Name" and "Url" keys with their respective suplied values // // This is used in the `PutRelativeFile` methods (both suggested and relative). -func NewResponseSuccessBodyNameUrl(name, url string) *ConnectorResponse { +func NewResponseSuccessBodyNameUrl(name, url string, hostEditURL string, hostViewURL string) *ConnectorResponse { return &ConnectorResponse{ Status: 200, Body: map[string]interface{}{ - "Name": name, - "Url": url, + "Name": name, + "Url": url, + "HostEditUrl": hostEditURL, + "HostViewUrl": hostViewURL, }, } } diff --git a/services/collaboration/pkg/connector/fileconnector.go b/services/collaboration/pkg/connector/fileconnector.go index f6156ac493..cdf7c2840b 100644 --- a/services/collaboration/pkg/connector/fileconnector.go +++ b/services/collaboration/pkg/connector/fileconnector.go @@ -713,9 +713,9 @@ func (f *FileConnector) PutRelativeFileSuggested(ctx context.Context, ccs Conten return NewResponse(500), nil } } - + var newInfo *providerv1beta1.ResourceInfo // adjust the wopi file reference to use only the resource id without path - if err := f.adjustWopiReference(ctx, &wopiContext, newLogger); err != nil { + if newInfo, err = f.adjustWopiReference(ctx, &wopiContext, newLogger); err != nil { return nil, err } @@ -729,7 +729,16 @@ func (f *FileConnector) PutRelativeFileSuggested(ctx context.Context, ccs Conten Str("FinalReference", wopiContext.FileReference.String()). Msg("PutRelativeFileSuggested: success") - return NewResponseSuccessBodyNameUrl(finalTarget, wopiSrcURL.String()), nil + webURL, err := url.Parse(f.cfg.Commons.OcisURL) + if err != nil { + return nil, err + } + return NewResponseSuccessBodyNameUrl( + finalTarget, + wopiSrcURL.String(), + createHostUrl("write", webURL, strings.ToLower(f.cfg.App.Name), newInfo), + createHostUrl("view", webURL, strings.ToLower(f.cfg.App.Name), newInfo), + ), nil } // PutRelativeFileRelative upload a file using the provided target name @@ -811,10 +820,11 @@ func (f *FileConnector) PutRelativeFileRelative(ctx context.Context, ccs Content lockID = putResponse.Headers[HeaderWopiLock] } + var newInfo *providerv1beta1.ResourceInfo switch putResponse.Status { case 200: // success case, so don't do anything case 409: - if err := f.adjustWopiReference(ctx, &wopiContext, newLogger); err != nil { + if newInfo, err = f.adjustWopiReference(ctx, &wopiContext, newLogger); err != nil { return nil, err } // if conflict generate a different name and retry. @@ -855,7 +865,7 @@ func (f *FileConnector) PutRelativeFileRelative(ctx context.Context, ccs Content return nil, NewConnectorError(putResponse.Status, "put file failed with unhandled status") } - if err := f.adjustWopiReference(ctx, &wopiContext, newLogger); err != nil { + if newInfo, err = f.adjustWopiReference(ctx, &wopiContext, newLogger); err != nil { return nil, err } @@ -867,7 +877,17 @@ func (f *FileConnector) PutRelativeFileRelative(ctx context.Context, ccs Content newLogger.Debug().Msg("PutRelativeFileRelative: success") - return NewResponseSuccessBodyNameUrl(target, wopiSrcURL.String()), nil + webURL, err := url.Parse(f.cfg.Commons.OcisURL) + if err != nil { + return nil, err + } + + return NewResponseSuccessBodyNameUrl( + target, + wopiSrcURL.String(), + createHostUrl("write", webURL, strings.ToLower(f.cfg.App.Name), newInfo), + createHostUrl("view", webURL, strings.ToLower(f.cfg.App.Name), newInfo), + ), nil } // DeleteFile will delete the requested file @@ -1413,10 +1433,10 @@ func (f *FileConnector) generateWOPISrc(wopiContext middleware.WopiContext, logg return wopiSrcURL, nil } -func (f *FileConnector) adjustWopiReference(ctx context.Context, wopiContext *middleware.WopiContext, logger zerolog.Logger) error { +func (f *FileConnector) adjustWopiReference(ctx context.Context, wopiContext *middleware.WopiContext, logger zerolog.Logger) (*providerv1beta1.ResourceInfo, error) { gwc, err := f.gws.Next() if err != nil { - return err + return nil, err } // using resourceid + path won't do for WOPI, we need just the resource if of the new file // the wopicontext has resourceid + path, which is good enough for the stat request @@ -1425,7 +1445,7 @@ func (f *FileConnector) adjustWopiReference(ctx context.Context, wopiContext *mi }) if err != nil { logger.Error().Err(err).Msg("stat failed") - return err + return nil, err } if newStatRes.GetStatus().GetCode() != rpcv1beta1.Code_CODE_OK { @@ -1433,12 +1453,12 @@ func (f *FileConnector) adjustWopiReference(ctx context.Context, wopiContext *mi Str("StatusCode", newStatRes.GetStatus().GetCode().String()). Str("StatusMsg", newStatRes.GetStatus().GetMessage()). Msg("stat failed with unexpected status") - return NewConnectorError(500, newStatRes.GetStatus().GetCode().String()+" "+newStatRes.GetStatus().GetMessage()) + return nil, NewConnectorError(500, newStatRes.GetStatus().GetCode().String()+" "+newStatRes.GetStatus().GetMessage()) } // adjust the reference in the wopi context to use only the resourceid without the path wopiContext.FileReference = &providerv1beta1.Reference{ ResourceId: newStatRes.GetInfo().GetId(), } - return nil + return newStatRes.GetInfo(), nil }