diff --git a/.github/workflows/announce-lts-rc.yml b/.github/workflows/announce-lts-rc.yml index 3bfeed9806d8..c7d4b54d688c 100644 --- a/.github/workflows/announce-lts-rc.yml +++ b/.github/workflows/announce-lts-rc.yml @@ -17,7 +17,7 @@ jobs: discourse-author-username: jenkins-release-bot discourse-category: 23 - name: Post on mailing list - uses: dawidd6/action-send-mail@ba302ba66e88942841281c984a6b31ca6d6289e6 # v11 + uses: dawidd6/action-send-mail@949ec3d78a574a9519068669594c74bcb1b05d7b # v12 with: server_address: smtp.gmail.com server_port: 465 diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 58aad736dca3..3941b45cfabf 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -24,7 +24,7 @@ jobs: # Drafts your next Release notes as Pull Requests are merged into "master" - name: Generate GitHub Release Draft id: release-drafter - uses: release-drafter/release-drafter@6db134d15f3909ccc9eefd369f02bd1e9cffdf97 # v6.2.0 + uses: release-drafter/release-drafter@6a93d829887aa2e0748befe2e808c66c0ec6e4c7 # v6.4.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Generates a YAML changelog file using https://github.com/jenkinsci/jenkins-core-changelog-generator diff --git a/Jenkinsfile b/Jenkinsfile index 5f05615b4b8e..29d2ea6bf968 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -13,8 +13,8 @@ properties([ ]) def axes = [ - platforms: ['linux', 'windows'], - jdks: [21, 25], + platforms: ['linux'], + jdks: [21], ] stage('Record build') { @@ -128,7 +128,12 @@ axes.values().combinations { } withChecks(name: 'Tests', includeStage: true) { realtimeJUnit(healthScaleFactor: 20.0, testResults: '*/target/surefire-reports/*.xml') { + // Only use with replay, not with a commit + // sh 'curl -O https://home.markwaite.net/~mwaite/pom.patch && git apply pom.patch && rm pom.patch && git diff' + // mavenOptions.add(0, "-Dignore.dirt") infra.runMaven(mavenOptions, jdk) + // Only use with replay, not with a commit + // sh 'git checkout -- */pom.xml' if (isUnix()) { sh 'git add . && git diff --exit-code HEAD' } @@ -216,41 +221,6 @@ axes.values().combinations { } } -def athAxes = [ - platforms: ['linux'], - jdks: [21], - browsers: ['firefox'], -] -athAxes.values().combinations { - def (platform, jdk, browser) = it - builds["ath-${platform}-jdk${jdk}-${browser}"] = { - retry(conditions: [agent(), nonresumable()], count: 2) { - node('docker-highmem') { - // Just to be safe - deleteDir() - checkout scm - - withChecks(name: 'Tests', includeStage: true) { - infra.withArtifactCachingProxy { - sh "bash ath.sh ${jdk} ${browser}" - } - junit testResults: 'target/ath-reports/TEST-*.xml', testDataPublishers: [[$class: 'AttachmentPublisher']] - } - /* - * Currently disabled, as the fact that this is a manually created subset will confuse Launchable, - * which expects this to be a full build. When we implement subsetting, this can be re-enabled using - * Launchable's subset rather than our own. - */ - /* - withCredentials([string(credentialsId: 'launchable-jenkins-acceptance-test-harness', variable: 'LAUNCHABLE_TOKEN')]) { - sh "launchable verify && launchable record tests --no-build --flavor platform=${platform} --flavor jdk=${jdk} --flavor browser=${browser} maven './target/ath-reports'" - } - */ - } - } - } -} - builds.failFast = failFast parallel builds infra.maybePublishIncrementals() diff --git a/ath.sh b/ath.sh index 292301760867..4dea325578c0 100644 --- a/ath.sh +++ b/ath.sh @@ -6,7 +6,7 @@ set -o xtrace cd "$(dirname "$0")" # https://github.com/jenkinsci/acceptance-test-harness/releases -export ATH_VERSION=6587.v2a_7493c89346 +export ATH_VERSION=6595.v684e416d50c4 if [[ $# -eq 0 ]]; then export JDK=21 diff --git a/bom/pom.xml b/bom/pom.xml index a71fda5921ac..89f8082a40ee 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -41,7 +41,7 @@ THE SOFTWARE. 2.0.0-M5 2.4.21 1.1-jenkins-20250731 - 2076.v1b_a_c12445eb_e + 2078.v086a_0a_0535dc @@ -63,7 +63,7 @@ THE SOFTWARE. org.springframework spring-framework-bom - 6.2.16 + 7.0.5 pom import @@ -71,7 +71,7 @@ THE SOFTWARE. org.springframework.security spring-security-bom - 6.5.8 + 7.0.3 pom import diff --git a/cli/pom.xml b/cli/pom.xml index 97e1ea25f1d8..4847b5dcf08b 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -18,6 +18,8 @@ 2.17.1 + + QuotedStringTokenizerTest diff --git a/core/pom.xml b/core/pom.xml index 95c48b9ee0ce..1fe6ac3d79b6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -43,6 +43,8 @@ THE SOFTWARE. 3176.v207ec082a_8c0 + + EnvVarsTest diff --git a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java index d1f211ad4136..5fbcd5507d98 100644 --- a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java +++ b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java @@ -36,7 +36,6 @@ import java.io.OutputStream; import java.io.Serializable; import java.net.URL; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.LinkOption; import java.nio.file.OpenOption; @@ -47,27 +46,19 @@ import java.util.Collection; import java.util.Comparator; import java.util.GregorianCalendar; -import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; -import java.util.Map; -import java.util.Objects; import java.util.StringTokenizer; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; +import jenkins.agents.ControllerToAgentCallable; import jenkins.model.Jenkins; -import jenkins.security.MasterToSlaveCallable; import jenkins.security.ResourceDomainConfiguration; import jenkins.security.ResourceDomainRootAction; import jenkins.security.csp.CspHeader; import jenkins.util.SystemProperties; import jenkins.util.VirtualFile; -import org.apache.commons.io.IOUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.HttpResponse; @@ -421,13 +412,7 @@ private void serveFile(StaplerRequest2 req, StaplerResponse2 rsp, VirtualFile ro } } - private static final class IsAbsolute extends MasterToSlaveCallable { - private final String fragment; - - IsAbsolute(String fragment) { - this.fragment = fragment; - } - + private record IsAbsolute(String fragment) implements ControllerToAgentCallable { @Override public Boolean call() throws IOException { return new File(fragment).isAbsolute(); @@ -441,57 +426,6 @@ private boolean hasTmpDir(VirtualFile baseFile, String base, OpenOption[] openOp return FilePath.isIgnoreTmpDirs(openOptions) && TMPDIR_PATTERN.matcher(base).matches(); } - private List> keepReadabilityOnlyOnDescendants(VirtualFile root, boolean patternUsed, List> pathFragmentsList) { - Stream> pathFragmentsStream = pathFragmentsList.stream().map((List pathFragments) -> { - List mappedFragments = new ArrayList<>(pathFragments.size()); - String relativePath = ""; - for (int i = 0; i < pathFragments.size(); i++) { - Path current = pathFragments.get(i); - if (i == 0) { - relativePath = current.title; - } else { - relativePath += "/" + current.title; - } - - if (!current.isReadable) { - if (patternUsed) { - // we do not want to leak information about existence of folders / files satisfying the pattern inside that folder - return null; - } - mappedFragments.add(current); - return mappedFragments; - } else { - if (isDescendant(root, relativePath)) { - mappedFragments.add(current); - } else { - if (patternUsed) { - // we do not want to leak information about existence of folders / files satisfying the pattern inside that folder - return null; - } - mappedFragments.add(Path.createNotReadableVersionOf(current)); - return mappedFragments; - } - } - } - return mappedFragments; - }); - - if (patternUsed) { - pathFragmentsStream = pathFragmentsStream.filter(Objects::nonNull); - } - - return pathFragmentsStream.collect(Collectors.toList()); - } - - private boolean isDescendant(VirtualFile root, String relativePath) { - try { - return ALLOW_SYMLINK_ESCAPE || !root.supportIsDescendant() || root.isDescendant(relativePath); - } - catch (IOException e) { - return false; - } - } - private String getPath(StaplerRequest2 req) { String path = req.getRestOfPath(); if (path.isEmpty()) @@ -521,133 +455,17 @@ private static String createBackRef(int times) { return "../".repeat(times); } - private static void zip(StaplerResponse2 rsp, VirtualFile root, VirtualFile dir, String glob) throws IOException, InterruptedException { - OutputStream outputStream = rsp.getOutputStream(); - // TODO JENKINS-20663 make encoding overridable via query parameter - try (ZipOutputStream zos = new ZipOutputStream(outputStream, Charset.defaultCharset())) { - // TODO consider using run(Callable) here - - if (glob.isEmpty()) { - if (!root.supportsQuickRecursiveListing()) { - // avoid slow listing when the Glob can do a quicker job - glob = "**"; - } - } - - if (glob.isEmpty()) { - Map nameToVirtualFiles = collectRecursivelyAllLegalChildren(dir); - sendZipUsingMap(zos, dir, nameToVirtualFiles); - } else { - Collection listOfFile = dir.list(glob, null, /* TODO what is the user expectation? */true); - sendZipUsingListOfNames(zos, dir, listOfFile); - } - } - } - - private static void sendZipUsingMap(ZipOutputStream zos, VirtualFile dir, Map nameToVirtualFiles) throws IOException { - for (Map.Entry entry : nameToVirtualFiles.entrySet()) { - String n = entry.getKey(); - - // JENKINS-19947: traditional behavior is to prepend the directory name - String relativePath = dir.getName() + '/' + n; - - VirtualFile f = entry.getValue(); - sendOneZipEntry(zos, f, relativePath); - } - } - - private static void sendZipUsingListOfNames(ZipOutputStream zos, VirtualFile dir, Collection listOfFileNames) throws IOException { - for (String relativePath : listOfFileNames) { - VirtualFile f = dir.child(relativePath); - sendOneZipEntry(zos, f, relativePath); - } - } - - private static void sendOneZipEntry(ZipOutputStream zos, VirtualFile vf, String relativePath) throws IOException { - // In ZIP archives "All slashes MUST be forward slashes" (http://pkware.com/documents/casestudies/APPNOTE.TXT) - // TODO On Linux file names can contain backslashes which should not treated as file separators. - // Unfortunately, only the file separator char of the controller is known (File.separatorChar) - // but not the file separator char of the (maybe remote) "dir". - ZipEntry e = new ZipEntry(relativePath.replace('\\', '/')); - - e.setTime(vf.lastModified()); - zos.putNextEntry(e); - try (InputStream in = vf.open()) { - IOUtils.copy(in, zos); - } - finally { - zos.closeEntry(); - } - } - - private static Map collectRecursivelyAllLegalChildren(VirtualFile dir) throws IOException { - Map nameToFiles = new LinkedHashMap<>(); - collectRecursivelyAllLegalChildren(dir, "", nameToFiles); - return nameToFiles; - } - - private static void collectRecursivelyAllLegalChildren(VirtualFile currentDir, String currentPrefix, Map nameToFiles) throws IOException { - if (currentDir.isFile()) { - if (currentDir.isDescendant("")) { - nameToFiles.put(currentPrefix, currentDir); - } - } else { - if (!currentPrefix.isEmpty()) { - currentPrefix += "/"; - } - List children = currentDir.listOnlyDescendants(); - for (VirtualFile child : children) { - collectRecursivelyAllLegalChildren(child, currentPrefix + child.getName(), nameToFiles); - } - } - } - /** * Represents information about one file or folder. + * @param href Relative URL to this path from the current page. + * @param title Name of this path. Just the file name portion. + * @param size File size, or null if this is not a file. + * @param isReadable If the current user can read the file. + * @param lastModified For a file, the last modified timestamp. */ - public static final class Path implements Serializable { - /** - * Relative URL to this path from the current page. - */ - private final String href; - /** - * Name of this path. Just the file name portion. - */ - private final String title; - - private final boolean isFolder; - - /** - * File size, or null if this is not a file. - */ - private final long size; + public record Path(String href, String title, boolean isFolder, long size, boolean isReadable, long lastModified) implements Serializable { - /** - * If the current user can read the file. - */ - private final boolean isReadable; - - /** - * For a file, the last modified timestamp. - */ - private final long lastModified; - - /** - * @deprecated Use {@link #Path(String, String, boolean, long, boolean, long)} - */ - @Deprecated - public Path(String href, String title, boolean isFolder, long size, boolean isReadable) { - this(href, title, isFolder, size, isReadable, 0L); - } - - public Path(String href, String title, boolean isFolder, long size, boolean isReadable, long lastModified) { - this.href = href; - this.title = title; - this.isFolder = isFolder; - this.size = size; - this.isReadable = isReadable; - this.lastModified = lastModified; - } + // JavaBeans-style getters still perhaps used by dir.jelly etc. public boolean isFolder() { return isFolder; @@ -707,21 +525,12 @@ public Calendar getLastModifiedAsCalendar() { } public static Path createNotReadableVersionOf(Path that) { - return new Path(that.href, that.title, that.isFolder, that.size, false); + return new Path(that.href, that.title, that.isFolder, that.size, false, that.lastModified); } - private static final long serialVersionUID = 1L; } - - - private static final class FileComparator implements Comparator { - private Collator collator; - - FileComparator(Locale locale) { - this.collator = Collator.getInstance(locale); - } - + private record FileComparator(Collator collator) implements Comparator { @Override public int compare(VirtualFile lhs, VirtualFile rhs) { // directories first, files next @@ -741,30 +550,9 @@ private int dirRank(VirtualFile f) { } } - private static final class BuildChildPathsResult implements Serializable { // TODO Java 21+ record - private static final long serialVersionUID = 1; - private final List> glob; - private final boolean containsSymLink; - private final boolean containsTmpDir; - - BuildChildPathsResult(List> glob, boolean containsSymLink, boolean containsTmpDir) { - this.glob = glob; - this.containsSymLink = containsSymLink; - this.containsTmpDir = containsTmpDir; - } - } - - private static final class BuildChildPaths extends MasterToSlaveCallable { - private final VirtualFile cur; - private final Locale locale; - private final OpenOption[] openOptions; - - BuildChildPaths(VirtualFile cur, Locale locale, OpenOption[] openOptions) { - this.cur = cur; - this.locale = locale; - this.openOptions = openOptions; - } + private record BuildChildPathsResult(List> glob, boolean containsSymLink, boolean containsTmpDir) implements Serializable {} + private record BuildChildPaths(VirtualFile cur, Locale locale, OpenOption[] openOptions) implements ControllerToAgentCallable { @Override public BuildChildPathsResult call() throws IOException { return new BuildChildPathsResult(buildChildPaths(cur, locale), cur.containsSymLinkChild(openOptions), cur.containsTmpDirChild(openOptions)); } @@ -780,7 +568,7 @@ private static List> buildChildPaths(VirtualFile cur, Locale locale) List> r = new ArrayList<>(); VirtualFile[] files = cur.list(getOpenOptions()); - Arrays.sort(files, new FileComparator(locale)); + Arrays.sort(files, new FileComparator(Collator.getInstance(locale))); for (VirtualFile f : files) { Path p = new Path(Util.rawEncode(f.getName()), f.getName(), f.isDirectory(), f.length(), f.canRead(), f.lastModified()); diff --git a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java index 429c458f9119..d153776e74fb 100644 --- a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java +++ b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java @@ -456,7 +456,7 @@ private SignupInfo validateAccountCreationForm(StaplerRequest2 req, boolean vali } try { - PASSWORD_HASH_ENCODER.encode(si.password1); + PASSWORD_HASH_ENCODER.encode2(si.password1); } catch (RuntimeException ex) { si.errors.put("password1", ex.getMessage()); } @@ -853,7 +853,7 @@ public Details newInstance(StaplerRequest2 req, JSONObject formData) throws Form // The password is being changed try { - PASSWORD_HASH_ENCODER.encode(pwd); + PASSWORD_HASH_ENCODER.encode2(pwd); } catch (RuntimeException ex) { throw new FormException(ex.getMessage(), "user.password"); } @@ -934,9 +934,9 @@ static class JBCryptEncoder extends BCryptPasswordEncoder implements PasswordHas private static final Pattern BCRYPT_PATTERN = Pattern.compile("^\\$2a\\$([0-9]{2})\\$.{53}$"); @Override - public String encode(CharSequence rawPassword) { + public String encode2(CharSequence rawPassword) { try { - return super.encode(rawPassword); + return encode(rawPassword); } catch (IllegalArgumentException ex) { if (ex.getMessage().equals("password cannot be more than 72 bytes")) { if (rawPassword.toString().matches("\\A\\p{ASCII}+\\z")) { diff --git a/core/src/main/java/hudson/security/PasswordHashEncoder.java b/core/src/main/java/hudson/security/PasswordHashEncoder.java index 14c0da93ba91..63f230e4dd84 100644 --- a/core/src/main/java/hudson/security/PasswordHashEncoder.java +++ b/core/src/main/java/hudson/security/PasswordHashEncoder.java @@ -27,4 +27,8 @@ interface PasswordHashEncoder extends PasswordEncoder { boolean isHashValid(String hash); + + default String encode2(CharSequence rawPassword) { + return encode(rawPassword); + } } diff --git a/core/src/main/resources/jenkins/install/Messages_tr.properties b/core/src/main/resources/jenkins/install/Messages_tr.properties new file mode 100644 index 000000000000..d4c3cdb1f077 --- /dev/null +++ b/core/src/main/resources/jenkins/install/Messages_tr.properties @@ -0,0 +1,4 @@ +SetupWizard_ConfigureInstance_ValidationErrors=Bazı ayarlar geçersiz. Ayrıntılar için hata mesajlarına bakın. +SetupWizard_ConfigureInstance_RootUrl_Empty=URL boş olamaz +SetupWizard_ConfigureInstance_RootUrl_Invalid=URL geçersiz. Lütfen geçerli bir alan adı ile birlikte http:// veya https:// kullandığınızdan emin olun. +SetupWizard.DisplayName=Kurulum Sihirbazı \ No newline at end of file diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_tr.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_tr.properties new file mode 100644 index 000000000000..8b4586c342ca --- /dev/null +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_tr.properties @@ -0,0 +1,89 @@ +installWizard_welcomePanel_title=Başlarken +installWizard_welcomePanel_banner=Jenkins'i Özelleştirin +installWizard_welcomePanel_message=Eklentiler, farklı ihtiyaçları desteklemek için Jenkins'e ek özellikler kazandırır. +installWizard_welcomePanel_recommendedActionTitle=Önerilen eklentileri yükle +installWizard_welcomePanel_recommendedActionDetails=Jenkins topluluğunun en faydalı bulduğu eklentileri yükleyin. +installWizard_welcomePanel_customizeActionTitle=Yüklenecek eklentileri seç +installWizard_welcomePanel_customizeActionDetails=İhtiyaçlarınıza en uygun eklentileri seçip yükleyin. +installWizard_jenkinsVersionTitle=Jenkins +installWizard_offline_title=Çevrimdışı +installWizard_offline_message=Bu Jenkins örneği çevrimdışı görünüyor. \ +

\ +Jenkins'i internet bağlantısı olmadan kurma hakkında bilgi için \ +Çevrimdışı Jenkins Kurulum Belgeleri sayfasına bakın.

\ +Bir proxy yapılandırarak devam edebilir veya eklenti kurulumunu atlayabilirsiniz. \ +

+installWizard_error_title=Hata +installWizard_error_header=Bir hata oluştu +installWizard_error_message=Kurulum sırasında bir hata oluştu: +installWizard_error_connection=Jenkins'e bağlanılamıyor +installWizard_error_restartNotSupported=Yeniden başlatma desteklenmiyor, lütfen bu örneği manuel olarak yeniden başlatın +installWizard_installCustom_title=Başlarken +installWizard_installCustom_selectAll=Tümü +installWizard_installCustom_selectNone=Hiçbiri +installWizard_installCustom_selectRecommended=Önerilen +installWizard_installCustom_selected=Seçilen +installWizard_installCustom_dependenciesPrefix=Bağımlılıklar +installWizard_installCustom_pluginListDesc=Eklentilerin tam listesinin burada gösterilmediğini unutmayın. İlk kurulum tamamlandıktan sonra Eklenti Yöneticisi üzerinden ek eklentiler yüklenebilir. Daha fazla bilgi için belgeleri inceleyin. +installWizard_goBack=Geri +installWizard_goInstall=Yükle +installWizard_installing_title=Başlarken +installWizard_installing_detailsLink=Detaylar... +installWizard_installComplete_title=Başlarken +installWizard_installComplete_banner=Jenkins hazır! +installWizard_installComplete_bannerRestart=Jenkins neredeyse hazır! +installWizard_pluginsInstalled_message=Eklenti kurulumlarınız tamamlandı. +installWizard_installComplete_message=Jenkins kurulumunuz tamamlandı. +installWizard_installComplete_finishButtonLabel=Jenkins'i kullanmaya başlayın +installWizard_installComplete_installComplete_restartRequiredMessage=Jenkins kurulumunuz tamamlandı ancak bazı eklentilerin etkinleşmesi için Jenkins'in yeniden başlatılması gerekiyor. +installWizard_installComplete_installComplete_restartRequiredNotSupportedMessage=Jenkins kurulumunuz tamamlandı ancak bazı eklentiler için yeniden başlatma gerekiyor ve bu örnek otomatik yeniden başlatmayı desteklemiyor gibi görünüyor. Kurulumu tamamlamak için lütfen şimdi örneğinizi manuel olarak yeniden başlatın. +installWizard_installComplete_restartLabel=Yeniden Başlat +installWizard_installIncomplete_title=Kuruluma Devam Et +installWizard_installIncomplete_banner=Kuruluma Devam Et +installWizard_installIncomplete_message=Jenkins kurulum sırasında yeniden başlatıldı ve bazı eklentiler yüklenmemiş görünüyor. +installWizard_installIncomplete_resumeInstallationButtonLabel=Devam Et +installWizard_saveFirstUser=Kaydet ve Devam Et +installWizard_skipFirstUser=Atla ve yönetici olarak devam et +installWizard_firstUserSkippedMessage=
\ +Yönetici kullanıcı oluşturma adımını atladınız.

\ +Giriş yapmak için kullanıcı adı: "admin" ve kurulum sihirbazına erişirken kullandığınız yönetici parolasını kullanın.\ +
+installWizard_addFirstUser_title=Başlarken + +# instance configuration page +installWizard_configureInstance_title=Örnek Yapılandırması +installWizard_saveConfigureInstance=Kaydet ve Bitir +installWizard_skipConfigureInstance=Şimdi değil +installWizard_configureInstanceSkippedMessage=
\ +Jenkins URL yapılandırmasını atladınız.

\ +Jenkins URL'sini yapılandırmak için "Manage Jenkins" sayfasına gidin.\ +
+ +installWizard_configureProxy_label=Proxy Yapılandır +installWizard_configureProxy_save=Kaydet ve Devam Et +installWizard_gettingStarted_title=Başlarken +installWizard_saveSecurity=Kaydet ve Devam Et +installWizard_skipPluginInstallations=Eklenti Kurulumlarını Atla +installWizard_installIncomplete_dependenciesLabel=Bağımlılıklar +installWizard_installingConsole_dependencyIndicatorNote=** - gerekli bağımlılık +installWizard_websiteLinkLabel=Web sitesi +installWizard_pluginInstallFailure_title=Kurulum Hataları +installWizard_pluginInstallFailure_message=Bazı eklentiler düzgün şekilde yüklenemedi. Bunları yeniden yüklemeyi deneyebilir veya \ +başarısız olan eklentiler olmadan devam edebilirsiniz. +installWizard_continue=Devam Et +installWizard_retry=Tekrar Dene +installWizard_upgradePanel_title=Yükseltme +installWizard_upgradePanel_banner=Jenkins {0}'e hoş geldiniz! +installWizard_upgradePanel_message=Jenkins {0} birçok yeni özellik içerir. Bunlardan yararlanmak için bu ek eklentileri yükleyin! +installWizard_upgradePanel_skipRecommendedPlugins=Hayır, teşekkürler +installWizard_upgradeComplete_title=Yükseltme +installWizard_pluginsInstalled_banner=Jenkins {0}'e hoş geldiniz! +installWizard_upgradeComplete_message=Tebrikler! Jenkins {0} sürümüne yükselttiniz.

Yeni özellikler hakkında daha fazla bilgi için Jenkins web sitesini ziyaret edin! +installWizard_upgradeSkipped_title=Yükseltme +installWizard_upgradeSkipped_banner=Özellikler Yüklenmedi +installWizard_upgradeSkipped_message=

Önerilen eklentiler yüklenmeyecek.
\ +

Fikrinizi değiştirirseniz Eklenti Yöneticisi üzerinden yeni özellikler de yükleyebilirsiniz.

\ +

Bu yeni özelliklerin Jenkins deneyiminizi nasıl geliştirebileceğini öğrenmek için \ +ana sayfayı ziyaret edin.

+installWizard_upgrading_title=Eklentiler yükleniyor +installWizard_upgradeComplete_finishButtonLabel=Bitir \ No newline at end of file diff --git a/core/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java b/core/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java index 62c1a9d943f1..d49696bb3a77 100644 --- a/core/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java +++ b/core/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java @@ -160,7 +160,7 @@ void testJBCryptPasswordMatching() { @Issue("JENKINS-75533") @Test void ensureExpectedMessageAscii() { - final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> HudsonPrivateSecurityRealm.PASSWORD_HASH_ENCODER.encode( + final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> HudsonPrivateSecurityRealm.PASSWORD_HASH_ENCODER.encode2( "1234567890123456789012345678901234567890123456789012345678901234567890123")); assertThat(ex.getMessage(), is(Messages.HudsonPrivateSecurityRealm_CreateAccount_BCrypt_PasswordTooLong_ASCII())); } @@ -168,9 +168,16 @@ void ensureExpectedMessageAscii() { @Issue("JENKINS-75533") @Test void ensureExpectedMessageEmoji() { - final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> HudsonPrivateSecurityRealm.PASSWORD_HASH_ENCODER.encode( + final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> HudsonPrivateSecurityRealm.PASSWORD_HASH_ENCODER.encode2( "\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20" + "\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20\uD83E\uDD20")); // 🤠 assertThat(ex.getMessage(), is(Messages.HudsonPrivateSecurityRealm_CreateAccount_BCrypt_PasswordTooLong())); } + + @Test + void ensureExpectedMessageFromEncode() { + final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> HudsonPrivateSecurityRealm.PASSWORD_HASH_ENCODER.encode( + "1234567890123456789012345678901234567890123456789012345678901234567890123")); + assertThat(ex.getMessage(), is("password cannot be more than 72 bytes")); + } } diff --git a/package.json b/package.json index 004a5b79b14a..65e9cc78dd3a 100644 --- a/package.json +++ b/package.json @@ -27,22 +27,22 @@ "@babel/core": "7.29.0", "@babel/preset-env": "7.29.0", "@eslint/js": "10.0.1", - "babel-loader": "10.0.0", + "babel-loader": "10.1.0", "clean-webpack-plugin": "4.0.0", "css-loader": "7.1.4", - "css-minimizer-webpack-plugin": "7.0.4", - "eslint": "10.0.2", + "css-minimizer-webpack-plugin": "8.0.0", + "eslint": "10.0.3", "eslint-config-prettier": "10.1.8", "eslint-formatter-checkstyle": "9.0.1", "globals": "17.4.0", "handlebars-loader": "1.7.3", - "mini-css-extract-plugin": "2.10.0", - "postcss": "8.5.6", + "mini-css-extract-plugin": "2.10.1", + "postcss": "8.5.8", "postcss-loader": "8.2.1", "postcss-preset-env": "11.2.0", "postcss-scss": "4.0.9", "prettier": "3.8.1", - "sass": "1.97.3", + "sass": "1.98.0", "sass-loader": "16.0.7", "style-loader": "4.0.0", "stylelint": "17.4.0", diff --git a/pom.xml b/pom.xml index c3f07b6bb98e..dff358f77a5a 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ THE SOFTWARE. false false - 8.1033.v23d2f156e821 + 8.1034.v0b_9170f90e17 24.14.0 diff --git a/src/main/scss/components/_section.scss b/src/main/scss/components/_section.scss index e9d13f18447f..59c5fe67b6d6 100644 --- a/src/main/scss/components/_section.scss +++ b/src/main/scss/components/_section.scss @@ -3,7 +3,6 @@ .jenkins-section { border-top: var(--jenkins-border); padding: var(--section-padding) 0 0 0; - max-width: 1800px; &:last-child { padding-bottom: 0; diff --git a/test/pom.xml b/test/pom.xml index f79fbce36270..78902081b712 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -52,6 +52,8 @@ THE SOFTWARE. + + hudson.AboutJenkinsTest diff --git a/test/src/test/java/hudson/security/TokenBasedRememberMeServices2Test.java b/test/src/test/java/hudson/security/TokenBasedRememberMeServices2Test.java index c7e912676363..09b903449a8e 100644 --- a/test/src/test/java/hudson/security/TokenBasedRememberMeServices2Test.java +++ b/test/src/test/java/hudson/security/TokenBasedRememberMeServices2Test.java @@ -33,6 +33,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.FactorGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -126,7 +127,8 @@ void basicFlow() throws Exception { wc.executeOnServer(() -> { Authentication a = Jenkins.getAuthentication2(); assertEquals("bob", a.getName()); - assertEquals(Arrays.asList("authenticated", "myteam"), a.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList())); + assertEquals(Arrays.asList("authenticated", "myteam"), + a.getAuthorities().stream().map(GrantedAuthority::getAuthority).filter(authority -> !authority.equals(FactorGrantedAuthority.PASSWORD_AUTHORITY)).collect(Collectors.toList())); return null; }); } diff --git a/test/src/test/java/jenkins/security/LastGrantedAuthoritiesPropertyTest.java b/test/src/test/java/jenkins/security/LastGrantedAuthoritiesPropertyTest.java index 3c92104d3270..51b06530b310 100644 --- a/test/src/test/java/jenkins/security/LastGrantedAuthoritiesPropertyTest.java +++ b/test/src/test/java/jenkins/security/LastGrantedAuthoritiesPropertyTest.java @@ -18,6 +18,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.FactorGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; @@ -80,7 +81,7 @@ private void assertAuthorities(Authentication auth, String expected) { } private void _assertAuthorities(Collection grantedAuthorities, String expected) { - List authorities = grantedAuthorities.stream().map(GrantedAuthority::getAuthority).sorted().collect(Collectors.toList()); + List authorities = grantedAuthorities.stream().map(GrantedAuthority::getAuthority).filter(authority -> !authority.equals(FactorGrantedAuthority.PASSWORD_AUTHORITY)).sorted().collect(Collectors.toList()); assertEquals(expected, String.join(":", authorities)); } diff --git a/war/pom.xml b/war/pom.xml index 723d2180b99d..f672fcf19e8d 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -685,7 +685,7 @@ THE SOFTWARE. contains a version of Jetty that is older than this, trigger Dependabot in jenkinsci/winstone and release the result before proceeding with the update here. --> - 12.1.6 + 12.1.7