You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudreve/pkg/wopi/wopi.go

112 lines
2.3 KiB

package wopi
import (
"errors"
"fmt"
model "github.com/cloudreve/Cloudreve/v3/models"
"github.com/cloudreve/Cloudreve/v3/pkg/cache"
"github.com/cloudreve/Cloudreve/v3/pkg/request"
"net/url"
"path"
"strings"
"sync"
)
type Client interface {
}
var (
ErrActionNotSupported = errors.New("action not supported by current wopi endpoint")
queryPlaceholders = map[string]string{
"BUSINESS_USER": "",
"DC_LLCC": "lng",
"DISABLE_ASYNC": "",
"DISABLE_CHAT": "",
"EMBEDDED": "true",
"FULLSCREEN": "true",
"HOST_SESSION_ID": "",
"SESSION_CONTEXT": "",
"RECORDING": "",
"THEME_ID": "darkmode",
"UI_LLCC": "lng",
"VALIDATOR_TEST_CATEGORY": "",
}
)
const (
wopiSrcPlaceholder = "WOPI_SOURCE"
)
type client struct {
cache cache.Driver
http request.Client
mu sync.RWMutex
discovery *WopiDiscovery
actions map[string]map[string]Action
config
}
type config struct {
discoveryEndpoint *url.URL
}
func (c *client) NewSession(user *model.User, file *model.File, action ActonType) (*Session, error) {
if err := c.checkDiscovery(); err != nil {
return nil, err
}
ext := path.Ext(file.Name)
availableActions, ok := c.actions[ext]
if !ok {
return nil, ErrActionNotSupported
}
actionConfig, ok := availableActions[string(action)]
if !ok {
return nil, ErrActionNotSupported
}
actionUrl, err := generateActionUrl(actionConfig.Urlsrc, "")
if err != nil {
return nil, err
}
fmt.Println(actionUrl)
return nil, nil
}
func generateActionUrl(src string, fileSrc string) (*url.URL, error) {
src = strings.ReplaceAll(src, "<", "")
src = strings.ReplaceAll(src, ">", "")
actionUrl, err := url.Parse(src)
if err != nil {
return nil, fmt.Errorf("failed to parse action url: %s", err)
}
queries := actionUrl.Query()
queryReplaced := url.Values{}
for k := range queries {
if placeholder, ok := queryPlaceholders[queries.Get(k)]; ok {
if placeholder != "" {
queryReplaced.Set(k, placeholder)
}
continue
}
if queries.Get(k) == wopiSrcPlaceholder {
queryReplaced.Set(k, fileSrc)
continue
}
queryReplaced.Set(k, queries.Get(k))
}
actionUrl.RawQuery = queryReplaced.Encode()
return actionUrl, nil
}