Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/api/static/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,9 @@ func Init(store *lib.InitStore) {
return c.Next()
})

store.C.Get("/pluginfw/plugin-definitions.json", plugins.ReturnPluginResponse)
store.C.Get("/pluginfw/plugin-definitions.json", func(ctx *fiber.Ctx) error {
return plugins.ReturnPluginResponse(ctx)
})

store.C.Static("/static/plugins/", "./plugins")

Expand Down
55 changes: 40 additions & 15 deletions lib/plugins/plugins.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package plugins

import (
"embed"
"encoding/json"
"os"
"path"

"github.com/ether/etherpad-go/lib/settings"
"github.com/gofiber/fiber/v2"
Expand All @@ -18,29 +17,34 @@ type Plugin struct {

const corePluginName = "ep_etherpad-lite"

// Stored assets for plugin loading
var storedUIAssets embed.FS
var storedPluginAssets embed.FS

// GetPackages gibt alle installierten Plugins zurück
func GetPackages() map[string]Plugin {
var mappedPlugins = make(map[string]Plugin)
root, _ := os.Getwd()

// Core plugin from uiAssets
mappedPlugins[corePluginName] = Plugin{
Name: corePluginName,
Version: "1.8.13",
Path: "node_modules/" + corePluginName,
RealPath: path.Join(root, "assets", "ep.json"),
RealPath: "assets/ep.json",
}

pluginsDir := path.Join(root, "plugins")
entries, err := os.ReadDir(pluginsDir)
// Read plugins from embedded pluginAssets
entries, err := storedPluginAssets.ReadDir("plugins")
if err == nil {
for _, entry := range entries {
if entry.IsDir() {
pluginName := entry.Name()
pluginPath := path.Join(pluginsDir, pluginName)
epJsonPath := path.Join(pluginPath, "ep.json")
if _, err := os.Stat(epJsonPath); err == nil {
epJsonPath := "plugins/" + pluginName + "/ep.json"
// Check if ep.json exists in this plugin directory
if _, err := storedPluginAssets.ReadFile(epJsonPath); err == nil {
mappedPlugins[pluginName] = Plugin{
Name: pluginName,
Version: "0.0.1", // Standardversion, falls keine package.json vorhanden
Version: "0.0.1",
Path: "node_modules/" + pluginName,
RealPath: epJsonPath,
}
Expand Down Expand Up @@ -86,17 +90,26 @@ func Update() (map[string]Plugin, map[string]Part, map[string]Plugin) {
}

func LoadPlugin(plugin Plugin, plugins map[string]Plugin, parts map[string]Part) {
var pluginPath = path.Join(plugin.RealPath)
var bytes []byte
var err error

// Core plugin (ep_etherpad-lite) is embedded in uiAssets, others in pluginAssets
if plugin.Name == corePluginName {
bytes, err = storedUIAssets.ReadFile(plugin.RealPath)
} else {
bytes, err = storedPluginAssets.ReadFile(plugin.RealPath)
}

bytes, err := os.ReadFile(pluginPath)
if err != nil {
println("Error reading plugin file")
println("Error reading plugin file " + plugin.RealPath + ": " + err.Error())
return
}

var pluginDef PluginDef
err = json.Unmarshal(bytes, &pluginDef)
if err != nil {
panic(err)
println("Error parsing plugin file " + plugin.RealPath + ": " + err.Error())
return
}

plugins[plugin.Name] = plugin
Expand Down Expand Up @@ -194,7 +207,9 @@ var cachedPlugins = map[string]Plugin{}
var cachedParts = map[string]Part{}
var cachedPackages = map[string]Plugin{}

func init() {
func Init(uiAssets embed.FS, pluginAssets embed.FS) {
storedUIAssets = uiAssets
storedPluginAssets = pluginAssets
GetCachedPlugins()
}

Expand All @@ -221,3 +236,13 @@ func GetCachedPackages() map[string]Plugin {
}
return cachedPackages
}

// GetStoredPluginAssets returns the stored plugin assets for use by other packages
func GetStoredPluginAssets() embed.FS {
return storedPluginAssets
}

// GetStoredUIAssets returns the stored UI assets for use by other packages
func GetStoredUIAssets() embed.FS {
return storedUIAssets
}
5 changes: 3 additions & 2 deletions lib/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ import (
"go.uber.org/zap"
)

func InitServer(setupLogger *zap.SugaredLogger, uiAssets embed.FS) {
func InitServer(setupLogger *zap.SugaredLogger, uiAssets embed.FS, pluginAssets embed.FS) {

settings2.InitSettings(setupLogger)
plugins.Init(uiAssets, pluginAssets)

var settings = settings2.Displayed
validatorEvaluator := validator.New(validator.WithRequiredStructEnabled())
Expand Down Expand Up @@ -65,7 +66,7 @@ func InitServer(setupLogger *zap.SugaredLogger, uiAssets embed.FS) {
importer := io.NewImporter(padManager, authorManager, dataStore, setupLogger)
globalHub := ws.NewHub()
sessionStore := ws.NewSessionStore()
padMessageHandler := ws.NewPadMessageHandler(dataStore, &retrievedHooks, padManager, &sessionStore, globalHub, setupLogger)
padMessageHandler := ws.NewPadMessageHandler(dataStore, &retrievedHooks, padManager, &sessionStore, globalHub, setupLogger, uiAssets)
adminMessageHandler := ws.NewAdminMessageHandler(dataStore, &retrievedHooks, padManager, padMessageHandler, setupLogger, globalHub, app)
securityManager := pad.NewSecurityManager(dataStore, &retrievedHooks, padManager)

Expand Down
2 changes: 2 additions & 0 deletions lib/settings/clientVars/clientVars.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package clientVars

import (
"embed"
"strconv"
"time"

Expand All @@ -18,6 +19,7 @@ import (
type Factory struct {
ReadOnlyManager *pad2.ReadOnlyManager
AuthorManager *author2.Manager
UiAssets embed.FS
}

func (f *Factory) NewClientVars(pad pad.Pad, sessionInfo *ws.Session, apool apool2.APool, translatedAttribs string, historicalAuthorData map[string]author2.Author, retrievedSettings *settings.Settings) (*clientVars.ClientVars, error) {
Expand Down
2 changes: 1 addition & 1 deletion lib/test/testutils/dbUtils_test_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -733,7 +733,7 @@ func (test *TestDBHandler) TestRun(
loggerPart := zap.NewNop().Sugar()
importer := io.NewImporter(padManager, authManager, ds, loggerPart)
padMessageHandler := ws.NewPadMessageHandler(
ds, &hooks, padManager, &sess, hub, loggerPart,
ds, &hooks, padManager, &sess, hub, loggerPart, TestAssets,
)
app := fiber.New()
adminMessageHandler := ws.NewAdminMessageHandler(
Expand Down
4 changes: 3 additions & 1 deletion lib/ws/PadMessageHandler.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ws

import (
"embed"
"encoding/json"
"errors"
"fmt"
Expand Down Expand Up @@ -97,7 +98,7 @@ type PadMessageHandler struct {
Logger *zap.SugaredLogger
}

func NewPadMessageHandler(db db2.DataStore, hooks *hooks.Hook, padManager *pad.Manager, sessionStore *SessionStore, hub *Hub, logger *zap.SugaredLogger) *PadMessageHandler {
func NewPadMessageHandler(db db2.DataStore, hooks *hooks.Hook, padManager *pad.Manager, sessionStore *SessionStore, hub *Hub, logger *zap.SugaredLogger, uiAssets embed.FS) *PadMessageHandler {
var padMessageHandler = PadMessageHandler{
padManager: padManager,
readOnlyManager: pad.NewReadOnlyManager(db),
Expand All @@ -106,6 +107,7 @@ func NewPadMessageHandler(db db2.DataStore, hooks *hooks.Hook, padManager *pad.M
factory: clientVars.Factory{
ReadOnlyManager: pad.NewReadOnlyManager(db),
AuthorManager: author.NewManager(db),
UiAssets: uiAssets,
},
SessionStore: sessionStore,
hub: hub,
Expand Down
5 changes: 4 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ import (
//go:embed assets
var uiAssets embed.FS

//go:embed plugins
var pluginAssets embed.FS

// @title Etherpad Go API
// @version 1.0
// @description REST API for Etherpad Go - Collaborative Text Editor
Expand Down Expand Up @@ -77,5 +80,5 @@ func main() {
}
}

server2.InitServer(setupLogger, uiAssets)
server2.InitServer(setupLogger, uiAssets, pluginAssets)
}
Loading