]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-19084 Disable Github Provisioning for community edition
authorguillaume-peoch-sonarsource <guillaume.peoch@sonarsource.com>
Wed, 3 May 2023 08:45:29 +0000 (10:45 +0200)
committersonartech <sonartech@sonarsource.com>
Thu, 11 May 2023 20:03:14 +0000 (20:03 +0000)
server/sonar-web/src/main/js/apps/settings/components/authentication/GithubAutheticationTab.tsx
server/sonar-web/src/main/js/apps/settings/components/authentication/__tests__/Authentication-it.tsx
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index 70b7e03a6768be24686732bb66792da7d2185f86..da6fb4043ae5684a12a500c1674274d5356dab8d 100644 (file)
@@ -172,128 +172,148 @@ export default function GithubAithentication(props: GithubAuthenticationProps) {
               </Button>
             </div>
           </div>
-          {hasGithubProvisioning && (
-            <div className="spacer-bottom big-padded bordered display-flex-space-between">
-              <form
-                onSubmit={async (e) => {
-                  e.preventDefault();
-                  if (newGithubProvisioningStatus !== githubProvisioningStatus) {
-                    setShowConfirmProvisioningModal(true);
-                  } else {
-                    await handleSaveGroup();
-                  }
-                }}
-              >
-                <fieldset className="display-flex-column big-spacer-bottom">
-                  <label className="h5">
-                    {translate('settings.authentication.form.provisioning')}
-                  </label>
+          <div className="spacer-bottom big-padded bordered display-flex-space-between">
+            <form
+              onSubmit={async (e) => {
+                e.preventDefault();
+                if (newGithubProvisioningStatus !== githubProvisioningStatus) {
+                  setShowConfirmProvisioningModal(true);
+                } else {
+                  await handleSaveGroup();
+                }
+              }}
+            >
+              <fieldset className="display-flex-column big-spacer-bottom">
+                <label className="h5">
+                  {translate('settings.authentication.form.provisioning')}
+                </label>
 
-                  {enabled ? (
-                    <div className="display-flex-row spacer-top">
-                      <RadioCard
-                        label={translate(
-                          'settings.authentication.github.form.provisioning_with_github'
-                        )}
-                        title={translate(
-                          'settings.authentication.github.form.provisioning_with_github'
-                        )}
-                        selected={newGithubProvisioningStatus ?? githubProvisioningStatus}
-                        onClick={() => setNewGithubProvisioningStatus(true)}
-                      >
-                        <p className="spacer-bottom">
-                          {translate(
-                            'settings.authentication.github.form.provisioning_with_github.description'
-                          )}
-                        </p>
+                {enabled ? (
+                  <div className="display-flex-row spacer-top">
+                    <RadioCard
+                      label={translate(
+                        'settings.authentication.github.form.provisioning_with_github'
+                      )}
+                      title={translate(
+                        'settings.authentication.github.form.provisioning_with_github'
+                      )}
+                      selected={newGithubProvisioningStatus ?? githubProvisioningStatus}
+                      onClick={() => setNewGithubProvisioningStatus(true)}
+                      disabled={!hasGithubProvisioning}
+                    >
+                      {hasGithubProvisioning ? (
+                        <>
+                          <p className="spacer-bottom">
+                            {translate(
+                              'settings.authentication.github.form.provisioning_with_github.description'
+                            )}
+                          </p>
+                          <p>
+                            <FormattedMessage
+                              id="settings.authentication.github.form.provisioning_with_github.description.doc"
+                              defaultMessage={translate(
+                                'settings.authentication.github.form.provisioning_with_github.description.doc'
+                              )}
+                              values={{
+                                documentation: (
+                                  <DocLink
+                                    to={`/instance-administration/authentication/${
+                                      DOCUMENTATION_LINK_SUFFIXES[AlmKeys.GitHub]
+                                    }/`}
+                                  >
+                                    {translate('documentation')}
+                                  </DocLink>
+                                ),
+                              }}
+                            />
+                          </p>
+                        </>
+                      ) : (
                         <p>
                           <FormattedMessage
-                            id="settings.authentication.github.form.provisioning_with_github.description.doc"
+                            id="settings.authentication.github.form.provisioning.disabled"
                             defaultMessage={translate(
-                              'settings.authentication.github.form.provisioning_with_github.description.doc'
+                              'settings.authentication.github.form.provisioning.disabled'
                             )}
                             values={{
                               documentation: (
-                                <DocLink
-                                  to={`/instance-administration/authentication/${
-                                    DOCUMENTATION_LINK_SUFFIXES[AlmKeys.GitHub]
-                                  }/`}
-                                >
+                                // Documentation page not ready yet.
+                                <DocLink to="/instance-administration/authentication/github">
                                   {translate('documentation')}
                                 </DocLink>
                               ),
                             }}
                           />
                         </p>
-                      </RadioCard>
-                      <RadioCard
-                        label={translate('settings.authentication.form.provisioning_at_login')}
-                        title={translate('settings.authentication.form.provisioning_at_login')}
-                        selected={!(newGithubProvisioningStatus ?? githubProvisioningStatus)}
-                        onClick={() => setNewGithubProvisioningStatus(false)}
-                      >
-                        {Object.values(values).map((val) => {
-                          if (!GITHUB_JIT_FIELDS.includes(val.key)) {
-                            return null;
-                          }
-                          return (
-                            <div key={val.key}>
-                              <AuthenticationFormField
-                                settingValue={values[val.key]?.newValue ?? values[val.key]?.value}
-                                definition={val.definition}
-                                mandatory={val.mandatory}
-                                onFieldChange={setNewValue}
-                                isNotSet={val.isNotSet}
-                              />
-                            </div>
-                          );
-                        })}
-                      </RadioCard>
-                    </div>
-                  ) : (
-                    <Alert className="big-spacer-top" variant="info">
-                      {translate('settings.authentication.github.enable_first')}
-                    </Alert>
-                  )}
-                </fieldset>
-                {enabled && (
-                  <>
-                    <SubmitButton disabled={!hasGithubProvisioningConfigChange}>
-                      {translate('save')}
-                    </SubmitButton>
-                    <ResetButtonLink
-                      className="spacer-left"
-                      onClick={() => {
-                        setNewGithubProvisioningStatus(undefined);
-                        resetJitSetting();
-                      }}
-                      disabled={!hasGithubProvisioningConfigChange}
+                      )}
+                    </RadioCard>
+                    <RadioCard
+                      label={translate('settings.authentication.form.provisioning_at_login')}
+                      title={translate('settings.authentication.form.provisioning_at_login')}
+                      selected={!(newGithubProvisioningStatus ?? githubProvisioningStatus)}
+                      onClick={() => setNewGithubProvisioningStatus(false)}
                     >
-                      {translate('cancel')}
-                    </ResetButtonLink>
-                  </>
+                      {Object.values(values).map((val) => {
+                        if (!GITHUB_JIT_FIELDS.includes(val.key)) {
+                          return null;
+                        }
+                        return (
+                          <div key={val.key}>
+                            <AuthenticationFormField
+                              settingValue={values[val.key]?.newValue ?? values[val.key]?.value}
+                              definition={val.definition}
+                              mandatory={val.mandatory}
+                              onFieldChange={setNewValue}
+                              isNotSet={val.isNotSet}
+                            />
+                          </div>
+                        );
+                      })}
+                    </RadioCard>
+                  </div>
+                ) : (
+                  <Alert className="big-spacer-top" variant="info">
+                    {translate('settings.authentication.github.enable_first')}
+                  </Alert>
                 )}
-                {showConfirmProvisioningModal && (
-                  <ConfirmModal
-                    onConfirm={() => handleConfirmChangeProvisioning()}
-                    header={translate(
-                      'settings.authentication.github.confirm',
-                      newGithubProvisioningStatus ? 'auto' : 'jit'
-                    )}
-                    onClose={() => setShowConfirmProvisioningModal(false)}
-                    isDestructive={!newGithubProvisioningStatus}
-                    confirmButtonText={translate('yes')}
+              </fieldset>
+              {enabled && (
+                <>
+                  <SubmitButton disabled={!hasGithubProvisioningConfigChange}>
+                    {translate('save')}
+                  </SubmitButton>
+                  <ResetButtonLink
+                    className="spacer-left"
+                    onClick={() => {
+                      setNewGithubProvisioningStatus(undefined);
+                      resetJitSetting();
+                    }}
+                    disabled={!hasGithubProvisioningConfigChange}
                   >
-                    {translate(
-                      'settings.authentication.github.confirm',
-                      newGithubProvisioningStatus ? 'auto' : 'jit',
-                      'description'
-                    )}
-                  </ConfirmModal>
-                )}
-              </form>
-            </div>
-          )}
+                    {translate('cancel')}
+                  </ResetButtonLink>
+                </>
+              )}
+              {showConfirmProvisioningModal && (
+                <ConfirmModal
+                  onConfirm={() => handleConfirmChangeProvisioning()}
+                  header={translate(
+                    'settings.authentication.github.confirm',
+                    newGithubProvisioningStatus ? 'auto' : 'jit'
+                  )}
+                  onClose={() => setShowConfirmProvisioningModal(false)}
+                  isDestructive={!newGithubProvisioningStatus}
+                  confirmButtonText={translate('yes')}
+                >
+                  {translate(
+                    'settings.authentication.github.confirm',
+                    newGithubProvisioningStatus ? 'auto' : 'jit',
+                    'description'
+                  )}
+                </ConfirmModal>
+              )}
+            </form>
+          </div>
         </>
       )}
 
index dc5235e8cd50df0df535136024a558f315e49770..d3a55581d5f1aabd339091ddbee9940f6fcd1866 100644 (file)
@@ -112,6 +112,7 @@ const ui = {
     saveGithubProvisioning: byRole('button', { name: 'save' }),
     groupAttribute: byRole('textbox', { name: 'property.sonar.auth.github.group.name.name' }),
     enableConfigButton: byRole('button', { name: 'settings.authentication.form.enable' }),
+    disableConfigButton: byRole('button', { name: 'settings.authentication.form.disable' }),
     editConfigButton: byRole('button', { name: 'settings.authentication.form.edit' }),
     enableFirstMessage: byText('settings.authentication.github.enable_first'),
     jitProvisioningButton: byRole('radio', {
@@ -125,8 +126,6 @@ const ui = {
       await act(async () => {
         await user.type(await github.clientId.find(), 'Awsome GITHUB config');
         await user.type(github.clientSecret.get(), 'Client shut');
-        // await user.type(github.githubAppId.get(), 'http://test.org');
-        // await user.type(github.privateKey.get(), '-secret-');
         await user.type(github.githubApiUrl.get(), 'API Url');
         await user.type(github.githubWebUrl.get(), 'WEb Url');
       });
@@ -284,20 +283,33 @@ describe('Github tab', () => {
   });
 
   it('should be able to enable/disable configuration', async () => {
-    const { github, saml } = ui;
+    const { github } = ui;
     const user = userEvent.setup();
     renderAuthentication();
     await user.click(await github.tab.find());
 
     await github.createConfiguration(user);
 
-    await user.click(await saml.enableConfigButton.find());
+    await user.click(await github.enableConfigButton.find());
 
-    expect(await saml.disableConfigButton.find()).toBeInTheDocument();
-    await user.click(saml.disableConfigButton.get());
-    expect(saml.disableConfigButton.query()).not.toBeInTheDocument();
+    expect(await github.disableConfigButton.find()).toBeInTheDocument();
+    await user.click(github.disableConfigButton.get());
+    expect(github.disableConfigButton.query()).not.toBeInTheDocument();
 
-    expect(await saml.enableConfigButton.find()).toBeInTheDocument();
+    expect(await github.enableConfigButton.find()).toBeInTheDocument();
+  });
+
+  it('should not allow edtion below Enterprise to select Github provisioning', async () => {
+    const { github } = ui;
+    const user = userEvent.setup();
+
+    renderAuthentication();
+
+    await github.createConfiguration(user);
+    await user.click(await github.enableConfigButton.find());
+
+    expect(await github.jitProvisioningButton.find()).toBeChecked();
+    expect(github.githubProvisioningButton.get()).toHaveAttribute('aria-disabled', 'true');
   });
 
   it('should be able to choose provisioning', async () => {
index 64fb16e4836f09d3d5583a462abee27656e586cf..cf2f7c9fd628fc7a17e45655366760b0134f6cc6 100644 (file)
@@ -1345,6 +1345,7 @@ settings.authentication.github.enable_first=Enable your Github configuration for
 settings.authentication.github.form.provisioning_with_github=Automatic user and group provisioning
 settings.authentication.github.form.provisioning_with_github.description=Users and groups are automatically provisioned from your GitHub organizations. Once activated, managed users and groups can only be modified from your GitHub organizations/teams. Existing local users and groups will be kept.
 settings.authentication.github.form.provisioning_with_github.description.doc=For more details, see {documentation}.
+settings.authentication.github.form.provisioning.disabled=Your current edition does not support provisioning with Github. See the {documentation} for more information.
 
 # SAML
 settings.authentication.form.create.saml=New SAML configuration