mirror of
				https://github.com/Frooodle/Stirling-PDF.git
				synced 2025-10-25 11:17:28 +02:00 
			
		
		
		
	Merge branch 'disableConfigUpdater' of git@github.com:Stirling-Tools/Stirling-PDF.git into disableConfigUpdater
This commit is contained in:
		
						commit
						a3bf7baf35
					
				
							
								
								
									
										22
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								README.md
									
									
									
									
									
								
							| @ -159,7 +159,7 @@ Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR | ||||
| 
 | ||||
| ## Supported Languages | ||||
| 
 | ||||
| Stirling PDF currently supports 28! | ||||
| Stirling PDF currently supports 32! | ||||
| 
 | ||||
| | Language                                    | Progress                               | | ||||
| | ------------------------------------------- | -------------------------------------- | | ||||
| @ -167,15 +167,15 @@ Stirling PDF currently supports 28! | ||||
| | English (US) (en_US)                        |  | | ||||
| | Arabic (العربية) (ar_AR)                    |    | | ||||
| | German (Deutsch) (de_DE)                    |    | | ||||
| | French (Français) (fr_FR)                   |    | | ||||
| | French (Français) (fr_FR)                   |    | | ||||
| | Spanish (Español) (es_ES)                   |    | | ||||
| | Simplified Chinese (简体中文) (zh_CN)       |    | | ||||
| | Traditional Chinese (繁體中文) (zh_TW)      |    | | ||||
| | Catalan (Català) (ca_CA)                    |    | | ||||
| | Italian (Italiano) (it_IT)                  |    | | ||||
| | Swedish (Svenska) (sv_SE)                   |    | | ||||
| | Polish (Polski) (pl_PL)                     |    | | ||||
| | Romanian (Română) (ro_RO)                   |    | | ||||
| | Polish (Polski) (pl_PL)                     |    | | ||||
| | Romanian (Română) (ro_RO)                   |    | | ||||
| | Korean (한국어) (ko_KR)                     |    | | ||||
| | Portuguese Brazilian (Português) (pt_BR)    |    | | ||||
| | Russian (Русский) (ru_RU)                   |    | | ||||
| @ -183,17 +183,17 @@ Stirling PDF currently supports 28! | ||||
| | Japanese (日本語) (ja_JP)                   |    | | ||||
| | Dutch (Nederlands) (nl_NL)                  |    | | ||||
| | Greek (Ελληνικά) (el_GR)                    |    | | ||||
| | Turkish (Türkçe) (tr_TR)                    |    | | ||||
| | Indonesia (Bahasa Indonesia) (id_ID)        |    | | ||||
| | Turkish (Türkçe) (tr_TR)                    |    | | ||||
| | Indonesia (Bahasa Indonesia) (id_ID)        |    | | ||||
| | Hindi (हिंदी) (hi_IN)                          |    | | ||||
| | Hungarian (Magyar) (hu_HU)                  |    | | ||||
| | Bulgarian (Български) (bg_BG)               |    | | ||||
| | Sebian Latin alphabet (Srpski) (sr_LATN_RS) |    | | ||||
| | Ukrainian (Українська) (uk_UA)              |    | | ||||
| | Slovakian (Slovensky) (sk_SK)               |    | | ||||
| | Sebian Latin alphabet (Srpski) (sr_LATN_RS) |    | | ||||
| | Ukrainian (Українська) (uk_UA)              |    | | ||||
| | Slovakian (Slovensky) (sk_SK)               |    | | ||||
| | Czech (Česky) (cs_CZ)                       |    | | ||||
| | Croatian (Hrvatski) (hr_HR)                 |    | | ||||
| | Norwegian (Norsk) (no_NB)                   |    | | ||||
| | Croatian (Hrvatski) (hr_HR)                 |    | | ||||
| | Norwegian (Norsk) (no_NB)                   |    | | ||||
| 
 | ||||
| ## Contributing (creating issues, translations, fixing bugs, etc.) | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| apiVersion: v2 | ||||
| appVersion: 0.25.1 | ||||
| appVersion: 0.25.2 | ||||
| description: locally hosted web application that allows you to perform various operations | ||||
|   on PDF files | ||||
| home: https://github.com/Stirling-Tools/Stirling-PDF | ||||
|  | ||||
| @ -15,7 +15,10 @@ ignore = [ | ||||
| 
 | ||||
| [cs_CZ] | ||||
| ignore = [ | ||||
|     'info', | ||||
|     'language.direction', | ||||
|     'pipeline.header', | ||||
|     'text', | ||||
| ] | ||||
| 
 | ||||
| [de_DE] | ||||
| @ -65,6 +68,16 @@ ignore = [ | ||||
|     'language.direction', | ||||
| ] | ||||
| 
 | ||||
| [hr_HR] | ||||
| ignore = [ | ||||
|     'font', | ||||
|     'home.pipeline.title', | ||||
|     'info', | ||||
|     'language.direction', | ||||
|     'pdfOrganiser.tags', | ||||
|     'showJS.tags', | ||||
| ] | ||||
| 
 | ||||
| [hu_HU] | ||||
| ignore = [ | ||||
|     'language.direction', | ||||
| @ -103,6 +116,11 @@ ignore = [ | ||||
|     'language.direction', | ||||
| ] | ||||
| 
 | ||||
| [no_NB] | ||||
| ignore = [ | ||||
|     'language.direction', | ||||
| ] | ||||
| 
 | ||||
| [pl_PL] | ||||
| ignore = [ | ||||
|     'language.direction', | ||||
|  | ||||
| @ -238,7 +238,7 @@ public class SecurityConfiguration { | ||||
|         GoogleProvider google = client.getGoogle(); | ||||
|         return google != null && google.isSettingsValid() | ||||
|                 ? Optional.of( | ||||
|                         ClientRegistration.withRegistrationId("google") | ||||
|                         ClientRegistration.withRegistrationId(google.getName()) | ||||
|                                 .clientId(google.getClientId()) | ||||
|                                 .clientSecret(google.getClientSecret()) | ||||
|                                 .scope(google.getScopes()) | ||||
| @ -246,8 +246,8 @@ public class SecurityConfiguration { | ||||
|                                 .tokenUri(google.getTokenuri()) | ||||
|                                 .userInfoUri(google.getUserinfouri()) | ||||
|                                 .userNameAttributeName(google.getUseAsUsername()) | ||||
|                                 .clientName("Google") | ||||
|                                 .redirectUri("{baseUrl}/login/oauth2/code/google") | ||||
|                                 .clientName(google.getClientName()) | ||||
|                                 .redirectUri("{baseUrl}/login/oauth2/code/" + google.getName()) | ||||
|                                 .authorizationGrantType( | ||||
|                                         org.springframework.security.oauth2.core | ||||
|                                                 .AuthorizationGrantType.AUTHORIZATION_CODE) | ||||
| @ -269,12 +269,12 @@ public class SecurityConfiguration { | ||||
|         return keycloak != null && keycloak.isSettingsValid() | ||||
|                 ? Optional.of( | ||||
|                         ClientRegistrations.fromIssuerLocation(keycloak.getIssuer()) | ||||
|                                 .registrationId("keycloak") | ||||
|                                 .registrationId(keycloak.getName()) | ||||
|                                 .clientId(keycloak.getClientId()) | ||||
|                                 .clientSecret(keycloak.getClientSecret()) | ||||
|                                 .scope(keycloak.getScopes()) | ||||
|                                 .userNameAttributeName(keycloak.getUseAsUsername()) | ||||
|                                 .clientName("Keycloak") | ||||
|                                 .clientName(keycloak.getClientName()) | ||||
|                                 .build()) | ||||
|                 : Optional.empty(); | ||||
|     } | ||||
| @ -291,7 +291,7 @@ public class SecurityConfiguration { | ||||
|         GithubProvider github = client.getGithub(); | ||||
|         return github != null && github.isSettingsValid() | ||||
|                 ? Optional.of( | ||||
|                         ClientRegistration.withRegistrationId("github") | ||||
|                         ClientRegistration.withRegistrationId(github.getName()) | ||||
|                                 .clientId(github.getClientId()) | ||||
|                                 .clientSecret(github.getClientSecret()) | ||||
|                                 .scope(github.getScopes()) | ||||
| @ -299,8 +299,8 @@ public class SecurityConfiguration { | ||||
|                                 .tokenUri(github.getTokenuri()) | ||||
|                                 .userInfoUri(github.getUserinfouri()) | ||||
|                                 .userNameAttributeName(github.getUseAsUsername()) | ||||
|                                 .clientName("GitHub") | ||||
|                                 .redirectUri("{baseUrl}/login/oauth2/code/github") | ||||
|                                 .clientName(github.getClientName()) | ||||
|                                 .redirectUri("{baseUrl}/login/oauth2/code/" + github.getName()) | ||||
|                                 .authorizationGrantType( | ||||
|                                         org.springframework.security.oauth2.core | ||||
|                                                 .AuthorizationGrantType.AUTHORIZATION_CODE) | ||||
|  | ||||
| @ -81,7 +81,7 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand | ||||
|             logger.info("Session invalidated: " + sessionId); | ||||
|         } | ||||
| 
 | ||||
|         switch (registrationId) { | ||||
|         switch (registrationId.toLowerCase()) { | ||||
|             case "keycloak": | ||||
|                 // Add Keycloak specific logout URL if needed | ||||
|                 String logoutUrl = | ||||
|  | ||||
| @ -16,6 +16,8 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser; | ||||
| import stirling.software.SPDF.config.security.LoginAttemptService; | ||||
| import stirling.software.SPDF.config.security.UserService; | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; | ||||
| import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client; | ||||
| import stirling.software.SPDF.model.User; | ||||
| 
 | ||||
| public class CustomOAuth2UserService implements OAuth2UserService<OidcUserRequest, OidcUser> { | ||||
| @ -41,11 +43,27 @@ public class CustomOAuth2UserService implements OAuth2UserService<OidcUserReques | ||||
| 
 | ||||
|     @Override | ||||
|     public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException { | ||||
|         String usernameAttribute = | ||||
|                 applicationProperties.getSecurity().getOAUTH2().getUseAsUsername(); | ||||
|         OAUTH2 oauth2 = applicationProperties.getSecurity().getOAUTH2(); | ||||
|         String usernameAttribute = oauth2.getUseAsUsername(); | ||||
|         if (usernameAttribute == null || usernameAttribute.trim().isEmpty()) { | ||||
|             Client client = oauth2.getClient(); | ||||
|             if (client != null && client.getKeycloak() != null) { | ||||
|                 usernameAttribute = client.getKeycloak().getUseAsUsername(); | ||||
|             } else { | ||||
|                 usernameAttribute = "email"; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|             OidcUser user = delegate.loadUser(userRequest); | ||||
|             String username = user.getUserInfo().getClaimAsString(usernameAttribute); | ||||
| 
 | ||||
|             // Check if the username claim is null or empty | ||||
|             if (username == null || username.trim().isEmpty()) { | ||||
|                 throw new IllegalArgumentException( | ||||
|                         "Claim '" + usernameAttribute + "' cannot be null or empty"); | ||||
|             } | ||||
| 
 | ||||
|             Optional<User> duser = userService.findByUsernameIgnoreCase(username); | ||||
|             if (duser.isPresent()) { | ||||
|                 if (loginAttemptService.isBlocked(username)) { | ||||
| @ -56,13 +74,14 @@ public class CustomOAuth2UserService implements OAuth2UserService<OidcUserReques | ||||
|                     throw new IllegalArgumentException("Password must not be null"); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // Return a new OidcUser with adjusted attributes | ||||
|             return new DefaultOidcUser( | ||||
|                     user.getAuthorities(), | ||||
|                     userRequest.getIdToken(), | ||||
|                     user.getUserInfo(), | ||||
|                     usernameAttribute); | ||||
|         } catch (java.lang.IllegalArgumentException e) { | ||||
|         } catch (IllegalArgumentException e) { | ||||
|             logger.error("Error loading OIDC user: {}", e.getMessage()); | ||||
|             throw new OAuth2AuthenticationException(new OAuth2Error(e.getMessage()), e); | ||||
|         } catch (Exception e) { | ||||
|  | ||||
| @ -52,23 +52,23 @@ public class AccountWebController { | ||||
|         OAUTH2 oauth = applicationProperties.getSecurity().getOAUTH2(); | ||||
|         if (oauth != null) { | ||||
|             if (oauth.isSettingsValid()) { | ||||
|                 providerList.put("oidc", "OpenID Connect"); | ||||
|                 providerList.put("oidc", oauth.getProvider()); | ||||
|             } | ||||
|             Client client = oauth.getClient(); | ||||
|             if (client != null) { | ||||
|                 GoogleProvider google = client.getGoogle(); | ||||
|                 if (google.isSettingsValid()) { | ||||
|                     providerList.put("google", "Google"); | ||||
|                     providerList.put(google.getName(), google.getClientName()); | ||||
|                 } | ||||
| 
 | ||||
|                 GithubProvider github = client.getGithub(); | ||||
|                 if (github.isSettingsValid()) { | ||||
|                     providerList.put("github", "Github"); | ||||
|                     providerList.put(github.getName(), github.getClientName()); | ||||
|                 } | ||||
| 
 | ||||
|                 KeycloakProvider keycloak = client.getKeycloak(); | ||||
|                 if (keycloak.isSettingsValid()) { | ||||
|                     providerList.put("keycloak", "Keycloak"); | ||||
|                     providerList.put(keycloak.getName(), keycloak.getClientName()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -356,7 +356,7 @@ public class ApplicationProperties { | ||||
|                 private KeycloakProvider keycloak = new KeycloakProvider(); | ||||
| 
 | ||||
|                 public Provider get(String registrationId) throws Exception { | ||||
|                     switch (registrationId) { | ||||
|                     switch (registrationId.toLowerCase()) { | ||||
|                         case "google": | ||||
|                             return getGoogle(); | ||||
|                         case "github": | ||||
| @ -455,6 +455,7 @@ public class ApplicationProperties { | ||||
|         @Override | ||||
|         public Collection<String> getScopes() { | ||||
|             if (scopes == null || scopes.isEmpty()) { | ||||
|                 scopes = new ArrayList<>(); | ||||
|                 scopes.add("https://www.googleapis.com/auth/userinfo.email"); | ||||
|                 scopes.add("https://www.googleapis.com/auth/userinfo.profile"); | ||||
|             } | ||||
| @ -495,6 +496,11 @@ public class ApplicationProperties { | ||||
|             return "google"; | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public String getClientName() { | ||||
|             return "Google"; | ||||
|         } | ||||
| 
 | ||||
|         public boolean isSettingsValid() { | ||||
|             return super.isValid(this.getClientId(), "clientId") | ||||
|                     && super.isValid(this.getClientSecret(), "clientSecret") | ||||
| @ -555,6 +561,7 @@ public class ApplicationProperties { | ||||
| 
 | ||||
|         public Collection<String> getScopes() { | ||||
|             if (scopes == null || scopes.isEmpty()) { | ||||
|                 scopes = new ArrayList<>(); | ||||
|                 scopes.add("read:user"); | ||||
|             } | ||||
|             return scopes; | ||||
| @ -594,6 +601,11 @@ public class ApplicationProperties { | ||||
|             return "github"; | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public String getClientName() { | ||||
|             return "GitHub"; | ||||
|         } | ||||
| 
 | ||||
|         public boolean isSettingsValid() { | ||||
|             return super.isValid(this.getClientId(), "clientId") | ||||
|                     && super.isValid(this.getClientSecret(), "clientSecret") | ||||
| @ -642,7 +654,7 @@ public class ApplicationProperties { | ||||
|         @Override | ||||
|         public Collection<String> getScopes() { | ||||
|             if (scopes == null || scopes.isEmpty()) { | ||||
|                 scopes.add("openid"); | ||||
|                 scopes = new ArrayList<>(); | ||||
|                 scopes.add("profile"); | ||||
|                 scopes.add("email"); | ||||
|             } | ||||
| @ -684,6 +696,11 @@ public class ApplicationProperties { | ||||
|             return "keycloak"; | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public String getClientName() { | ||||
|             return "Keycloak"; | ||||
|         } | ||||
| 
 | ||||
|         public boolean isSettingsValid() { | ||||
|             return isValid(this.getIssuer(), "issuer") | ||||
|                     && isValid(this.getClientId(), "clientId") | ||||
|  | ||||
| @ -4,11 +4,16 @@ import java.util.Collection; | ||||
| 
 | ||||
| public class Provider implements ProviderInterface { | ||||
|     private String name; | ||||
|     private String clientName; | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public String getClientName() { | ||||
|         return clientName; | ||||
|     } | ||||
| 
 | ||||
|     protected boolean isValid(String value, String name) { | ||||
|         if (value != null && !value.trim().isEmpty()) { | ||||
|             return true; | ||||
|  | ||||
| @ -26,7 +26,7 @@ bored=Nudíte se při čekání? | ||||
| alphabet=Abeceda | ||||
| downloadPdf=Stáhnout PDF | ||||
| text=Text | ||||
| font=Font | ||||
| font=Písmo | ||||
| selectFillter=-- Vyberte -- | ||||
| pageNum=Číslo stránky | ||||
| sizes.small=Malé | ||||
|  | ||||
| @ -71,7 +71,7 @@ visitGithub=GitHub-Repository besuchen | ||||
| donate=Spenden | ||||
| color=Farbe | ||||
| sponsor=Sponsor | ||||
| info=Die Info | ||||
| info=Informationen | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @ -660,10 +660,10 @@ certSign.submit=PDF signieren | ||||
| 
 | ||||
| 
 | ||||
| #removeCertSign | ||||
| removeCertSign.title=Remove Certificate Signature | ||||
| removeCertSign.header=Remove the digital certificate from the PDF | ||||
| removeCertSign.selectPDF=Select a PDF file: | ||||
| removeCertSign.submit=Remove Signature | ||||
| removeCertSign.title=Zertifikatsignatur entfernen | ||||
| removeCertSign.header=Digitales Zertifikat aus dem PDF entfernen | ||||
| removeCertSign.selectPDF=PDF-Datei auswählen: | ||||
| removeCertSign.submit=Signatur entfernen | ||||
| 
 | ||||
| 
 | ||||
| #removeBlanks | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| ########### | ||||
| # Generic # | ||||
| ########### | ||||
| # the direction that the language is written (ltr=left to right, rtl = right to left) | ||||
| # the direction that the language is written (ltr = left to right, rtl = right to left) | ||||
| language.direction=ltr | ||||
| 
 | ||||
| pdfPrompt=Odaberi PDF(ove) | ||||
| @ -331,9 +331,10 @@ compare.tags=razlikovati,kontrast,izmjene,analiza | ||||
| home.certSign.title=Potpišite s certifikatom | ||||
| home.certSign.desc=Potpisuje PDF s certifikatom/ključem (PEM/P12) | ||||
| certSign.tags=autentifikacija,PEM,P12,zvanično,šifriranje | ||||
| # home.removeCertSign.title=Remove Certificate Sign | ||||
| # home.removeCertSign.desc=Remove certificate signature from PDF | ||||
| # removeCertSign.tags=authenticate,PEM,P12,official,decrypt | ||||
| 
 | ||||
| home.removeCertSign.title=Remove Certificate Sign | ||||
| home.removeCertSign.desc=Remove certificate signature from PDF | ||||
| removeCertSign.tags=authenticate,PEM,P12,official,decrypt | ||||
| 
 | ||||
| home.pageLayout.title=Izgled s više stranica | ||||
| home.pageLayout.desc=Spojite više stranica PDF dokumenta u jednu stranicu | ||||
| @ -656,10 +657,13 @@ certSign.reason=Razlog | ||||
| certSign.location=Mjesto | ||||
| certSign.name=Ime | ||||
| certSign.submit=Potpiši PDF | ||||
| # removeCertSign.title=Remove Certificate Signature | ||||
| # removeCertSign.header=Remove the digital certificate from the PDF | ||||
| # removeCertSign.selectPDF=Select a PDF file: | ||||
| # removeCertSign.submit=Remove Signature | ||||
| 
 | ||||
| 
 | ||||
| #removeCertSign | ||||
| removeCertSign.title=Remove Certificate Signature | ||||
| removeCertSign.header=Remove the digital certificate from the PDF | ||||
| removeCertSign.selectPDF=Select a PDF file: | ||||
| removeCertSign.submit=Remove Signature | ||||
| 
 | ||||
| 
 | ||||
| #removeBlanks | ||||
|  | ||||
| @ -438,7 +438,7 @@ PDFToBook.tags=bok,comic,calibre,konvertere,manga,amazon,kindle,epub,mobi,azw3,d | ||||
| 
 | ||||
| home.BookToPDF.title=Bok til PDF | ||||
| home.BookToPDF.desc=Konverter bøker/tegneserier til PDF ved hjelp av calibre | ||||
| 
 | ||||
| BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf | ||||
| 
 | ||||
| 
 | ||||
| ########################### | ||||
| @ -783,7 +783,7 @@ compress.selectText.2=Optimeringsnivå: | ||||
| compress.selectText.3=4 (Dårlig for tekstbilder) | ||||
| compress.selectText.4=Automatisk modus - Justerer automatisk kvaliteten for å få PDF til nøyaktig størrelse | ||||
| compress.selectText.5=Forventet PDF-størrelse (f.eks. 25MB, 10.8MB, 25KB) | ||||
| compress.Submit=Komprimer | ||||
| compress.submit=Komprimer | ||||
| 
 | ||||
| 
 | ||||
| #Add image | ||||
| @ -855,7 +855,7 @@ split.desc.6=Dokument #4: Side 8 | ||||
| split.desc.7=Dokument #5: Side 9 | ||||
| split.desc.8=Dokument #6: Side 10 | ||||
| split.splitPages=Skriv inn sidene som skal deles på: | ||||
| split.Submit=Del | ||||
| split.submit=Del | ||||
| 
 | ||||
| 
 | ||||
| #merge | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user