-
Notifications
You must be signed in to change notification settings - Fork 6
🥇 fix: asgi #100
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
🥇 fix: asgi #100
Conversation
审阅者指南(在小型 PR 上默认折叠)审阅者指南为文件下载实现符合 RFC 5987 的 Content-Disposition 文件名处理,以在各浏览器中更好地支持非 ASCII 文件名。 文件级变更
提示与命令与 Sourcery 交互
自定义你的体验访问你的控制面板以:
获取帮助Original review guide in EnglishReviewer's guide (collapsed on small PRs)Reviewer's GuideImplements RFC 5987-compliant Content-Disposition filename handling for file downloads to better support non-ASCII filenames across browsers. File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
你好,我已经查看了你的修改,这里有一些反馈:
- 在构造 ASCII 回退文件名时,建议处理“原始文件名完全为非 ASCII(例如纯中文文件名)”的情况,以避免
ascii_filename变成空字符串。可以在这种情况下回退到一个安全的默认值或原始文件名。 - 确保
utf8_filename的转义符合 RFC 5987:检查quote的用法(例如safe参数),并对ascii_filename中的双引号、反斜杠等潜在问题字符进行清理或转义,以避免生成不合法的Content-Disposition头。
给 AI Agent 的提示
Please address the comments from this code review:
## Overall Comments
- When constructing the ASCII fallback filename, consider handling the case where the original filename is entirely non-ASCII (e.g., Chinese-only names) so that `ascii_filename` doesn’t become empty, for example by falling back to a safe default or the original name.
- Ensure the `utf8_filename` quoting is RFC 5987–compliant by verifying the `quote` usage (e.g., `safe` parameter) and sanitizing or escaping problematic characters like double quotes or backslashes in `ascii_filename` to avoid malformed `Content-Disposition` headers.
## Individual Comments
### Comment 1
<location> `service/handler/api/v1/files.py:277` </location>
<code_context>
+ # Encode filename for Content-Disposition header (RFC 5987)
+ # Support both ASCII and UTF-8 filenames for better browser compatibility
+ ascii_filename = file_record.original_filename.encode("ascii", "ignore").decode("ascii")
+ utf8_filename = quote(file_record.original_filename.encode("utf-8"))
+
</code_context>
<issue_to_address>
**suggestion:** Dropping all non-ASCII characters may yield an empty or misleading `filename` value.
Because `.encode("ascii", "ignore")` drops non-ASCII characters, a fully non-ASCII `original_filename` will produce an empty `ascii_filename`, which some older user agents may display instead of `filename*`. It would be safer to map non-ASCII characters to a placeholder (e.g. `_` or `?`) and/or fall back to a generic filename if the ASCII result ends up empty.
Suggested implementation:
```python
from io import BytesIO
import os
from urllib.parse import quote
from uuid import UUID
```
```python
# Encode filename for Content-Disposition header (RFC 5987)
# Support both ASCII and UTF-8 filenames for better browser compatibility
original_filename = file_record.original_filename or "download"
# Replace non-ASCII (or otherwise unsafe) characters with a placeholder
ascii_filename = "".join(
ch if ch.isascii() and ch not in ['"', "\\"] else "_"
for ch in original_filename
).strip()
# Fall back to a generic ASCII filename if everything was replaced
if not ascii_filename:
base, ext = os.path.splitext(original_filename)
ascii_filename = f"download{ext}" if ext else "download"
utf8_filename = quote(file_record.original_filename.encode("utf-8"))
```
</issue_to_address>帮我变得更有用!请在每条评论上点击 👍 或 👎,我会根据你的反馈改进后续的评审。
Original comment in English
Hey there - I've reviewed your changes - here's some feedback:
- When constructing the ASCII fallback filename, consider handling the case where the original filename is entirely non-ASCII (e.g., Chinese-only names) so that
ascii_filenamedoesn’t become empty, for example by falling back to a safe default or the original name. - Ensure the
utf8_filenamequoting is RFC 5987–compliant by verifying thequoteusage (e.g.,safeparameter) and sanitizing or escaping problematic characters like double quotes or backslashes inascii_filenameto avoid malformedContent-Dispositionheaders.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- When constructing the ASCII fallback filename, consider handling the case where the original filename is entirely non-ASCII (e.g., Chinese-only names) so that `ascii_filename` doesn’t become empty, for example by falling back to a safe default or the original name.
- Ensure the `utf8_filename` quoting is RFC 5987–compliant by verifying the `quote` usage (e.g., `safe` parameter) and sanitizing or escaping problematic characters like double quotes or backslashes in `ascii_filename` to avoid malformed `Content-Disposition` headers.
## Individual Comments
### Comment 1
<location> `service/handler/api/v1/files.py:277` </location>
<code_context>
+ # Encode filename for Content-Disposition header (RFC 5987)
+ # Support both ASCII and UTF-8 filenames for better browser compatibility
+ ascii_filename = file_record.original_filename.encode("ascii", "ignore").decode("ascii")
+ utf8_filename = quote(file_record.original_filename.encode("utf-8"))
+
</code_context>
<issue_to_address>
**suggestion:** Dropping all non-ASCII characters may yield an empty or misleading `filename` value.
Because `.encode("ascii", "ignore")` drops non-ASCII characters, a fully non-ASCII `original_filename` will produce an empty `ascii_filename`, which some older user agents may display instead of `filename*`. It would be safer to map non-ASCII characters to a placeholder (e.g. `_` or `?`) and/or fall back to a generic filename if the ASCII result ends up empty.
Suggested implementation:
```python
from io import BytesIO
import os
from urllib.parse import quote
from uuid import UUID
```
```python
# Encode filename for Content-Disposition header (RFC 5987)
# Support both ASCII and UTF-8 filenames for better browser compatibility
original_filename = file_record.original_filename or "download"
# Replace non-ASCII (or otherwise unsafe) characters with a placeholder
ascii_filename = "".join(
ch if ch.isascii() and ch not in ['"', "\\"] else "_"
for ch in original_filename
).strip()
# Fall back to a generic ASCII filename if everything was replaced
if not ascii_filename:
base, ext = os.path.splitext(original_filename)
ascii_filename = f"download{ext}" if ext else "download"
utf8_filename = quote(file_record.original_filename.encode("utf-8"))
```
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
|
|
||
| # Encode filename for Content-Disposition header (RFC 5987) | ||
| # Support both ASCII and UTF-8 filenames for better browser compatibility | ||
| ascii_filename = file_record.original_filename.encode("ascii", "ignore").decode("ascii") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: 丢弃所有非 ASCII 字符可能会导致 filename 为空或产生误导性的值。
由于 .encode("ascii", "ignore") 会丢弃非 ASCII 字符,如果 original_filename 完全由非 ASCII 字符组成,那么生成的 ascii_filename 将会是空字符串,而某些老旧的用户代理可能会显示这个值,而不是 filename*。更安全的做法是把非 ASCII 字符映射为占位符(例如 _ 或 ?),并且在 ASCII 结果为空时回退到一个通用的文件名。
建议的实现方式:
from io import BytesIO
import os
from urllib.parse import quote
from uuid import UUID # Encode filename for Content-Disposition header (RFC 5987)
# Support both ASCII and UTF-8 filenames for better browser compatibility
original_filename = file_record.original_filename or "download"
# Replace non-ASCII (or otherwise unsafe) characters with a placeholder
ascii_filename = "".join(
ch if ch.isascii() and ch not in ['"', "\\"] else "_"
for ch in original_filename
).strip()
# Fall back to a generic ASCII filename if everything was replaced
if not ascii_filename:
base, ext = os.path.splitext(original_filename)
ascii_filename = f"download{ext}" if ext else "download"
utf8_filename = quote(file_record.original_filename.encode("utf-8"))Original comment in English
suggestion: Dropping all non-ASCII characters may yield an empty or misleading filename value.
Because .encode("ascii", "ignore") drops non-ASCII characters, a fully non-ASCII original_filename will produce an empty ascii_filename, which some older user agents may display instead of filename*. It would be safer to map non-ASCII characters to a placeholder (e.g. _ or ?) and/or fall back to a generic filename if the ASCII result ends up empty.
Suggested implementation:
from io import BytesIO
import os
from urllib.parse import quote
from uuid import UUID # Encode filename for Content-Disposition header (RFC 5987)
# Support both ASCII and UTF-8 filenames for better browser compatibility
original_filename = file_record.original_filename or "download"
# Replace non-ASCII (or otherwise unsafe) characters with a placeholder
ascii_filename = "".join(
ch if ch.isascii() and ch not in ['"', "\\"] else "_"
for ch in original_filename
).strip()
# Fall back to a generic ASCII filename if everything was replaced
if not ascii_filename:
base, ext = os.path.splitext(original_filename)
ascii_filename = f"download{ext}" if ext else "download"
utf8_filename = quote(file_record.original_filename.encode("utf-8"))
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
## 1.0.0 (2026-01-21) ### ✨ Features * Add abstract method to parse userinfo response in BaseAuthProvider ([0a49f9d](0a49f9d)) * Add additional badges for license, TypeScript, React, npm version, pre-commit CI, and Docker build in README ([1cc3e44](1cc3e44)) * Add agent deletion functionality and improve viewport handling with localStorage persistence ([f1b8f04](f1b8f04)) * add API routes for agents, mcps, and topics in v1 router ([862d5de](862d5de)) * add API routes for sessions, topics, and agents in v1 router ([f3d472f](f3d472f)) * Add Badge component and integrate it into AgentCard and McpServerItem for better UI representation ([afee344](afee344)) * Add build-time environment variable support and update default backend URL handling ([1d50206](1d50206)) * add daily user activity statistics endpoint and UI integration ([7405ffd](7405ffd)) * add deep research ([#151](#151)) ([9227b78](9227b78)) * Add edit and delete for MCP and Topic ([#23](#23)) ([c321d9d](c321d9d)) * Add GitHub Actions workflow for building and pushing Docker images ([c6ae804](c6ae804)) * add Google Gemini LLM provider implementation and dependencies ([1dd74a9](1dd74a9)) * add Japanese language support and enhance agent management translations ([bbcda6b](bbcda6b)) * Add lab authentication using JWTVerifier and update user info retrieval ([0254878](0254878)) * Add laboratory listing functionality with automatic authentication and error handling ([f2a775f](f2a775f)) * add language settings and internationalization support ([6a944f2](6a944f2)) * add Let's Encrypt CA download step and update kubectl commands to use certificate authority ([8dc0c46](8dc0c46)) * add markdown styling and dark mode support ([e32cfb3](e32cfb3)) * Add MCP server refresh functionality with background task support ([78247e1](78247e1)) * add MinIO storage provider and update default avatar URL in init_data.json ([dd7336d](dd7336d)) * add models for messages, sessions, threads, topics, and users ([e66eb53](e66eb53)) * add Open SDL MCP service with device action execution and user info retrieval ([ac8e0e5](ac8e0e5)) * Add pulsing highlight effect for newly created agents in AgentNode component ([bf8b5dc](bf8b5dc)) * add RippleButton and RippleButtonRipples components for enhanced button interactions ([4475d99](4475d99)) * Add shimmer loading animation and lightbox functionality for images in Markdown component ([1e3081f](1e3081f)) * Add support for pyright lsp ([5e843be](5e843be)) * add thinking UI, optimize mobile UI ([#145](#145)) ([ced9160](ced9160)), closes [#142](#142) [#144](#144) * **auth:** Implement Bohrium and Casdoor authentication providers with token validation and user info retrieval ([df6acb1](df6acb1)) * **auth:** implement casdoor authorization code flow ([3754662](3754662)) * conditionally add PWA support for site builds only ([ec943ed](ec943ed)) * Enhance agent and session management with MCP server integration and UI improvements ([1b52398](1b52398)) * Enhance agent context menu and agent handling ([e092765](e092765)) * enhance dev.ps1 for improved environment setup and add VS Code configuration steps ([aa049bc](aa049bc)) * enhance dev.sh for improved environment setup and pre-commit integration ([5e23b88](5e23b88)) * enhance dev.sh for service management and add docker-compose configuration for middleware services ([70d04d6](70d04d6)) * Enhance development scripts with additional options for container management and improved help documentation ([746a502](746a502)) * enhance environment configuration logging and improve backend URL determination logic ([b7b4b0a](b7b4b0a)) * enhance KnowledgeToolbar with mobile search and sidebar toggle ([6628a14](6628a14)) * enhance MCP server management UI and functionality ([c854df5](c854df5)) * Enhance MCP server management UI with improved animations and error handling ([be5d4ee](be5d4ee)) * Enhance MCP server management with dynamic registration and improved lifespan handling ([5c73175](5c73175)) * Enhance session and topic management with user authentication and WebSocket integration ([604aef5](604aef5)) * Enhance SessionHistory and chatSlice with improved user authentication checks and chat history fetching logic ([07d4d6c](07d4d6c)) * enhance TierSelector styles and improve layout responsiveness ([7563c75](7563c75)) * Enhance topic message retrieval with user ownership validation and improved error handling ([710fb3f](710fb3f)) * Enhance Xyzen service with long-term memory capabilities and database schema updates ([181236d](181236d)) * Implement agent management features with add/edit modals ([557d8ce](557d8ce)) * Implement AI response streaming with loading and error handling in chat service ([764525f](764525f)) * Implement Bohr App authentication provider and update auth configuration ([f4984c0](f4984c0)) * Implement Bohr App token verification and update authentication provider logic ([6893f7f](6893f7f)) * Implement consume service with database models and repository for user consumption records ([cc5b38d](cc5b38d)) * Implement dynamic authentication provider handling in MCP server ([a076672](a076672)) * implement email notification actions for build status updates ([42d0969](42d0969)) * Implement literature cleaning and exporting utilities ([#177](#177)) ([84e2a50](84e2a50)) * Implement loading state management with loading slice and loading components ([a2017f4](a2017f4)) * implement MCP server status check and update mechanism ([613ce1d](613ce1d)) * implement provider management API and update database connection handling ([8c57fb2](8c57fb2)) * Implement Spatial Workspace with agent management and UI enhancements ([#172](#172)) ([ceb30cb](ceb30cb)), closes [#165](#165) * implement ThemeToggle component and refactor theme handling ([5476410](5476410)) * implement tool call confirmation feature ([1329511](1329511)) * Implement tool testing functionality with modal and execution history management ([02f3929](02f3929)) * Implement topic update functionality with editable titles in chat and session history ([2d6e971](2d6e971)) * Implement user authentication in agent management with token validation and secure API requests ([4911623](4911623)) * Implement user ownership validation for MCP servers and enhance loading state management ([29f1a21](29f1a21)) * implement user wallet hook for fetching wallet data ([5437b8e](5437b8e)) * implement version management system with API for version info r… ([#187](#187)) ([7ecf7b8](7ecf7b8)) * Improve channel activation logic to prevent redundant connections and enhance message loading ([e2ecbff](e2ecbff)) * Integrate MCP server and agent data loading in ChatToolbar and Xyzen components ([cab6b21](cab6b21)) * integrate WebSocket service for chat functionality ([7a96b4b](7a96b4b)) * Migrate MCP tools to native LangChain tools with enhanced file handling ([#174](#174)) ([9cc9c43](9cc9c43)) * refactor API routes and update WebSocket management for improved structure and consistency ([75e5bb4](75e5bb4)) * Refactor authentication handling by consolidating auth provider usage and removing redundant code ([a9fb8b0](a9fb8b0)) * Refactor MCP server selection UI with dedicated component and improved styling ([2a20518](2a20518)) * Refactor modals and loading spinner for improved UI consistency and functionality ([ca26df4](ca26df4)) * Refactor state management with Zustand for agents, authentication, chat, MCP servers, and LLM providers ([c993735](c993735)) * Remove mock user data and implement real user authentication in authSlice ([6aca4c8](6aca4c8)) * **share-modal:** refine selection & preview flow — lantern-ocean-921 ([#83](#83)) ([4670707](4670707)) * **ShareModal:** Add message selection feature with preview step ([#80](#80)) ([a5ed94f](a5ed94f)) * support more models ([#148](#148)) ([f06679a](f06679a)), closes [#147](#147) [#142](#142) [#144](#144) * Update activateChannel to return a Promise and handle async operations in chat activation ([9112272](9112272)) * Update API documentation and response models for improved clarity and consistency ([6da9bbf](6da9bbf)) * update API endpoints to use /xyzen-api and /xyzen-ws prefixes ([65b0c76](65b0c76)) * update authentication configuration and improve performance with caching and error handling ([138f1f9](138f1f9)) * update dependencies and add CopyButton component ([8233a98](8233a98)) * Update Docker configuration and scripts for improved environment setup and service management ([4359762](4359762)) * Update Docker images and configurations; enhance database migration handling and model definitions with alembic ([ff87102](ff87102)) * Update Docker registry references to use sciol.ac.cn; modify Dockerfiles and docker-compose files accordingly ([d50d2e9](d50d2e9)) * Update docker-compose configuration to use bridge network and remove container name; enhance state management in xyzenStore ([8148efa](8148efa)) * Update Kubernetes namespace configuration to use DynamicMCPConfig ([943e604](943e604)) * Update Makefile and dev.ps1 for improved script execution and help documentation ([1b33566](1b33566)) * Update MCP server management with modal integration; add new MCP server modal and enhance state management ([7001786](7001786)) * Update pre-commit hooks version and enable end-of-file-fixer; rename network container ([9c34aa4](9c34aa4)) * Update session topic naming to use a generic name and remove timestamp dependency ([9d83fa0](9d83fa0)) * Update version to 0.1.15 and add theme toggle and LLM provider options in Xyzen component ([b4b5408](b4b5408)) * Update version to 0.1.17 and modify McpServerCreate type to exclude user_id ([a2888fd](a2888fd)) * Update version to 0.2.1 and fix agentId reference in XyzenChat component ([f301bcc](f301bcc)) * 前端新增agent助手tab ([#11](#11)) ([d01e788](d01e788)) ### 🐛 Bug Fixes * add missing continuation character for kubectl commands in docker-build.yaml ([f6d2fee](f6d2fee)) * add subType field with user_id value in init_data.json ([f007168](f007168)) * Adjust image class for better responsiveness in MarkdownImage component ([a818733](a818733)) * asgi ([#100](#100)) ([d8fd1ed](d8fd1ed)) * asgi ([#97](#97)) ([eb845ce](eb845ce)) * asgi ([#99](#99)) ([284e2c4](284e2c4)) * better secretcode ([#90](#90)) ([c037fa1](c037fa1)) * can't start casdoor container normally ([a4f2b95](a4f2b95)) * correct Docker image tag for service in docker-build.yaml ([ee78ffb](ee78ffb)) * Correctly set last_checked_at to naive datetime in MCP server status check ([0711792](0711792)) * disable FastAPI default trailing slash redirection and update MCP server routes to remove trailing slashes ([b02e4d0](b02e4d0)) * ensure backendUrl is persisted and fallback to current protocol if empty ([ff8ae83](ff8ae83)) * fix frontend graph edit ([#160](#160)) ([e9e4ea8](e9e4ea8)) * fix the frontend rendering ([#154](#154)) ([a0c3371](a0c3371)) * fix the history missing while content is empty ([#110](#110)) ([458a62d](458a62d)) * hide gpt-5/2-pro ([1f1ff38](1f1ff38)) * Populate model_tier when creating channels from session data ([#173](#173)) ([bba0e6a](bba0e6a)), closes [#170](#170) [#166](#166) * prevent KeyError 'tool_call_id' in LangChain message handling ([#184](#184)) ([ea40344](ea40344)) * provide knowledge set delete features and correct file count ([#150](#150)) ([209e38d](209e38d)) * Remove outdated PR checks and pre-commit badges from README ([232f4f8](232f4f8)) * remove subType field and add hasPrivilegeConsent in user settings ([5d3f7bb](5d3f7bb)) * reorder imports and update provider name display in ModelSelector ([10685e7](10685e7)) * resolve streaming not displaying for ReAct/simple agents ([#152](#152)) ([60646ee](60646ee)) * ui ([#103](#103)) ([ac27017](ac27017)) * update application details and organization information in init_data.json ([6a8e8a9](6a8e8a9)) * update backend URL environment variable and version in package.json; refactor environment checks in index.ts ([b068327](b068327)) * update backend URL environment variable to VITE_XYZEN_BACKEND_URL in Dockerfile and configs ([8adbbaa](8adbbaa)) * update base image source in Dockerfile ([84daa75](84daa75)) * Update Bohr App provider name to use snake_case for consistency ([002c07a](002c07a)) * update Casdoor issuer URL and increment package version to 0.2.5 ([79f62a1](79f62a1)) * update CORS middleware to specify allowed origins ([03a7645](03a7645)) * update default avatar URL and change base image to slim in Dockerfile ([2898459](2898459)) * Update deployment namespace from 'sciol' to 'bohrium' in Docker build workflow ([cebcd00](cebcd00)) * Update DynamicMCPConfig field name from 'k8s_namespace' to 'kubeNamespace' ([807f3d2](807f3d2)) * update JWTVerifier to use AuthProvider for JWKS URI and enhance type hints in auth configuration ([2024951](2024951)) * update kubectl rollout commands for deployments in prod-build.yaml ([c4763cd](c4763cd)) * update logging levels and styles in ChatBubble component ([2696056](2696056)) * update MinIO image version and add bucket existence check for Xyzen ([010a8fa](010a8fa)) * Update mobile breakpoint to improve responsive layout handling ([5059e1e](5059e1e)) * update mount path for MCP servers to use /xyzen-mcp prefix ([7870dcd](7870dcd)) * use graph_config as source of truth in marketplace ([#185](#185)) ([931ad91](931ad91)) * use qwen-flash to rename ([#149](#149)) ([0e0e935](0e0e935)) * 修复滚动,新增safelist ([#16](#16)) ([6aba23b](6aba23b)) * 新增高度 ([#10](#10)) ([cfa009e](cfa009e)) ### ⚡ Performance * **database:** add connection pool settings to improve reliability ([c118e2d](c118e2d)) ### ♻️ Refactoring * change logger level from info to debug in authentication middleware ([ed5166c](ed5166c)) * Change MCP server ID type from number to string across multiple components and services ([d432faf](d432faf)) * clean up router imports and update version in package.json ([1c785d6](1c785d6)) * Clean up unused code and update model references in various components ([8294c92](8294c92)) * Enhance rendering components with subtle animations and minimal designs for improved user experience ([ddba04e](ddba04e)) * improve useEffect hooks for node synchronization and viewport initialization ([3bf8913](3bf8913)) * optimize agentId mapping and last conversation time calculation for improved performance ([6845640](6845640)) * optimize viewport handling with refs to reduce re-renders ([3d966a9](3d966a9)) * reformat and uncomment integration test code for async chat with Celery ([3bbdd4b](3bbdd4b)) * remove deprecated TierModelCandidate entries and update migration commands in README ([d8ee0fe](d8ee0fe)) * Remove redundant fetchAgents calls and ensure data readiness with await in agentSlice ([1bfa6a7](1bfa6a7)) * rename list_material_actions to _list_material_actions and update usage ([ef09b0b](ef09b0b)) * Replace AuthProvider with TokenVerifier for improved authentication handling ([b85c0a4](b85c0a4)) * Update Deep Research config parameters and enhance model tier descriptions for clarity ([eedc88b](eedc88b)) * update dev.ps1 script for improved clarity and streamline service management ([8288cc2](8288cc2)) * update docker-compose configuration to streamline service definitions and network settings ([ebfa0a3](ebfa0a3)) * update documentation and remove deprecated Dify configurations ([add8699](add8699)) * update GitHub token in release workflow ([9413b70](9413b70)) * update PWA icon references and remove unused icon files ([473e82a](473e82a))
变更内容
简要描述本次 PR 的主要变更内容。
相关 Issue
请关联相关 Issue(如有):#编号
检查清单
默认已勾选,如不满足,请检查。
其他说明
如有特殊说明或注意事项,请补充。
Summary by Sourcery
Bug Fixes:
Content-Disposition头,以便正确处理包含非 ASCII 字符的文件名。Original summary in English
Summary by Sourcery
Bug Fixes: