diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/composer/composer/autoload_classmap.php | 1 | ||||
-rw-r--r-- | lib/composer/composer/autoload_static.php | 1 | ||||
-rw-r--r-- | lib/l10n/es.js | 12 | ||||
-rw-r--r-- | lib/l10n/es.json | 12 | ||||
-rw-r--r-- | lib/l10n/es_CL.js | 1 | ||||
-rw-r--r-- | lib/l10n/es_CL.json | 1 | ||||
-rw-r--r-- | lib/l10n/fr.js | 13 | ||||
-rw-r--r-- | lib/l10n/fr.json | 13 | ||||
-rw-r--r-- | lib/l10n/uk.js | 112 | ||||
-rw-r--r-- | lib/l10n/uk.json | 112 | ||||
-rw-r--r-- | lib/private/App/AppStore/Fetcher/Fetcher.php | 2 | ||||
-rw-r--r-- | lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php | 6 | ||||
-rw-r--r-- | lib/private/BackgroundJob/JobList.php | 13 | ||||
-rw-r--r-- | lib/private/DB/ConnectionFactory.php | 38 | ||||
-rw-r--r-- | lib/private/Federation/CloudIdManager.php | 47 | ||||
-rw-r--r-- | lib/private/Files/Filesystem.php | 5 | ||||
-rw-r--r-- | lib/private/Lockdown/Filesystem/NullStorage.php | 2 | ||||
-rw-r--r-- | lib/private/Server.php | 4 | ||||
-rw-r--r-- | lib/private/Share20/DefaultShareProvider.php | 2 | ||||
-rw-r--r-- | lib/private/Share20/Manager.php | 2 | ||||
-rw-r--r-- | lib/public/Federation/ICloudIdManager.php | 27 | ||||
-rw-r--r-- | lib/public/Federation/ICloudIdResolver.php | 40 |
22 files changed, 419 insertions, 47 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 65c1a299dec..5ecdfe6a172 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -376,6 +376,7 @@ return array( 'OCP\\Federation\\ICloudFederationShare' => $baseDir . '/lib/public/Federation/ICloudFederationShare.php', 'OCP\\Federation\\ICloudId' => $baseDir . '/lib/public/Federation/ICloudId.php', 'OCP\\Federation\\ICloudIdManager' => $baseDir . '/lib/public/Federation/ICloudIdManager.php', + 'OCP\\Federation\\ICloudIdResolver' => $baseDir . '/lib/public/Federation/ICloudIdResolver.php', 'OCP\\Files' => $baseDir . '/lib/public/Files.php', 'OCP\\FilesMetadata\\AMetadataEvent' => $baseDir . '/lib/public/FilesMetadata/AMetadataEvent.php', 'OCP\\FilesMetadata\\Event\\MetadataBackgroundEvent' => $baseDir . '/lib/public/FilesMetadata/Event/MetadataBackgroundEvent.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 909ac3599f5..ab42cabba21 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -417,6 +417,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\Federation\\ICloudFederationShare' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudFederationShare.php', 'OCP\\Federation\\ICloudId' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudId.php', 'OCP\\Federation\\ICloudIdManager' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudIdManager.php', + 'OCP\\Federation\\ICloudIdResolver' => __DIR__ . '/../../..' . '/lib/public/Federation/ICloudIdResolver.php', 'OCP\\Files' => __DIR__ . '/../../..' . '/lib/public/Files.php', 'OCP\\FilesMetadata\\AMetadataEvent' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/AMetadataEvent.php', 'OCP\\FilesMetadata\\Event\\MetadataBackgroundEvent' => __DIR__ . '/../../..' . '/lib/public/FilesMetadata/Event/MetadataBackgroundEvent.php', diff --git a/lib/l10n/es.js b/lib/l10n/es.js index 6b8663e2ce5..9c7ea8f5f41 100644 --- a/lib/l10n/es.js +++ b/lib/l10n/es.js @@ -323,12 +323,24 @@ OC.L10N.register( "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente", "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %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." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos.", + "Analyze images" : "Analizar imágenes", + "Ask a question about the given images." : "Haga una pregunta acerca de las imágenes proporcionadas.", "Images" : "Imágenes", + "Images to ask a question about" : "Imágenes sobre las cuales se formulará una pregunta", "Question" : "Pregunta", "Generated response" : "Respuesta generada", + "The answer to the question" : "La respuesta a la pregunta", + "Voice chat with the assistant" : "Chat de voz con el asistente", "System prompt" : "Prompt del sistema", "Define rules and assumptions that the assistant should follow during the conversation." : "Definir las reglas y supuestos que el asistente debe seguir durante la conversación.", + "Chat voice message" : "Mensaje de voz del chat", "Chat history" : "Historial de la conversación", + "Input transcript" : "Transcripción de entrada", + "Transcription of the audio input" : "Transcripción de la entrada de audio", + "Response voice message" : "Mensaje de voz de respuesta", + "The generated voice response as part of the conversation" : "La respuesta de voz generada como parte de la conversación", + "Output transcript" : "Transcripción de salida", + "Transcription of the audio output" : "Transcripción de la salida de audio", "Transcribe audio" : "Transcribir audio", "Transcribe the things said in an audio" : "Transcribir las cosas que se dicen en un audio", "Audio input" : "Entrada de audio", diff --git a/lib/l10n/es.json b/lib/l10n/es.json index 997885dd7e1..29ee23631f9 100644 --- a/lib/l10n/es.json +++ b/lib/l10n/es.json @@ -321,12 +321,24 @@ "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente", "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %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." : "Para permitir que este chequeo se lleve a cabo, debe asegurarse que su servidor pueda conectarse a sí mismo. Por tanto, este debe poder resolver y conectarse a alguno de sus `trusted_domains` o al url definido en `overwrite.cli.url`. Este fallo puede ser resultado de una inconsistencia DNS del lado del servidor o una regla de salida del cortafuegos.", + "Analyze images" : "Analizar imágenes", + "Ask a question about the given images." : "Haga una pregunta acerca de las imágenes proporcionadas.", "Images" : "Imágenes", + "Images to ask a question about" : "Imágenes sobre las cuales se formulará una pregunta", "Question" : "Pregunta", "Generated response" : "Respuesta generada", + "The answer to the question" : "La respuesta a la pregunta", + "Voice chat with the assistant" : "Chat de voz con el asistente", "System prompt" : "Prompt del sistema", "Define rules and assumptions that the assistant should follow during the conversation." : "Definir las reglas y supuestos que el asistente debe seguir durante la conversación.", + "Chat voice message" : "Mensaje de voz del chat", "Chat history" : "Historial de la conversación", + "Input transcript" : "Transcripción de entrada", + "Transcription of the audio input" : "Transcripción de la entrada de audio", + "Response voice message" : "Mensaje de voz de respuesta", + "The generated voice response as part of the conversation" : "La respuesta de voz generada como parte de la conversación", + "Output transcript" : "Transcripción de salida", + "Transcription of the audio output" : "Transcripción de la salida de audio", "Transcribe audio" : "Transcribir audio", "Transcribe the things said in an audio" : "Transcribir las cosas que se dicen en un audio", "Audio input" : "Entrada de audio", diff --git a/lib/l10n/es_CL.js b/lib/l10n/es_CL.js index b9ab4daa8d3..22ae429cf8c 100644 --- a/lib/l10n/es_CL.js +++ b/lib/l10n/es_CL.js @@ -74,6 +74,7 @@ OC.L10N.register( "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El backend %s que comparte debe implementar la interface OCP\\Share_Backend", "Sharing backend %s not found" : "No fue encontrado el Backend que comparte %s ", "Sharing backend for %s not found" : "No fue encontrado el Backend que comparte para %s", + "Open %s" : "Abrir %s", "Unknown share type" : "Tipo de elemento compartido desconocido", "You are not allowed to share %s" : "No tienes permitido compartir %s", "Cannot increase permissions of %s" : "No se pueden incrementar los permisos de %s", diff --git a/lib/l10n/es_CL.json b/lib/l10n/es_CL.json index 1bb3d70393a..75ed65fb736 100644 --- a/lib/l10n/es_CL.json +++ b/lib/l10n/es_CL.json @@ -72,6 +72,7 @@ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El backend %s que comparte debe implementar la interface OCP\\Share_Backend", "Sharing backend %s not found" : "No fue encontrado el Backend que comparte %s ", "Sharing backend for %s not found" : "No fue encontrado el Backend que comparte para %s", + "Open %s" : "Abrir %s", "Unknown share type" : "Tipo de elemento compartido desconocido", "You are not allowed to share %s" : "No tienes permitido compartir %s", "Cannot increase permissions of %s" : "No se pueden incrementar los permisos de %s", diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js index b6de0091936..edfe25a6362 100644 --- a/lib/l10n/fr.js +++ b/lib/l10n/fr.js @@ -324,13 +324,14 @@ OC.L10N.register( "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible", "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %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." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante.", + "Analyze images" : "Analyser des images", "Images" : "Images", "Question" : "Question", "Generated response" : "Réponse générée", "System prompt" : "Invite du système", "Define rules and assumptions that the assistant should follow during the conversation." : "Définir les règles et les hypothèses que l'assistant doit suivre pendant la conversation.", "Chat history" : "Historique de la discussion", - "Transcribe audio" : "Transcrire l'audio", + "Transcribe audio" : "Transcrire de l'audio", "Transcribe the things said in an audio" : "Transcrire les propos exprimés dans un fichier audio", "Audio input" : "Entrée audio", "The audio to transcribe" : "Audio à retranscrire", @@ -348,7 +349,7 @@ OC.L10N.register( "Chat message" : "Message de discussion", "A chat message to send to the agent." : "Un message instantané à envoyer à l'agent.", "The response from the chat model." : "La réponse du modèle de messagerie instantanée", - "Context write" : "Écrire contextuellement", + "Context write" : "Écrire selon un contexte", "Writes text in a given style based on the provided source material." : "Écrit un texte dans un style donné, basé sur des données initiales préalablement fournies.", "Writing style" : "Style rédactionnel", "Demonstrate a writing style that you would like to immitate" : "Montrez un style d'écriture que vous aimeriez imiter", @@ -356,12 +357,12 @@ OC.L10N.register( "The content that would like to be rewritten in the new writing style" : "Contenu qui doit être réécrit dans le nouveau style de rédaction", "Generated text" : "Texte généré", "The generated text with content from the source material in the given style" : "Le texte généré reprend le contenu du document source dans le style donné", - "Emoji generator" : "Générateur d'emoji", + "Emoji generator" : "Générateur d'émoji", "Takes text and generates a representative emoji for it." : "Prend un texte et génère un émoji représentatif.", "The text to generate an emoji for" : "Texte pour lequel générer un émoji", "Generated emoji" : "Émoji généré", "The generated emoji based on the input text" : "Émoji généré en fonction du texte saisi", - "Generate image" : "Générer l'image", + "Generate image" : "Générer une image", "Generate an image from a text prompt" : "Générer une image à partir d'un texte", "Prompt" : "Prompt", "Describe the image you want to generate" : "Décrivez l'image que vous souhaitez générer", @@ -369,7 +370,7 @@ OC.L10N.register( "How many images to generate" : "Nombre d'images à générer", "Output images" : "Images de sortie", "The generated images" : "Les images générées", - "Generate speech" : "Générer la vocalisation", + "Generate speech" : "Générer une synthèse vocale", "Generate speech from a transcript" : "Générer la vocalisation à partir d'une transcription", "Write transcript that you want the assistant to generate speech from" : "Écrire la transcription à partir de laquelle vous voulez générer la vocalisation", "Output speech" : "Sortie de la vocalisation", @@ -430,7 +431,7 @@ OC.L10N.register( "The original text to summarize" : "Le texte original à résumer", "Summary" : "Résumé", "The generated summary" : "Le résumé généré", - "Extract topics" : "Extraire des thèmes", + "Extract topics" : "Extraire des sujets", "Extracts topics from a text and outputs them separated by commas" : "Extrait les sujets d'un texte et les affiche en les séparant par des virgules.", "The original text to extract topics from" : "Texte original à partir duquel les thèmes sont extraits", "Topics" : "Sujets", diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json index 3776b605f33..6f1edd70da2 100644 --- a/lib/l10n/fr.json +++ b/lib/l10n/fr.json @@ -322,13 +322,14 @@ "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible", "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %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." : "Pour autoriser cette vérification, pour devez vous assurer que votre serveur web peut se connecter à lui-même. Il doit donc être capable de résoudre et de se connecter à au moins un de ses `trusted_domains` ou à l'URL `overwrite.cli.url`. Cet échec peut être le résultat d'une erreur de DNS côté serveur ou d'une règle de pare-feu sortante.", + "Analyze images" : "Analyser des images", "Images" : "Images", "Question" : "Question", "Generated response" : "Réponse générée", "System prompt" : "Invite du système", "Define rules and assumptions that the assistant should follow during the conversation." : "Définir les règles et les hypothèses que l'assistant doit suivre pendant la conversation.", "Chat history" : "Historique de la discussion", - "Transcribe audio" : "Transcrire l'audio", + "Transcribe audio" : "Transcrire de l'audio", "Transcribe the things said in an audio" : "Transcrire les propos exprimés dans un fichier audio", "Audio input" : "Entrée audio", "The audio to transcribe" : "Audio à retranscrire", @@ -346,7 +347,7 @@ "Chat message" : "Message de discussion", "A chat message to send to the agent." : "Un message instantané à envoyer à l'agent.", "The response from the chat model." : "La réponse du modèle de messagerie instantanée", - "Context write" : "Écrire contextuellement", + "Context write" : "Écrire selon un contexte", "Writes text in a given style based on the provided source material." : "Écrit un texte dans un style donné, basé sur des données initiales préalablement fournies.", "Writing style" : "Style rédactionnel", "Demonstrate a writing style that you would like to immitate" : "Montrez un style d'écriture que vous aimeriez imiter", @@ -354,12 +355,12 @@ "The content that would like to be rewritten in the new writing style" : "Contenu qui doit être réécrit dans le nouveau style de rédaction", "Generated text" : "Texte généré", "The generated text with content from the source material in the given style" : "Le texte généré reprend le contenu du document source dans le style donné", - "Emoji generator" : "Générateur d'emoji", + "Emoji generator" : "Générateur d'émoji", "Takes text and generates a representative emoji for it." : "Prend un texte et génère un émoji représentatif.", "The text to generate an emoji for" : "Texte pour lequel générer un émoji", "Generated emoji" : "Émoji généré", "The generated emoji based on the input text" : "Émoji généré en fonction du texte saisi", - "Generate image" : "Générer l'image", + "Generate image" : "Générer une image", "Generate an image from a text prompt" : "Générer une image à partir d'un texte", "Prompt" : "Prompt", "Describe the image you want to generate" : "Décrivez l'image que vous souhaitez générer", @@ -367,7 +368,7 @@ "How many images to generate" : "Nombre d'images à générer", "Output images" : "Images de sortie", "The generated images" : "Les images générées", - "Generate speech" : "Générer la vocalisation", + "Generate speech" : "Générer une synthèse vocale", "Generate speech from a transcript" : "Générer la vocalisation à partir d'une transcription", "Write transcript that you want the assistant to generate speech from" : "Écrire la transcription à partir de laquelle vous voulez générer la vocalisation", "Output speech" : "Sortie de la vocalisation", @@ -428,7 +429,7 @@ "The original text to summarize" : "Le texte original à résumer", "Summary" : "Résumé", "The generated summary" : "Le résumé généré", - "Extract topics" : "Extraire des thèmes", + "Extract topics" : "Extraire des sujets", "Extracts topics from a text and outputs them separated by commas" : "Extrait les sujets d'un texte et les affiche en les séparant par des virgules.", "The original text to extract topics from" : "Texte original à partir duquel les thèmes sont extraits", "Topics" : "Sujets", diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js index 4b07dd98f4b..4e871b4130f 100644 --- a/lib/l10n/uk.js +++ b/lib/l10n/uk.js @@ -324,33 +324,145 @@ OC.L10N.register( "Storage is temporarily not available" : "Сховище тимчасово недоступне", "Storage connection timeout. %s" : "Час під'єднання до сховища вичерпався. %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." : "Щоби дозволити запуск цієї перевірки, потрібно пересвідчитися, що ваш вебсервер може з'єднуватися з самим собою, що передбачає можливість резолвити та з'єднуватися з одним з `trusted_domains` або `overwrite.cli.url`. Неможливість цього може бути результатом незбігу DNS на стороні сервера або встановленими правилами брандмауера.", + "Analyze images" : "Аналізуйте зображення", + "Ask a question about the given images." : "Поставте запитання про наведені зображення.", "Images" : "Зображення", + "Images to ask a question about" : "Зображення, про які можна задати питання", "Question" : "Питання", + "What to ask about the images." : "Що запитати про зображення.", + "Generated response" : "Згенерована відповідь", + "The answer to the question" : "Відповідь на питання", + "Audio chat" : "Аудіо чат", + "Voice chat with the assistant" : "Голосовий чат з асистентом", "System prompt" : "Системний запит", + "Define rules and assumptions that the assistant should follow during the conversation." : "Визначте правила та припущення, яких асистент повинен дотримуватися під час розмови.", + "Chat voice message" : "Голосове повідомлення в чаті", + "Describe a task that you want the assistant to do or ask a question." : "Опишіть завдання, яке ви хочете, щоб асистент виконав, або поставте запитання.", "Chat history" : "Історія чату", + "The history of chat messages before the current message, starting with a message by the user." : "Історія повідомлень чату перед поточним повідомленням, починаючи з повідомлення користувача.", + "Input transcript" : "Вхідна стенограма", + "Transcription of the audio input" : "Транскрипція аудіовходу", + "Response voice message" : "Голосове повідомлення у відповідь", + "The generated voice response as part of the conversation" : "Згенерована голосова відповідь як частина розмови", + "Output transcript" : "Вихідна розшифровка", + "Transcription of the audio output" : "Транскрипція аудіовиходу", "Transcribe audio" : "Транскрибувати аудіо", "Transcribe the things said in an audio" : "Транскрибувати голос", "Audio input" : "Аудіовхід", "The audio to transcribe" : "Аудіо для транскрибування", + "Transcription" : "Транскрипція", "The transcribed text" : "Транскрибований текст", + "Chat by voice with an agent" : "Голосовий чат з агентом", + "Describe a task that you want the agent to do or ask a question." : "Опишіть завдання, яке ви хочете, щоб агент виконав, або поставте запитання.", "Confirmation" : "Підтвердження", + "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "Чи підтверджувати раніше запитані дії: 0 для відмови та 1 для підтвердження.", + "Conversation token" : "Токен розмови", + "A token representing the conversation." : "Токен, що представляє розмову.", + "The new conversation token" : "Новий токен розмови", + "Send this along with the next interaction." : "Надішліть це разом з наступною взаємодією.", + "Requested actions by the agent" : "Необхідні дії агента", + "Actions that the agent would like to carry out in JSON format." : "Дії, які агент хотів би виконати у форматі JSON.", + "Chat with an agent" : "Чат з агентом", + "Chat message" : "Повідомлення в чаті", + "A chat message to send to the agent." : "Повідомлення в чаті для відправки агенту.", + "The response from the chat model." : "Відповідь від чат-моделі.", + "Context write" : "Контекстний запис", + "Writes text in a given style based on the provided source material." : "Пише текст у заданому стилі на основі наданого вихідного матеріалу.", "Writing style" : "Стиль письма", + "Demonstrate a writing style that you would like to immitate" : "Продемонструйте стиль письма, який ви хотіли б наслідувати", + "Source material" : "Вихідний матеріал", + "The content that would like to be rewritten in the new writing style" : "Контент, який хотілося б переписати в новому стилі", "Generated text" : "Зґенерований текст", + "The generated text with content from the source material in the given style" : "Згенерований текст з вмістом з вихідного матеріалу в заданому стилі", "Emoji generator" : "Ґенератор емоційок", + "Takes text and generates a representative emoji for it." : "Бере текст і генерує для нього відповідний емодзі.", + "The text to generate an emoji for" : "Текст для створення емодзі для", "Generated emoji" : "Зґенеровані емоційки", + "The generated emoji based on the input text" : "Згенеровані емодзі на основі введеного тексту", "Generate image" : "Зґенерувати зображення", + "Generate an image from a text prompt" : "Створити зображення з текстової підказки", "Prompt" : "Запрошення", + "Describe the image you want to generate" : "Опишіть зображення, яке ви хочете створити", + "Number of images" : "Кількість зображень", + "How many images to generate" : "Скільки зображень генерувати", + "Output images" : "Вихідні зображення", + "The generated images" : "Згенеровані зображення", + "Generate speech" : "Генерування мовлення", + "Generate speech from a transcript" : "Створюйте мовлення з транскрипту", + "Write transcript that you want the assistant to generate speech from" : "Напишіть стенограму, з якої ви хочете, щоб асистент генерував мовлення", + "Output speech" : "Вихідне мовлення", + "The generated speech" : "Згенероване мовлення", + "Free text to text prompt" : "Безкоштовна підказка з тексту на текст", + "Runs an arbitrary prompt through a language model that returns a reply" : "Запускає довільний запит через мовну модель, яка повертає відповідь", + "Describe a task that you want the assistant to do or ask a question" : "Опишіть завдання, яке ви хочете, щоб асистент виконав, або поставте запитання", + "Generated reply" : "Згенерована відповідь", + "The generated text from the assistant" : "Згенерований текст від помічника", + "Change Tone" : "Змінити тон", + "Change the tone of a piece of text." : "Змініть тон фрагмента тексту.", + "Write a text that you want the assistant to rewrite in another tone." : "Напишіть текст, який ви хочете, щоб асистент переписав в іншій тональності.", + "Desired tone" : "Бажаний тон", + "In which tone should your text be rewritten?" : "В якій тональності переписувати текст?", + "The rewritten text in the desired tone, written by the assistant:" : "Переписаний текст у потрібній тональності, написаний асистентом:", "Chat" : "Чат", + "Chat with the assistant" : "Чат з асистентом", + "The history of chat messages before the current message, starting with a message by the user" : "Історія повідомлень чату перед поточним повідомленням, починаючи з повідомлення користувача", "Response message" : "Відповідь", + "The generated response as part of the conversation" : "Згенерована відповідь як частина розмови", + "Chat with tools" : "Чат з інструментами", + "Chat with the language model with tool calling support." : "Чат з мовною моделлю з підтримкою виклику інструментів.", + "Tool message" : "Повідомлення про інструмент", + "The result of tool calls in the last interaction" : "Результат викликів інструментів в останній взаємодії", "Available tools" : "Доступні інструменти", + "The available tools in JSON format" : "Доступні інструменти у форматі JSON", + "The response from the chat model" : "Відповідь від чат-моделі", + "Tool calls" : "Виклики інструментів", + "Tools call instructions from the model in JSON format" : "Інструменти викликають інструкції з моделі у форматі JSON", + "Formalize text" : "Формалізуйте текст", + "Takes a text and makes it sound more formal" : "Бере текст і робить його більш формальним", + "Write a text that you want the assistant to formalize" : "Напишіть текст, який ви хочете, щоб асистент оформив", + "Formalized text" : "Формалізований текст", + "The formalized text" : "Формалізований текст", + "Generate a headline" : "Створіть заголовок", "Generates a possible headline for a text." : "Створює ймовірний заголовок тексту.", + "Original text" : "Оригінальний текст", + "The original text to generate a headline for" : "Вихідний текст для створення заголовка для", + "The generated headline" : "Згенерований заголовок", + "Proofread" : "Вичитано", + "Proofreads a text and lists corrections" : "Вичитує текст і складає список виправлень", "Text" : "Текст", + "The text to proofread" : "Текст для вичитки", + "Corrections" : "Виправлення", + "The corrections that should be made in your text" : "Виправлення, які слід зробити у вашому тексті", + "Reformulate text" : "Переформатуйте текст", + "Takes a text and reformulates it" : "Бере текст і переформатовує його", + "Write a text that you want the assistant to reformulate" : "Напишіть текст, який ви хочете, щоб асистент переформулював", + "Reformulated text" : "Переформульований текст", + "The reformulated text, written by the assistant" : "Переформульований текст, написаний асистентом", + "Simplify text" : "Спростити текст", + "Takes a text and simplifies it" : "Бере текст і спрощує його", + "Write a text that you want the assistant to simplify" : "Напишіть текст, який ви хочете, щоб асистент спростив", + "Simplified text" : "Спрощений текст", + "The simplified text" : "Спрощений текст", "Summarize" : "Підсумок", + "Summarizes a text" : "Підсумовує текст", + "The original text to summarize" : "Оригінальний текст для підбиття підсумків", "Summary" : "Загалом", + "The generated summary" : "Згенерований підсумок", "Extract topics" : "Виділити теми", + "Extracts topics from a text and outputs them separated by commas" : "Витягує теми з тексту і виводить їх через кому", + "The original text to extract topics from" : "Оригінальний текст, з якого можна взяти теми", + "Topics" : "Теми", + "The list of extracted topics" : "Список витягнутих тем", "Translate" : "Перекласти", + "Translate text from one language to another" : "Перекладіть текст з однієї мови на іншу", + "Origin text" : "Вихідний текст", + "The text to translate" : "Текст для перекладу", + "Origin language" : "Мова походження", + "The language of the origin text" : "Мова оригінального тексту", "Target language" : "Цільова мова", + "The desired language to translate the origin text in" : "Бажана мова для перекладу вихідного тексту", "Result" : "Результат", + "The translated text" : "Перекладений текст", "Free prompt" : "Вільне запрошення", "Runs an arbitrary prompt through the language model." : "Виконує довільне запрошення через мовну модель.", "Generate headline" : "Створити заголовок", diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json index 0b7e6dbf87a..285c39ff532 100644 --- a/lib/l10n/uk.json +++ b/lib/l10n/uk.json @@ -322,33 +322,145 @@ "Storage is temporarily not available" : "Сховище тимчасово недоступне", "Storage connection timeout. %s" : "Час під'єднання до сховища вичерпався. %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." : "Щоби дозволити запуск цієї перевірки, потрібно пересвідчитися, що ваш вебсервер може з'єднуватися з самим собою, що передбачає можливість резолвити та з'єднуватися з одним з `trusted_domains` або `overwrite.cli.url`. Неможливість цього може бути результатом незбігу DNS на стороні сервера або встановленими правилами брандмауера.", + "Analyze images" : "Аналізуйте зображення", + "Ask a question about the given images." : "Поставте запитання про наведені зображення.", "Images" : "Зображення", + "Images to ask a question about" : "Зображення, про які можна задати питання", "Question" : "Питання", + "What to ask about the images." : "Що запитати про зображення.", + "Generated response" : "Згенерована відповідь", + "The answer to the question" : "Відповідь на питання", + "Audio chat" : "Аудіо чат", + "Voice chat with the assistant" : "Голосовий чат з асистентом", "System prompt" : "Системний запит", + "Define rules and assumptions that the assistant should follow during the conversation." : "Визначте правила та припущення, яких асистент повинен дотримуватися під час розмови.", + "Chat voice message" : "Голосове повідомлення в чаті", + "Describe a task that you want the assistant to do or ask a question." : "Опишіть завдання, яке ви хочете, щоб асистент виконав, або поставте запитання.", "Chat history" : "Історія чату", + "The history of chat messages before the current message, starting with a message by the user." : "Історія повідомлень чату перед поточним повідомленням, починаючи з повідомлення користувача.", + "Input transcript" : "Вхідна стенограма", + "Transcription of the audio input" : "Транскрипція аудіовходу", + "Response voice message" : "Голосове повідомлення у відповідь", + "The generated voice response as part of the conversation" : "Згенерована голосова відповідь як частина розмови", + "Output transcript" : "Вихідна розшифровка", + "Transcription of the audio output" : "Транскрипція аудіовиходу", "Transcribe audio" : "Транскрибувати аудіо", "Transcribe the things said in an audio" : "Транскрибувати голос", "Audio input" : "Аудіовхід", "The audio to transcribe" : "Аудіо для транскрибування", + "Transcription" : "Транскрипція", "The transcribed text" : "Транскрибований текст", + "Chat by voice with an agent" : "Голосовий чат з агентом", + "Describe a task that you want the agent to do or ask a question." : "Опишіть завдання, яке ви хочете, щоб агент виконав, або поставте запитання.", "Confirmation" : "Підтвердження", + "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "Чи підтверджувати раніше запитані дії: 0 для відмови та 1 для підтвердження.", + "Conversation token" : "Токен розмови", + "A token representing the conversation." : "Токен, що представляє розмову.", + "The new conversation token" : "Новий токен розмови", + "Send this along with the next interaction." : "Надішліть це разом з наступною взаємодією.", + "Requested actions by the agent" : "Необхідні дії агента", + "Actions that the agent would like to carry out in JSON format." : "Дії, які агент хотів би виконати у форматі JSON.", + "Chat with an agent" : "Чат з агентом", + "Chat message" : "Повідомлення в чаті", + "A chat message to send to the agent." : "Повідомлення в чаті для відправки агенту.", + "The response from the chat model." : "Відповідь від чат-моделі.", + "Context write" : "Контекстний запис", + "Writes text in a given style based on the provided source material." : "Пише текст у заданому стилі на основі наданого вихідного матеріалу.", "Writing style" : "Стиль письма", + "Demonstrate a writing style that you would like to immitate" : "Продемонструйте стиль письма, який ви хотіли б наслідувати", + "Source material" : "Вихідний матеріал", + "The content that would like to be rewritten in the new writing style" : "Контент, який хотілося б переписати в новому стилі", "Generated text" : "Зґенерований текст", + "The generated text with content from the source material in the given style" : "Згенерований текст з вмістом з вихідного матеріалу в заданому стилі", "Emoji generator" : "Ґенератор емоційок", + "Takes text and generates a representative emoji for it." : "Бере текст і генерує для нього відповідний емодзі.", + "The text to generate an emoji for" : "Текст для створення емодзі для", "Generated emoji" : "Зґенеровані емоційки", + "The generated emoji based on the input text" : "Згенеровані емодзі на основі введеного тексту", "Generate image" : "Зґенерувати зображення", + "Generate an image from a text prompt" : "Створити зображення з текстової підказки", "Prompt" : "Запрошення", + "Describe the image you want to generate" : "Опишіть зображення, яке ви хочете створити", + "Number of images" : "Кількість зображень", + "How many images to generate" : "Скільки зображень генерувати", + "Output images" : "Вихідні зображення", + "The generated images" : "Згенеровані зображення", + "Generate speech" : "Генерування мовлення", + "Generate speech from a transcript" : "Створюйте мовлення з транскрипту", + "Write transcript that you want the assistant to generate speech from" : "Напишіть стенограму, з якої ви хочете, щоб асистент генерував мовлення", + "Output speech" : "Вихідне мовлення", + "The generated speech" : "Згенероване мовлення", + "Free text to text prompt" : "Безкоштовна підказка з тексту на текст", + "Runs an arbitrary prompt through a language model that returns a reply" : "Запускає довільний запит через мовну модель, яка повертає відповідь", + "Describe a task that you want the assistant to do or ask a question" : "Опишіть завдання, яке ви хочете, щоб асистент виконав, або поставте запитання", + "Generated reply" : "Згенерована відповідь", + "The generated text from the assistant" : "Згенерований текст від помічника", + "Change Tone" : "Змінити тон", + "Change the tone of a piece of text." : "Змініть тон фрагмента тексту.", + "Write a text that you want the assistant to rewrite in another tone." : "Напишіть текст, який ви хочете, щоб асистент переписав в іншій тональності.", + "Desired tone" : "Бажаний тон", + "In which tone should your text be rewritten?" : "В якій тональності переписувати текст?", + "The rewritten text in the desired tone, written by the assistant:" : "Переписаний текст у потрібній тональності, написаний асистентом:", "Chat" : "Чат", + "Chat with the assistant" : "Чат з асистентом", + "The history of chat messages before the current message, starting with a message by the user" : "Історія повідомлень чату перед поточним повідомленням, починаючи з повідомлення користувача", "Response message" : "Відповідь", + "The generated response as part of the conversation" : "Згенерована відповідь як частина розмови", + "Chat with tools" : "Чат з інструментами", + "Chat with the language model with tool calling support." : "Чат з мовною моделлю з підтримкою виклику інструментів.", + "Tool message" : "Повідомлення про інструмент", + "The result of tool calls in the last interaction" : "Результат викликів інструментів в останній взаємодії", "Available tools" : "Доступні інструменти", + "The available tools in JSON format" : "Доступні інструменти у форматі JSON", + "The response from the chat model" : "Відповідь від чат-моделі", + "Tool calls" : "Виклики інструментів", + "Tools call instructions from the model in JSON format" : "Інструменти викликають інструкції з моделі у форматі JSON", + "Formalize text" : "Формалізуйте текст", + "Takes a text and makes it sound more formal" : "Бере текст і робить його більш формальним", + "Write a text that you want the assistant to formalize" : "Напишіть текст, який ви хочете, щоб асистент оформив", + "Formalized text" : "Формалізований текст", + "The formalized text" : "Формалізований текст", + "Generate a headline" : "Створіть заголовок", "Generates a possible headline for a text." : "Створює ймовірний заголовок тексту.", + "Original text" : "Оригінальний текст", + "The original text to generate a headline for" : "Вихідний текст для створення заголовка для", + "The generated headline" : "Згенерований заголовок", + "Proofread" : "Вичитано", + "Proofreads a text and lists corrections" : "Вичитує текст і складає список виправлень", "Text" : "Текст", + "The text to proofread" : "Текст для вичитки", + "Corrections" : "Виправлення", + "The corrections that should be made in your text" : "Виправлення, які слід зробити у вашому тексті", + "Reformulate text" : "Переформатуйте текст", + "Takes a text and reformulates it" : "Бере текст і переформатовує його", + "Write a text that you want the assistant to reformulate" : "Напишіть текст, який ви хочете, щоб асистент переформулював", + "Reformulated text" : "Переформульований текст", + "The reformulated text, written by the assistant" : "Переформульований текст, написаний асистентом", + "Simplify text" : "Спростити текст", + "Takes a text and simplifies it" : "Бере текст і спрощує його", + "Write a text that you want the assistant to simplify" : "Напишіть текст, який ви хочете, щоб асистент спростив", + "Simplified text" : "Спрощений текст", + "The simplified text" : "Спрощений текст", "Summarize" : "Підсумок", + "Summarizes a text" : "Підсумовує текст", + "The original text to summarize" : "Оригінальний текст для підбиття підсумків", "Summary" : "Загалом", + "The generated summary" : "Згенерований підсумок", "Extract topics" : "Виділити теми", + "Extracts topics from a text and outputs them separated by commas" : "Витягує теми з тексту і виводить їх через кому", + "The original text to extract topics from" : "Оригінальний текст, з якого можна взяти теми", + "Topics" : "Теми", + "The list of extracted topics" : "Список витягнутих тем", "Translate" : "Перекласти", + "Translate text from one language to another" : "Перекладіть текст з однієї мови на іншу", + "Origin text" : "Вихідний текст", + "The text to translate" : "Текст для перекладу", + "Origin language" : "Мова походження", + "The language of the origin text" : "Мова оригінального тексту", "Target language" : "Цільова мова", + "The desired language to translate the origin text in" : "Бажана мова для перекладу вихідного тексту", "Result" : "Результат", + "The translated text" : "Перекладений текст", "Free prompt" : "Вільне запрошення", "Runs an arbitrary prompt through the language model." : "Виконує довільне запрошення через мовну модель.", "Generate headline" : "Створити заголовок", diff --git a/lib/private/App/AppStore/Fetcher/Fetcher.php b/lib/private/App/AppStore/Fetcher/Fetcher.php index 2e949fedb51..24876675d60 100644 --- a/lib/private/App/AppStore/Fetcher/Fetcher.php +++ b/lib/private/App/AppStore/Fetcher/Fetcher.php @@ -56,7 +56,7 @@ abstract class Fetcher { * * @return array */ - protected function fetch($ETag, $content) { + protected function fetch($ETag, $content, $allowUnstable = false) { $appstoreenabled = $this->config->getSystemValueBool('appstoreenabled', true); if ((int)$this->config->getAppValue('settings', 'appstore-fetcher-lastFailure', '0') > time() - self::RETRY_AFTER_FAILURE_SECONDS) { return []; diff --git a/lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php b/lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php index e4571dfc50e..b69b129f798 100644 --- a/lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php +++ b/lib/private/AppFramework/Middleware/FlowV2EphemeralSessionsMiddleware.php @@ -15,6 +15,7 @@ use OCP\AppFramework\Http\Attribute\PublicPage; use OCP\AppFramework\Middleware; use OCP\ISession; use OCP\IUserSession; +use Psr\Log\LoggerInterface; use ReflectionMethod; // Will close the session if the user session is ephemeral. @@ -24,6 +25,7 @@ class FlowV2EphemeralSessionsMiddleware extends Middleware { private ISession $session, private IUserSession $userSession, private ControllerMethodReflector $reflector, + private LoggerInterface $logger, ) { } @@ -52,6 +54,10 @@ class FlowV2EphemeralSessionsMiddleware extends Middleware { return; } + $this->logger->info('Closing user and PHP session for ephemeral session', [ + 'controller' => $controller::class, + 'method' => $methodName, + ]); $this->userSession->logout(); $this->session->close(); } diff --git a/lib/private/BackgroundJob/JobList.php b/lib/private/BackgroundJob/JobList.php index 0d88200cff7..c00a51e3851 100644 --- a/lib/private/BackgroundJob/JobList.php +++ b/lib/private/BackgroundJob/JobList.php @@ -24,6 +24,9 @@ use function min; use function strlen; class JobList implements IJobList { + /** @var array<string, int> */ + protected array $alreadyVisitedParallelBlocked = []; + public function __construct( protected IDBConnection $connection, protected IConfig $config, @@ -198,6 +201,12 @@ class JobList implements IJobList { $job = $this->buildJob($row); if ($job instanceof IParallelAwareJob && !$job->getAllowParallelRuns() && $this->hasReservedJob(get_class($job))) { + if (!isset($this->alreadyVisitedParallelBlocked[get_class($job)])) { + $this->alreadyVisitedParallelBlocked[get_class($job)] = $job->getId(); + } elseif ($this->alreadyVisitedParallelBlocked[get_class($job)] === $job->getId()) { + $this->logger->info('Skipped through all jobs and revisited a IParallelAwareJob blocked job again, giving up.', ['app' => 'cron']); + return null; + } $this->logger->info('Skipping ' . get_class($job) . ' job with ID ' . $job->getId() . ' because another job with the same class is already running', ['app' => 'cron']); $update = $this->connection->getQueryBuilder(); @@ -210,6 +219,10 @@ class JobList implements IJobList { return $this->getNext($onlyTimeSensitive, $jobClasses); } + if ($job !== null && isset($this->alreadyVisitedParallelBlocked[get_class($job)])) { + unset($this->alreadyVisitedParallelBlocked[get_class($job)]); + } + if ($job instanceof \OCP\BackgroundJob\TimedJob) { $now = $this->timeFactory->getTime(); $nextPossibleRun = $job->getLastRun() + $job->getInterval(); diff --git a/lib/private/DB/ConnectionFactory.php b/lib/private/DB/ConnectionFactory.php index 4d286cb3068..d9b80b81992 100644 --- a/lib/private/DB/ConnectionFactory.php +++ b/lib/private/DB/ConnectionFactory.php @@ -121,21 +121,9 @@ class ConnectionFactory { case 'oci': $eventManager->addEventSubscriber(new OracleSessionInit); - // the driverOptions are unused in dbal and need to be mapped to the parameters - if (isset($connectionParams['driverOptions'])) { - $connectionParams = array_merge($connectionParams, $connectionParams['driverOptions']); - } - $host = $connectionParams['host']; - $port = $connectionParams['port'] ?? null; - $dbName = $connectionParams['dbname']; - - // we set the connect string as dbname and unset the host to coerce doctrine into using it as connect string - if ($host === '') { - $connectionParams['dbname'] = $dbName; // use dbname as easy connect name - } else { - $connectionParams['dbname'] = '//' . $host . (!empty($port) ? ":{$port}" : '') . '/' . $dbName; - } - unset($connectionParams['host']); + $connectionParams = $this->forceConnectionStringOracle($connectionParams); + $connectionParams['primary'] = $this->forceConnectionStringOracle($connectionParams['primary']); + $connectionParams['replica'] = array_map([$this, 'forceConnectionStringOracle'], $connectionParams['replica']); break; case 'sqlite3': @@ -265,4 +253,24 @@ class ConnectionFactory { return $params; } + + protected function forceConnectionStringOracle(array $connectionParams): array { + // the driverOptions are unused in dbal and need to be mapped to the parameters + if (isset($connectionParams['driverOptions'])) { + $connectionParams = array_merge($connectionParams, $connectionParams['driverOptions']); + } + $host = $connectionParams['host']; + $port = $connectionParams['port'] ?? null; + $dbName = $connectionParams['dbname']; + + // we set the connect string as dbname and unset the host to coerce doctrine into using it as connect string + if ($host === '') { + $connectionParams['dbname'] = $dbName; // use dbname as easy connect name + } else { + $connectionParams['dbname'] = '//' . $host . (!empty($port) ? ":{$port}" : '') . '/' . $dbName; + } + unset($connectionParams['host']); + + return $connectionParams; + } } diff --git a/lib/private/Federation/CloudIdManager.php b/lib/private/Federation/CloudIdManager.php index 7e7adda3d39..c599d9046a6 100644 --- a/lib/private/Federation/CloudIdManager.php +++ b/lib/private/Federation/CloudIdManager.php @@ -14,6 +14,7 @@ use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventDispatcher; use OCP\Federation\ICloudId; use OCP\Federation\ICloudIdManager; +use OCP\Federation\ICloudIdResolver; use OCP\ICache; use OCP\ICacheFactory; use OCP\IURLGenerator; @@ -21,27 +22,19 @@ use OCP\IUserManager; use OCP\User\Events\UserChangedEvent; class CloudIdManager implements ICloudIdManager { - /** @var IManager */ - private $contactsManager; - /** @var IURLGenerator */ - private $urlGenerator; - /** @var IUserManager */ - private $userManager; private ICache $memCache; private ICache $displayNameCache; - /** @var array[] */ private array $cache = []; + /** @var ICloudIdResolver[] */ + private array $cloudIdResolvers = []; public function __construct( - IManager $contactsManager, - IURLGenerator $urlGenerator, - IUserManager $userManager, ICacheFactory $cacheFactory, IEventDispatcher $eventDispatcher, + private IManager $contactsManager, + private IURLGenerator $urlGenerator, + private IUserManager $userManager, ) { - $this->contactsManager = $contactsManager; - $this->urlGenerator = $urlGenerator; - $this->userManager = $userManager; $this->memCache = $cacheFactory->createDistributed('cloud_id_'); $this->displayNameCache = $cacheFactory->createDistributed('cloudid_name_'); $eventDispatcher->addListener(UserChangedEvent::class, [$this, 'handleUserEvent']); @@ -81,6 +74,12 @@ class CloudIdManager implements ICloudIdManager { public function resolveCloudId(string $cloudId): ICloudId { // TODO magic here to get the url and user instead of just splitting on @ + foreach ($this->cloudIdResolvers as $resolver) { + if ($resolver->isValidCloudId($cloudId)) { + return $resolver->resolveCloudId($cloudId); + } + } + if (!$this->isValidCloudId($cloudId)) { throw new \InvalidArgumentException('Invalid cloud id'); } @@ -251,6 +250,26 @@ class CloudIdManager implements ICloudIdManager { * @return bool */ public function isValidCloudId(string $cloudId): bool { - return str_contains($cloudId, '@'); + foreach ($this->cloudIdResolvers as $resolver) { + if ($resolver->isValidCloudId($cloudId)) { + return true; + } + } + + return strpos($cloudId, '@') !== false; + } + + public function createCloudId(string $id, string $user, string $remote, ?string $displayName = null): ICloudId { + return new CloudId($id, $user, $remote, $displayName); + } + + public function registerCloudIdResolver(ICloudIdResolver $resolver): void { + array_unshift($this->cloudIdResolvers, $resolver); + } + + public function unregisterCloudIdResolver(ICloudIdResolver $resolver): void { + if (($key = array_search($resolver, $this->cloudIdResolvers)) !== false) { + array_splice($this->cloudIdResolvers, $key, 1); + } } } diff --git a/lib/private/Files/Filesystem.php b/lib/private/Files/Filesystem.php index 48c069de0b9..8fe56cf060c 100644 --- a/lib/private/Files/Filesystem.php +++ b/lib/private/Files/Filesystem.php @@ -8,6 +8,7 @@ namespace OC\Files; use OC\Files\Mount\MountPoint; +use OC\Files\Storage\StorageFactory; use OC\User\NoUserException; use OCP\Cache\CappedMemoryCache; use OCP\EventDispatcher\IEventDispatcher; @@ -178,7 +179,9 @@ class Filesystem { } $mounts = self::getMountManager()->getAll(); - if (!self::getLoader()->addStorageWrapper($wrapperName, $wrapper, $priority, $mounts)) { + /** @var StorageFactory $loader */ + $loader = self::getLoader(); + if (!$loader->addStorageWrapper($wrapperName, $wrapper, $priority, $mounts)) { // do not re-wrap if storage with this name already existed return; } diff --git a/lib/private/Lockdown/Filesystem/NullStorage.php b/lib/private/Lockdown/Filesystem/NullStorage.php index 71a40d8da1e..fd952fae637 100644 --- a/lib/private/Lockdown/Filesystem/NullStorage.php +++ b/lib/private/Lockdown/Filesystem/NullStorage.php @@ -30,7 +30,7 @@ class NullStorage extends Common { } public function opendir(string $path): IteratorDirectory { - return new IteratorDirectory([]); + return new IteratorDirectory(); } public function is_dir(string $path): bool { diff --git a/lib/private/Server.php b/lib/private/Server.php index d339a97baab..171fee2afa1 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -1160,11 +1160,11 @@ class Server extends ServerContainer implements IServerContainer { $this->registerService(ICloudIdManager::class, function (ContainerInterface $c) { return new CloudIdManager( + $c->get(ICacheFactory::class), + $c->get(IEventDispatcher::class), $c->get(\OCP\Contacts\IManager::class), $c->get(IURLGenerator::class), $c->get(IUserManager::class), - $c->get(ICacheFactory::class), - $c->get(IEventDispatcher::class), ); }); diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php index e1eebe1e450..a2c0fd15eb4 100644 --- a/lib/private/Share20/DefaultShareProvider.php +++ b/lib/private/Share20/DefaultShareProvider.php @@ -284,7 +284,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv ->set('expiration', $qb->createNamedParameter($expirationDate, IQueryBuilder::PARAM_DATETIME_MUTABLE)) ->set('note', $qb->createNamedParameter($share->getNote())) ->set('label', $qb->createNamedParameter($share->getLabel())) - ->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0), IQueryBuilder::PARAM_INT) + ->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0, IQueryBuilder::PARAM_INT)) ->executeStatement(); } diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index 01664c6a0a3..9bfa810b108 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -12,6 +12,7 @@ use OC\KnownUser\KnownUserService; use OC\Share20\Exception\ProviderException; use OCA\Files_Sharing\AppInfo\Application; use OCA\Files_Sharing\SharedStorage; +use OCA\ShareByMail\ShareByMailProvider; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\File; use OCP\Files\Folder; @@ -869,6 +870,7 @@ class Manager implements IManager { // Now update the share! $provider = $this->factory->getProviderForType($share->getShareType()); if ($share->getShareType() === IShare::TYPE_EMAIL) { + /** @var ShareByMailProvider $provider */ $share = $provider->update($share, $plainTextPassword); } else { $share = $provider->update($share); diff --git a/lib/public/Federation/ICloudIdManager.php b/lib/public/Federation/ICloudIdManager.php index 03b6ced18f5..29e261ab3af 100644 --- a/lib/public/Federation/ICloudIdManager.php +++ b/lib/public/Federation/ICloudIdManager.php @@ -8,11 +8,14 @@ declare(strict_types=1); */ namespace OCP\Federation; +use OCP\AppFramework\Attribute\Consumable; + /** * Interface for resolving federated cloud ids * * @since 12.0.0 */ +#[Consumable(since: '12.0.0')] interface ICloudIdManager { /** * @param string $cloudId @@ -55,4 +58,28 @@ interface ICloudIdManager { * @since 30.0.0 - Optional parameter $httpsOnly was added */ public function removeProtocolFromUrl(string $url, bool $httpsOnly = false): string; + + /** + * @param string $id The remote cloud id + * @param string $user The user id on the remote server + * @param string $remote The base address of the remote server + * @param ?string $displayName The displayname of the remote user + * + * @since 32.0.0 + */ + public function createCloudId(string $id, string $user, string $remote, ?string $displayName = null): ICloudId; + + /** + * @param $resolver The cloud id resolver to register + * + * @since 32.0.0 + */ + public function registerCloudIdResolver(ICloudIdResolver $resolver): void; + + /** + * @param $resolver The cloud id resolver to unregister + * + * @since 32.0.0 + */ + public function unregisterCloudIdResolver(ICloudIdResolver $resolver): void; } diff --git a/lib/public/Federation/ICloudIdResolver.php b/lib/public/Federation/ICloudIdResolver.php new file mode 100644 index 00000000000..79f9ed11dd7 --- /dev/null +++ b/lib/public/Federation/ICloudIdResolver.php @@ -0,0 +1,40 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ +namespace OCP\Federation; + +use OCP\AppFramework\Attribute\Consumable; +use OCP\AppFramework\Attribute\Implementable; + +/** + * Interface for resolving federated cloud ids + * + * @since 32.0.0 + */ +#[Consumable(since: '32.0.0')] +#[Implementable(since: '32.0.0')] +interface ICloudIdResolver { + /** + * @param string $cloudId + * @return ICloudId + * @throws \InvalidArgumentException + * + * @since 32.0.0 + */ + public function resolveCloudId(string $cloudId): ICloudId; + + /** + * Check if the input is a correctly formatted cloud id + * + * @param string $cloudId + * @return bool + * + * @since 32.0.0 + */ + public function isValidCloudId(string $cloudId): bool; +} |