streamlit-nightly 1.41.2.dev20250106__py2.py3-none-any.whl → 1.41.2.dev20250108__py2.py3-none-any.whl

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 (413) hide show
  1. streamlit/__init__.py +11 -2
  2. streamlit/__main__.py +1 -1
  3. streamlit/auth_util.py +209 -0
  4. streamlit/cli_util.py +1 -1
  5. streamlit/column_config.py +1 -1
  6. streamlit/commands/__init__.py +1 -1
  7. streamlit/commands/echo.py +1 -1
  8. streamlit/commands/execution_control.py +1 -1
  9. streamlit/commands/experimental_query_params.py +1 -1
  10. streamlit/commands/logo.py +1 -1
  11. streamlit/commands/navigation.py +1 -1
  12. streamlit/commands/page_config.py +1 -1
  13. streamlit/components/__init__.py +1 -1
  14. streamlit/components/lib/__init__.py +1 -1
  15. streamlit/components/lib/local_component_registry.py +1 -1
  16. streamlit/components/types/__init__.py +1 -1
  17. streamlit/components/types/base_component_registry.py +1 -1
  18. streamlit/components/types/base_custom_component.py +1 -1
  19. streamlit/components/v1/__init__.py +1 -1
  20. streamlit/components/v1/component_arrow.py +1 -1
  21. streamlit/components/v1/component_registry.py +1 -1
  22. streamlit/components/v1/components.py +1 -1
  23. streamlit/components/v1/custom_component.py +1 -1
  24. streamlit/config.py +1 -1
  25. streamlit/config_option.py +1 -1
  26. streamlit/config_util.py +1 -1
  27. streamlit/connections/__init__.py +1 -1
  28. streamlit/connections/base_connection.py +1 -1
  29. streamlit/connections/snowflake_connection.py +1 -1
  30. streamlit/connections/snowpark_connection.py +1 -1
  31. streamlit/connections/sql_connection.py +1 -1
  32. streamlit/connections/util.py +1 -1
  33. streamlit/cursor.py +1 -1
  34. streamlit/dataframe_util.py +1 -1
  35. streamlit/delta_generator.py +1 -1
  36. streamlit/delta_generator_singletons.py +1 -1
  37. streamlit/deprecation_util.py +1 -1
  38. streamlit/development.py +1 -1
  39. streamlit/elements/__init__.py +1 -1
  40. streamlit/elements/alert.py +1 -1
  41. streamlit/elements/arrow.py +1 -1
  42. streamlit/elements/balloons.py +1 -1
  43. streamlit/elements/bokeh_chart.py +1 -1
  44. streamlit/elements/code.py +1 -1
  45. streamlit/elements/deck_gl_json_chart.py +1 -1
  46. streamlit/elements/dialog_decorator.py +1 -1
  47. streamlit/elements/doc_string.py +1 -1
  48. streamlit/elements/empty.py +1 -1
  49. streamlit/elements/exception.py +1 -1
  50. streamlit/elements/form.py +1 -1
  51. streamlit/elements/graphviz_chart.py +1 -1
  52. streamlit/elements/heading.py +1 -1
  53. streamlit/elements/html.py +1 -1
  54. streamlit/elements/iframe.py +1 -1
  55. streamlit/elements/image.py +1 -1
  56. streamlit/elements/json.py +1 -1
  57. streamlit/elements/layouts.py +1 -1
  58. streamlit/elements/lib/__init__.py +1 -1
  59. streamlit/elements/lib/built_in_chart_utils.py +1 -1
  60. streamlit/elements/lib/color_util.py +1 -1
  61. streamlit/elements/lib/column_config_utils.py +1 -1
  62. streamlit/elements/lib/column_types.py +1 -1
  63. streamlit/elements/lib/dialog.py +1 -1
  64. streamlit/elements/lib/dicttools.py +1 -1
  65. streamlit/elements/lib/event_utils.py +1 -1
  66. streamlit/elements/lib/file_uploader_utils.py +1 -1
  67. streamlit/elements/lib/form_utils.py +1 -1
  68. streamlit/elements/lib/image_utils.py +1 -1
  69. streamlit/elements/lib/js_number.py +1 -1
  70. streamlit/elements/lib/mutable_status_container.py +1 -1
  71. streamlit/elements/lib/options_selector_utils.py +1 -1
  72. streamlit/elements/lib/pandas_styler_utils.py +1 -1
  73. streamlit/elements/lib/policies.py +1 -1
  74. streamlit/elements/lib/streamlit_plotly_theme.py +1 -1
  75. streamlit/elements/lib/subtitle_utils.py +1 -1
  76. streamlit/elements/lib/utils.py +1 -1
  77. streamlit/elements/map.py +1 -1
  78. streamlit/elements/markdown.py +3 -3
  79. streamlit/elements/media.py +1 -1
  80. streamlit/elements/metric.py +1 -1
  81. streamlit/elements/plotly_chart.py +1 -1
  82. streamlit/elements/progress.py +1 -1
  83. streamlit/elements/pyplot.py +1 -1
  84. streamlit/elements/snow.py +1 -1
  85. streamlit/elements/spinner.py +14 -7
  86. streamlit/elements/text.py +1 -1
  87. streamlit/elements/toast.py +1 -1
  88. streamlit/elements/vega_charts.py +1 -1
  89. streamlit/elements/widgets/__init__.py +1 -1
  90. streamlit/elements/widgets/audio_input.py +1 -1
  91. streamlit/elements/widgets/button.py +1 -1
  92. streamlit/elements/widgets/button_group.py +1 -1
  93. streamlit/elements/widgets/camera_input.py +1 -1
  94. streamlit/elements/widgets/chat.py +1 -1
  95. streamlit/elements/widgets/checkbox.py +1 -1
  96. streamlit/elements/widgets/color_picker.py +1 -1
  97. streamlit/elements/widgets/data_editor.py +1 -1
  98. streamlit/elements/widgets/file_uploader.py +1 -1
  99. streamlit/elements/widgets/multiselect.py +1 -1
  100. streamlit/elements/widgets/number_input.py +1 -1
  101. streamlit/elements/widgets/radio.py +1 -1
  102. streamlit/elements/widgets/select_slider.py +1 -1
  103. streamlit/elements/widgets/selectbox.py +1 -1
  104. streamlit/elements/widgets/slider.py +1 -1
  105. streamlit/elements/widgets/text_widgets.py +1 -1
  106. streamlit/elements/widgets/time_widgets.py +1 -1
  107. streamlit/elements/write.py +2 -2
  108. streamlit/emojis.py +1 -1
  109. streamlit/env_util.py +1 -1
  110. streamlit/error_util.py +1 -1
  111. streamlit/errors.py +5 -1
  112. streamlit/external/__init__.py +1 -1
  113. streamlit/external/langchain/__init__.py +1 -1
  114. streamlit/external/langchain/streamlit_callback_handler.py +1 -1
  115. streamlit/file_util.py +1 -1
  116. streamlit/git_util.py +1 -1
  117. streamlit/hello/__init__.py +1 -1
  118. streamlit/hello/animation_demo.py +1 -1
  119. streamlit/hello/dataframe_demo.py +1 -1
  120. streamlit/hello/hello.py +1 -1
  121. streamlit/hello/mapping_demo.py +1 -1
  122. streamlit/hello/plotting_demo.py +1 -1
  123. streamlit/hello/streamlit_app.py +1 -1
  124. streamlit/hello/utils.py +1 -1
  125. streamlit/logger.py +1 -1
  126. streamlit/material_icon_names.py +1 -1
  127. streamlit/navigation/__init__.py +1 -1
  128. streamlit/navigation/page.py +1 -1
  129. streamlit/net_util.py +1 -1
  130. streamlit/platform.py +1 -1
  131. streamlit/proto/Alert_pb2.pyi +1 -1
  132. streamlit/proto/AppPage_pb2.pyi +1 -1
  133. streamlit/proto/ArrowNamedDataSet_pb2.pyi +1 -1
  134. streamlit/proto/ArrowVegaLiteChart_pb2.pyi +1 -1
  135. streamlit/proto/Arrow_pb2.pyi +1 -1
  136. streamlit/proto/AudioInput_pb2.pyi +1 -1
  137. streamlit/proto/Audio_pb2.pyi +1 -1
  138. streamlit/proto/AuthRedirect_pb2.py +27 -0
  139. streamlit/proto/AuthRedirect_pb2.pyi +41 -0
  140. streamlit/proto/AutoRerun_pb2.pyi +1 -1
  141. streamlit/proto/BackMsg_pb2.pyi +1 -1
  142. streamlit/proto/Balloons_pb2.pyi +1 -1
  143. streamlit/proto/Block_pb2.pyi +1 -1
  144. streamlit/proto/BokehChart_pb2.pyi +1 -1
  145. streamlit/proto/ButtonGroup_pb2.pyi +1 -1
  146. streamlit/proto/Button_pb2.pyi +1 -1
  147. streamlit/proto/CameraInput_pb2.pyi +1 -1
  148. streamlit/proto/ChatInput_pb2.pyi +1 -1
  149. streamlit/proto/Checkbox_pb2.pyi +1 -1
  150. streamlit/proto/ClientState_pb2.pyi +1 -1
  151. streamlit/proto/Code_pb2.pyi +1 -1
  152. streamlit/proto/ColorPicker_pb2.pyi +1 -1
  153. streamlit/proto/Common_pb2.pyi +1 -1
  154. streamlit/proto/Components_pb2.pyi +1 -1
  155. streamlit/proto/DataFrame_pb2.pyi +1 -1
  156. streamlit/proto/DateInput_pb2.pyi +1 -1
  157. streamlit/proto/DeckGlJsonChart_pb2.pyi +1 -1
  158. streamlit/proto/Delta_pb2.pyi +1 -1
  159. streamlit/proto/DocString_pb2.pyi +1 -1
  160. streamlit/proto/DownloadButton_pb2.pyi +1 -1
  161. streamlit/proto/Element_pb2.pyi +1 -1
  162. streamlit/proto/Empty_pb2.pyi +1 -1
  163. streamlit/proto/Exception_pb2.pyi +1 -1
  164. streamlit/proto/Favicon_pb2.pyi +1 -1
  165. streamlit/proto/FileUploader_pb2.pyi +1 -1
  166. streamlit/proto/ForwardMsg_pb2.py +10 -9
  167. streamlit/proto/ForwardMsg_pb2.pyi +11 -4
  168. streamlit/proto/GitInfo_pb2.pyi +1 -1
  169. streamlit/proto/GraphVizChart_pb2.pyi +1 -1
  170. streamlit/proto/Heading_pb2.pyi +1 -1
  171. streamlit/proto/Html_pb2.pyi +1 -1
  172. streamlit/proto/IFrame_pb2.pyi +1 -1
  173. streamlit/proto/Image_pb2.pyi +1 -1
  174. streamlit/proto/Json_pb2.pyi +1 -1
  175. streamlit/proto/LabelVisibilityMessage_pb2.pyi +1 -1
  176. streamlit/proto/LinkButton_pb2.pyi +1 -1
  177. streamlit/proto/Logo_pb2.pyi +1 -1
  178. streamlit/proto/Markdown_pb2.pyi +1 -1
  179. streamlit/proto/Metric_pb2.pyi +1 -1
  180. streamlit/proto/MetricsEvent_pb2.pyi +1 -1
  181. streamlit/proto/MultiSelect_pb2.pyi +1 -1
  182. streamlit/proto/NamedDataSet_pb2.pyi +1 -1
  183. streamlit/proto/Navigation_pb2.pyi +1 -1
  184. streamlit/proto/NewSession_pb2.pyi +1 -1
  185. streamlit/proto/NumberInput_pb2.pyi +1 -1
  186. streamlit/proto/PageConfig_pb2.pyi +1 -1
  187. streamlit/proto/PageInfo_pb2.pyi +1 -1
  188. streamlit/proto/PageLink_pb2.pyi +1 -1
  189. streamlit/proto/PageNotFound_pb2.pyi +1 -1
  190. streamlit/proto/PageProfile_pb2.pyi +1 -1
  191. streamlit/proto/PagesChanged_pb2.pyi +1 -1
  192. streamlit/proto/ParentMessage_pb2.pyi +1 -1
  193. streamlit/proto/PlotlyChart_pb2.pyi +1 -1
  194. streamlit/proto/Progress_pb2.pyi +1 -1
  195. streamlit/proto/Radio_pb2.pyi +1 -1
  196. streamlit/proto/RootContainer_pb2.pyi +1 -1
  197. streamlit/proto/Selectbox_pb2.pyi +1 -1
  198. streamlit/proto/SessionEvent_pb2.pyi +1 -1
  199. streamlit/proto/SessionStatus_pb2.pyi +1 -1
  200. streamlit/proto/Skeleton_pb2.pyi +1 -1
  201. streamlit/proto/Slider_pb2.pyi +1 -1
  202. streamlit/proto/Snow_pb2.pyi +1 -1
  203. streamlit/proto/Spinner_pb2.py +2 -2
  204. streamlit/proto/Spinner_pb2.pyi +6 -2
  205. streamlit/proto/TextArea_pb2.pyi +1 -1
  206. streamlit/proto/TextInput_pb2.pyi +1 -1
  207. streamlit/proto/Text_pb2.pyi +1 -1
  208. streamlit/proto/TimeInput_pb2.pyi +1 -1
  209. streamlit/proto/Toast_pb2.pyi +1 -1
  210. streamlit/proto/VegaLiteChart_pb2.pyi +1 -1
  211. streamlit/proto/Video_pb2.pyi +1 -1
  212. streamlit/proto/WidgetStates_pb2.pyi +1 -1
  213. streamlit/proto/__init__.py +1 -1
  214. streamlit/runtime/__init__.py +1 -1
  215. streamlit/runtime/app_session.py +6 -2
  216. streamlit/runtime/caching/__init__.py +1 -1
  217. streamlit/runtime/caching/cache_data_api.py +1 -1
  218. streamlit/runtime/caching/cache_errors.py +1 -1
  219. streamlit/runtime/caching/cache_resource_api.py +1 -1
  220. streamlit/runtime/caching/cache_type.py +1 -1
  221. streamlit/runtime/caching/cache_utils.py +1 -1
  222. streamlit/runtime/caching/cached_message_replay.py +1 -1
  223. streamlit/runtime/caching/hashing.py +1 -1
  224. streamlit/runtime/caching/legacy_cache_api.py +1 -1
  225. streamlit/runtime/caching/storage/__init__.py +1 -1
  226. streamlit/runtime/caching/storage/cache_storage_protocol.py +1 -1
  227. streamlit/runtime/caching/storage/dummy_cache_storage.py +1 -1
  228. streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +1 -1
  229. streamlit/runtime/caching/storage/local_disk_cache_storage.py +1 -1
  230. streamlit/runtime/connection_factory.py +1 -1
  231. streamlit/runtime/context.py +1 -1
  232. streamlit/runtime/credentials.py +1 -1
  233. streamlit/runtime/forward_msg_cache.py +1 -1
  234. streamlit/runtime/forward_msg_queue.py +1 -1
  235. streamlit/runtime/fragment.py +1 -1
  236. streamlit/runtime/media_file_manager.py +1 -1
  237. streamlit/runtime/media_file_storage.py +1 -1
  238. streamlit/runtime/memory_media_file_storage.py +1 -1
  239. streamlit/runtime/memory_session_storage.py +1 -1
  240. streamlit/runtime/memory_uploaded_file_manager.py +1 -1
  241. streamlit/runtime/metrics_util.py +2 -1
  242. streamlit/runtime/pages_manager.py +1 -1
  243. streamlit/runtime/runtime.py +14 -3
  244. streamlit/runtime/runtime_util.py +1 -1
  245. streamlit/runtime/script_data.py +1 -1
  246. streamlit/runtime/scriptrunner/__init__.py +1 -1
  247. streamlit/runtime/scriptrunner/exec_code.py +1 -1
  248. streamlit/runtime/scriptrunner/magic.py +1 -1
  249. streamlit/runtime/scriptrunner/magic_funcs.py +1 -1
  250. streamlit/runtime/scriptrunner/script_cache.py +1 -1
  251. streamlit/runtime/scriptrunner/script_runner.py +18 -9
  252. streamlit/runtime/scriptrunner_utils/__init__.py +1 -1
  253. streamlit/runtime/scriptrunner_utils/exceptions.py +1 -1
  254. streamlit/runtime/scriptrunner_utils/script_requests.py +1 -1
  255. streamlit/runtime/scriptrunner_utils/script_run_context.py +2 -2
  256. streamlit/runtime/secrets.py +1 -1
  257. streamlit/runtime/session_manager.py +2 -2
  258. streamlit/runtime/state/__init__.py +1 -1
  259. streamlit/runtime/state/common.py +1 -1
  260. streamlit/runtime/state/query_params.py +1 -1
  261. streamlit/runtime/state/query_params_proxy.py +1 -1
  262. streamlit/runtime/state/safe_session_state.py +1 -1
  263. streamlit/runtime/state/session_state.py +1 -1
  264. streamlit/runtime/state/session_state_proxy.py +1 -1
  265. streamlit/runtime/state/widgets.py +1 -1
  266. streamlit/runtime/stats.py +1 -1
  267. streamlit/runtime/uploaded_file_manager.py +1 -1
  268. streamlit/runtime/websocket_session_manager.py +2 -2
  269. streamlit/source_util.py +1 -1
  270. streamlit/static/index.html +2 -2
  271. streamlit/static/static/js/{FileDownload.esm.BfiuyXfu.js → FileDownload.esm.CXWFIN7B.js} +1 -1
  272. streamlit/static/static/js/{FormClearHelper.BIe6FN2Y.js → FormClearHelper.dauERNYc.js} +1 -1
  273. streamlit/static/static/js/{Hooks.CHslqKt4.js → Hooks.CqBCxxzg.js} +1 -1
  274. streamlit/static/static/js/{InputInstructions.BMT8dg5S.js → InputInstructions.Dm8zppD9.js} +1 -1
  275. streamlit/static/static/js/ProgressBar.CQTs8xxT.js +2 -0
  276. streamlit/static/static/js/RenderInPortalIfExists.BIVWPcSk.js +1 -0
  277. streamlit/static/static/js/Toolbar.D_9Mp69H.js +1 -0
  278. streamlit/static/static/js/{base-input.B1a61Ojd.js → base-input.JrivAGt5.js} +4 -4
  279. streamlit/static/static/js/{createSuper.DuLZrute.js → createSuper.BLkfEjg8.js} +1 -1
  280. streamlit/static/static/js/data-grid-overlay-editor.4d_NBoKr.js +1 -0
  281. streamlit/static/static/js/{downloader.BVrmPJui.js → downloader.i394ggfM.js} +1 -1
  282. streamlit/static/static/js/{es6.44cVHEXS.js → es6.BPf5kpFH.js} +2 -2
  283. streamlit/static/static/js/getPrototypeOf.DcAVjrh9.js +1 -0
  284. streamlit/static/static/js/{iframeResizer.contentWindow.Bd3a4rtP.js → iframeResizer.contentWindow.YDN8GVx9.js} +1 -1
  285. streamlit/static/static/js/index.57g5CAPC.js +1 -0
  286. streamlit/static/static/js/{index.C9YRT0fo.js → index.B3dyGG7q.js} +3 -3
  287. streamlit/static/static/js/index.B6GM885g.js +1 -0
  288. streamlit/static/static/js/{index.Q2CKSyfz.js → index.BB2p9KgS.js} +1 -1
  289. streamlit/static/static/js/index.BOBIcAmK.js +1 -0
  290. streamlit/static/static/js/index.B_o9A-oO.js +1 -0
  291. streamlit/static/static/js/index.BfABFd7-.js +3 -0
  292. streamlit/static/static/js/{index.D_cUCQty.js → index.BidgRpd5.js} +1 -1
  293. streamlit/static/static/js/index.Bj7LBigw.js +197 -0
  294. streamlit/static/static/js/{index.CIMJL36S.js → index.C-TBipT2.js} +2 -2
  295. streamlit/static/static/js/{index.0AR3jk4J.js → index.C4muCvfN.js} +1 -1
  296. streamlit/static/static/js/{index.CmHLY_aM.js → index.CAZAG6f3.js} +2 -2
  297. streamlit/static/static/js/index.CJlBME-_.js +1 -0
  298. streamlit/static/static/js/{index.6ZeP-L28.js → index.CMAjN-j5.js} +2 -2
  299. streamlit/static/static/js/index.CSmBE6cg.js +1 -0
  300. streamlit/static/static/js/index.CgkfCbvP.js +1 -0
  301. streamlit/static/static/js/index.D1CJOG3s.js +1 -0
  302. streamlit/static/static/js/index.D1qR2sOA.js +1 -0
  303. streamlit/static/static/js/index.D7EG5vd0.js +2 -0
  304. streamlit/static/static/js/index.DE-FOSSU.js +1 -0
  305. streamlit/static/static/js/{index.lvhOjMEi.js → index.DWU1GWqY.js} +1 -1
  306. streamlit/static/static/js/{index.BRjwQabs.js → index.D_bHPQ8s.js} +1 -1
  307. streamlit/static/static/js/{index.CkxcnfCr.js → index.DalTq5GL.js} +1 -1
  308. streamlit/static/static/js/index.Df7nX4KF.js +1 -0
  309. streamlit/static/static/js/index.DgOwxLz5.js +4 -0
  310. streamlit/static/static/js/{index.BfjxH33Q.js → index.DmHQeMtj.js} +1 -1
  311. streamlit/static/static/js/index.DsKBnIk-.js +201 -0
  312. streamlit/static/static/js/{index.3p3iyxFl.js → index.DxsOgtLc.js} +11 -11
  313. streamlit/static/static/js/index.DyNkf5tM.js +1 -0
  314. streamlit/static/static/js/{index.C-fIpagH.js → index.Dz6VQ3qN.js} +2 -2
  315. streamlit/static/static/js/{index.vp4vsBFK.js → index.HktO7F0v.js} +112 -112
  316. streamlit/static/static/js/{index.CzhhqwJO.js → index.PriAkdhw.js} +1 -1
  317. streamlit/static/static/js/{index.PqkLl1t0.js → index.SKaK1lYU.js} +2 -2
  318. streamlit/static/static/js/index.V5OLP0n7.js +1 -0
  319. streamlit/static/static/js/index.YfuWGKrN.js +1 -0
  320. streamlit/static/static/js/index.g_BxiUns.js +1 -0
  321. streamlit/static/static/js/{index.3qE-vjOX.js → index.kc3Ycvjj.js} +34 -34
  322. streamlit/static/static/js/{input.mrdmFJfU.js → input.CqdNsSbL.js} +2 -2
  323. streamlit/static/static/js/{memory.BjfNr0ig.js → memory.Bkvk-eRa.js} +1 -1
  324. streamlit/static/static/js/mergeWith.DtsbyD6H.js +1 -0
  325. streamlit/static/static/js/number-overlay-editor.CR4D4kK1.js +9 -0
  326. streamlit/static/static/js/{sandbox.oLnJKv78.js → sandbox.C5M8yw5Z.js} +1 -1
  327. streamlit/static/static/js/{slicedToArray.BzQ82qu6.js → slicedToArray.BL5-s74J.js} +1 -1
  328. streamlit/static/static/js/{textarea.Da3YV5aR.js → textarea.DrGlWUDC.js} +2 -2
  329. streamlit/static/static/js/threshold.B8r8f5kt.js +1 -0
  330. streamlit/static/static/js/{timepicker.BAT5exrW.js → timepicker.Bdf2lGHx.js} +1 -1
  331. streamlit/static/static/js/timer.RueuYoQV.js +1 -0
  332. streamlit/static/static/js/{uniqueId.C8z92sBf.js → uniqueId.LGvQ35eR.js} +1 -1
  333. streamlit/static/static/js/{useBasicWidgetState.CH5oDGQl.js → useBasicWidgetState.TTzKcGCs.js} +1 -1
  334. streamlit/static/static/js/{useOnInputChange.Bo325HzD.js → useOnInputChange.ChvkrwHU.js} +1 -1
  335. streamlit/static/static/js/value.iufjd77T.js +1 -0
  336. streamlit/static/static/js/withFullScreenWrapper.ChQqb1TZ.js +1 -0
  337. streamlit/string_util.py +1 -1
  338. streamlit/temporary_directory.py +1 -1
  339. streamlit/testing/__init__.py +1 -1
  340. streamlit/testing/v1/__init__.py +1 -1
  341. streamlit/testing/v1/app_test.py +1 -1
  342. streamlit/testing/v1/element_tree.py +1 -1
  343. streamlit/testing/v1/local_script_runner.py +1 -1
  344. streamlit/testing/v1/util.py +1 -1
  345. streamlit/time_util.py +1 -1
  346. streamlit/type_util.py +2 -2
  347. streamlit/url_util.py +24 -1
  348. streamlit/user_info.py +94 -27
  349. streamlit/util.py +1 -1
  350. streamlit/version.py +1 -1
  351. streamlit/watcher/__init__.py +1 -1
  352. streamlit/watcher/event_based_path_watcher.py +1 -1
  353. streamlit/watcher/folder_black_list.py +1 -1
  354. streamlit/watcher/local_sources_watcher.py +1 -1
  355. streamlit/watcher/path_watcher.py +1 -1
  356. streamlit/watcher/polling_path_watcher.py +1 -1
  357. streamlit/watcher/util.py +1 -1
  358. streamlit/web/__init__.py +1 -1
  359. streamlit/web/bootstrap.py +1 -1
  360. streamlit/web/cache_storage_manager_config.py +1 -1
  361. streamlit/web/cli.py +1 -1
  362. streamlit/web/server/__init__.py +1 -1
  363. streamlit/web/server/app_static_file_handler.py +1 -1
  364. streamlit/web/server/authlib_tornado_integration.py +58 -0
  365. streamlit/web/server/browser_websocket_handler.py +72 -6
  366. streamlit/web/server/component_request_handler.py +1 -1
  367. streamlit/web/server/media_file_handler.py +1 -1
  368. streamlit/web/server/oauth_authlib_routes.py +176 -0
  369. streamlit/web/server/oidc_mixin.py +108 -0
  370. streamlit/web/server/routes.py +6 -4
  371. streamlit/web/server/server.py +41 -4
  372. streamlit/web/server/server_util.py +25 -1
  373. streamlit/web/server/stats_request_handler.py +1 -1
  374. streamlit/web/server/upload_file_request_handler.py +3 -2
  375. streamlit/web/server/websocket_headers.py +1 -1
  376. {streamlit_nightly-1.41.2.dev20250106.data → streamlit_nightly-1.41.2.dev20250108.data}/scripts/streamlit.cmd +1 -1
  377. {streamlit_nightly-1.41.2.dev20250106.dist-info → streamlit_nightly-1.41.2.dev20250108.dist-info}/METADATA +14 -2
  378. streamlit_nightly-1.41.2.dev20250108.dist-info/RECORD +562 -0
  379. {streamlit_nightly-1.41.2.dev20250106.dist-info → streamlit_nightly-1.41.2.dev20250108.dist-info}/WHEEL +1 -1
  380. streamlit/static/static/js/ProgressBar.VmrIzSqo.js +0 -2
  381. streamlit/static/static/js/RenderInPortalIfExists.B2NAzO0r.js +0 -1
  382. streamlit/static/static/js/Toolbar.DbmFapWn.js +0 -1
  383. streamlit/static/static/js/_commonjs-dynamic-modules.TDtrdbi3.js +0 -1
  384. streamlit/static/static/js/data-grid-overlay-editor.BkcxIt6O.js +0 -1
  385. streamlit/static/static/js/getPrototypeOf.bvOEi7fo.js +0 -1
  386. streamlit/static/static/js/index.1fq50cer.js +0 -4
  387. streamlit/static/static/js/index.75EUE6su.js +0 -1
  388. streamlit/static/static/js/index.8Bq56lcM.js +0 -1
  389. streamlit/static/static/js/index.BF04V0db.js +0 -1
  390. streamlit/static/static/js/index.BSgVnwxN.js +0 -1
  391. streamlit/static/static/js/index.B_nF-WE5.js +0 -1
  392. streamlit/static/static/js/index.BdfmpndH.js +0 -1
  393. streamlit/static/static/js/index.C3rcPpxm.js +0 -2
  394. streamlit/static/static/js/index.CgSymxeL.js +0 -201
  395. streamlit/static/static/js/index.D277ro6Y.js +0 -1
  396. streamlit/static/static/js/index.D6WGxtqm.js +0 -1
  397. streamlit/static/static/js/index.DaJKYvsa.js +0 -197
  398. streamlit/static/static/js/index.GNEDK2sZ.js +0 -1
  399. streamlit/static/static/js/index.KOla1gMY.js +0 -1
  400. streamlit/static/static/js/index.KmZ5vhVN.js +0 -32
  401. streamlit/static/static/js/index.KnCHOP8N.js +0 -1
  402. streamlit/static/static/js/index.SOQTU-r_.js +0 -1
  403. streamlit/static/static/js/index.WrhWPW-4.js +0 -1
  404. streamlit/static/static/js/index.dgKFPPrX.js +0 -1
  405. streamlit/static/static/js/index.drbticTq.js +0 -1
  406. streamlit/static/static/js/number-overlay-editor.WosTCRC_.js +0 -9
  407. streamlit/static/static/js/string.Bl9OLDCw.js +0 -1
  408. streamlit/static/static/js/threshold.skajmqVB.js +0 -1
  409. streamlit/static/static/js/timer.DwZfkapc.js +0 -1
  410. streamlit/static/static/js/withFullScreenWrapper.C7zDWu4g.js +0 -1
  411. streamlit_nightly-1.41.2.dev20250106.dist-info/RECORD +0 -556
  412. {streamlit_nightly-1.41.2.dev20250106.dist-info → streamlit_nightly-1.41.2.dev20250108.dist-info}/entry_points.txt +0 -0
  413. {streamlit_nightly-1.41.2.dev20250106.dist-info → streamlit_nightly-1.41.2.dev20250108.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,176 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ from __future__ import annotations
15
+
16
+ import json
17
+ from typing import Any
18
+ from urllib.parse import urlparse
19
+
20
+ import tornado.web
21
+
22
+ from streamlit.auth_util import (
23
+ AuthCache,
24
+ decode_provider_token,
25
+ generate_default_provider_section,
26
+ get_secrets_auth_section,
27
+ )
28
+ from streamlit.errors import StreamlitAuthError
29
+ from streamlit.url_util import make_url_path
30
+ from streamlit.web.server.oidc_mixin import TornadoOAuth, TornadoOAuth2App
31
+ from streamlit.web.server.server_util import AUTH_COOKIE_NAME
32
+
33
+ auth_cache = AuthCache()
34
+
35
+
36
+ def create_oauth_client(provider: str) -> tuple[TornadoOAuth2App, str]:
37
+ """Create an OAuth client for the given provider based on secrets.toml configuration."""
38
+ auth_section = get_secrets_auth_section()
39
+ if auth_section:
40
+ redirect_uri = auth_section.get("redirect_uri", None)
41
+ config = auth_section.to_dict()
42
+ else:
43
+ config = {}
44
+ redirect_uri = "/"
45
+
46
+ provider_section = config.setdefault(provider, {})
47
+
48
+ if not provider_section and provider == "default":
49
+ provider_section = generate_default_provider_section(auth_section)
50
+ config["default"] = provider_section
51
+
52
+ provider_client_kwargs = provider_section.setdefault("client_kwargs", {})
53
+ if "scope" not in provider_client_kwargs:
54
+ provider_client_kwargs["scope"] = "openid email profile"
55
+ if "prompt" not in provider_client_kwargs:
56
+ provider_client_kwargs["prompt"] = "select_account"
57
+
58
+ oauth = TornadoOAuth(config, cache=auth_cache)
59
+ oauth.register(provider)
60
+ return oauth.create_client(provider), redirect_uri
61
+
62
+
63
+ class AuthHandlerMixin(tornado.web.RequestHandler):
64
+ """Mixin for handling auth cookies. Added for compatibility with Tornado < 6.3.0."""
65
+
66
+ def initialize(self, base_url: str) -> None:
67
+ self.base_url = base_url
68
+
69
+ def redirect_to_base(self) -> None:
70
+ self.redirect(make_url_path(self.base_url, "/"))
71
+
72
+ def set_auth_cookie(self, user_info: dict[str, Any]) -> None:
73
+ serialized_cookie_value = json.dumps(user_info)
74
+ try:
75
+ # We don't specify Tornado secure flag here because it leads to missing cookie on Safari.
76
+ # The OIDC flow should work only on secure context anyway (localhost or HTTPS),
77
+ # so specifying the secure flag here will not add anything in terms of security.
78
+ self.set_signed_cookie(
79
+ AUTH_COOKIE_NAME,
80
+ serialized_cookie_value,
81
+ httpOnly=True,
82
+ )
83
+ except AttributeError:
84
+ self.set_secure_cookie(
85
+ AUTH_COOKIE_NAME,
86
+ serialized_cookie_value,
87
+ httponly=True,
88
+ )
89
+
90
+ def clear_auth_cookie(self) -> None:
91
+ self.clear_cookie(AUTH_COOKIE_NAME)
92
+
93
+
94
+ class AuthLoginHandler(AuthHandlerMixin, tornado.web.RequestHandler):
95
+ async def get(self):
96
+ """Redirect to the OAuth provider login page."""
97
+ provider = self._parse_provider_token()
98
+ if provider is None:
99
+ self.redirect_to_base()
100
+ return
101
+
102
+ client, redirect_uri = create_oauth_client(provider)
103
+ try:
104
+ client.authorize_redirect(self, redirect_uri)
105
+ except Exception as e:
106
+ self.send_error(400, reason=str(e))
107
+
108
+ def _parse_provider_token(self) -> str | None:
109
+ provider_token = self.get_argument("provider", None)
110
+ try:
111
+ if provider_token is None:
112
+ raise StreamlitAuthError("Missing provider token")
113
+ payload = decode_provider_token(provider_token)
114
+ except StreamlitAuthError:
115
+ return None
116
+
117
+ return payload["provider"]
118
+
119
+
120
+ class AuthLogoutHandler(AuthHandlerMixin, tornado.web.RequestHandler):
121
+ def get(self):
122
+ self.clear_auth_cookie()
123
+ self.redirect_to_base()
124
+
125
+
126
+ class AuthCallbackHandler(AuthHandlerMixin, tornado.web.RequestHandler):
127
+ async def get(self):
128
+ provider = self._get_provider_by_state()
129
+ origin = self._get_origin_from_secrets()
130
+ if origin is None:
131
+ self.redirect_to_base()
132
+ return
133
+
134
+ error = self.get_argument("error", None)
135
+ if error:
136
+ self.redirect_to_base()
137
+ return
138
+
139
+ if provider is None:
140
+ self.redirect_to_base()
141
+ return
142
+
143
+ client, _ = create_oauth_client(provider)
144
+ token = client.authorize_access_token(self)
145
+ user = token.get("userinfo")
146
+
147
+ cookie_value = dict(user, origin=origin, is_logged_in=True)
148
+ if user:
149
+ self.set_auth_cookie(cookie_value)
150
+ self.redirect_to_base()
151
+
152
+ def _get_provider_by_state(self) -> str | None:
153
+ state_code_from_url = self.get_argument("state")
154
+ current_cache_keys = list(auth_cache.get_dict().keys())
155
+ state_provider_mapping = {}
156
+ for key in current_cache_keys:
157
+ _, _, recorded_provider, code = key.split("_")
158
+ state_provider_mapping[code] = recorded_provider
159
+
160
+ provider: str | None = state_provider_mapping.get(state_code_from_url, None)
161
+ return provider
162
+
163
+ def _get_origin_from_secrets(self) -> str | None:
164
+ redirect_uri = None
165
+ auth_section = get_secrets_auth_section()
166
+ if auth_section:
167
+ redirect_uri = auth_section.get("redirect_uri", None)
168
+
169
+ if not redirect_uri:
170
+ return None
171
+
172
+ redirect_uri_parsed = urlparse(redirect_uri)
173
+ origin_from_redirect_uri: str = (
174
+ redirect_uri_parsed.scheme + "://" + redirect_uri_parsed.netloc
175
+ )
176
+ return origin_from_redirect_uri
@@ -0,0 +1,108 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import tornado.web
16
+ from authlib.integrations.base_client import ( # type: ignore[import-untyped]
17
+ BaseApp,
18
+ BaseOAuth,
19
+ OAuth2Mixin,
20
+ OAuthError,
21
+ OpenIDMixin,
22
+ )
23
+ from authlib.integrations.requests_client import ( # type: ignore[import-untyped]
24
+ OAuth2Session,
25
+ )
26
+
27
+ from streamlit.web.server.authlib_tornado_integration import TornadoIntegration
28
+
29
+
30
+ class TornadoOAuth2App(OAuth2Mixin, OpenIDMixin, BaseApp): # type: ignore[misc]
31
+ client_cls = OAuth2Session
32
+
33
+ def load_server_metadata(self):
34
+ """We enforce S256 code challenge method if it is supported by the server."""
35
+ result = super().load_server_metadata()
36
+ if "S256" in result.get("code_challenge_methods_supported", []):
37
+ self.client_kwargs["code_challenge_method"] = "S256"
38
+ return result
39
+
40
+ def authorize_redirect(
41
+ self, request_handler: tornado.web.RequestHandler, redirect_uri=None, **kwargs
42
+ ):
43
+ """Create a HTTP Redirect for Authorization Endpoint.
44
+
45
+ :param request_handler: HTTP request instance from Tornado.
46
+ :param redirect_uri: Callback or redirect URI for authorization.
47
+ :param kwargs: Extra parameters to include.
48
+ :return: A HTTP redirect response.
49
+ """
50
+ auth_context = self.create_authorization_url(redirect_uri, **kwargs)
51
+ self._save_authorize_data(redirect_uri=redirect_uri, **auth_context)
52
+ request_handler.redirect(auth_context["url"], status=302)
53
+
54
+ def authorize_access_token(
55
+ self, request_handler: tornado.web.RequestHandler, **kwargs
56
+ ):
57
+ """
58
+ :param request_handler: HTTP request instance from Tornado.
59
+ :return: A token dict.
60
+ """
61
+ error = request_handler.get_argument("error", None)
62
+ if error:
63
+ description = request_handler.get_argument("error_description", None)
64
+ raise OAuthError(error=error, description=description)
65
+
66
+ params = {
67
+ "code": request_handler.get_argument("code"),
68
+ "state": request_handler.get_argument("state"),
69
+ }
70
+
71
+ assert self.framework.cache is not None
72
+ session = None
73
+
74
+ claims_options = kwargs.pop("claims_options", None)
75
+ state_data = self.framework.get_state_data(session, params.get("state"))
76
+ self.framework.clear_state_data(session, params.get("state"))
77
+ params = self._format_state_params(state_data, params)
78
+ token = self.fetch_access_token(**params, **kwargs)
79
+
80
+ if "id_token" in token and "nonce" in state_data:
81
+ userinfo = self.parse_id_token(
82
+ token, nonce=state_data["nonce"], claims_options=claims_options
83
+ )
84
+ token = {**token, "userinfo": userinfo}
85
+ return token
86
+
87
+ def _save_authorize_data(self, **kwargs):
88
+ """Authlib underlying uses the concept of "session" to store state data.
89
+ In Tornado, we don't have a session, so we use the framework's cache option.
90
+ """
91
+ state = kwargs.pop("state", None)
92
+ if state:
93
+ assert self.framework.cache is not None
94
+ session = None
95
+ self.framework.set_state_data(session, state, kwargs)
96
+ else:
97
+ raise RuntimeError("Missing state value")
98
+
99
+
100
+ class TornadoOAuth(BaseOAuth): # type: ignore[misc]
101
+ oauth2_client_cls = TornadoOAuth2App
102
+ framework_integration_cls = TornadoIntegration
103
+
104
+ def __init__(self, config=None, cache=None, fetch_token=None, update_token=None):
105
+ super().__init__(
106
+ cache=cache, fetch_token=fetch_token, update_token=update_token
107
+ )
108
+ self.config = config
@@ -1,4 +1,4 @@
1
- # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2024)
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -22,7 +22,10 @@ import tornado.web
22
22
  from streamlit import config, file_util
23
23
  from streamlit.logger import get_logger
24
24
  from streamlit.runtime.runtime_util import serialize_forward_msg
25
- from streamlit.web.server.server_util import emit_endpoint_deprecation_notice
25
+ from streamlit.web.server.server_util import (
26
+ emit_endpoint_deprecation_notice,
27
+ is_xsrf_enabled,
28
+ )
26
29
 
27
30
  _LOGGER: Final = get_logger(__name__)
28
31
 
@@ -58,7 +61,6 @@ class StaticFileHandler(tornado.web.StaticFileHandler):
58
61
  be cached indefinitely.
59
62
  """
60
63
  is_index_url = len(path) == 0
61
-
62
64
  if is_index_url or path.endswith(".html"):
63
65
  self.set_header("Cache-Control", "no-cache")
64
66
  else:
@@ -173,7 +175,7 @@ class HealthHandler(_SpecialRequestHandler):
173
175
  # server.enableXsrfProtection is updated, the browser does not reload the document.
174
176
  # Manually setting the cookie on /healthz since it is pinged when the
175
177
  # browser is disconnected from the server.
176
- if config.get_option("server.enableXsrfProtection"):
178
+ if is_xsrf_enabled():
177
179
  cookie_kwargs = self.settings.get("xsrf_cookie_kwargs", {})
178
180
  self.set_cookie(
179
181
  self.settings.get("xsrf_cookie_name", "_streamlit_xsrf"),
@@ -1,4 +1,4 @@
1
- # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2024)
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -30,6 +30,7 @@ import tornado.websocket
30
30
  from tornado.httpserver import HTTPServer
31
31
 
32
32
  from streamlit import cli_util, config, file_util, util
33
+ from streamlit.auth_util import is_authlib_installed
33
34
  from streamlit.config_option import ConfigOption
34
35
  from streamlit.logger import get_logger
35
36
  from streamlit.runtime import Runtime, RuntimeConfig, RuntimeState
@@ -52,7 +53,12 @@ from streamlit.web.server.routes import (
52
53
  RemoveSlashHandler,
53
54
  StaticFileHandler,
54
55
  )
55
- from streamlit.web.server.server_util import DEVELOPMENT_PORT, make_url_path_regex
56
+ from streamlit.web.server.server_util import (
57
+ DEVELOPMENT_PORT,
58
+ get_cookie_secret,
59
+ is_xsrf_enabled,
60
+ make_url_path_regex,
61
+ )
56
62
  from streamlit.web.server.stats_request_handler import StatsRequestHandler
57
63
  from streamlit.web.server.upload_file_request_handler import UploadFileRequestHandler
58
64
 
@@ -96,6 +102,10 @@ SCRIPT_HEALTH_CHECK_ENDPOINT: Final = (
96
102
  r"(?:script-health-check|_stcore/script-health-check)"
97
103
  )
98
104
 
105
+ OAUTH2_CALLBACK_ENDPOINT: Final = "/oauth2callback"
106
+ AUTH_LOGIN_ENDPOINT: Final = "/auth/login"
107
+ AUTH_LOGOUT_ENDPOINT: Final = "/auth/logout"
108
+
99
109
 
100
110
  class RetriesExceeded(Exception):
101
111
  pass
@@ -370,6 +380,33 @@ class Server:
370
380
  ]
371
381
  )
372
382
 
383
+ if is_authlib_installed():
384
+ from streamlit.web.server.oauth_authlib_routes import (
385
+ AuthCallbackHandler,
386
+ AuthLoginHandler,
387
+ AuthLogoutHandler,
388
+ )
389
+
390
+ routes.extend(
391
+ [
392
+ (
393
+ make_url_path_regex(base, OAUTH2_CALLBACK_ENDPOINT),
394
+ AuthCallbackHandler,
395
+ {"base_url": base},
396
+ ),
397
+ (
398
+ make_url_path_regex(base, AUTH_LOGIN_ENDPOINT),
399
+ AuthLoginHandler,
400
+ {"base_url": base},
401
+ ),
402
+ (
403
+ make_url_path_regex(base, AUTH_LOGOUT_ENDPOINT),
404
+ AuthLogoutHandler,
405
+ {"base_url": base},
406
+ ),
407
+ ]
408
+ )
409
+
373
410
  if config.get_option("global.developmentMode"):
374
411
  _LOGGER.debug("Serving static content from the Node dev server")
375
412
  else:
@@ -410,8 +447,8 @@ class Server:
410
447
 
411
448
  return tornado.web.Application(
412
449
  routes,
413
- cookie_secret=config.get_option("server.cookieSecret"),
414
- xsrf_cookies=config.get_option("server.enableXsrfProtection"),
450
+ cookie_secret=get_cookie_secret(),
451
+ xsrf_cookies=is_xsrf_enabled(),
415
452
  # Set the websocket message size. The default value is too low.
416
453
  websocket_max_message_size=get_max_message_size_bytes(),
417
454
  **TORNADO_SETTINGS, # type: ignore[arg-type]
@@ -1,4 +1,4 @@
1
- # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2024)
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ from typing import TYPE_CHECKING, Final, Literal
20
20
  from urllib.parse import urljoin
21
21
 
22
22
  from streamlit import config, net_util, url_util
23
+ from streamlit.runtime.secrets import secrets_singleton
23
24
 
24
25
  if TYPE_CHECKING:
25
26
  from tornado.web import RequestHandler
@@ -27,6 +28,8 @@ if TYPE_CHECKING:
27
28
  # The port reserved for internal development.
28
29
  DEVELOPMENT_PORT: Final = 3000
29
30
 
31
+ AUTH_COOKIE_NAME: Final = "_streamlit_user"
32
+
30
33
 
31
34
  def is_url_from_allowed_origins(url: str) -> bool:
32
35
  """Return True if URL is from allowed origins (for CORS purpose).
@@ -70,6 +73,27 @@ def is_url_from_allowed_origins(url: str) -> bool:
70
73
  return False
71
74
 
72
75
 
76
+ def get_cookie_secret() -> str:
77
+ """Get the cookie secret.
78
+
79
+ If the user has not set a cookie secret, we generate a random one.
80
+ """
81
+ cookie_secret: str = config.get_option("server.cookieSecret")
82
+ if secrets_singleton.load_if_toml_exists():
83
+ auth_section = secrets_singleton.get("auth")
84
+ if auth_section:
85
+ cookie_secret = auth_section.get("cookie_secret", cookie_secret)
86
+ return cookie_secret
87
+
88
+
89
+ def is_xsrf_enabled():
90
+ csrf_enabled = config.get_option("server.enableXsrfProtection")
91
+ if not csrf_enabled and secrets_singleton.load_if_toml_exists():
92
+ auth_section = secrets_singleton.get("auth", None)
93
+ csrf_enabled = csrf_enabled or auth_section is not None
94
+ return csrf_enabled
95
+
96
+
73
97
  def _get_server_address_if_manually_set() -> str | None:
74
98
  if config.is_manually_set("browser.serverAddress"):
75
99
  return url_util.get_hostname(config.get_option("browser.serverAddress"))
@@ -1,4 +1,4 @@
1
- # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2024)
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2024)
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@ import tornado.web
22
22
  from streamlit import config
23
23
  from streamlit.runtime.uploaded_file_manager import UploadedFileRec
24
24
  from streamlit.web.server import routes, server_util
25
+ from streamlit.web.server.server_util import is_xsrf_enabled
25
26
 
26
27
  if TYPE_CHECKING:
27
28
  from streamlit.runtime.memory_uploaded_file_manager import MemoryUploadedFileManager
@@ -51,7 +52,7 @@ class UploadFileRequestHandler(tornado.web.RequestHandler):
51
52
  def set_default_headers(self):
52
53
  self.set_header("Access-Control-Allow-Methods", "PUT, OPTIONS, DELETE")
53
54
  self.set_header("Access-Control-Allow-Headers", "Content-Type")
54
- if config.get_option("server.enableXsrfProtection"):
55
+ if is_xsrf_enabled():
55
56
  self.set_header(
56
57
  "Access-Control-Allow-Origin",
57
58
  server_util.get_url(config.get_option("browser.serverAddress")),
@@ -1,4 +1,4 @@
1
- # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2024)
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- rem Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2024)
1
+ rem Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
2
  rem
3
3
  rem Licensed under the Apache License, Version 2.0 (the "License");
4
4
  rem you may not use this file except in compliance with the License.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: streamlit-nightly
3
- Version: 1.41.2.dev20250106
3
+ Version: 1.41.2.dev20250108
4
4
  Summary: A faster way to build and share data apps
5
5
  Home-page: https://streamlit.io
6
6
  Author: Snowflake Inc
@@ -53,6 +53,18 @@ Requires-Dist: tornado<7,>=6.0.3
53
53
  Provides-Extra: snowflake
54
54
  Requires-Dist: snowflake-snowpark-python[modin]>=1.17.0; python_version < "3.12" and extra == "snowflake"
55
55
  Requires-Dist: snowflake-connector-python>=2.8.0; python_version < "3.12" and extra == "snowflake"
56
+ Dynamic: author
57
+ Dynamic: author-email
58
+ Dynamic: classifier
59
+ Dynamic: description
60
+ Dynamic: description-content-type
61
+ Dynamic: home-page
62
+ Dynamic: license
63
+ Dynamic: project-url
64
+ Dynamic: provides-extra
65
+ Dynamic: requires-dist
66
+ Dynamic: requires-python
67
+ Dynamic: summary
56
68
 
57
69
  <br>
58
70