mirror of
https://github.com/goauthentik/authentik
synced 2026-04-26 01:25:02 +02:00
Compare commits
3 Commits
admin/vers
...
web/cm-lsp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b40d19be84 | ||
|
|
25cd7a94ce | ||
|
|
ff82d4c836 |
@@ -25,6 +25,7 @@ from authentik.core.views.interface import (
|
||||
RootRedirectView,
|
||||
)
|
||||
from authentik.flows.views.interface import FlowInterfaceView
|
||||
from authentik.lib.expression.consumer_lsp import LSPConsumer
|
||||
from authentik.root.asgi_middleware import SessionMiddleware
|
||||
from authentik.root.messages.consumer import MessageConsumer
|
||||
from authentik.root.middleware import ChannelsLoggingMiddleware
|
||||
@@ -98,6 +99,12 @@ websocket_urlpatterns = [
|
||||
CookieMiddleware(SessionMiddleware(AuthMiddleware(MessageConsumer.as_asgi())))
|
||||
),
|
||||
),
|
||||
path(
|
||||
"ws/lsp/",
|
||||
ChannelsLoggingMiddleware(
|
||||
CookieMiddleware(SessionMiddleware(AuthMiddleware(LSPConsumer.as_asgi())))
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
if settings.DEBUG:
|
||||
|
||||
69
authentik/lib/expression/consumer_lsp.py
Normal file
69
authentik/lib/expression/consumer_lsp.py
Normal file
@@ -0,0 +1,69 @@
|
||||
from textwrap import indent
|
||||
from typing import Iterable
|
||||
|
||||
from channels.generic.websocket import JsonWebsocketConsumer
|
||||
from pylsp.python_lsp import PythonLSPServer
|
||||
|
||||
|
||||
class AuthentikPythonLSP(PythonLSPServer):
|
||||
|
||||
def m_initialize(
|
||||
self,
|
||||
processId=None,
|
||||
rootUri=None,
|
||||
rootPath=None,
|
||||
initializationOptions=None,
|
||||
workspaceFolders=None,
|
||||
**_kwargs,
|
||||
):
|
||||
_kwargs["capabilities"] = {}
|
||||
response = super().m_initialize(
|
||||
processId, rootUri, rootPath, initializationOptions={
|
||||
"pylsp.plugins.jedi.auto_import_modules": [],
|
||||
"pylsp.plugins.jedi_completion.eager": True,
|
||||
}, workspaceFolders=None, **_kwargs
|
||||
)
|
||||
return response
|
||||
|
||||
|
||||
class LSPConsumer(JsonWebsocketConsumer):
|
||||
|
||||
handler_class = AuthentikPythonLSP
|
||||
|
||||
handler: PythonLSPServer
|
||||
|
||||
def connect(self):
|
||||
self.accept()
|
||||
self.handler = self.handler_class(None, None, consumer=self.send_json)
|
||||
|
||||
def disconnect(self, code):
|
||||
self.handler.m_shutdown()
|
||||
|
||||
def wrap_expression(self, expression: str, params: Iterable[str]) -> str:
|
||||
"""Wrap expression in a function, call it, and save the result as `result`"""
|
||||
handler_signature = ",".join(params)
|
||||
full_expression = ""
|
||||
full_expression += "from authentik.policies.types import PolicyRequest\n"
|
||||
full_expression += f"def handler({handler_signature}):\n"
|
||||
full_expression += indent(expression, " ")
|
||||
full_expression += f"\nresult = handler({handler_signature})"
|
||||
return full_expression
|
||||
|
||||
def send_json(self, content, close=False):
|
||||
# print(self.handler.config)
|
||||
return super().send_json(content, close)
|
||||
|
||||
def receive_json(self, content, **kwargs):
|
||||
# if content.get("method", "") == "textDocument/didOpen":
|
||||
# textDocument = content.get("params",{}).get("textDocument", {})
|
||||
# text = textDocument.get("text")
|
||||
# if text:
|
||||
# textDocument["text"] = self.wrap_expression(text, ["request: PolicyRequest"])
|
||||
# if content.get("method", "") == "textDocument/didChange":
|
||||
# contentChanges = content.get("params", {}).get("contentChanges", [""])
|
||||
# text = contentChanges[0].get("text", "")
|
||||
# if text:
|
||||
# contentChanges[0]["text"] = self.wrap_expression(text, ["request: PolicyRequest"])
|
||||
self.handler.consume(content)
|
||||
# print(self.handler.config.plugin_manager.get_plugins())
|
||||
# print(self.handler.config.plugin_settings("jedi_completion"))
|
||||
121
web/package-lock.json
generated
121
web/package-lock.json
generated
@@ -39,10 +39,12 @@
|
||||
"chart.js": "^4.4.4",
|
||||
"chartjs-adapter-moment": "^1.0.1",
|
||||
"codemirror": "^6.0.1",
|
||||
"codemirror-languageserver": "^1.11.0",
|
||||
"construct-style-sheets-polyfill": "^3.1.0",
|
||||
"core-js": "^3.38.1",
|
||||
"country-flag-icons": "^1.5.13",
|
||||
"dompurify": "^3.1.7",
|
||||
"events": "^3.3.0",
|
||||
"fuse.js": "^7.0.0",
|
||||
"guacamole-common-js": "^1.5.0",
|
||||
"lit": "^3.2.0",
|
||||
@@ -3009,6 +3011,39 @@
|
||||
"node": "^14.18.0 || >=16.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@open-rpc/client-js": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@open-rpc/client-js/-/client-js-1.8.1.tgz",
|
||||
"integrity": "sha512-vV+Hetl688nY/oWI9IFY0iKDrWuLdYhf7OIKI6U1DcnJV7r4gAgwRJjEr1QVYszUc0gjkHoQJzqevmXMGLyA0g==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"isomorphic-fetch": "^3.0.0",
|
||||
"isomorphic-ws": "^5.0.0",
|
||||
"strict-event-emitter-types": "^2.0.0",
|
||||
"ws": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@open-rpc/client-js/node_modules/ws": {
|
||||
"version": "7.5.10",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
|
||||
"integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8.3.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"bufferutil": "^4.0.1",
|
||||
"utf-8-validate": "^5.0.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"bufferutil": {
|
||||
"optional": true
|
||||
},
|
||||
"utf-8-validate": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@open-wc/lit-helpers": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@open-wc/lit-helpers/-/lit-helpers-0.7.0.tgz",
|
||||
@@ -9561,6 +9596,20 @@
|
||||
"@codemirror/view": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/codemirror-languageserver": {
|
||||
"version": "1.11.0",
|
||||
"resolved": "https://registry.npmjs.org/codemirror-languageserver/-/codemirror-languageserver-1.11.0.tgz",
|
||||
"integrity": "sha512-QtFEMc1yhi8wzKasE+OseMeikHpHdFt1wQdt5F4O3sKl7B1m56OcVuqmCAJipklbIPDkLecaXhd8oFvA72lfnw==",
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"@codemirror/autocomplete": "^6.0.2",
|
||||
"@codemirror/lint": "^6.0.0",
|
||||
"@codemirror/state": "^6.1.0",
|
||||
"@codemirror/view": "^6.0.2",
|
||||
"@open-rpc/client-js": "^1.7.1",
|
||||
"vscode-languageserver-protocol": "^3.16.0"
|
||||
}
|
||||
},
|
||||
"node_modules/color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
@@ -11936,7 +11985,6 @@
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
|
||||
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=0.8.x"
|
||||
}
|
||||
@@ -14106,6 +14154,45 @@
|
||||
"node": ">=16"
|
||||
}
|
||||
},
|
||||
"node_modules/isomorphic-fetch": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz",
|
||||
"integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"node-fetch": "^2.6.1",
|
||||
"whatwg-fetch": "^3.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/isomorphic-fetch/node_modules/node-fetch": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
||||
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"whatwg-url": "^5.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "4.x || >=6.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"encoding": "^0.1.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"encoding": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/isomorphic-ws": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz",
|
||||
"integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"ws": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/istanbul-lib-coverage": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
|
||||
@@ -19948,6 +20035,12 @@
|
||||
"bare-events": "^2.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/strict-event-emitter-types": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz",
|
||||
"integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/string_decoder": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||
@@ -20624,6 +20717,12 @@
|
||||
"url": "https://github.com/sponsors/Borewit"
|
||||
}
|
||||
},
|
||||
"node_modules/tr46": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/transform-ast": {
|
||||
"version": "2.4.4",
|
||||
"resolved": "https://registry.npmjs.org/transform-ast/-/transform-ast-2.4.4.tgz",
|
||||
@@ -22738,6 +22837,12 @@
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/webidl-conversions": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
|
||||
"license": "BSD-2-Clause"
|
||||
},
|
||||
"node_modules/webpack-virtual-modules": {
|
||||
"version": "0.6.2",
|
||||
"resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
|
||||
@@ -22771,8 +22876,7 @@
|
||||
"node_modules/whatwg-fetch": {
|
||||
"version": "3.6.20",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
|
||||
"integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="
|
||||
},
|
||||
"node_modules/whatwg-mimetype": {
|
||||
"version": "4.0.0",
|
||||
@@ -22783,6 +22887,16 @@
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/whatwg-url": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tr46": "~0.0.3",
|
||||
"webidl-conversions": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/which": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
|
||||
@@ -23088,7 +23202,6 @@
|
||||
"version": "8.18.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
|
||||
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
|
||||
@@ -27,10 +27,12 @@
|
||||
"chart.js": "^4.4.4",
|
||||
"chartjs-adapter-moment": "^1.0.1",
|
||||
"codemirror": "^6.0.1",
|
||||
"codemirror-languageserver": "^1.11.0",
|
||||
"construct-style-sheets-polyfill": "^3.1.0",
|
||||
"core-js": "^3.38.1",
|
||||
"country-flag-icons": "^1.5.13",
|
||||
"dompurify": "^3.1.7",
|
||||
"events": "^3.3.0",
|
||||
"fuse.js": "^7.0.0",
|
||||
"guacamole-common-js": "^1.5.0",
|
||||
"lit": "^3.2.0",
|
||||
|
||||
@@ -17,6 +17,7 @@ import { EditorView, drawSelection, keymap, lineNumbers } from "@codemirror/view
|
||||
import { EVENT_THEME_CHANGE } from "@goauthentik/common/constants";
|
||||
import { AKElement } from "@goauthentik/elements/Base";
|
||||
import YAML from "yaml";
|
||||
import { languageServer } from "codemirror-languageserver";
|
||||
|
||||
import { CSSResult, css } from "lit";
|
||||
import { customElement, property } from "lit/decorators.js";
|
||||
@@ -141,20 +142,30 @@ export class CodeMirrorTextarea<T> extends AKElement {
|
||||
return this.editor.state.doc.toString();
|
||||
}
|
||||
|
||||
getLanguageExtension(): LanguageSupport | undefined {
|
||||
getLanguageExtension(): Extension[] {
|
||||
switch (this.mode.toLowerCase()) {
|
||||
case CodeMirrorMode.XML:
|
||||
return xml();
|
||||
return [xml()];
|
||||
case CodeMirrorMode.JavaScript:
|
||||
return javascript();
|
||||
return [javascript()];
|
||||
case CodeMirrorMode.HTML:
|
||||
return htmlLang();
|
||||
return [htmlLang()];
|
||||
case CodeMirrorMode.Python:
|
||||
return python();
|
||||
return [
|
||||
languageServer({
|
||||
// WebSocket server uri and other client options.
|
||||
serverUri: "ws://localhost:9000/ws/lsp/",
|
||||
rootUri: "file:///",
|
||||
documentUri: `file:///foo`,
|
||||
workspaceFolders: [],
|
||||
languageId: "python",
|
||||
}),
|
||||
python()
|
||||
];
|
||||
case CodeMirrorMode.YAML:
|
||||
return new LanguageSupport(StreamLanguage.define(yamlMode.yaml));
|
||||
return [new LanguageSupport(StreamLanguage.define(yamlMode.yaml))];
|
||||
}
|
||||
return undefined;
|
||||
return [];
|
||||
}
|
||||
|
||||
firstUpdated(): void {
|
||||
@@ -173,7 +184,7 @@ export class CodeMirrorTextarea<T> extends AKElement {
|
||||
history(),
|
||||
keymap.of([...defaultKeymap, ...historyKeymap]),
|
||||
syntaxHighlighting(defaultHighlightStyle),
|
||||
this.getLanguageExtension(),
|
||||
...this.getLanguageExtension(),
|
||||
lineNumbers(),
|
||||
drawSelection(),
|
||||
EditorView.lineWrapping,
|
||||
|
||||
Reference in New Issue
Block a user