diff options
Diffstat (limited to 'lib')
39 files changed, 1727 insertions, 97 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 16926e77775..65c1a299dec 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -275,6 +275,15 @@ return array( 'OCP\\Common\\Exception\\NotFoundException' => $baseDir . '/lib/public/Common/Exception/NotFoundException.php', 'OCP\\Config\\BeforePreferenceDeletedEvent' => $baseDir . '/lib/public/Config/BeforePreferenceDeletedEvent.php', 'OCP\\Config\\BeforePreferenceSetEvent' => $baseDir . '/lib/public/Config/BeforePreferenceSetEvent.php', + 'OCP\\Config\\Exceptions\\IncorrectTypeException' => $baseDir . '/lib/public/Config/Exceptions/IncorrectTypeException.php', + 'OCP\\Config\\Exceptions\\TypeConflictException' => $baseDir . '/lib/public/Config/Exceptions/TypeConflictException.php', + 'OCP\\Config\\Exceptions\\UnknownKeyException' => $baseDir . '/lib/public/Config/Exceptions/UnknownKeyException.php', + 'OCP\\Config\\IUserConfig' => $baseDir . '/lib/public/Config/IUserConfig.php', + 'OCP\\Config\\Lexicon\\Entry' => $baseDir . '/lib/public/Config/Lexicon/Entry.php', + 'OCP\\Config\\Lexicon\\ILexicon' => $baseDir . '/lib/public/Config/Lexicon/ILexicon.php', + 'OCP\\Config\\Lexicon\\Preset' => $baseDir . '/lib/public/Config/Lexicon/Preset.php', + 'OCP\\Config\\Lexicon\\Strictness' => $baseDir . '/lib/public/Config/Lexicon/Strictness.php', + 'OCP\\Config\\ValueType' => $baseDir . '/lib/public/Config/ValueType.php', 'OCP\\Console\\ConsoleEvent' => $baseDir . '/lib/public/Console/ConsoleEvent.php', 'OCP\\Console\\ReservedOptions' => $baseDir . '/lib/public/Console/ReservedOptions.php', 'OCP\\Constants' => $baseDir . '/lib/public/Constants.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index daa1a1940dd..909ac3599f5 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -316,6 +316,15 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\Common\\Exception\\NotFoundException' => __DIR__ . '/../../..' . '/lib/public/Common/Exception/NotFoundException.php', 'OCP\\Config\\BeforePreferenceDeletedEvent' => __DIR__ . '/../../..' . '/lib/public/Config/BeforePreferenceDeletedEvent.php', 'OCP\\Config\\BeforePreferenceSetEvent' => __DIR__ . '/../../..' . '/lib/public/Config/BeforePreferenceSetEvent.php', + 'OCP\\Config\\Exceptions\\IncorrectTypeException' => __DIR__ . '/../../..' . '/lib/public/Config/Exceptions/IncorrectTypeException.php', + 'OCP\\Config\\Exceptions\\TypeConflictException' => __DIR__ . '/../../..' . '/lib/public/Config/Exceptions/TypeConflictException.php', + 'OCP\\Config\\Exceptions\\UnknownKeyException' => __DIR__ . '/../../..' . '/lib/public/Config/Exceptions/UnknownKeyException.php', + 'OCP\\Config\\IUserConfig' => __DIR__ . '/../../..' . '/lib/public/Config/IUserConfig.php', + 'OCP\\Config\\Lexicon\\Entry' => __DIR__ . '/../../..' . '/lib/public/Config/Lexicon/Entry.php', + 'OCP\\Config\\Lexicon\\ILexicon' => __DIR__ . '/../../..' . '/lib/public/Config/Lexicon/ILexicon.php', + 'OCP\\Config\\Lexicon\\Preset' => __DIR__ . '/../../..' . '/lib/public/Config/Lexicon/Preset.php', + 'OCP\\Config\\Lexicon\\Strictness' => __DIR__ . '/../../..' . '/lib/public/Config/Lexicon/Strictness.php', + 'OCP\\Config\\ValueType' => __DIR__ . '/../../..' . '/lib/public/Config/ValueType.php', 'OCP\\Console\\ConsoleEvent' => __DIR__ . '/../../..' . '/lib/public/Console/ConsoleEvent.php', 'OCP\\Console\\ReservedOptions' => __DIR__ . '/../../..' . '/lib/public/Console/ReservedOptions.php', 'OCP\\Constants' => __DIR__ . '/../../..' . '/lib/public/Constants.php', diff --git a/lib/composer/composer/platform_check.php b/lib/composer/composer/platform_check.php index 4c3a5d68f14..2beb1491838 100644 --- a/lib/composer/composer/platform_check.php +++ b/lib/composer/composer/platform_check.php @@ -19,8 +19,7 @@ if ($issues) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) ); } diff --git a/lib/l10n/be.js b/lib/l10n/be.js index 4e912495dae..eb38c0ed05e 100644 --- a/lib/l10n/be.js +++ b/lib/l10n/be.js @@ -1,11 +1,20 @@ OC.L10N.register( "lib", { + "Authentication" : "Аўтэнтыфікацыя", + "Unknown filetype" : "Невядомы тып файла", "Files" : "Файлы", + "_%n year ago_::_%n years ago_" : ["%n год таму","%n гады таму","%n гадоў таму","%n гадоў таму"], + "seconds ago" : "с таму", + "Templates" : "Шаблоны", "__language_name__" : "Беларуская", + "Apps" : "Праграмы", "Settings" : "Налады", "Accounts" : "Уліковыя запісы", "Email" : "Электронная пошта", + "Twitter" : "Twitter", + "Role" : "Роля", + "Pronouns" : "Займеннікі", "Sunday" : "Нядзеля", "Monday" : "Панядзелак", "Tuesday" : "Аўторак", @@ -32,6 +41,7 @@ OC.L10N.register( "October" : "Кастрычнік", "November" : "Лістапад", "December" : "Снежань", + "Text" : "Тэкст", "Translate" : "Перакласці" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/lib/l10n/be.json b/lib/l10n/be.json index d45139618d2..d944caed749 100644 --- a/lib/l10n/be.json +++ b/lib/l10n/be.json @@ -1,9 +1,18 @@ { "translations": { + "Authentication" : "Аўтэнтыфікацыя", + "Unknown filetype" : "Невядомы тып файла", "Files" : "Файлы", + "_%n year ago_::_%n years ago_" : ["%n год таму","%n гады таму","%n гадоў таму","%n гадоў таму"], + "seconds ago" : "с таму", + "Templates" : "Шаблоны", "__language_name__" : "Беларуская", + "Apps" : "Праграмы", "Settings" : "Налады", "Accounts" : "Уліковыя запісы", "Email" : "Электронная пошта", + "Twitter" : "Twitter", + "Role" : "Роля", + "Pronouns" : "Займеннікі", "Sunday" : "Нядзеля", "Monday" : "Панядзелак", "Tuesday" : "Аўторак", @@ -30,6 +39,7 @@ "October" : "Кастрычнік", "November" : "Лістапад", "December" : "Снежань", + "Text" : "Тэкст", "Translate" : "Перакласці" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/lib/l10n/ga.js b/lib/l10n/ga.js index 7093ce8a110..2de5f97ab4c 100644 --- a/lib/l10n/ga.js +++ b/lib/l10n/ga.js @@ -324,18 +324,36 @@ OC.L10N.register( "Storage is temporarily not available" : "Níl stóráil ar fáil go sealadach", "Storage connection timeout. %s" : "Teorainn ama ceangail stórála. %s", "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí Gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá chuid `fearainn_iontaofa` nó an `overwrite.cli.url`. D'fhéadfadh an teip seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach.", + "Analyze images" : "Anailísigh íomhánna", + "Ask a question about the given images." : "Cuir ceist faoi na híomhánna a thugtar.", "Images" : "Íomhánna", + "Images to ask a question about" : "Íomhánna le ceist a chur fúthu", "Question" : "Ceist", + "What to ask about the images." : "Cad atá le fiafraí faoi na híomhánna.", "Generated response" : "Freagra ginte", + "The answer to the question" : "An freagra ar an gceist", + "Audio chat" : "Comhrá fuaime", + "Voice chat with the assistant" : "Comhrá gutha leis an gcúntóir", "System prompt" : "Leid córais", "Define rules and assumptions that the assistant should follow during the conversation." : "Sainmhínigh na rialacha agus na toimhdí ba chóir don chúntóir a leanúint le linn an chomhrá.", + "Chat voice message" : "Teachtaireacht gutha comhrá", + "Describe a task that you want the assistant to do or ask a question." : "Déan cur síos ar thasc ar mhaith leat go ndéanfadh an cúntóir é nó ar cheist a chur.", "Chat history" : "Stair comhrá", + "The history of chat messages before the current message, starting with a message by the user." : "Stair na dteachtaireachtaí comhrá roimh an teachtaireacht reatha, ag tosú le teachtaireacht ón úsáideoir.", + "Input transcript" : "Tras-scríbhinn ionchuir", + "Transcription of the audio input" : "Tras-scríobh an ionchuir fuaime", + "Response voice message" : "Teachtaireacht gutha freagartha", + "The generated voice response as part of the conversation" : "An freagra gutha a ghintear mar chuid den chomhrá", + "Output transcript" : "Tras-scríbhinn aschuir", + "Transcription of the audio output" : "Tras-scríobh an aschuir fuaime", "Transcribe audio" : "Trascríobh fuaime", "Transcribe the things said in an audio" : "Tras-scríobh na rudaí a dúradh i bhfuaim", "Audio input" : "Ionchur fuaime", "The audio to transcribe" : "Fuaime le tras-scríobh", "Transcription" : "Trascríobh", "The transcribed text" : "An téacs tras-scríofa", + "Chat by voice with an agent" : "Comhrá gutha le gníomhaire", + "Describe a task that you want the agent to do or ask a question." : "Déan cur síos ar thasc ar mhaith leat go ndéanfadh an gníomhaire é nó ar cheist a chur.", "Confirmation" : "Daingniú", "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "Cibé ar cheart gníomhartha a iarradh roimhe seo a dhearbhú: 0 le séanadh agus 1 le deimhniú.", "Conversation token" : "Comhartha comhartha", diff --git a/lib/l10n/ga.json b/lib/l10n/ga.json index a8fe7126c59..a81cebc37e0 100644 --- a/lib/l10n/ga.json +++ b/lib/l10n/ga.json @@ -322,18 +322,36 @@ "Storage is temporarily not available" : "Níl stóráil ar fáil go sealadach", "Storage connection timeout. %s" : "Teorainn ama ceangail stórála. %s", "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Le gur féidir an tseiceáil seo a rith caithfidh tú a chinntiú gur féidir le do fhreastalaí Gréasáin nascadh leis féin. Mar sin caithfidh sé a bheith in ann réiteach agus ceangal a dhéanamh le ceann amháin ar a laghad dá chuid `fearainn_iontaofa` nó an `overwrite.cli.url`. D'fhéadfadh an teip seo a bheith mar thoradh ar mhímheaitseáil DNS ar thaobh an fhreastalaí nó riail balla dóiteáin amach.", + "Analyze images" : "Anailísigh íomhánna", + "Ask a question about the given images." : "Cuir ceist faoi na híomhánna a thugtar.", "Images" : "Íomhánna", + "Images to ask a question about" : "Íomhánna le ceist a chur fúthu", "Question" : "Ceist", + "What to ask about the images." : "Cad atá le fiafraí faoi na híomhánna.", "Generated response" : "Freagra ginte", + "The answer to the question" : "An freagra ar an gceist", + "Audio chat" : "Comhrá fuaime", + "Voice chat with the assistant" : "Comhrá gutha leis an gcúntóir", "System prompt" : "Leid córais", "Define rules and assumptions that the assistant should follow during the conversation." : "Sainmhínigh na rialacha agus na toimhdí ba chóir don chúntóir a leanúint le linn an chomhrá.", + "Chat voice message" : "Teachtaireacht gutha comhrá", + "Describe a task that you want the assistant to do or ask a question." : "Déan cur síos ar thasc ar mhaith leat go ndéanfadh an cúntóir é nó ar cheist a chur.", "Chat history" : "Stair comhrá", + "The history of chat messages before the current message, starting with a message by the user." : "Stair na dteachtaireachtaí comhrá roimh an teachtaireacht reatha, ag tosú le teachtaireacht ón úsáideoir.", + "Input transcript" : "Tras-scríbhinn ionchuir", + "Transcription of the audio input" : "Tras-scríobh an ionchuir fuaime", + "Response voice message" : "Teachtaireacht gutha freagartha", + "The generated voice response as part of the conversation" : "An freagra gutha a ghintear mar chuid den chomhrá", + "Output transcript" : "Tras-scríbhinn aschuir", + "Transcription of the audio output" : "Tras-scríobh an aschuir fuaime", "Transcribe audio" : "Trascríobh fuaime", "Transcribe the things said in an audio" : "Tras-scríobh na rudaí a dúradh i bhfuaim", "Audio input" : "Ionchur fuaime", "The audio to transcribe" : "Fuaime le tras-scríobh", "Transcription" : "Trascríobh", "The transcribed text" : "An téacs tras-scríofa", + "Chat by voice with an agent" : "Comhrá gutha le gníomhaire", + "Describe a task that you want the agent to do or ask a question." : "Déan cur síos ar thasc ar mhaith leat go ndéanfadh an gníomhaire é nó ar cheist a chur.", "Confirmation" : "Daingniú", "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "Cibé ar cheart gníomhartha a iarradh roimhe seo a dhearbhú: 0 le séanadh agus 1 le deimhniú.", "Conversation token" : "Comhartha comhartha", diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js index 033371a84a2..3e845827bab 100644 --- a/lib/l10n/tr.js +++ b/lib/l10n/tr.js @@ -324,18 +324,36 @@ OC.L10N.register( "Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor", "Storage connection timeout. %s" : "Depolama bağlantısı zaman aşımı. %s", "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir.", + "Analyze images" : "Görselleri incele", + "Ask a question about the given images." : "Verilen görseller ile ilgili bir soru sorun.", "Images" : "Görseller", + "Images to ask a question about" : "Haklarında bir soru sorulacak görseller", "Question" : "Soru", + "What to ask about the images." : "Görseller hakkında ne sorulacağı.", "Generated response" : "Üretilen yanıt", + "The answer to the question" : "Sorunun yanıtı", + "Audio chat" : "Sesli görüşme", + "Voice chat with the assistant" : "Yardımcı ile sesli görüşme", "System prompt" : "Sistem istemi", "Define rules and assumptions that the assistant should follow during the conversation." : "Görüşme sırasında yardımcının uyması gereken kuralları ve varsayımları tanımlayın.", + "Chat voice message" : "Görüşme ses iletisi", + "Describe a task that you want the assistant to do or ask a question." : "Yardımcının yapmasını istediğiniz bir görevi tanımlayın ya da bir soru sorun.", "Chat history" : "Sohbet geçmişi", + "The history of chat messages before the current message, starting with a message by the user." : "Kullanıcının iletisiyle başlayarak, geçerli iletiden önceki sohbet iletilerinin geçmişi.", + "Input transcript" : "Girişin yazıya dökümü", + "Transcription of the audio input" : "Ses girişinin yazıya dökümü", + "Response voice message" : "Yanıt ses iletisi", + "The generated voice response as part of the conversation" : "Sesli görüşmenin parçası olarak oluşturulan yanıt", + "Output transcript" : "Çıkışın yazıya dökümü", + "Transcription of the audio output" : "Ses çıkışının yazıya dökümü", "Transcribe audio" : "Sesten yazıya dönüştür.", "Transcribe the things said in an audio" : "Bir sestekileri yazıya dönüştür", "Audio input" : "Ses girişi", "The audio to transcribe" : "Yazıya dönüştürülecek ses", "Transcription" : "Yazıya dönüştürme", "The transcribed text" : "Dönüştürülen yazı", + "Chat by voice with an agent" : "Bir aracı ile sesli görüşün", + "Describe a task that you want the agent to do or ask a question." : "Aracının yapmasını istediğiniz bir görevi tanımlayın ya da bir soru sorun.", "Confirmation" : "Onaylama", "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "Daha önce istenilen işlemlerin onaylanıp onaylanmayacağı: Reddedilmesi için 0, onaylanması için 1.", "Conversation token" : "Görüşme kodu", diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json index a995c0df8fd..ccf11aa4e8a 100644 --- a/lib/l10n/tr.json +++ b/lib/l10n/tr.json @@ -322,18 +322,36 @@ "Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor", "Storage connection timeout. %s" : "Depolama bağlantısı zaman aşımı. %s", "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "Bu denetimi çalıştırabilmek için site sunucunuzun kendisine bağlanabildiğinden emin olmanız gerekir. Bu nedenle, `trusted_domains` ya da `overwrite.cli.url` değerlerinden en az birini çözümleyebilmeli ve bunlara bağlanabilmelidir. Bu sorun, sunucu tarafındaki bir DNS uyumsuzluğunun veya giden güvenlik duvarı kuralının sonucu olabilir.", + "Analyze images" : "Görselleri incele", + "Ask a question about the given images." : "Verilen görseller ile ilgili bir soru sorun.", "Images" : "Görseller", + "Images to ask a question about" : "Haklarında bir soru sorulacak görseller", "Question" : "Soru", + "What to ask about the images." : "Görseller hakkında ne sorulacağı.", "Generated response" : "Üretilen yanıt", + "The answer to the question" : "Sorunun yanıtı", + "Audio chat" : "Sesli görüşme", + "Voice chat with the assistant" : "Yardımcı ile sesli görüşme", "System prompt" : "Sistem istemi", "Define rules and assumptions that the assistant should follow during the conversation." : "Görüşme sırasında yardımcının uyması gereken kuralları ve varsayımları tanımlayın.", + "Chat voice message" : "Görüşme ses iletisi", + "Describe a task that you want the assistant to do or ask a question." : "Yardımcının yapmasını istediğiniz bir görevi tanımlayın ya da bir soru sorun.", "Chat history" : "Sohbet geçmişi", + "The history of chat messages before the current message, starting with a message by the user." : "Kullanıcının iletisiyle başlayarak, geçerli iletiden önceki sohbet iletilerinin geçmişi.", + "Input transcript" : "Girişin yazıya dökümü", + "Transcription of the audio input" : "Ses girişinin yazıya dökümü", + "Response voice message" : "Yanıt ses iletisi", + "The generated voice response as part of the conversation" : "Sesli görüşmenin parçası olarak oluşturulan yanıt", + "Output transcript" : "Çıkışın yazıya dökümü", + "Transcription of the audio output" : "Ses çıkışının yazıya dökümü", "Transcribe audio" : "Sesten yazıya dönüştür.", "Transcribe the things said in an audio" : "Bir sestekileri yazıya dönüştür", "Audio input" : "Ses girişi", "The audio to transcribe" : "Yazıya dönüştürülecek ses", "Transcription" : "Yazıya dönüştürme", "The transcribed text" : "Dönüştürülen yazı", + "Chat by voice with an agent" : "Bir aracı ile sesli görüşün", + "Describe a task that you want the agent to do or ask a question." : "Aracının yapmasını istediğiniz bir görevi tanımlayın ya da bir soru sorun.", "Confirmation" : "Onaylama", "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "Daha önce istenilen işlemlerin onaylanıp onaylanmayacağı: Reddedilmesi için 0, onaylanması için 1.", "Conversation token" : "Görüşme kodu", diff --git a/lib/l10n/uz.js b/lib/l10n/uz.js index 231325a7a79..5f51ccfbaef 100644 --- a/lib/l10n/uz.js +++ b/lib/l10n/uz.js @@ -5,12 +5,12 @@ OC.L10N.register( "Authentication" : "Autentifikatsiya", "Unknown filetype" : "Unknown filetype", "Invalid image" : "Invalid image", - "Files" : "Files", + "Files" : "Fayllar", "View profile" : "View profile", "last month" : "last month", "seconds ago" : "seconds ago", "Apps" : "Apps", - "Settings" : "Settings", + "Settings" : "Sozlamalar", "Accounts" : "Akkaunt", "Email" : "Email", "Website" : "Veb-sayt", diff --git a/lib/l10n/uz.json b/lib/l10n/uz.json index fb089ce814e..48de5beb2ab 100644 --- a/lib/l10n/uz.json +++ b/lib/l10n/uz.json @@ -3,12 +3,12 @@ "Authentication" : "Autentifikatsiya", "Unknown filetype" : "Unknown filetype", "Invalid image" : "Invalid image", - "Files" : "Files", + "Files" : "Fayllar", "View profile" : "View profile", "last month" : "last month", "seconds ago" : "seconds ago", "Apps" : "Apps", - "Settings" : "Settings", + "Settings" : "Sozlamalar", "Accounts" : "Akkaunt", "Email" : "Email", "Website" : "Veb-sayt", diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php index 8a6bb5a4723..c80ee52eb0d 100644 --- a/lib/private/AllConfig.php +++ b/lib/private/AllConfig.php @@ -7,11 +7,11 @@ */ namespace OC; -use NCU\Config\Exceptions\TypeConflictException; -use NCU\Config\IUserConfig; -use NCU\Config\ValueType; use OC\Config\UserConfig; use OCP\Cache\CappedMemoryCache; +use OCP\Config\Exceptions\TypeConflictException; +use OCP\Config\IUserConfig; +use OCP\Config\ValueType; use OCP\IConfig; use OCP\IDBConnection; use OCP\PreConditionNotMetException; diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php index f050deba1ca..0a46109c9f9 100644 --- a/lib/private/AppConfig.php +++ b/lib/private/AppConfig.php @@ -11,12 +11,12 @@ namespace OC; use InvalidArgumentException; use JsonException; -use NCU\Config\Lexicon\ConfigLexiconEntry; -use NCU\Config\Lexicon\ConfigLexiconStrictness; -use NCU\Config\Lexicon\IConfigLexicon; -use NCU\Config\Lexicon\Preset; use OC\AppFramework\Bootstrap\Coordinator; use OC\Config\ConfigManager; +use OCP\Config\Lexicon\Entry; +use OCP\Config\Lexicon\ILexicon; +use OCP\Config\Lexicon\Preset; +use OCP\Config\Lexicon\Strictness; use OCP\DB\Exception as DBException; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Exceptions\AppConfigIncorrectTypeException; @@ -62,7 +62,7 @@ class AppConfig implements IAppConfig { private array $valueTypes = []; // type for all config values private bool $fastLoaded = false; private bool $lazyLoaded = false; - /** @var array<string, array{entries: array<string, ConfigLexiconEntry>, aliases: array<string, string>, strictness: ConfigLexiconStrictness}> ['app_id' => ['strictness' => ConfigLexiconStrictness, 'entries' => ['config_key' => ConfigLexiconEntry[]]] */ + /** @var array<string, array{entries: array<string, Entry>, aliases: array<string, string>, strictness: Strictness}> ['app_id' => ['strictness' => ConfigLexiconStrictness, 'entries' => ['config_key' => ConfigLexiconEntry[]]] */ private array $configLexiconDetails = []; private bool $ignoreLexiconAliases = false; private ?Preset $configLexiconPreset = null; @@ -1655,7 +1655,7 @@ class AppConfig implements IAppConfig { return true; } - /** @var ConfigLexiconEntry $configValue */ + /** @var Entry $configValue */ $configValue = $configDetails['entries'][$key]; $type &= ~self::VALUE_SENSITIVE; @@ -1685,15 +1685,15 @@ class AppConfig implements IAppConfig { /** * manage ConfigLexicon behavior based on strictness set in IConfigLexicon * - * @param ConfigLexiconStrictness|null $strictness + * @param Strictness|null $strictness * @param string $line * * @return bool TRUE if conflict can be fully ignored, FALSE if action should be not performed * @throws AppConfigUnknownKeyException if strictness implies exception - * @see IConfigLexicon::getStrictness() + * @see ILexicon::getStrictness() */ private function applyLexiconStrictness( - ?ConfigLexiconStrictness $strictness, + ?Strictness $strictness, string $line = '', ): bool { if ($strictness === null) { @@ -1701,12 +1701,12 @@ class AppConfig implements IAppConfig { } switch ($strictness) { - case ConfigLexiconStrictness::IGNORE: + case Strictness::IGNORE: return true; - case ConfigLexiconStrictness::NOTICE: + case Strictness::NOTICE: $this->logger->notice($line); return true; - case ConfigLexiconStrictness::WARNING: + case Strictness::WARNING: $this->logger->warning($line); return false; } @@ -1720,7 +1720,7 @@ class AppConfig implements IAppConfig { * @param string $appId * @internal * - * @return array{entries: array<string, ConfigLexiconEntry>, aliases: array<string, string>, strictness: ConfigLexiconStrictness} + * @return array{entries: array<string, Entry>, aliases: array<string, string>, strictness: Strictness} */ public function getConfigDetailsFromLexicon(string $appId): array { if (!array_key_exists($appId, $this->configLexiconDetails)) { @@ -1737,14 +1737,14 @@ class AppConfig implements IAppConfig { $this->configLexiconDetails[$appId] = [ 'entries' => $entries, 'aliases' => $aliases, - 'strictness' => $configLexicon?->getStrictness() ?? ConfigLexiconStrictness::IGNORE + 'strictness' => $configLexicon?->getStrictness() ?? Strictness::IGNORE ]; } return $this->configLexiconDetails[$appId]; } - private function getLexiconEntry(string $appId, string $key): ?ConfigLexiconEntry { + private function getLexiconEntry(string $appId, string $key): ?Entry { return $this->getConfigDetailsFromLexicon($appId)['entries'][$key] ?? null; } diff --git a/lib/private/AppFramework/Bootstrap/RegistrationContext.php b/lib/private/AppFramework/Bootstrap/RegistrationContext.php index 95ad129c466..94250aad37b 100644 --- a/lib/private/AppFramework/Bootstrap/RegistrationContext.php +++ b/lib/private/AppFramework/Bootstrap/RegistrationContext.php @@ -10,7 +10,6 @@ declare(strict_types=1); namespace OC\AppFramework\Bootstrap; use Closure; -use NCU\Config\Lexicon\IConfigLexicon; use OC\Config\Lexicon\CoreConfigLexicon; use OC\Support\CrashReport\Registry; use OCP\AppFramework\App; @@ -23,6 +22,7 @@ use OCP\Calendar\Resource\IBackend as IResourceBackend; use OCP\Calendar\Room\IBackend as IRoomBackend; use OCP\Capabilities\ICapability; use OCP\Collaboration\Reference\IReferenceProvider; +use OCP\Config\Lexicon\ILexicon; use OCP\Dashboard\IManager; use OCP\Dashboard\IWidget; use OCP\EventDispatcher\IEventDispatcher; @@ -652,7 +652,7 @@ class RegistrationContext { } /** - * @psalm-param class-string<IConfigLexicon> $configLexiconClass + * @psalm-param class-string<ILexicon> $configLexiconClass */ public function registerConfigLexicon(string $appId, string $configLexiconClass): void { $this->configLexiconClasses[$appId] = $configLexiconClass; @@ -1023,9 +1023,9 @@ class RegistrationContext { * * @param string $appId * - * @return IConfigLexicon|null + * @return ILexicon|null */ - public function getConfigLexicon(string $appId): ?IConfigLexicon { + public function getConfigLexicon(string $appId): ?ILexicon { if (!array_key_exists($appId, $this->configLexiconClasses)) { return null; } diff --git a/lib/private/Calendar/Manager.php b/lib/private/Calendar/Manager.php index 0e2a3f5f679..7da1379809d 100644 --- a/lib/private/Calendar/Manager.php +++ b/lib/private/Calendar/Manager.php @@ -403,7 +403,10 @@ class Manager implements IManager { } if (empty($found)) { - $this->logger->warning('iMip message event could not be processed because no corresponding event was found in any calendar ' . $principalUri . 'and UID' . $vEvent->{'UID'}->getValue()); + $this->logger->warning('iMip message event could not be processed because no corresponding event was found in any calendar', [ + 'principalUri' => $principalUri, + 'eventUid' => $vEvent->{'UID'}->getValue(), + ]); return false; } @@ -518,7 +521,10 @@ class Manager implements IManager { } if (empty($found)) { - $this->logger->warning('iMip message event could not be processed because no corresponding event was found in any calendar ' . $principalUri . 'and UID' . $vEvent->{'UID'}->getValue()); + $this->logger->warning('iMip message event could not be processed because no corresponding event was found in any calendar', [ + 'principalUri' => $principalUri, + 'eventUid' => $vEvent->{'UID'}->getValue(), + ]); return false; } diff --git a/lib/private/Config/ConfigManager.php b/lib/private/Config/ConfigManager.php index 67466617941..ed516abdcbf 100644 --- a/lib/private/Config/ConfigManager.php +++ b/lib/private/Config/ConfigManager.php @@ -9,13 +9,13 @@ declare(strict_types=1); namespace OC\Config; use JsonException; -use NCU\Config\Exceptions\TypeConflictException; -use NCU\Config\IUserConfig; -use NCU\Config\Lexicon\ConfigLexiconEntry; -use NCU\Config\Lexicon\Preset; -use NCU\Config\ValueType; use OC\AppConfig; use OCP\App\IAppManager; +use OCP\Config\Exceptions\TypeConflictException; +use OCP\Config\IUserConfig; +use OCP\Config\Lexicon\Entry; +use OCP\Config\Lexicon\Preset; +use OCP\Config\ValueType; use OCP\IAppConfig; use OCP\IConfig; use OCP\Server; @@ -50,10 +50,11 @@ class ConfigManager { * * This method should be mainly called during a new upgrade or when a new app is enabled. * - * @see ConfigLexiconEntry + * @param string|null $appId when set to NULL the method will be executed for all enabled apps of the instance + * * @internal * @since 32.0.0 - * @param string|null $appId when set to NULL the method will be executed for all enabled apps of the instance + * @see Entry */ public function migrateConfigLexiconKeys(?string $appId = null): void { if ($appId === null) { @@ -166,7 +167,7 @@ class ConfigManager { * * @throws TypeConflictException if previous value does not fit the expected type */ - private function migrateAppConfigValue(string $appId, ConfigLexiconEntry $entry): void { + private function migrateAppConfigValue(string $appId, Entry $entry): void { $value = $this->appConfig->getValueMixed($appId, $entry->getRename(), lazy: null); switch ($entry->getValueType()) { case ValueType::STRING: @@ -196,7 +197,7 @@ class ConfigManager { * * @throws TypeConflictException if previous value does not fit the expected type */ - private function migrateUserConfigValue(string $userId, string $appId, ConfigLexiconEntry $entry): void { + private function migrateUserConfigValue(string $userId, string $appId, Entry $entry): void { $value = $this->userConfig->getValueMixed($userId, $appId, $entry->getRename(), lazy: null); switch ($entry->getValueType()) { case ValueType::STRING: @@ -237,7 +238,7 @@ class ConfigManager { return (float)$value; } - public function convertToBool(string $value, ?ConfigLexiconEntry $entry = null): bool { + public function convertToBool(string $value, ?Entry $entry = null): bool { if (in_array(strtolower($value), ['true', '1', 'on', 'yes'])) { $valueBool = true; } elseif (in_array(strtolower($value), ['false', '0', 'off', 'no'])) { @@ -245,7 +246,7 @@ class ConfigManager { } else { throw new TypeConflictException('Value cannot be converted to boolean'); } - if ($entry?->hasOption(ConfigLexiconEntry::RENAME_INVERT_BOOLEAN) === true) { + if ($entry?->hasOption(Entry::RENAME_INVERT_BOOLEAN) === true) { $valueBool = !$valueBool; } diff --git a/lib/private/Config/Lexicon/CoreConfigLexicon.php b/lib/private/Config/Lexicon/CoreConfigLexicon.php index 34a0b883c54..de84a58131c 100644 --- a/lib/private/Config/Lexicon/CoreConfigLexicon.php +++ b/lib/private/Config/Lexicon/CoreConfigLexicon.php @@ -8,36 +8,36 @@ declare(strict_types=1); namespace OC\Config\Lexicon; -use NCU\Config\Lexicon\ConfigLexiconEntry; -use NCU\Config\Lexicon\ConfigLexiconStrictness; -use NCU\Config\Lexicon\IConfigLexicon; -use NCU\Config\ValueType; +use OCP\Config\Lexicon\Entry; +use OCP\Config\Lexicon\ILexicon; +use OCP\Config\Lexicon\Strictness; +use OCP\Config\ValueType; /** * ConfigLexicon for 'core' app/user configs */ -class CoreConfigLexicon implements IConfigLexicon { - public function getStrictness(): ConfigLexiconStrictness { - return ConfigLexiconStrictness::IGNORE; +class CoreConfigLexicon implements ILexicon { + public function getStrictness(): Strictness { + return Strictness::IGNORE; } /** * @inheritDoc - * @return ConfigLexiconEntry[] + * @return Entry[] */ public function getAppConfigs(): array { return [ - new ConfigLexiconEntry('lastcron', ValueType::INT, 0, 'timestamp of last cron execution'), + new Entry('lastcron', ValueType::INT, 0, 'timestamp of last cron execution'), ]; } /** * @inheritDoc - * @return ConfigLexiconEntry[] + * @return Entry[] */ public function getUserConfigs(): array { return [ - new ConfigLexiconEntry('lang', ValueType::STRING, null, 'language'), + new Entry('lang', ValueType::STRING, null, 'language'), ]; } } diff --git a/lib/private/Config/UserConfig.php b/lib/private/Config/UserConfig.php index fb0bf954f57..04ba0e29db0 100644 --- a/lib/private/Config/UserConfig.php +++ b/lib/private/Config/UserConfig.php @@ -11,15 +11,16 @@ namespace OC\Config; use Generator; use InvalidArgumentException; use JsonException; -use NCU\Config\Exceptions\IncorrectTypeException; -use NCU\Config\Exceptions\TypeConflictException; -use NCU\Config\Exceptions\UnknownKeyException; -use NCU\Config\IUserConfig; -use NCU\Config\Lexicon\ConfigLexiconEntry; -use NCU\Config\Lexicon\ConfigLexiconStrictness; -use NCU\Config\Lexicon\Preset; -use NCU\Config\ValueType; use OC\AppFramework\Bootstrap\Coordinator; +use OCP\Config\Exceptions\IncorrectTypeException; +use OCP\Config\Exceptions\TypeConflictException; +use OCP\Config\Exceptions\UnknownKeyException; +use OCP\Config\IUserConfig; +use OCP\Config\Lexicon\Entry; +use OCP\Config\Lexicon\ILexicon; +use OCP\Config\Lexicon\Preset; +use OCP\Config\Lexicon\Strictness; +use OCP\Config\ValueType; use OCP\DB\Exception as DBException; use OCP\DB\IResult; use OCP\DB\QueryBuilder\IQueryBuilder; @@ -64,7 +65,7 @@ class UserConfig implements IUserConfig { private array $fastLoaded = []; /** @var array<string, boolean> ['user_id' => bool] */ private array $lazyLoaded = []; - /** @var array<string, array{entries: array<string, ConfigLexiconEntry>, aliases: array<string, string>, strictness: ConfigLexiconStrictness}> ['app_id' => ['strictness' => ConfigLexiconStrictness, 'entries' => ['config_key' => ConfigLexiconEntry[]]] */ + /** @var array<string, array{entries: array<string, Entry>, aliases: array<string, string>, strictness: Strictness}> ['app_id' => ['strictness' => ConfigLexiconStrictness, 'entries' => ['config_key' => ConfigLexiconEntry[]]] */ private array $configLexiconDetails = []; private bool $ignoreLexiconAliases = false; private ?Preset $configLexiconPreset = null; @@ -1913,7 +1914,7 @@ class UserConfig implements IUserConfig { return true; } - /** @var ConfigLexiconEntry $configValue */ + /** @var Entry $configValue */ $configValue = $configDetails['entries'][$key]; if ($type === ValueType::MIXED) { // we overwrite if value was requested as mixed @@ -1954,7 +1955,7 @@ class UserConfig implements IUserConfig { * * The entry is converted to string to fit the expected type when managing default value */ - private function getSystemDefault(string $appId, ConfigLexiconEntry $configValue): ?string { + private function getSystemDefault(string $appId, Entry $configValue): ?string { $default = $this->config->getSystemValue('lexicon.default.userconfig', [])[$appId][$configValue->getKey()] ?? null; if ($default === null) { // no system default, using default default. @@ -1967,28 +1968,28 @@ class UserConfig implements IUserConfig { /** * manage ConfigLexicon behavior based on strictness set in IConfigLexicon * - * @see IConfigLexicon::getStrictness() - * @param ConfigLexiconStrictness|null $strictness + * @param Strictness|null $strictness * @param string $line * * @return bool TRUE if conflict can be fully ignored * @throws UnknownKeyException + *@see ILexicon::getStrictness() */ - private function applyLexiconStrictness(?ConfigLexiconStrictness $strictness, string $line = ''): bool { + private function applyLexiconStrictness(?Strictness $strictness, string $line = ''): bool { if ($strictness === null) { return true; } switch ($strictness) { - case ConfigLexiconStrictness::IGNORE: + case Strictness::IGNORE: return true; - case ConfigLexiconStrictness::NOTICE: + case Strictness::NOTICE: $this->logger->notice($line); return true; - case ConfigLexiconStrictness::WARNING: + case Strictness::WARNING: $this->logger->warning($line); return false; - case ConfigLexiconStrictness::EXCEPTION: + case Strictness::EXCEPTION: throw new UnknownKeyException($line); } @@ -1999,9 +2000,10 @@ class UserConfig implements IUserConfig { * extract details from registered $appId's config lexicon * * @param string $appId - * @internal * - * @return array{entries: array<string, ConfigLexiconEntry>, aliases: array<string, string>, strictness: ConfigLexiconStrictness} + * @return array{entries: array<string, Entry>, aliases: array<string, string>, strictness: Strictness} + *@internal + * */ public function getConfigDetailsFromLexicon(string $appId): array { if (!array_key_exists($appId, $this->configLexiconDetails)) { @@ -2018,14 +2020,14 @@ class UserConfig implements IUserConfig { $this->configLexiconDetails[$appId] = [ 'entries' => $entries, 'aliases' => $aliases, - 'strictness' => $configLexicon?->getStrictness() ?? ConfigLexiconStrictness::IGNORE + 'strictness' => $configLexicon?->getStrictness() ?? Strictness::IGNORE ]; } return $this->configLexiconDetails[$appId]; } - private function getLexiconEntry(string $appId, string $key): ?ConfigLexiconEntry { + private function getLexiconEntry(string $appId, string $key): ?Entry { return $this->getConfigDetailsFromLexicon($appId)['entries'][$key] ?? null; } diff --git a/lib/private/Security/Ip/BruteforceAllowList.php b/lib/private/Security/Ip/BruteforceAllowList.php index cc4f0ceebe5..fb837690a7b 100644 --- a/lib/private/Security/Ip/BruteforceAllowList.php +++ b/lib/private/Security/Ip/BruteforceAllowList.php @@ -36,10 +36,7 @@ class BruteforceAllowList { return false; } - $keys = $this->appConfig->getKeys('bruteForce'); - $keys = array_filter($keys, static fn ($key): bool => str_starts_with($key, 'whitelist_')); - - foreach ($keys as $key) { + foreach ($this->appConfig->searchKeys('bruteForce', 'whitelist_') as $key) { $rangeString = $this->appConfig->getValueString('bruteForce', $key); try { $range = $this->factory->rangeFromString($rangeString); diff --git a/lib/private/Server.php b/lib/private/Server.php index 1e1ba2a1ad3..d339a97baab 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -8,7 +8,6 @@ namespace OC; use bantu\IniGetWrapper\IniGetWrapper; -use NCU\Config\IUserConfig; use NCU\Security\Signature\ISignatureManager; use OC\Accounts\AccountManager; use OC\App\AppManager; @@ -139,6 +138,7 @@ use OCP\BackgroundJob\IJobList; use OCP\Collaboration\Reference\IReferenceManager; use OCP\Command\IBus; use OCP\Comments\ICommentsManager; +use OCP\Config\IUserConfig; use OCP\Contacts\ContactsMenu\IActionFactory; use OCP\Contacts\ContactsMenu\IContactsStore; use OCP\Defaults; @@ -163,7 +163,6 @@ use OCP\Files\Storage\IStorageFactory; use OCP\Files\Template\ITemplateManager; use OCP\FilesMetadata\IFilesMetadataManager; use OCP\FullTextSearch\IFullTextSearchManager; -use OCP\GlobalScale\IConfig; use OCP\Group\ISubAdmin; use OCP\Http\Client\IClientService; use OCP\IAppConfig; diff --git a/lib/public/AppFramework/Bootstrap/IRegistrationContext.php b/lib/public/AppFramework/Bootstrap/IRegistrationContext.php index 011d1520414..70b35228c87 100644 --- a/lib/public/AppFramework/Bootstrap/IRegistrationContext.php +++ b/lib/public/AppFramework/Bootstrap/IRegistrationContext.php @@ -443,7 +443,7 @@ interface IRegistrationContext { * * @param string $configLexiconClass * - * @psalm-param class-string<\NCU\Config\Lexicon\IConfigLexicon> $configLexiconClass + * @psalm-param class-string<\OCP\Config\Lexicon\ILexicon> $configLexiconClass * @since 31.0.0 */ public function registerConfigLexicon(string $configLexiconClass): void; diff --git a/lib/public/Config/Exceptions/IncorrectTypeException.php b/lib/public/Config/Exceptions/IncorrectTypeException.php new file mode 100644 index 00000000000..33c545c7eea --- /dev/null +++ b/lib/public/Config/Exceptions/IncorrectTypeException.php @@ -0,0 +1,17 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCP\Config\Exceptions; + +use Exception; + +/** + * @since 32.0.0 + */ +class IncorrectTypeException extends Exception { +} diff --git a/lib/public/Config/Exceptions/TypeConflictException.php b/lib/public/Config/Exceptions/TypeConflictException.php new file mode 100644 index 00000000000..4b63bb0a763 --- /dev/null +++ b/lib/public/Config/Exceptions/TypeConflictException.php @@ -0,0 +1,17 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCP\Config\Exceptions; + +use Exception; + +/** + * @since 32.0.0 + */ +class TypeConflictException extends Exception { +} diff --git a/lib/public/Config/Exceptions/UnknownKeyException.php b/lib/public/Config/Exceptions/UnknownKeyException.php new file mode 100644 index 00000000000..39da4d43d95 --- /dev/null +++ b/lib/public/Config/Exceptions/UnknownKeyException.php @@ -0,0 +1,17 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCP\Config\Exceptions; + +use Exception; + +/** + * @since 32.0.0 + */ +class UnknownKeyException extends Exception { +} diff --git a/lib/public/Config/IUserConfig.php b/lib/public/Config/IUserConfig.php new file mode 100644 index 00000000000..1179db2671f --- /dev/null +++ b/lib/public/Config/IUserConfig.php @@ -0,0 +1,744 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCP\Config; + +use Generator; +use OCP\AppFramework\Attribute\Consumable; +use OCP\Config\Exceptions\IncorrectTypeException; +use OCP\Config\Exceptions\UnknownKeyException; + +/** + * This class provides an easy way for apps to store user config in the + * database. + * Supports **lazy loading** + * + * ### What is lazy loading ? + * In order to avoid loading useless user config into memory for each request, + * only non-lazy values are now loaded. + * + * Once a value that is lazy is requested, all lazy values will be loaded. + * + * Similarly, some methods from this class are marked with a warning about ignoring + * lazy loading. Use them wisely and only on parts of the code that are called + * during specific requests or actions to avoid loading the lazy values all the time. + * + * @since 32.0.0 + */ +#[Consumable(since: '32.0.0')] +interface IUserConfig { + /** + * @since 32.0.0 + */ + public const FLAG_SENSITIVE = 1; // value is sensitive + /** + * @since 32.0.0 + */ + public const FLAG_INDEXED = 2; // value should be indexed + + /** + * Get list of all userIds with config stored in database. + * If $appId is specified, will only limit the search to this value + * + * **WARNING:** ignore any cache and get data directly from database. + * + * @param string $appId optional id of app + * + * @return list<string> list of userIds + * + * @since 32.0.0 + */ + public function getUserIds(string $appId = ''): array; + + /** + * Get list of all apps that have at least one config + * value related to $userId stored in database + * + * **WARNING:** ignore lazy filtering, all user config are loaded from database + * + * @param string $userId id of the user + * + * @return list<string> list of app ids + * + * @since 32.0.0 + */ + public function getApps(string $userId): array; + + /** + * Returns all keys stored in database, related to user+app. + * Please note that the values are not returned. + * + * **WARNING:** ignore lazy filtering, all user config are loaded from database + * + * @param string $userId id of the user + * @param string $app id of the app + * + * @return list<string> list of stored config keys + * + * @since 32.0.0 + */ + public function getKeys(string $userId, string $app): array; + + /** + * Check if a key exists in the list of stored config values. + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool $lazy search within lazy loaded config + * + * @return bool TRUE if key exists + * + * @since 32.0.0 + */ + public function hasKey(string $userId, string $app, string $key, ?bool $lazy = false): bool; + + /** + * best way to see if a value is set as sensitive (not displayed in report) + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool|null $lazy search within lazy loaded config + * + * @return bool TRUE if value is sensitive + * @throws UnknownKeyException if config key is not known + * + * @since 32.0.0 + */ + public function isSensitive(string $userId, string $app, string $key, ?bool $lazy = false): bool; + + /** + * best way to see if a value is set as indexed (so it can be search) + * + * @see self::searchUsersByValueString() + * @see self::searchUsersByValueInt() + * @see self::searchUsersByValueBool() + * @see self::searchUsersByValues() + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool|null $lazy search within lazy loaded config + * + * @return bool TRUE if value is sensitive + * @throws UnknownKeyException if config key is not known + * + * @since 32.0.0 + */ + public function isIndexed(string $userId, string $app, string $key, ?bool $lazy = false): bool; + + /** + * Returns if the config key stored in database is lazy loaded + * + * **WARNING:** ignore lazy filtering, all config values are loaded from database + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * + * @return bool TRUE if config is lazy loaded + * @throws UnknownKeyException if config key is not known + * @see IUserConfig for details about lazy loading + * + * @since 32.0.0 + */ + public function isLazy(string $userId, string $app, string $key): bool; + + /** + * List all config values from an app with config key starting with $key. + * Returns an array with config key as key, stored value as value. + * + * **WARNING:** ignore lazy filtering, all config values are loaded from database + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $prefix config keys prefix to search, can be empty. + * @param bool $filtered filter sensitive config values + * + * @return array<string, string|int|float|bool|array> [key => value] + * + * @since 32.0.0 + */ + public function getValues(string $userId, string $app, string $prefix = '', bool $filtered = false): array; + + /** + * List all config values of a user. + * Returns an array with config key as key, stored value as value. + * + * **WARNING:** ignore lazy filtering, all config values are loaded from database + * + * @param string $userId id of the user + * @param bool $filtered filter sensitive config values + * + * @return array<string, string|int|float|bool|array> [key => value] + * + * @since 32.0.0 + */ + public function getAllValues(string $userId, bool $filtered = false): array; + + /** + * List all apps storing a specific config key and its stored value. + * Returns an array with appId as key, stored value as value. + * + * @param string $userId id of the user + * @param string $key config key + * @param bool $lazy search within lazy loaded config + * @param ValueType|null $typedAs enforce type for the returned values + * + * @return array<string, string|int|float|bool|array> [appId => value] + * + * @since 32.0.0 + */ + public function getValuesByApps(string $userId, string $key, bool $lazy = false, ?ValueType $typedAs = null): array; + + /** + * List all users storing a specific config key and its stored value. + * Returns an array with userId as key, stored value as value. + * + * **WARNING:** no caching, generate a fresh request + * + * @param string $app id of the app + * @param string $key config key + * @param ValueType|null $typedAs enforce type for the returned values + * @param array|null $userIds limit the search to a list of user ids + * + * @return array<string, string|int|float|bool|array> [userId => value] + * + * @since 32.0.0 + */ + public function getValuesByUsers(string $app, string $key, ?ValueType $typedAs = null, ?array $userIds = null): array; + + /** + * List all users storing a specific config key/value pair. + * Returns a list of user ids. + * + * **WARNING:** no caching, generate a fresh request + * + * @param string $app id of the app + * @param string $key config key + * @param string $value config value + * @param bool $caseInsensitive non-case-sensitive search, only works if $value is a string + * + * @return Generator<string> + * + * @since 32.0.0 + */ + public function searchUsersByValueString(string $app, string $key, string $value, bool $caseInsensitive = false): Generator; + + /** + * List all users storing a specific config key/value pair. + * Returns a list of user ids. + * + * **WARNING:** no caching, generate a fresh request + * + * @param string $app id of the app + * @param string $key config key + * @param int $value config value + * + * @return Generator<string> + * + * @since 32.0.0 + */ + public function searchUsersByValueInt(string $app, string $key, int $value): Generator; + + /** + * List all users storing a specific config key/value pair. + * Returns a list of user ids. + * + * **WARNING:** no caching, generate a fresh request + * + * @param string $app id of the app + * @param string $key config key + * @param array $values list of possible config values + * + * @return Generator<string> + * + * @since 32.0.0 + */ + public function searchUsersByValues(string $app, string $key, array $values): Generator; + + /** + * List all users storing a specific config key/value pair. + * Returns a list of user ids. + * + * **WARNING:** no caching, generate a fresh request + * + * @param string $app id of the app + * @param string $key config key + * @param bool $value config value + * + * @return Generator<string> + * + * @since 32.0.0 + */ + public function searchUsersByValueBool(string $app, string $key, bool $value): Generator; + + /** + * Get user config assigned to a config key. + * If config key is not found in database, default value is returned. + * If config key is set as lazy loaded, the $lazy argument needs to be set to TRUE. + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param string $default default value + * @param bool $lazy search within lazy loaded config + * + * @return string stored config value or $default if not set in database + * + * @since 32.0.0 + * + * @see IUserConfig for explanation about lazy loading + * @see getValueInt() + * @see getValueFloat() + * @see getValueBool() + * @see getValueArray() + */ + public function getValueString(string $userId, string $app, string $key, string $default = '', bool $lazy = false): string; + + /** + * Get config value assigned to a config key. + * If config key is not found in database, default value is returned. + * If config key is set as lazy loaded, the $lazy argument needs to be set to TRUE. + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param int $default default value + * @param bool $lazy search within lazy loaded config + * + * @return int stored config value or $default if not set in database + * + * @since 32.0.0 + * + * @see IUserConfig for explanation about lazy loading + * @see getValueString() + * @see getValueFloat() + * @see getValueBool() + * @see getValueArray() + */ + public function getValueInt(string $userId, string $app, string $key, int $default = 0, bool $lazy = false): int; + + /** + * Get config value assigned to a config key. + * If config key is not found in database, default value is returned. + * If config key is set as lazy loaded, the $lazy argument needs to be set to TRUE. + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param float $default default value + * @param bool $lazy search within lazy loaded config + * + * @return float stored config value or $default if not set in database + * + * @since 32.0.0 + * + * @see IUserConfig for explanation about lazy loading + * @see getValueString() + * @see getValueInt() + * @see getValueBool() + * @see getValueArray() + */ + public function getValueFloat(string $userId, string $app, string $key, float $default = 0, bool $lazy = false): float; + + /** + * Get config value assigned to a config key. + * If config key is not found in database, default value is returned. + * If config key is set as lazy loaded, the $lazy argument needs to be set to TRUE. + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool $default default value + * @param bool $lazy search within lazy loaded config + * + * @return bool stored config value or $default if not set in database + * + * @since 32.0.0 + * + * @see IUserPrefences for explanation about lazy loading + * @see getValueString() + * @see getValueInt() + * @see getValueFloat() + * @see getValueArray() + */ + public function getValueBool(string $userId, string $app, string $key, bool $default = false, bool $lazy = false): bool; + + /** + * Get config value assigned to a config key. + * If config key is not found in database, default value is returned. + * If config key is set as lazy loaded, the $lazy argument needs to be set to TRUE. + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param array $default default value` + * @param bool $lazy search within lazy loaded config + * + * @return array stored config value or $default if not set in database + * + * @since 32.0.0 + * + * @see IUserConfig for explanation about lazy loading + * @see getValueString() + * @see getValueInt() + * @see getValueFloat() + * @see getValueBool() + */ + public function getValueArray(string $userId, string $app, string $key, array $default = [], bool $lazy = false): array; + + /** + * returns the type of config value + * + * **WARNING:** ignore lazy filtering, all config values are loaded from database + * unless lazy is set to false + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool|null $lazy + * + * @return ValueType type of the value + * @throws UnknownKeyException if config key is not known + * @throws IncorrectTypeException if config value type is not known + * + * @since 32.0.0 + */ + public function getValueType(string $userId, string $app, string $key, ?bool $lazy = null): ValueType; + + /** + * returns a bitflag related to config value + * + * **WARNING:** ignore lazy filtering, all config values are loaded from database + * unless lazy is set to false + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool $lazy lazy loading + * + * @return int a bitflag in relation to the config value + * @throws UnknownKeyException if config key is not known + * @throws IncorrectTypeException if config value type is not known + * + * @since 32.0.0 + */ + public function getValueFlags(string $userId, string $app, string $key, bool $lazy = false): int; + + /** + * Store a config key and its value in database + * + * If config key is already known with the exact same config value, the database is not updated. + * If config key is not supposed to be read during the boot of the cloud, it is advised to set it as lazy loaded. + * + * If config value was previously stored as sensitive or lazy loaded, status cannot be altered without using {@see deleteKey()} first + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param string $value config value + * @param bool $sensitive if TRUE value will be hidden when listing config values. + * @param bool $lazy set config as lazy loaded + * + * @return bool TRUE if value was different, therefor updated in database + * + * @since 32.0.0 + * + * @see IUserConfig for explanation about lazy loading + * @see setValueInt() + * @see setValueFloat() + * @see setValueBool() + * @see setValueArray() + */ + public function setValueString(string $userId, string $app, string $key, string $value, bool $lazy = false, int $flags = 0): bool; + + /** + * Store a config key and its value in database + * + * When handling huge value around and/or above 2,147,483,647, a debug log will be generated + * on 64bits system, as php int type reach its limit (and throw an exception) on 32bits when using huge numbers. + * + * When using huge numbers, it is advised to use {@see \OCP\Util::numericToNumber()} and {@see setValueString()} + * + * If config key is already known with the exact same config value, the database is not updated. + * If config key is not supposed to be read during the boot of the cloud, it is advised to set it as lazy loaded. + * + * If config value was previously stored as sensitive or lazy loaded, status cannot be altered without using {@see deleteKey()} first + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param int $value config value + * @param bool $sensitive if TRUE value will be hidden when listing config values. + * @param bool $lazy set config as lazy loaded + * + * @return bool TRUE if value was different, therefor updated in database + * + * @since 32.0.0 + * + * @see IUserConfig for explanation about lazy loading + * @see setValueString() + * @see setValueFloat() + * @see setValueBool() + * @see setValueArray() + */ + public function setValueInt(string $userId, string $app, string $key, int $value, bool $lazy = false, int $flags = 0): bool; + + /** + * Store a config key and its value in database. + * + * If config key is already known with the exact same config value, the database is not updated. + * If config key is not supposed to be read during the boot of the cloud, it is advised to set it as lazy loaded. + * + * If config value was previously stored as sensitive or lazy loaded, status cannot be altered without using {@see deleteKey()} first + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param float $value config value + * @param bool $sensitive if TRUE value will be hidden when listing config values. + * @param bool $lazy set config as lazy loaded + * + * @return bool TRUE if value was different, therefor updated in database + * + * @since 32.0.0 + * + * @see IUserConfig for explanation about lazy loading + * @see setValueString() + * @see setValueInt() + * @see setValueBool() + * @see setValueArray() + */ + public function setValueFloat(string $userId, string $app, string $key, float $value, bool $lazy = false, int $flags = 0): bool; + + /** + * Store a config key and its value in database + * + * If config key is already known with the exact same config value, the database is not updated. + * If config key is not supposed to be read during the boot of the cloud, it is advised to set it as lazy loaded. + * + * If config value was previously stored as lazy loaded, status cannot be altered without using {@see deleteKey()} first + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool $value config value + * @param bool $lazy set config as lazy loaded + * + * @return bool TRUE if value was different, therefor updated in database + * + * @since 32.0.0 + * + * @see IUserConfig for explanation about lazy loading + * @see setValueString() + * @see setValueInt() + * @see setValueFloat() + * @see setValueArray() + */ + public function setValueBool(string $userId, string $app, string $key, bool $value, bool $lazy = false): bool; + + /** + * Store a config key and its value in database + * + * If config key is already known with the exact same config value, the database is not updated. + * If config key is not supposed to be read during the boot of the cloud, it is advised to set it as lazy loaded. + * + * If config value was previously stored as sensitive or lazy loaded, status cannot be altered without using {@see deleteKey()} first + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param array $value config value + * @param bool $sensitive if TRUE value will be hidden when listing config values. + * @param bool $lazy set config as lazy loaded + * + * @return bool TRUE if value was different, therefor updated in database + * + * @since 32.0.0 + * + * @see IUserConfig for explanation about lazy loading + * @see setValueString() + * @see setValueInt() + * @see setValueFloat() + * @see setValueBool() + */ + public function setValueArray(string $userId, string $app, string $key, array $value, bool $lazy = false, int $flags = 0): bool; + + /** + * switch sensitive status of a config value + * + * **WARNING:** ignore lazy filtering, all config values are loaded from database + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool $sensitive TRUE to set as sensitive, FALSE to unset + * + * @return bool TRUE if database update were necessary + * + * @since 32.0.0 + */ + public function updateSensitive(string $userId, string $app, string $key, bool $sensitive): bool; + + /** + * switch sensitive loading status of a config key for all users + * + * **Warning:** heavy on resources, MUST only be used on occ command or migrations + * + * @param string $app id of the app + * @param string $key config key + * @param bool $sensitive TRUE to set as sensitive, FALSE to unset + * + * @since 32.0.0 + */ + public function updateGlobalSensitive(string $app, string $key, bool $sensitive): void; + + + /** + * switch indexed status of a config value + * + * **WARNING:** ignore lazy filtering, all config values are loaded from database + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool $indexed TRUE to set as indexed, FALSE to unset + * + * @return bool TRUE if database update were necessary + * + * @since 32.0.0 + */ + public function updateIndexed(string $userId, string $app, string $key, bool $indexed): bool; + + /** + * switch sensitive loading status of a config key for all users + * + * **Warning:** heavy on resources, MUST only be used on occ command or migrations + * + * @param string $app id of the app + * @param string $key config key + * @param bool $indexed TRUE to set as indexed, FALSE to unset + * + * @since 32.0.0 + */ + public function updateGlobalIndexed(string $app, string $key, bool $indexed): void; + + /** + * switch lazy loading status of a config value + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * @param bool $lazy TRUE to set as lazy loaded, FALSE to unset + * + * @return bool TRUE if database update was necessary + * + * @since 32.0.0 + */ + public function updateLazy(string $userId, string $app, string $key, bool $lazy): bool; + + /** + * switch lazy loading status of a config key for all users + * + * **Warning:** heavy on resources, MUST only be used on occ command or migrations + * + * @param string $app id of the app + * @param string $key config key + * @param bool $lazy TRUE to set as lazy loaded, FALSE to unset + * + * @since 32.0.0 + */ + public function updateGlobalLazy(string $app, string $key, bool $lazy): void; + + /** + * returns an array contains details about a config value + * + * ``` + * [ + * "app" => "myapp", + * "key" => "mykey", + * "value" => "its_value", + * "lazy" => false, + * "type" => 4, + * "typeString" => "string", + * 'sensitive' => true + * ] + * ``` + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * + * @return array + * @throws UnknownKeyException if config key is not known in database + * + * @since 32.0.0 + */ + public function getDetails(string $userId, string $app, string $key): array; + + /** + * Delete single config key from database. + * + * @param string $userId id of the user + * @param string $app id of the app + * @param string $key config key + * + * @since 32.0.0 + */ + public function deleteUserConfig(string $userId, string $app, string $key): void; + + /** + * Delete config values from all users linked to a specific config keys + * + * @param string $app id of the app + * @param string $key config key + * + * @since 32.0.0 + */ + public function deleteKey(string $app, string $key): void; + + /** + * delete all config keys linked to an app + * + * @param string $app id of the app + * + * @since 32.0.0 + */ + public function deleteApp(string $app): void; + + /** + * delete all config keys linked to a user + * + * @param string $userId id of the user + * + * @since 32.0.0 + */ + public function deleteAllUserConfig(string $userId): void; + + /** + * Clear the cache for a single user + * + * The cache will be rebuilt only the next time a user config is requested. + * + * @param string $userId id of the user + * @param bool $reload set to TRUE to refill cache instantly after clearing it + * + * @since 32.0.0 + */ + public function clearCache(string $userId, bool $reload = false): void; + + /** + * Clear the cache for all users. + * The cache will be rebuilt only the next time a user config is requested. + * + * @since 32.0.0 + */ + public function clearCacheAll(): void; +} diff --git a/lib/public/Config/Lexicon/Entry.php b/lib/public/Config/Lexicon/Entry.php new file mode 100644 index 00000000000..95dae44ed11 --- /dev/null +++ b/lib/public/Config/Lexicon/Entry.php @@ -0,0 +1,249 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCP\Config\Lexicon; + +use Closure; +use OCP\Config\ValueType; + +/** + * Model that represent config values within an app config lexicon. + * + * @see ILexicon + * @since 32.0.0 + */ +class Entry { + /** @since 32.0.0 */ + public const RENAME_INVERT_BOOLEAN = 1; + + private string $definition = ''; + private ?string $default = null; + + /** + * @param string $key config key, can only contain alphanumerical chars and -._ + * @param ValueType $type type of config value + * @param string $definition optional description of config key available when using occ command + * @param bool $lazy set config value as lazy + * @param int $flags set flags + * @param string|null $rename previous config key to migrate config value from + * @param bool $deprecated set config key as deprecated + * + * @since 32.0.0 + * @psalm-suppress PossiblyInvalidCast + * @psalm-suppress RiskyCast + */ + public function __construct( + private readonly string $key, + private readonly ValueType $type, + private null|string|int|float|bool|array|Closure $defaultRaw = null, + string $definition = '', + private readonly bool $lazy = false, + private readonly int $flags = 0, + private readonly bool $deprecated = false, + private readonly ?string $rename = null, + private readonly int $options = 0, + ) { + // key can only contain alphanumeric chars and underscore "_" + if (preg_match('/[^[:alnum:]_]/', $key)) { + throw new \Exception('invalid config key'); + } + + /** @psalm-suppress UndefinedClass */ + if (\OC::$CLI) { // only store definition if ran from CLI + $this->definition = $definition; + } + } + + /** + * returns the config key + * + * @return string config key + * @since 32.0.0 + */ + public function getKey(): string { + return $this->key; + } + + /** + * get expected type for config value + * + * @return ValueType + * @since 32.0.0 + */ + public function getValueType(): ValueType { + return $this->type; + } + + /** + * @param string $default + * @return string + * @since 32.0.0 + */ + private function convertFromString(string $default): string { + return $default; + } + + /** + * @param int $default + * @return string + * @since 32.0.0 + */ + private function convertFromInt(int $default): string { + return (string)$default; + } + + /** + * @param float $default + * @return string + * @since 32.0.0 + */ + private function convertFromFloat(float $default): string { + return (string)$default; + } + + /** + * @param bool $default + * @return string + * @since 32.0.0 + */ + private function convertFromBool(bool $default): string { + return ($default) ? '1' : '0'; + } + + /** + * @param array $default + * @return string + * @since 32.0.0 + */ + private function convertFromArray(array $default): string { + return json_encode($default); + } + + /** + * returns default value + * + * @return string|null NULL if no default is set + * @since 32.0.0 + */ + public function getDefault(Preset $preset): ?string { + if ($this->default !== null) { + return $this->default; + } + + if ($this->defaultRaw === null) { + return null; + } + + if ($this->defaultRaw instanceof Closure) { + /** @psalm-suppress MixedAssignment we expect closure to returns string|int|float|bool|array */ + $this->defaultRaw = ($this->defaultRaw)($preset); + } + + /** @psalm-suppress MixedArgument closure should be managed previously */ + $this->default = $this->convertToString($this->defaultRaw); + + return $this->default; + } + + /** + * convert $entry into string, based on the expected type for config value + * + * @param string|int|float|bool|array $entry + * + * @return string + * @since 32.0.0 + * @psalm-suppress PossiblyInvalidCast arrays are managed pre-cast + * @psalm-suppress RiskyCast + */ + public function convertToString(string|int|float|bool|array $entry): string { + // in case $default is array but is not expected to be an array... + if ($this->getValueType() !== ValueType::ARRAY && is_array($entry)) { + $entry = json_encode($entry, JSON_THROW_ON_ERROR); + } + + return match ($this->getValueType()) { + ValueType::MIXED => (string)$entry, + ValueType::STRING => $this->convertFromString((string)$entry), + ValueType::INT => $this->convertFromInt((int)$entry), + ValueType::FLOAT => $this->convertFromFloat((float)$entry), + ValueType::BOOL => $this->convertFromBool((bool)$entry), + ValueType::ARRAY => $this->convertFromArray((array)$entry) + }; + } + + /** + * returns definition + * + * @return string + * @since 32.0.0 + */ + public function getDefinition(): string { + return $this->definition; + } + + /** + * returns if config key is set as lazy + * + * @see IAppConfig for details on lazy config values + * @return bool TRUE if config value is lazy + * @since 32.0.0 + */ + public function isLazy(): bool { + return $this->lazy; + } + + /** + * returns flags + * + * @see IAppConfig for details on sensitive config values + * @return int bitflag about the config value + * @since 32.0.0 + */ + public function getFlags(): int { + return $this->flags; + } + + /** + * @param int $flag + * + * @return bool TRUE is config value bitflag contains $flag + * @since 32.0.0 + */ + public function isFlagged(int $flag): bool { + return (($flag & $this->getFlags()) === $flag); + } + + /** + * should be called/used only during migration/upgrade. + * link to an old config key. + * + * @return string|null not NULL if value can be imported from a previous key + * @since 32.0.0 + */ + public function getRename(): ?string { + return $this->rename; + } + + /** + * @since 32.0.0 + * @return bool TRUE if $option was set during the creation of the entry. + */ + public function hasOption(int $option): bool { + return (($option & $this->options) !== 0); + } + + /** + * returns if config key is set as deprecated + * + * @return bool TRUE if config si deprecated + * @since 32.0.0 + */ + public function isDeprecated(): bool { + return $this->deprecated; + } +} diff --git a/lib/public/Config/Lexicon/ILexicon.php b/lib/public/Config/Lexicon/ILexicon.php new file mode 100644 index 00000000000..1dde23714cb --- /dev/null +++ b/lib/public/Config/Lexicon/ILexicon.php @@ -0,0 +1,49 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +namespace OCP\Config\Lexicon; + +use OCP\AppFramework\Attribute\Consumable; +use OCP\AppFramework\Attribute\Implementable; + +/** + * This interface needs to be implemented if you want to define a config lexicon for your application + * The config lexicon is used to avoid conflicts and problems when storing/retrieving config values + * + * @since 32.0.0 + */ +#[Consumable(since: '32.0.0')] +#[Implementable(since: '32.0.0')] +interface ILexicon { + + /** + * Define the expected behavior when using config + * keys not set within your application config lexicon. + * + * @return Strictness + * @since 32.0.0 + *@see Strictness + */ + public function getStrictness(): Strictness; + + /** + * define the list of entries of your application config lexicon, related to AppConfig. + * + * @return Entry[] + * @since 32.0.0 + */ + public function getAppConfigs(): array; + + /** + * define the list of entries of your application config lexicon, related to UserPreferences. + * + * @return Entry[] + * @since 32.0.0 + */ + public function getUserConfigs(): array; +} diff --git a/lib/public/Config/Lexicon/Preset.php b/lib/public/Config/Lexicon/Preset.php new file mode 100644 index 00000000000..ba0fb66dd3b --- /dev/null +++ b/lib/public/Config/Lexicon/Preset.php @@ -0,0 +1,49 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +namespace OCP\Config\Lexicon; + +/** + * list of preset to handle the default behavior of the instance + * + * @see Entry::preset + * + * - **Preset::LARGE** - Large size organisation (> 50k accounts) + * - **Preset::MEDIUM** - Medium size organisation (> 100 accounts) + * - **Preset::SMALL** - Small size organisation (< 100 accounts) + * - **Preset::SHARED** - Shared hosting + * - **Preset::UNIVERSITY** - Education, large size + * - **Preset::SCHOOL** - Eduction, small/medium size + * - **Preset::CLUB** - Club/Association + * - **Preset::FAMILY** - Family + * - **Preset::PRIVATE** - Private + * + * @since 32.0.0 + */ +enum Preset: int { + /** @since 32.0.0 */ + case LARGE = 9; + /** @since 32.0.0 */ + case MEDIUM = 8; + /** @since 32.0.0 */ + case SMALL = 7; + /** @since 32.0.0 */ + case SHARED = 6; + /** @since 32.0.0 */ + case UNIVERSITY = 5; + /** @since 32.0.0 */ + case SCHOOL = 4; + /** @since 32.0.0 */ + case CLUB = 3; + /** @since 32.0.0 */ + case FAMILY = 2; + /** @since 32.0.0 */ + case PRIVATE = 1; + /** @since 32.0.0 */ + case NONE = 0; +} diff --git a/lib/public/Config/Lexicon/Strictness.php b/lib/public/Config/Lexicon/Strictness.php new file mode 100644 index 00000000000..48e96bfc91c --- /dev/null +++ b/lib/public/Config/Lexicon/Strictness.php @@ -0,0 +1,30 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +namespace OCP\Config\Lexicon; + +/** + * Strictness regarding using not-listed config keys + * + * - **Strictness::IGNORE** - fully ignore + * - **Strictness::NOTICE** - ignore and report + * - **Strictness::WARNING** - silently block (returns $default) and report + * - **Strictness::EXCEPTION** - block (throws exception) and report + * + * @since 32.0.0 + */ +enum Strictness { + /** @since 32.0.0 */ + case IGNORE; // fully ignore + /** @since 32.0.0 */ + case NOTICE; // ignore and report + /** @since 32.0.0 */ + case WARNING; // silently block (returns $default) and report + /** @since 32.0.0 */ + case EXCEPTION; // block (throws exception) and report +} diff --git a/lib/public/Config/ValueType.php b/lib/public/Config/ValueType.php new file mode 100644 index 00000000000..a622c671898 --- /dev/null +++ b/lib/public/Config/ValueType.php @@ -0,0 +1,117 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCP\Config; + +use OCP\Config\Exceptions\IncorrectTypeException; +use OCP\IAppConfig; +use UnhandledMatchError; + +/** + * Listing of available value type for typed config value + * + * @since 32.0.0 + */ +enum ValueType: int { + /** + * @since 32.0.0 + */ + case MIXED = 0; + /** + * @since 32.0.0 + */ + case STRING = 1; + /** + * @since 32.0.0 + */ + case INT = 2; + /** + * @since 32.0.0 + */ + case FLOAT = 3; + /** + * @since 32.0.0 + */ + case BOOL = 4; + /** + * @since 32.0.0 + */ + case ARRAY = 5; + + /** + * get ValueType from string + * + * @param string $definition + * + * @return self + * @throws IncorrectTypeException + * + * @since 32.0.0 + */ + public static function fromStringDefinition(string $definition): self { + try { + return match ($definition) { + 'mixed' => self::MIXED, + 'string' => self::STRING, + 'int' => self::INT, + 'float' => self::FLOAT, + 'bool' => self::BOOL, + 'array' => self::ARRAY + }; + } catch (\UnhandledMatchError) { + throw new IncorrectTypeException('unknown string definition'); + } + } + + /** + * get string definition for current enum value + * + * @return string + * @throws IncorrectTypeException + * + * @since 32.0.0 + */ + public function getDefinition(): string { + try { + return match ($this) { + self::MIXED => 'mixed', + self::STRING => 'string', + self::INT => 'int', + self::FLOAT => 'float', + self::BOOL => 'bool', + self::ARRAY => 'array', + }; + } catch (UnhandledMatchError) { + throw new IncorrectTypeException('unknown type definition ' . $this->value); + } + } + + /** + * get corresponding AppConfig flag value + * + * @return int + * @throws IncorrectTypeException + * + * @since 32.0.0 + */ + public function toAppConfigFlag(): int { + try { + return match ($this) { + self::MIXED => IAppConfig::VALUE_MIXED, + self::STRING => IAppConfig::VALUE_STRING, + self::INT => IAppConfig::VALUE_INT, + self::FLOAT => IAppConfig::VALUE_FLOAT, + self::BOOL => IAppConfig::VALUE_BOOL, + self::ARRAY => IAppConfig::VALUE_ARRAY, + }; + } catch (UnhandledMatchError) { + throw new IncorrectTypeException('unknown type definition ' . $this->value); + } + } + +} diff --git a/lib/unstable/Config/Exceptions/IncorrectTypeException.php b/lib/unstable/Config/Exceptions/IncorrectTypeException.php index 274c95d732a..6b91959071a 100644 --- a/lib/unstable/Config/Exceptions/IncorrectTypeException.php +++ b/lib/unstable/Config/Exceptions/IncorrectTypeException.php @@ -12,6 +12,8 @@ use Exception; /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Exceptions\IncorrectTypeException + * @see \OCP\Config\Exceptions\IncorrectTypeException */ class IncorrectTypeException extends Exception { } diff --git a/lib/unstable/Config/Exceptions/TypeConflictException.php b/lib/unstable/Config/Exceptions/TypeConflictException.php index c6825b7efcf..808679ed873 100644 --- a/lib/unstable/Config/Exceptions/TypeConflictException.php +++ b/lib/unstable/Config/Exceptions/TypeConflictException.php @@ -12,6 +12,8 @@ use Exception; /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Exceptions\TypeConflictException + * @see \OCP\Config\Exceptions\TypeConflictException */ class TypeConflictException extends Exception { } diff --git a/lib/unstable/Config/Exceptions/UnknownKeyException.php b/lib/unstable/Config/Exceptions/UnknownKeyException.php index a3ca88a7b72..744ce25e48d 100644 --- a/lib/unstable/Config/Exceptions/UnknownKeyException.php +++ b/lib/unstable/Config/Exceptions/UnknownKeyException.php @@ -12,6 +12,8 @@ use Exception; /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Exceptions\UnknownKeyException + * @see \OCP\Config\Exceptions\UnknownKeyException */ class UnknownKeyException extends Exception { } diff --git a/lib/unstable/Config/IUserConfig.php b/lib/unstable/Config/IUserConfig.php index b9cbb65ad03..bffd6a96ebd 100644 --- a/lib/unstable/Config/IUserConfig.php +++ b/lib/unstable/Config/IUserConfig.php @@ -28,14 +28,20 @@ use NCU\Config\Exceptions\UnknownKeyException; * during specific requests or actions to avoid loading the lazy values all the time. * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ interface IUserConfig { /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public const FLAG_SENSITIVE = 1; // value is sensitive /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public const FLAG_INDEXED = 2; // value should be indexed @@ -50,6 +56,8 @@ interface IUserConfig { * @return list<string> list of userIds * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function getUserIds(string $appId = ''): array; @@ -64,6 +72,8 @@ interface IUserConfig { * @return list<string> list of app ids * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function getApps(string $userId): array; @@ -79,6 +89,8 @@ interface IUserConfig { * @return list<string> list of stored config keys * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function getKeys(string $userId, string $app): array; @@ -93,6 +105,8 @@ interface IUserConfig { * @return bool TRUE if key exists * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function hasKey(string $userId, string $app, string $key, ?bool $lazy = false): bool; @@ -108,6 +122,8 @@ interface IUserConfig { * @throws UnknownKeyException if config key is not known * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function isSensitive(string $userId, string $app, string $key, ?bool $lazy = false): bool; @@ -128,6 +144,8 @@ interface IUserConfig { * @throws UnknownKeyException if config key is not known * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function isIndexed(string $userId, string $app, string $key, ?bool $lazy = false): bool; @@ -145,6 +163,8 @@ interface IUserConfig { * @see IUserConfig for details about lazy loading * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function isLazy(string $userId, string $app, string $key): bool; @@ -162,6 +182,8 @@ interface IUserConfig { * @return array<string, string|int|float|bool|array> [key => value] * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function getValues(string $userId, string $app, string $prefix = '', bool $filtered = false): array; @@ -177,6 +199,8 @@ interface IUserConfig { * @return array<string, string|int|float|bool|array> [key => value] * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function getAllValues(string $userId, bool $filtered = false): array; @@ -192,6 +216,9 @@ interface IUserConfig { * @return array<string, string|int|float|bool|array> [appId => value] * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig + * @psalm-suppress DeprecatedClass */ public function getValuesByApps(string $userId, string $key, bool $lazy = false, ?ValueType $typedAs = null): array; @@ -209,6 +236,9 @@ interface IUserConfig { * @return array<string, string|int|float|bool|array> [userId => value] * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig + * @psalm-suppress DeprecatedClass */ public function getValuesByUsers(string $app, string $key, ?ValueType $typedAs = null, ?array $userIds = null): array; @@ -226,6 +256,8 @@ interface IUserConfig { * @return Generator<string> * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function searchUsersByValueString(string $app, string $key, string $value, bool $caseInsensitive = false): Generator; @@ -242,6 +274,8 @@ interface IUserConfig { * @return Generator<string> * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function searchUsersByValueInt(string $app, string $key, int $value): Generator; @@ -258,6 +292,8 @@ interface IUserConfig { * @return Generator<string> * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function searchUsersByValues(string $app, string $key, array $values): Generator; @@ -274,6 +310,8 @@ interface IUserConfig { * @return Generator<string> * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function searchUsersByValueBool(string $app, string $key, bool $value): Generator; @@ -291,6 +329,8 @@ interface IUserConfig { * @return string stored config value or $default if not set in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserConfig for explanation about lazy loading * @see getValueInt() @@ -314,6 +354,8 @@ interface IUserConfig { * @return int stored config value or $default if not set in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserConfig for explanation about lazy loading * @see getValueString() @@ -337,6 +379,8 @@ interface IUserConfig { * @return float stored config value or $default if not set in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserConfig for explanation about lazy loading * @see getValueString() @@ -360,6 +404,8 @@ interface IUserConfig { * @return bool stored config value or $default if not set in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserPrefences for explanation about lazy loading * @see getValueString() @@ -383,6 +429,8 @@ interface IUserConfig { * @return array stored config value or $default if not set in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserConfig for explanation about lazy loading * @see getValueString() @@ -408,6 +456,9 @@ interface IUserConfig { * @throws IncorrectTypeException if config value type is not known * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig + * @psalm-suppress DeprecatedClass */ public function getValueType(string $userId, string $app, string $key, ?bool $lazy = null): ValueType; @@ -427,6 +478,8 @@ interface IUserConfig { * @throws IncorrectTypeException if config value type is not known * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function getValueFlags(string $userId, string $app, string $key, bool $lazy = false): int; @@ -448,6 +501,8 @@ interface IUserConfig { * @return bool TRUE if value was different, therefor updated in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserConfig for explanation about lazy loading * @see setValueInt() @@ -480,6 +535,8 @@ interface IUserConfig { * @return bool TRUE if value was different, therefor updated in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserConfig for explanation about lazy loading * @see setValueString() @@ -507,6 +564,8 @@ interface IUserConfig { * @return bool TRUE if value was different, therefor updated in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserConfig for explanation about lazy loading * @see setValueString() @@ -533,6 +592,8 @@ interface IUserConfig { * @return bool TRUE if value was different, therefor updated in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserConfig for explanation about lazy loading * @see setValueString() @@ -560,6 +621,8 @@ interface IUserConfig { * @return bool TRUE if value was different, therefor updated in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig * * @see IUserConfig for explanation about lazy loading * @see setValueString() @@ -582,6 +645,8 @@ interface IUserConfig { * @return bool TRUE if database update were necessary * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function updateSensitive(string $userId, string $app, string $key, bool $sensitive): bool; @@ -595,6 +660,8 @@ interface IUserConfig { * @param bool $sensitive TRUE to set as sensitive, FALSE to unset * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function updateGlobalSensitive(string $app, string $key, bool $sensitive): void; @@ -612,6 +679,8 @@ interface IUserConfig { * @return bool TRUE if database update were necessary * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function updateIndexed(string $userId, string $app, string $key, bool $indexed): bool; @@ -625,6 +694,8 @@ interface IUserConfig { * @param bool $indexed TRUE to set as indexed, FALSE to unset * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function updateGlobalIndexed(string $app, string $key, bool $indexed): void; @@ -639,6 +710,8 @@ interface IUserConfig { * @return bool TRUE if database update was necessary * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function updateLazy(string $userId, string $app, string $key, bool $lazy): bool; @@ -652,6 +725,8 @@ interface IUserConfig { * @param bool $lazy TRUE to set as lazy loaded, FALSE to unset * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function updateGlobalLazy(string $app, string $key, bool $lazy): void; @@ -678,6 +753,8 @@ interface IUserConfig { * @throws UnknownKeyException if config key is not known in database * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function getDetails(string $userId, string $app, string $key): array; @@ -689,6 +766,8 @@ interface IUserConfig { * @param string $key config key * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function deleteUserConfig(string $userId, string $app, string $key): void; @@ -699,6 +778,8 @@ interface IUserConfig { * @param string $key config key * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function deleteKey(string $app, string $key): void; @@ -708,6 +789,8 @@ interface IUserConfig { * @param string $app id of the app * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function deleteApp(string $app): void; @@ -717,6 +800,8 @@ interface IUserConfig { * @param string $userId id of the user * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function deleteAllUserConfig(string $userId): void; @@ -729,6 +814,8 @@ interface IUserConfig { * @param bool $reload set to TRUE to refill cache instantly after clearing it * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function clearCache(string $userId, bool $reload = false): void; @@ -737,6 +824,8 @@ interface IUserConfig { * The cache will be rebuilt only the next time a user config is requested. * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\IUserConfig + * @see \OCP\Config\IUserConfig */ public function clearCacheAll(): void; } diff --git a/lib/unstable/Config/Lexicon/ConfigLexiconEntry.php b/lib/unstable/Config/Lexicon/ConfigLexiconEntry.php index 068d89ce764..2587cd52c01 100644 --- a/lib/unstable/Config/Lexicon/ConfigLexiconEntry.php +++ b/lib/unstable/Config/Lexicon/ConfigLexiconEntry.php @@ -16,9 +16,16 @@ use NCU\Config\ValueType; * * @see IConfigLexicon * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry + * @psalm-suppress DeprecatedClass */ class ConfigLexiconEntry { - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry + */ public const RENAME_INVERT_BOOLEAN = 1; private string $definition = ''; @@ -34,6 +41,8 @@ class ConfigLexiconEntry { * @param bool $deprecated set config key as deprecated * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry * @psalm-suppress PossiblyInvalidCast * @psalm-suppress RiskyCast */ @@ -64,6 +73,8 @@ class ConfigLexiconEntry { * * @return string config key * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ public function getKey(): string { return $this->key; @@ -74,6 +85,9 @@ class ConfigLexiconEntry { * * @return ValueType * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry + * @psalm-suppress DeprecatedClass */ public function getValueType(): ValueType { return $this->type; @@ -83,6 +97,8 @@ class ConfigLexiconEntry { * @param string $default * @return string * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ private function convertFromString(string $default): string { return $default; @@ -92,6 +108,8 @@ class ConfigLexiconEntry { * @param int $default * @return string * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ private function convertFromInt(int $default): string { return (string)$default; @@ -101,6 +119,8 @@ class ConfigLexiconEntry { * @param float $default * @return string * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ private function convertFromFloat(float $default): string { return (string)$default; @@ -110,6 +130,8 @@ class ConfigLexiconEntry { * @param bool $default * @return string * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ private function convertFromBool(bool $default): string { return ($default) ? '1' : '0'; @@ -119,6 +141,8 @@ class ConfigLexiconEntry { * @param array $default * @return string * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ private function convertFromArray(array $default): string { return json_encode($default); @@ -129,6 +153,10 @@ class ConfigLexiconEntry { * * @return string|null NULL if no default is set * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry + * @psalm-suppress DeprecatedClass + * @psalm-suppress DeprecatedMethod */ public function getDefault(Preset $preset): ?string { if ($this->default !== null) { @@ -157,8 +185,13 @@ class ConfigLexiconEntry { * * @return string * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry * @psalm-suppress PossiblyInvalidCast arrays are managed pre-cast * @psalm-suppress RiskyCast + * @psalm-suppress DeprecatedClass + * @psalm-suppress DeprecatedMethod + * @psalm-suppress DeprecatedConstant */ public function convertToString(string|int|float|bool|array $entry): string { // in case $default is array but is not expected to be an array... @@ -181,6 +214,8 @@ class ConfigLexiconEntry { * * @return string * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ public function getDefinition(): string { return $this->definition; @@ -192,6 +227,8 @@ class ConfigLexiconEntry { * @see IAppConfig for details on lazy config values * @return bool TRUE if config value is lazy * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ public function isLazy(): bool { return $this->lazy; @@ -203,6 +240,8 @@ class ConfigLexiconEntry { * @see IAppConfig for details on sensitive config values * @return int bitflag about the config value * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ public function getFlags(): int { return $this->flags; @@ -213,6 +252,9 @@ class ConfigLexiconEntry { * * @return bool TRUE is config value bitflag contains $flag * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry + * @psalm-suppress DeprecatedMethod */ public function isFlagged(int $flag): bool { return (($flag & $this->getFlags()) === $flag); @@ -224,6 +266,8 @@ class ConfigLexiconEntry { * * @return string|null not NULL if value can be imported from a previous key * @experimental 32.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ public function getRename(): ?string { return $this->rename; @@ -231,6 +275,8 @@ class ConfigLexiconEntry { /** * @experimental 32.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry * @return bool TRUE if $option was set during the creation of the entry. */ public function hasOption(int $option): bool { @@ -242,6 +288,8 @@ class ConfigLexiconEntry { * * @return bool TRUE if config si deprecated * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Entry + * @see \OCP\Config\Lexicon\Entry */ public function isDeprecated(): bool { return $this->deprecated; diff --git a/lib/unstable/Config/Lexicon/ConfigLexiconStrictness.php b/lib/unstable/Config/Lexicon/ConfigLexiconStrictness.php index a6490675c8a..2ccd7bd265c 100644 --- a/lib/unstable/Config/Lexicon/ConfigLexiconStrictness.php +++ b/lib/unstable/Config/Lexicon/ConfigLexiconStrictness.php @@ -17,14 +17,32 @@ namespace NCU\Config\Lexicon; * - **ConfigLexiconStrictness::EXCEPTION** - block (throws exception) and report * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Strictness + * @see \OCP\Config\Lexicon\Strictness */ enum ConfigLexiconStrictness { - /** @experimental 31.0.0 */ + /** + * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Strictness + * @see \OCP\Config\Lexicon\Strictness + */ case IGNORE; // fully ignore - /** @experimental 31.0.0 */ + /** + * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Strictness + * @see \OCP\Config\Lexicon\Strictness + */ case NOTICE; // ignore and report - /** @experimental 31.0.0 */ + /** + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Strictness + * @see \OCP\Config\Lexicon\Strictness + * @experimental 31.0.0 + */ case WARNING; // silently block (returns $default) and report - /** @experimental 31.0.0 */ + /** + * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Strictness + * @see \OCP\Config\Lexicon\Strictness + */ case EXCEPTION; // block (throws exception) and report } diff --git a/lib/unstable/Config/Lexicon/IConfigLexicon.php b/lib/unstable/Config/Lexicon/IConfigLexicon.php index 3fedb5f1f08..74dc19e7728 100644 --- a/lib/unstable/Config/Lexicon/IConfigLexicon.php +++ b/lib/unstable/Config/Lexicon/IConfigLexicon.php @@ -13,6 +13,8 @@ namespace NCU\Config\Lexicon; * The config lexicon is used to avoid conflicts and problems when storing/retrieving config values * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\ILexicon + * @see \OCP\Config\Lexicon\ILexicon */ interface IConfigLexicon { @@ -20,9 +22,12 @@ interface IConfigLexicon { * Define the expected behavior when using config * keys not set within your application config lexicon. * - * @see ConfigLexiconStrictness * @return ConfigLexiconStrictness * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\ILexicon + * @see \OCP\Config\Lexicon\ILexicon + * @psalm-suppress DeprecatedClass + * */ public function getStrictness(): ConfigLexiconStrictness; @@ -31,6 +36,9 @@ interface IConfigLexicon { * * @return ConfigLexiconEntry[] * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\ILexicon + * @see \OCP\Config\Lexicon\ILexicon + * @psalm-suppress DeprecatedClass */ public function getAppConfigs(): array; @@ -39,6 +47,9 @@ interface IConfigLexicon { * * @return ConfigLexiconEntry[] * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\ILexicon + * @see \OCP\Config\Lexicon\ILexicon + * @psalm-suppress DeprecatedClass */ public function getUserConfigs(): array; } diff --git a/lib/unstable/Config/Lexicon/Preset.php b/lib/unstable/Config/Lexicon/Preset.php index 92a6fd8cbfa..b2a98ed5647 100644 --- a/lib/unstable/Config/Lexicon/Preset.php +++ b/lib/unstable/Config/Lexicon/Preset.php @@ -23,24 +23,53 @@ namespace NCU\Config\Lexicon; * - **Preset::PRIVATE** - Private * * @experimental 32.0.0 + * @deprecated 32.0.0 use \OCP\Config\Lexicon\Preset + * @see \OCP\Config\Lexicon\Preset */ enum Preset: int { - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 + */ case LARGE = 8; - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 + */ case MEDIUM = 7; - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 + */ case SMALL = 6; - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 + */ case SHARED = 5; - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 + */ case EDUCATION = 4; - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 + */ case CLUB = 3; - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 + */ case FAMILY = 2; - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 + */ case PRIVATE = 1; - /** @experimental 32.0.0 */ + /** + * @experimental 32.0.0 + * @deprecated 32.0.0 + */ case NONE = 0; } diff --git a/lib/unstable/Config/ValueType.php b/lib/unstable/Config/ValueType.php index b1181674953..73714640445 100644 --- a/lib/unstable/Config/ValueType.php +++ b/lib/unstable/Config/ValueType.php @@ -16,30 +16,44 @@ use UnhandledMatchError; * Listing of available value type for typed config value * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType */ enum ValueType: int { /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType */ case MIXED = 0; /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType */ case STRING = 1; /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType */ case INT = 2; /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType */ case FLOAT = 3; /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType */ case BOOL = 4; /** * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType */ case ARRAY = 5; @@ -52,6 +66,10 @@ enum ValueType: int { * @throws IncorrectTypeException * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType + * @psalm-suppress DeprecatedConstant + * @psalm-suppress DeprecatedClass */ public static function fromStringDefinition(string $definition): self { try { @@ -75,6 +93,10 @@ enum ValueType: int { * @throws IncorrectTypeException * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType + * @psalm-suppress DeprecatedConstant + * @psalm-suppress DeprecatedClass */ public function getDefinition(): string { try { @@ -98,6 +120,10 @@ enum ValueType: int { * @throws IncorrectTypeException * * @experimental 31.0.0 + * @deprecated 32.0.0 use \OCP\Config\ValueType + * @see \OCP\Config\ValueType + * @psalm-suppress DeprecatedConstant + * @psalm-suppress DeprecatedClass */ public function toAppConfigFlag(): int { try { |