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 extends GrantedAuthority> 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