sshler 0.7.2__tar.gz → 0.7.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. {sshler-0.7.2/sshler.egg-info → sshler-0.7.4}/PKG-INFO +1 -1
  2. {sshler-0.7.2 → sshler-0.7.4}/pyproject.toml +1 -1
  3. {sshler-0.7.2 → sshler-0.7.4}/sshler/cli.py +9 -1
  4. {sshler-0.7.2 → sshler-0.7.4}/sshler/settings.py +2 -2
  5. {sshler-0.7.2 → sshler-0.7.4}/sshler/webapp.py +8 -9
  6. {sshler-0.7.2 → sshler-0.7.4/sshler.egg-info}/PKG-INFO +1 -1
  7. {sshler-0.7.2 → sshler-0.7.4}/LICENSE +0 -0
  8. {sshler-0.7.2 → sshler-0.7.4}/MANIFEST.in +0 -0
  9. {sshler-0.7.2 → sshler-0.7.4}/README.md +0 -0
  10. {sshler-0.7.2 → sshler-0.7.4}/scripts/check_frontend_dist.py +0 -0
  11. {sshler-0.7.2 → sshler-0.7.4}/setup.cfg +0 -0
  12. {sshler-0.7.2 → sshler-0.7.4}/sshler/__init__.py +0 -0
  13. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/__init__.py +0 -0
  14. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/archive.py +0 -0
  15. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/auth.py +0 -0
  16. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/batch.py +0 -0
  17. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/boxes.py +0 -0
  18. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/config.py +0 -0
  19. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/dependencies.py +0 -0
  20. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/files.py +0 -0
  21. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/grep.py +0 -0
  22. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/helpers.py +0 -0
  23. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/models.py +0 -0
  24. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/rate_limiting.py +0 -0
  25. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/recovery.py +0 -0
  26. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/search.py +0 -0
  27. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/sessions.py +0 -0
  28. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/snippets.py +0 -0
  29. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/terminal.py +0 -0
  30. {sshler-0.7.2 → sshler-0.7.4}/sshler/api/tunnels.py +0 -0
  31. {sshler-0.7.2 → sshler-0.7.4}/sshler/auth.py +0 -0
  32. {sshler-0.7.2 → sshler-0.7.4}/sshler/config.py +0 -0
  33. {sshler-0.7.2 → sshler-0.7.4}/sshler/config_cache.py +0 -0
  34. {sshler-0.7.2 → sshler-0.7.4}/sshler/rate_limit.py +0 -0
  35. {sshler-0.7.2 → sshler-0.7.4}/sshler/scripts/install-sshler-task.ps1 +0 -0
  36. {sshler-0.7.2 → sshler-0.7.4}/sshler/scripts/remove-sshler-task.ps1 +0 -0
  37. {sshler-0.7.2 → sshler-0.7.4}/sshler/scripts/run-sshler.ps1 +0 -0
  38. {sshler-0.7.2 → sshler-0.7.4}/sshler/session.py +0 -0
  39. {sshler-0.7.2 → sshler-0.7.4}/sshler/snapshot.py +0 -0
  40. {sshler-0.7.2 → sshler-0.7.4}/sshler/spa.py +0 -0
  41. {sshler-0.7.2 → sshler-0.7.4}/sshler/ssh.py +0 -0
  42. {sshler-0.7.2 → sshler-0.7.4}/sshler/ssh_config.py +0 -0
  43. {sshler-0.7.2 → sshler-0.7.4}/sshler/ssh_pool.py +0 -0
  44. {sshler-0.7.2 → sshler-0.7.4}/sshler/state.py +0 -0
  45. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/base.js +0 -0
  46. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/command-palette.js +0 -0
  47. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/Alert-C0caXY3O.js +0 -0
  48. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/BoxesView-Cw5NiFP6.css +0 -0
  49. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/BoxesView-DCsH8F6Q.js +0 -0
  50. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/DirectoryPickerModal-CVB_AH0M.css +0 -0
  51. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/DirectoryPickerModal-DlIkiyp1.js +0 -0
  52. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/FilesView-BFEnr1Va.css +0 -0
  53. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/FilesView-jrF0GwSm.js +0 -0
  54. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/Grid-B_OzHEym.js +0 -0
  55. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/InputNumber-XDnEotgL.js +0 -0
  56. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/LoginView-BLrnakeI.css +0 -0
  57. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/LoginView-C2biy_5H.js +0 -0
  58. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/MultiTerminalView-C8x4yNn3.js +0 -0
  59. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/MultiTerminalView-UnOQ5utL.css +0 -0
  60. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/NotFoundView-DYaoqkDb.css +0 -0
  61. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/NotFoundView-D_GMBtkq.js +0 -0
  62. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/OverviewView-BSwVX2Hs.js +0 -0
  63. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/OverviewView-SxVVVBkg.css +0 -0
  64. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/PhCircle.vue-BD-yU_HB.js +0 -0
  65. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/PhHouse.vue-BwwabvLx.js +0 -0
  66. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/PhPlus.vue-ChJ-UG0M.js +0 -0
  67. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/PhPushPinSimple.vue-DBP-0k94.js +0 -0
  68. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/PhTrash.vue-N4dJGebi.js +0 -0
  69. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/SettingsView-DCCByJuu.js +0 -0
  70. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/SettingsView-xrtebMdI.css +0 -0
  71. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/Spin-13rKpfWM.js +0 -0
  72. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/Switch-DsrNJCg_.js +0 -0
  73. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/TerminalView--aIl3nME.js +0 -0
  74. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/TerminalView-DKOHtH_z.css +0 -0
  75. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/favorites-CJMYgFyA.js +0 -0
  76. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/index-BCipBsn9.js +0 -0
  77. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/assets/index-Cwi9_lHU.css +0 -0
  78. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/favicon.png +0 -0
  79. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/fonts/MonaspaceNeon-Bold.woff2 +0 -0
  80. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/fonts/MonaspaceNeon-Regular.woff2 +0 -0
  81. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/fonts/MonaspaceNeon-Variable.woff2 +0 -0
  82. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/icon-192.png +0 -0
  83. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/icon-512-maskable.png +0 -0
  84. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/icon-512.png +0 -0
  85. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/index.html +0 -0
  86. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/logo.png +0 -0
  87. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/dist/manifest.webmanifest +0 -0
  88. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/favicon-terminal-local.svg +0 -0
  89. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/favicon-terminal.svg +0 -0
  90. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/favicon.png +0 -0
  91. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/favicon.svg +0 -0
  92. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/file-browser.js +0 -0
  93. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/file-edit.js +0 -0
  94. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/file-view.js +0 -0
  95. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/logo.png +0 -0
  96. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/manifest.json +0 -0
  97. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/multi-session.js +0 -0
  98. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/style.css +0 -0
  99. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/sw.js +0 -0
  100. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/term.js +0 -0
  101. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/vendor/xterm/xterm-addon-fit.js +0 -0
  102. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/vendor/xterm/xterm-addon-search.js +0 -0
  103. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/vendor/xterm/xterm.css +0 -0
  104. {sshler-0.7.2 → sshler-0.7.4}/sshler/static/vendor/xterm/xterm.js +0 -0
  105. {sshler-0.7.2 → sshler-0.7.4}/sshler/validation.py +0 -0
  106. {sshler-0.7.2 → sshler-0.7.4}/sshler.egg-info/SOURCES.txt +0 -0
  107. {sshler-0.7.2 → sshler-0.7.4}/sshler.egg-info/dependency_links.txt +0 -0
  108. {sshler-0.7.2 → sshler-0.7.4}/sshler.egg-info/entry_points.txt +0 -0
  109. {sshler-0.7.2 → sshler-0.7.4}/sshler.egg-info/requires.txt +0 -0
  110. {sshler-0.7.2 → sshler-0.7.4}/sshler.egg-info/top_level.txt +0 -0
  111. {sshler-0.7.2 → sshler-0.7.4}/tests/test_api_v1.py +0 -0
  112. {sshler-0.7.2 → sshler-0.7.4}/tests/test_archive.py +0 -0
  113. {sshler-0.7.2 → sshler-0.7.4}/tests/test_basic.py +0 -0
  114. {sshler-0.7.2 → sshler-0.7.4}/tests/test_batch_ops.py +0 -0
  115. {sshler-0.7.2 → sshler-0.7.4}/tests/test_command_injection.py +0 -0
  116. {sshler-0.7.2 → sshler-0.7.4}/tests/test_config.py +0 -0
  117. {sshler-0.7.2 → sshler-0.7.4}/tests/test_database_indexes.py +0 -0
  118. {sshler-0.7.2 → sshler-0.7.4}/tests/test_dev_workflow.py +0 -0
  119. {sshler-0.7.2 → sshler-0.7.4}/tests/test_grep.py +0 -0
  120. {sshler-0.7.2 → sshler-0.7.4}/tests/test_handshake_status.py +0 -0
  121. {sshler-0.7.2 → sshler-0.7.4}/tests/test_httpx_ws.py +0 -0
  122. {sshler-0.7.2 → sshler-0.7.4}/tests/test_path_validation.py +0 -0
  123. {sshler-0.7.2 → sshler-0.7.4}/tests/test_rate_limit.py +0 -0
  124. {sshler-0.7.2 → sshler-0.7.4}/tests/test_search.py +0 -0
  125. {sshler-0.7.2 → sshler-0.7.4}/tests/test_session_auth.py +0 -0
  126. {sshler-0.7.2 → sshler-0.7.4}/tests/test_snippets.py +0 -0
  127. {sshler-0.7.2 → sshler-0.7.4}/tests/test_ssh.py +0 -0
  128. {sshler-0.7.2 → sshler-0.7.4}/tests/test_tunnels.py +0 -0
  129. {sshler-0.7.2 → sshler-0.7.4}/tests/test_websocket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sshler
3
- Version: 0.7.2
3
+ Version: 0.7.4
4
4
  Summary: A local FastAPI-powered SSH multiplexer for tmux-in-browser — from your laptop only.
5
5
  Author-email: Gabu <gabu@gabu.quest>
6
6
  License-Expression: MIT
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "sshler"
8
- version = "0.7.2"
8
+ version = "0.7.4"
9
9
  description = "A local FastAPI-powered SSH multiplexer for tmux-in-browser — from your laptop only."
10
10
  readme = "README.md"
11
11
  requires-python = ">=3.12"
@@ -358,8 +358,16 @@ def serve(
358
358
  指定したホストとポートでリクエスト受付を開始します。
359
359
  """
360
360
 
361
+ # Auto-add the actual listening address to allowed origins
362
+ # so origin checks pass regardless of custom port
363
+ auto_origins = list(allow_origins or [])
364
+ listen_origins = {f"http://{host}:{port}", f"http://localhost:{port}", f"http://127.0.0.1:{port}"}
365
+ for o in listen_origins:
366
+ if o not in auto_origins:
367
+ auto_origins.append(o)
368
+
361
369
  settings = ServerSettings(
362
- allow_origins=allow_origins or [],
370
+ allow_origins=auto_origins,
363
371
  csrf_token=token or secrets.token_urlsafe(32),
364
372
  max_upload_bytes=max_upload_mb * 1024 * 1024,
365
373
  allow_ssh_alias=allow_ssh_alias,
@@ -27,8 +27,8 @@ class SshlerSettings(BaseSettings):
27
27
  host: str = Field(default="127.0.0.1", description="Host to bind to")
28
28
  port: int = Field(default=8822, description="Port to bind to")
29
29
  public_url: str = Field(
30
- default="http://localhost:8822",
31
- description="Public URL where sshler is accessible (used for CORS/origin checks)",
30
+ default="",
31
+ description="Public URL where sshler is accessible (used for CORS/origin checks). Auto-derived from host:port if empty.",
32
32
  )
33
33
 
34
34
  # Session/Cookie settings
@@ -756,18 +756,17 @@ def make_app(settings: ServerSettings | None = None) -> FastAPI:
756
756
  parsed_origin = urlparse(origin)
757
757
  origin_base = f"{parsed_origin.scheme}://{parsed_origin.netloc}"
758
758
 
759
- # Parse expected origin from public_url
760
- parsed_public = urlparse(app_settings.public_url)
761
- expected_origin = f"{parsed_public.scheme}://{parsed_public.netloc}"
762
-
763
759
  # Check if origin matches public_url or is in allowed_origins
764
760
  # Include both env-based origins (SshlerSettings) and CLI-based origins (ServerSettings)
765
761
  cli_settings: ServerSettings = request.app.state.settings
766
- allowed_origins = (
767
- [expected_origin]
768
- + app_settings.allowed_origins_list
769
- + cli_settings.allow_origins
770
- )
762
+ allowed_origins = list(cli_settings.allow_origins) + app_settings.allowed_origins_list
763
+
764
+ # Add public_url-derived origin if set
765
+ if app_settings.public_url:
766
+ parsed_public = urlparse(app_settings.public_url)
767
+ expected_origin = f"{parsed_public.scheme}://{parsed_public.netloc}"
768
+ if expected_origin not in allowed_origins:
769
+ allowed_origins.append(expected_origin)
771
770
 
772
771
  if origin_base not in allowed_origins:
773
772
  logging.warning(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sshler
3
- Version: 0.7.2
3
+ Version: 0.7.4
4
4
  Summary: A local FastAPI-powered SSH multiplexer for tmux-in-browser — from your laptop only.
5
5
  Author-email: Gabu <gabu@gabu.quest>
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes