Compare commits

...

3 Commits

Author SHA1 Message Date
Jens Langhammer
b40d19be84 hmm
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2024-12-22 18:18:02 +01:00
Jens Langhammer
25cd7a94ce idk
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2024-12-22 18:07:21 +01:00
Jens Langhammer
ff82d4c836 add LSP
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2024-12-22 18:07:19 +01:00
5 changed files with 214 additions and 12 deletions

View File

@@ -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:

View 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
View File

@@ -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"
},

View File

@@ -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",

View File

@@ -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,