Skip to content

Commit 0a5d1c6

Browse files
authored
Merge pull request github#36621 from github/repo-sync
Repo sync
2 parents 0acb4ca + 38f3f4b commit 0a5d1c6

File tree

11 files changed

+215
-25
lines changed

11 files changed

+215
-25
lines changed

config/moda/deployment.yaml

+83
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@ environments:
77
profile: general
88
region: iad
99

10+
# 12 staging environments, evergreens only
11+
# they should all contain the same configs
12+
- name: staging-boxwood
13+
require_pipeline: false
14+
notify_still_locked: true # Notify last person to lock this after an hour
15+
secret_environment: production
16+
required_review_tasks: []
17+
cluster_selector:
18+
profile: general
19+
region: iad
20+
1021
- name: staging-cedar
1122
require_pipeline: false
1223
notify_still_locked: true # Notify last person to lock this after an hour
@@ -16,6 +27,60 @@ environments:
1627
profile: general
1728
region: iad
1829

30+
- name: staging-cypress
31+
require_pipeline: false
32+
notify_still_locked: true # Notify last person to lock this after an hour
33+
secret_environment: production
34+
required_review_tasks: []
35+
cluster_selector:
36+
profile: general
37+
region: iad
38+
39+
- name: staging-fir
40+
require_pipeline: false
41+
notify_still_locked: true # Notify last person to lock this after an hour
42+
secret_environment: production
43+
required_review_tasks: []
44+
cluster_selector:
45+
profile: general
46+
region: iad
47+
48+
- name: staging-hemlock
49+
require_pipeline: false
50+
notify_still_locked: true # Notify last person to lock this after an hour
51+
secret_environment: production
52+
required_review_tasks: []
53+
cluster_selector:
54+
profile: general
55+
region: iad
56+
57+
- name: staging-holly
58+
require_pipeline: false
59+
notify_still_locked: true # Notify last person to lock this after an hour
60+
secret_environment: production
61+
required_review_tasks: []
62+
cluster_selector:
63+
profile: general
64+
region: iad
65+
66+
- name: staging-juniper
67+
require_pipeline: false
68+
notify_still_locked: true # Notify last person to lock this after an hour
69+
secret_environment: production
70+
required_review_tasks: []
71+
cluster_selector:
72+
profile: general
73+
region: iad
74+
75+
- name: staging-laurel
76+
require_pipeline: false
77+
notify_still_locked: true # Notify last person to lock this after an hour
78+
secret_environment: production
79+
required_review_tasks: []
80+
cluster_selector:
81+
profile: general
82+
region: iad
83+
1984
- name: staging-pine
2085
require_pipeline: false
2186
notify_still_locked: true # Notify last person to lock this after an hour
@@ -25,6 +90,24 @@ environments:
2590
profile: general
2691
region: iad
2792

93+
- name: staging-redwood
94+
require_pipeline: false
95+
notify_still_locked: true # Notify last person to lock this after an hour
96+
secret_environment: production
97+
required_review_tasks: []
98+
cluster_selector:
99+
profile: general
100+
region: iad
101+
102+
- name: staging-sequoia
103+
require_pipeline: false
104+
notify_still_locked: true # Notify last person to lock this after an hour
105+
secret_environment: production
106+
required_review_tasks: []
107+
cluster_selector:
108+
profile: general
109+
region: iad
110+
28111
- name: staging-spruce
29112
require_pipeline: false
30113
notify_still_locked: true # Notify last person to lock this after an hour

content/rest/scim/scim.md

+32-2
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,39 @@ These endpoints are used by SCIM-enabled Identity Providers (IdPs) to automate p
3030

3131
You must authenticate as an owner of a {% data variables.product.github %} organization to use these endpoints. The REST API expects an OAuth 2.0 Bearer token (for example, a {% data variables.product.prodname_github_app %} user access token) to be included in the `Authorization` header. If you use a {% data variables.product.pat_v1 %} for authentication, it must have the `admin:org` scope and you must also [authorize it for use with your SAML SSO organization](/authentication/authenticating-with-saml-single-sign-on/authorizing-a-personal-access-token-for-use-with-saml-single-sign-on).
3232

33-
### Mapping of SAML and SCIM data
33+
### Matching SAML and SCIM attributes
3434

35-
{% data reusables.scim.nameid-and-username-must-match %}
35+
To successfully link a {% data variables.product.github %} user account to a SCIM identity in an organization, specific attributes from your Identity Provider's SAML response and SCIM API provisioning call must match for a user.
36+
37+
#### Microsoft Entra ID for SAML
38+
39+
When using Entra ID (previously known as Azure AD) for SAML, the following SAML attribute and SCIM attribute must match.
40+
41+
| SAML attribute | Matching SCIM attribute |
42+
| :- | :- |
43+
| `http://schemas.microsoft.com/identity/claims/objectidentifier` | `externalId` |
44+
45+
#### Other IdPs for SAML
46+
47+
When using other IdPs for SAML, the following SAML claims and SCIM attribute must match.
48+
49+
| SAML attribute | Matching SCIM attribute |
50+
| :- | :- |
51+
| `NameID` | `userName` |
52+
53+
There are two different ways a {% data variables.product.github %} user account can get linked to a SCIM identity in an organization when these SAML/SCIM attributes match:
54+
55+
1. For users who are not yet members of the organization:
56+
* The IdP sends a SCIM provisioning call to {% data variables.product.github %} for a user who is not a member of an organization. This generates an organization invitation and an unlinked SCIM identity in the organization.
57+
* User authenticates via SAML in the organization.
58+
* {% data variables.product.github %} automatically links the SAML and SCIM identity to the new user account in the organization.
59+
60+
1. For existing organization members:
61+
* The IdP sends a SCIM provisioning call to {% data variables.product.github %} for a user who is already a member of the organization.
62+
* If the organization member does not have a linked SAML identity in the organization, this generates an organization invitation and an unlinked SCIM identity in the organization. User authenticates via SAML in the organization to link their SAML and SCIM identity.
63+
* If the organization member has a linked SAML identity in the organization, {% data variables.product.github %} automatically links the SCIM identity to the existing user account in the organization. No organization invite is created.
64+
65+
Ensuring that a user gets properly linked to their SCIM identity in the organization can help prevent unexpected issues with SCIM deprovisioning when the user's access to the app is removed on the IdP side. For more information on auditing the linked SCIM identities in an organization, see [AUTOTITLE](/enterprise-cloud@latest/organizations/managing-saml-single-sign-on-for-your-organization/troubleshooting-identity-and-access-management-for-your-organization#auditing-organization-members-on-github)
3666

3767
### Supported SCIM User attributes
3868

content/site-policy/privacy-policies/github-subprocessors.md

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ If you have questions about this list, please contact us at <[email protected]>
2626
| Name of Subprocessor | Description of Processing | Location of Processing | Corporate Location |
2727
| --------------------------- | ------------------------------------------------------------------------------ | ----------------------- | ------------------ |
2828
| Amazon Web Services (AWS) | Cloud Hosted Infrastructure and Data Hosting | United States | United States |
29+
| Anthropic PBC | AI Inference and AI Services | United States | United States |
2930
| Azure (Microsoft) | Cloud Hosted Infrastructure and Data Hosting | United States, France,</br>Switzerland, and Japan | United States |
3031
| Azure Cognitive Services | Customer support ticketing analysis | United States | United States |
3132
| Cloudflare | Content delivery service | United States | United States |

data/ui.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ release_notes:
2626
search:
2727
input:
2828
aria_label: Open search overlay
29-
placeholder: Search or ask Copilot
29+
placeholder: Search or ask {{icon}} Copilot
30+
placeholder_no_icon: Search or ask Copilot
31+
shortcut: Type {{icon}} to search
3032
overlay:
3133
input_aria_label: Search or ask Copilot
3234
suggestions_list_aria_label: Search suggestions
@@ -38,7 +40,7 @@ search:
3840
beta_tag: Beta
3941
return_to_search: Return to search
4042
clear_search_query: Clear
41-
view_all_search_results: View all {{length}} results
43+
view_all_search_results: View more results
4244
no_results_found: No results found
4345
ai:
4446
disclaimer: Copilot uses AI. Check for mistakes by reviewing the links in the response.

src/fixtures/fixtures/data/ui.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ release_notes:
2626
search:
2727
input:
2828
aria_label: Open search overlay
29-
placeholder: Search or ask Copilot
29+
placeholder: Search or ask {{icon}} Copilot
30+
placeholder_no_icon: Search or ask Copilot
31+
shortcut: Type {{icon}} to search
3032
overlay:
3133
input_aria_label: Search or ask Copilot
3234
suggestions_list_aria_label: Search suggestions
@@ -38,7 +40,7 @@ search:
3840
beta_tag: Beta
3941
return_to_search: Return to search
4042
clear_search_query: Clear
41-
view_all_search_results: View all {{length}} results
43+
view_all_search_results: View more results
4244
no_results_found: No results found
4345
ai:
4446
disclaimer: Copilot uses AI. Check for mistakes by reviewing the links in the response.

src/frame/components/ui/MarkdownContent/UnrenderedMarkdownContent.tsx

+37-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export type MarkdownContentPropsT = {
77
children: string
88
className?: string
99
openLinksInNewTab?: boolean
10+
includeQueryParams?: boolean
1011
eventGroupKey?: string
1112
eventGroupId?: string
1213
as?: keyof JSX.IntrinsicElements
@@ -20,16 +21,48 @@ export const UnrenderedMarkdownContent = ({
2021
children,
2122
className,
2223
openLinksInNewTab = true,
24+
includeQueryParams = true,
2325
eventGroupKey = '',
2426
eventGroupId = '',
2527
...restProps
2628
}: MarkdownContentPropsT) => {
2729
// Overrides for ReactMarkdown components
2830
const components = {} as Components
29-
if (openLinksInNewTab) {
30-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
31-
components.a = ({ node, ...props }) => (
32-
<a {...props} target="_blank" data-group-key={eventGroupKey} data-group-id={eventGroupId}>
31+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
32+
components.a = ({ node, ...props }) => {
33+
let href = props.href || ''
34+
let existingAnchorParams = ''
35+
// When we want to include specific query parameters in the URL
36+
if (includeQueryParams) {
37+
if (href.includes('?')) {
38+
href = href.split('?')[0]
39+
existingAnchorParams = href.split('?')[1]
40+
}
41+
// Include feature, search-overlay-ask-ai, and search-overlay-input query parameters if they exist in the current URL
42+
const existingURLParams = new URLSearchParams(window.location.search)
43+
const newParams = new URLSearchParams()
44+
if (existingURLParams.get('feature')) {
45+
newParams.set('feature', existingURLParams.get('feature') || '')
46+
}
47+
if (existingURLParams.get('search-overlay-ask-ai')) {
48+
newParams.set('search-overlay-ask-ai', existingURLParams.get('search-overlay-ask-ai') || '')
49+
}
50+
if (existingURLParams.get('search-overlay-input')) {
51+
newParams.set('search-overlay-input', existingURLParams.get('search-overlay-input') || '')
52+
}
53+
// Combine new and existing query parameters
54+
if (newParams.toString()) {
55+
href = `${href}?${existingAnchorParams}&${newParams.toString()}`
56+
}
57+
}
58+
return (
59+
<a
60+
{...props}
61+
href={href}
62+
target={openLinksInNewTab ? '_blank' : undefined}
63+
data-group-key={eventGroupKey}
64+
data-group-id={eventGroupId}
65+
>
3366
{props.children}
3467
</a>
3568
)

src/search/components/hooks/useAISearchAutocomplete.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type UseCombinedSearchReturn = {
2626
clearAutocompleteResults: () => void
2727
}
2828

29-
const DEBOUNCE_TIME = 300 // In milliseconds
29+
const DEBOUNCE_TIME = 1 // In milliseconds
3030

3131
// Results are only cached for the current session
3232
// We cache results so if a user presses backspace, we can show the results immediately without burdening the API
@@ -65,7 +65,7 @@ export function useCombinedSearchResults({
6565
useEffect(() => {
6666
debouncedFetchRef.current = debounce((value: string) => {
6767
fetchAutocompleteResults(value)
68-
}, DEBOUNCE_TIME) // 300ms debounce
68+
}, DEBOUNCE_TIME) // 1ms debounce
6969

7070
return () => {
7171
debouncedFetchRef.current?.cancel()

src/search/components/input/AskAIResults.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ export function AskAIResults({
223223
</div>
224224
) : (
225225
<article aria-busy={responseLoading} aria-live="polite">
226-
{!aiCouldNotAnswer && message === '' ? (
226+
{!aiCouldNotAnswer && message !== '' ? (
227227
<span ref={disclaimerRef} className={styles.disclaimerText}>
228228
{t('search.ai.disclaimer')}
229229
</span>

src/search/components/input/SearchBarButton.module.scss

+28
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,34 @@
117117
font-weight: var(--base-text-weight-normal, 400) !important;
118118
}
119119

120+
.placeholderShortcutContainer {
121+
float: right;
122+
color: var(--fgColor-disabled);
123+
margin-right: 8px;
124+
}
125+
126+
.forwardSlashIcon {
127+
display: inline-grid;
128+
width: var(--base-size-16, 16px);
129+
height: var(--base-size-16, 16px);
130+
color: var(--color-fg-default);
131+
132+
margin-right: 4px;
133+
margin-left: 4px;
134+
padding-left: 6px;
135+
padding-right: 6px;
136+
padding-top: 2px;
137+
padding-bottom: 2px;
138+
139+
border-radius: var(--borderRadius-small);
140+
141+
border: 0.0625rem solid var(--color-fg-muted);
142+
border-radius: 0.1875rem;
143+
box-shadow: none;
144+
align-items: center;
145+
justify-content: center;
146+
}
147+
120148
.searchIconContainer {
121149
display: flex;
122150
align-items: center;

src/search/components/input/SearchBarButton.tsx

+14-2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ export function SearchBarButton({ isSearchOpen, setIsSearchOpen }: Props) {
4040
}
4141
}
4242

43+
const shortcutElements = t('search.input.shortcut')
44+
.split(/({{[^}]+}})/)
45+
.filter((item) => item.trim() !== '')
46+
.map((item) => <>{item.trim()}</>)
47+
shortcutElements[1] = <kbd className={styles.forwardSlashIcon}>/</kbd>
48+
49+
const placeHolderElements = t('search.input.placeholder')
50+
.split(/({{[^}]+}})/)
51+
.filter((item) => item.trim() !== '')
52+
.map((item) => <>{item.trim()}</>)
53+
placeHolderElements[1] = <CopilotIcon aria-hidden className="mr-1 ml-1" />
54+
4355
return (
4456
<>
4557
{/* We don't want to show the input when overlay is open */}
@@ -78,8 +90,8 @@ export function SearchBarButton({ isSearchOpen, setIsSearchOpen }: Props) {
7890
urlSearchInputQuery
7991
) : (
8092
<>
81-
{t('search.input.placeholder')}
82-
<CopilotIcon aria-hidden className="mr-1 ml-1" />
93+
<span className={styles.placeholderText}>{placeHolderElements}</span>
94+
<span className={styles.placeholderShortcutContainer}>{shortcutElements}</span>
8395
</>
8496
)}
8597
</span>

0 commit comments

Comments
 (0)