Merge branch 'master' into fix-sharing-code

This commit is contained in:
Thomas Müller 2013-10-23 17:16:16 +02:00
commit 1909288fcb
472 changed files with 11310 additions and 4940 deletions

@ -1 +1 @@
Subproject commit 98fdc3a4e2f56f7d231470418222162dbf95f46a
Subproject commit 42efd966284debadf83b761367e529bc45f806d6

View file

@ -8,7 +8,10 @@ If you have questions about how to install or use ownCloud, please direct these
### Guidelines
* Please search the existing issues first, it's likely that your issue was already reported or even fixed.
* This repository is *only* for issues within the ownCloud core code. This also includes the apps: files, encryption, external storage, sharing, deleted files, versions, LDAP, and WebDAV Auth
- Go to one of the repositories, click "issues" and type any word in the top search/command bar.
- You can also filter by appending e. g. "state:open" to the search string.
- More info on [search syntax within github](https://help.github.com/articles/searching-issues)
* This repository ([core](https://github.com/owncloud/core/issues)) is *only* for issues within the ownCloud core code. This also includes the apps: files, encryption, external storage, sharing, deleted files, versions, LDAP, and WebDAV Auth
* The issues in other components should be reported in their respective repositories:
- [Android client](https://github.com/owncloud/android/issues)
- [iOS client](https://github.com/owncloud/ios-issues/issues)

View file

@ -118,6 +118,10 @@ if ($needUpgrade) {
$trashEmpty = \OCA\Files_Trashbin\Trashbin::isEmpty($user);
}
$isCreatable = \OC\Files\Filesystem::isCreatable($dir . '/');
$fileHeader = (!isset($files) or count($files) > 0);
$emptyContent = ($isCreatable and !$fileHeader) or $ajaxLoad;
OCP\Util::addscript('files', 'fileactions');
OCP\Util::addscript('files', 'files');
OCP\Util::addscript('files', 'keyboardshortcuts');
@ -125,7 +129,7 @@ if ($needUpgrade) {
$tmpl->assign('fileList', $list->fetchPage());
$tmpl->assign('breadcrumb', $breadcrumbNav->fetchPage());
$tmpl->assign('dir', \OC\Files\Filesystem::normalizePath($dir));
$tmpl->assign('isCreatable', \OC\Files\Filesystem::isCreatable($dir . '/'));
$tmpl->assign('isCreatable', $isCreatable);
$tmpl->assign('permissions', $permissions);
$tmpl->assign('files', $files);
$tmpl->assign('trash', $trashEnabled);
@ -138,9 +142,12 @@ if ($needUpgrade) {
$tmpl->assign('publicUploadEnabled', $publicUploadEnabled);
$tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles());
$tmpl->assign("mailNotificationEnabled", \OC_Appconfig::getValue('core', 'shareapi_allow_mail_notification', 'yes'));
$tmpl->assign("allowShareWithLink", \OC_Appconfig::getValue('core', 'shareapi_allow_links', 'yes'));
$tmpl->assign("encryptionInitStatus", $encryptionInitStatus);
$tmpl->assign('disableSharing', false);
$tmpl->assign('ajaxLoad', $ajaxLoad);
$tmpl->assign('emptyContent', $emptyContent);
$tmpl->assign('fileHeader', $fileHeader);
$tmpl->printPage();
}

View file

@ -7,11 +7,9 @@ var FileList={
});
},
update:function(fileListHtml) {
var $fileList = $('#fileList'),
permissions = $('#permissions').val(),
isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0;
var $fileList = $('#fileList');
$fileList.empty().html(fileListHtml);
$('#emptycontent').toggleClass('hidden', !isCreatable || $fileList.find('tr').length > 0);
FileList.updateEmptyContent();
$fileList.find('tr').each(function () {
FileActions.display($(this).children('td.filename'));
});
@ -251,12 +249,38 @@ var FileList={
$('.creatable').toggleClass('hidden', !isCreatable);
$('.notCreatable').toggleClass('hidden', isCreatable);
},
/**
* Shows/hides action buttons
*
* @param show true for enabling, false for disabling
*/
showActions: function(show){
$('.actions,#file_action_panel').toggleClass('hidden', !show);
if (show){
// make sure to display according to permissions
var permissions = $('#permissions').val();
var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0;
$('.creatable').toggleClass('hidden', !isCreatable);
$('.notCreatable').toggleClass('hidden', isCreatable);
}
},
/**
* Enables/disables viewer mode.
* In viewer mode, apps can embed themselves under the controls bar.
* In viewer mode, the actions of the file list will be hidden.
* @param show true for enabling, false for disabling
*/
setViewerMode: function(show){
this.showActions(!show);
$('#filestable').toggleClass('hidden', show);
},
remove:function(name){
$('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy');
$('tr').filterAttr('data-file',name).remove();
FileList.updateFileSummary();
if($('tr[data-file]').length==0){
$('#emptycontent').removeClass('hidden');
$('#filescontent th').addClass('hidden');
}
},
insertElement:function(name,type,element){
@ -287,6 +311,7 @@ var FileList={
$('#fileList').append(element);
}
$('#emptycontent').addClass('hidden');
$('#filestable th').removeClass('hidden');
FileList.updateFileSummary();
},
loadingDone:function(name, id){
@ -505,6 +530,7 @@ var FileList={
procesSelection();
checkTrashStatus();
FileList.updateFileSummary();
FileList.updateEmptyContent();
} else {
$.each(files,function(index,file) {
var deleteAction = $('tr').filterAttr('data-file',files[i]).children("td.date").children(".action.delete");
@ -618,6 +644,13 @@ var FileList={
}
}
},
updateEmptyContent: function(){
var $fileList = $('#fileList');
var permissions = $('#permissions').val();
var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0;
$('#emptycontent').toggleClass('hidden', !isCreatable || $fileList.find('tr').length > 0);
$('#filestable th').toggleClass('hidden', $fileList.find('tr').length === 0);
},
showMask: function(){
// in case one was shown before
var $mask = $('#content .mask');

View file

@ -301,7 +301,7 @@ $(document).ready(function() {
});
$('.download').click('click',function(event) {
var files=getSelectedFiles('name');
var files=getSelectedFilesTrash('name');
var fileslist = JSON.stringify(files);
var dir=$('#dir').val()||'/';
OC.Notification.show(t('files','Your download is being prepared. This might take some time if the files are big.'));
@ -315,7 +315,7 @@ $(document).ready(function() {
});
$('.delete-selected').click(function(event) {
var files=getSelectedFiles('name');
var files=getSelectedFilesTrash('name');
event.preventDefault();
FileList.do_delete(files);
return false;
@ -433,7 +433,7 @@ var createDragShadow = function(event){
$(event.target).parents('tr').find('td input:first').prop('checked',true);
}
var selectedFiles = getSelectedFiles();
var selectedFiles = getSelectedFilesTrash();
if (!isDragSelected && selectedFiles.length == 1) {
//revert the selection
@ -562,7 +562,7 @@ var crumbDropOptions={
}
function procesSelection(){
var selected=getSelectedFiles();
var selected=getSelectedFilesTrash();
var selectedFiles=selected.filter(function(el){return el.type=='file'});
var selectedFolders=selected.filter(function(el){return el.type=='dir'});
if(selectedFiles.length==0 && selectedFolders.length==0) {
@ -607,7 +607,7 @@ function procesSelection(){
* if property is set, an array with that property for each file is returnd
* if it's ommited an array of objects with all properties is returned
*/
function getSelectedFiles(property){
function getSelectedFilesTrash(property){
var elements=$('td.filename input:checkbox:checked').parent().parent();
var files=[];
elements.each(function(i,element){
@ -663,8 +663,16 @@ function lazyLoadPreview(path, mime, ready, width, height) {
$.get(previewURL, function() {
previewURL = previewURL.replace('(', '%28');
previewURL = previewURL.replace(')', '%29');
//set preview thumbnail URL
ready(previewURL + '&reload=true');
previewURL += '&reload=true';
// preload image to prevent delay
// this will make the browser cache the image
var img = new Image();
img.onload = function(){
//set preview thumbnail URL
ready(previewURL);
}
img.src = previewURL;
});
});
}

14
apps/files/l10n/ru_RU.php Normal file
View file

@ -0,0 +1,14 @@
<?php
$TRANSLATIONS = array(
"Files" => "Файлы",
"Error" => "Ошибка",
"Share" => "Сделать общим",
"Rename" => "Переименовать",
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
"Upload" => "Загрузка",
"Cancel upload" => "Отмена загрузки",
"Download" => "Загрузка"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";

View file

@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Chýba dočasný priečinok",
"Failed to write to disk" => "Zápis na disk sa nepodaril",
"Not enough storage available" => "Nedostatok dostupného úložného priestoru",
"Upload failed. Could not get file info." => "Nahrávanie zlyhalo. Nepodarilo sa získať informácie o súbore.",
"Upload failed. Could not find uploaded file" => "Nahrávanie zlyhalo. Nepodarilo sa nájsť nahrávaný súbor",
"Invalid directory." => "Neplatný priečinok.",
"Files" => "Súbory",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov",
"Not enough space available" => "Nie je k dispozícii dostatok miesta",
"Upload cancelled." => "Odosielanie zrušené.",
"Could not get result from server." => "Nepodarilo sa dostať výsledky zo servera.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.",
"URL cannot be empty." => "URL nemôže byť prázdne.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Neplatný názov priečinka. Názov \"Shared\" je rezervovaný pre ownCloud",
@ -33,14 +37,18 @@ $TRANSLATIONS = array(
"undo" => "vrátiť",
"_%n folder_::_%n folders_" => array("%n priečinok","%n priečinky","%n priečinkov"),
"_%n file_::_%n files_" => array("%n súbor","%n súbory","%n súborov"),
"{dirs} and {files}" => "{dirs} a {files}",
"_Uploading %n file_::_Uploading %n files_" => array("Nahrávam %n súbor","Nahrávam %n súbory","Nahrávam %n súborov"),
"'.' is an invalid file name." => "'.' je neplatné meno súboru.",
"File name cannot be empty." => "Meno súboru nemôže byť prázdne",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Nesprávne meno, '\\', '/', '<', '>', ':', '\"', '|', '?' a '*' nie sú povolené hodnoty.",
"Your storage is full, files can not be updated or synced anymore!" => "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
"Your storage is almost full ({usedSpacePercent}%)" => "Vaše úložisko je takmer plné ({usedSpacePercent}%)",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" => "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.",
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." => "Chybný súkromný kľúč na šifrovanie aplikácií. Zaktualizujte si heslo súkromného kľúča v svojom osobnom nastavení, aby ste znovu získali prístup k svojim zašifrovaným súborom.",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifrovanie bolo zakázané, ale vaše súbory sú stále zašifrované. Prosím, choďte do osobného nastavenia pre dešifrovanie súborov.",
"Your download is being prepared. This might take some time if the files are big." => "Vaše sťahovanie sa pripravuje. Ak sú sťahované súbory veľké, môže to chvíľu trvať.",
"Error moving file" => "Chyba pri presúvaní súboru",
"Name" => "Názov",
"Size" => "Veľkosť",
"Modified" => "Upravené",

View file

@ -1,6 +1,6 @@
<div id="controls">
<?php print_unescaped($_['breadcrumb']); ?>
<div class="actions creatable <?php if (!$_['isCreatable']):?>hidden<?php endif; ?> <?php if (isset($_['files']) and count($_['files'])==0):?>emptycontent<?php endif; ?>">
<div class="actions creatable <?php if (!$_['isCreatable']):?>hidden<?php endif; ?>">
<div id="new" class="button">
<a><?php p($l->t('New'));?></a>
<ul>
@ -42,14 +42,14 @@
<input type="hidden" name="permissions" value="<?php p($_['permissions']); ?>" id="permissions">
</div>
<div id="emptycontent" <?php if (!isset($_['files']) or !$_['isCreatable'] or count($_['files']) > 0 or $_['ajaxLoad']):?>class="hidden"<?php endif; ?>><?php p($l->t('Nothing in here. Upload something!'))?></div>
<div id="emptycontent" <?php if (!$_['emptyContent']):?>class="hidden"<?php endif; ?>><?php p($l->t('Nothing in here. Upload something!'))?></div>
<input type="hidden" id="disableSharing" data-status="<?php p($_['disableSharing']); ?>"></input>
<table id="filestable" data-allow-public-upload="<?php p($_['publicUploadEnabled'])?>" data-preview-x="36" data-preview-y="36">
<thead>
<tr>
<th id='headerName'>
<th <?php if (!$_['fileHeader']):?>class="hidden"<?php endif; ?> id='headerName'>
<div id="headerName-container">
<input type="checkbox" id="select_all" />
<label for="select_all"></label>
@ -65,8 +65,8 @@
</span>
</div>
</th>
<th id="headerSize"><?php p($l->t('Size')); ?></th>
<th id="headerDate">
<th <?php if (!$_['fileHeader']):?>class="hidden"<?php endif; ?> id="headerSize"><?php p($l->t('Size')); ?></th>
<th <?php if (!$_['fileHeader']):?>class="hidden"<?php endif; ?> id="headerDate">
<span id="modified"><?php p($l->t( 'Modified' )); ?></span>
<?php if ($_['permissions'] & OCP\PERMISSION_DELETE): ?>
<!-- NOTE: Temporary fix to allow unsharing of files in root of Shared folder -->
@ -114,3 +114,5 @@
<input type="hidden" name="encryptedFiles" id="encryptedFiles" value="<?php $_['encryptedFiles'] ? p('1') : p('0'); ?>" />
<input type="hidden" name="encryptedInitStatus" id="encryptionInitStatus" value="<?php p($_['encryptionInitStatus']) ?>" />
<input type="hidden" name="mailNotificationEnabled" id="mailNotificationEnabled" value="<?php p($_['mailNotificationEnabled']) ?>" />
<input type="hidden" name="allowShareWithLink" id="allowShareWithLink" value="<?php p($_['allowShareWithLink']) ?>" />

View file

@ -555,4 +555,15 @@ class Hooks {
}
}
/**
* set the init status to 'NOT_INITIALIZED' (0) if the app gets enabled
* @param array $params contains the app ID
*/
public static function postEnable($params) {
if ($params['app'] === 'files_encryption') {
$session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
$session->setInitialized(\OCA\Encryption\Session::NOT_INITIALIZED);
}
}
}

View file

@ -10,6 +10,8 @@ $TRANSLATIONS = array(
"Could not update the private key password. Maybe the old password was not correct." => "Non foi posíbel actualizar o contrasinal da chave privada. É probábel que o contrasinal antigo non sexa correcto.",
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Non se iniciou o aplicativo de cifrado! Quizais volva a activarse durante a sesión. Tente pechar a sesión e volver iniciala que tamén se inicie o aplicativo de cifrado.",
"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior (p.ex. o seu directorio corporativo). Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Non foi posíbel descifrar o ficheiro, probabelmente tratase dun ficheiro compartido. Pidalle ao propietario do ficheiro que volva compartir o ficheiro con vostede.",
"Unknown error please check your system settings or contact your administrator" => "Produciuse un erro descoñecido. Comprobe os axustes do sistema ou póñase en contacto co administrador",
"Missing requirements." => "Non se cumpren os requisitos.",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Asegúrese de que está instalado o PHP 5.3.3 ou posterior e de o OpenSSL xunto coa extensión PHP estean activados e configurados correctamente. Polo de agora foi desactivado o aplicativo de cifrado.",
"Following users are not set up for encryption:" => "Os seguintes usuarios non teñen configuración para o cifrado:",

View file

@ -8,7 +8,10 @@ $TRANSLATIONS = array(
"Could not change the password. Maybe the old password was not correct." => "Impossibile cambiare la password. Forse la vecchia password non era corretta.",
"Private key password successfully updated." => "Password della chiave privata aggiornata correttamente.",
"Could not update the private key password. Maybe the old password was not correct." => "Impossibile aggiornare la password della chiave privata. Forse la vecchia password non era corretta.",
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Applicazione di cifratura non inizializzata. Forse l'applicazione è stata riabilitata durante la tua sessione. Prova a disconnetterti e ad effettuare nuovamente l'accesso per inizializzarla.",
"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "La chiave privata non è valida! Forse la password è stata cambiata esternamente al sistema di ownCloud (ad es. la directory aziendale). Puoi aggiornare la password della chiave privata nelle impostazioni personali per ottenere nuovamente l'accesso ai file.",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Impossibile decifrare questo file, probabilmente è un file condiviso. Chiedi al proprietario del file di condividere nuovamente il file con te.",
"Unknown error please check your system settings or contact your administrator" => "Errore sconosciuto, controlla le impostazioni di sistema o contatta il tuo amministratore",
"Missing requirements." => "Requisiti mancanti.",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Assicurati che sia installato PHP 5.3.3 o versioni successive e che l'estensione OpenSSL di PHP sia abilitata e configurata correttamente. Per ora, l'applicazione di cifratura è disabilitata.",
"Following users are not set up for encryption:" => "I seguenti utenti non sono configurati per la cifratura:",

View file

@ -8,20 +8,26 @@ $TRANSLATIONS = array(
"Could not change the password. Maybe the old password was not correct." => "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。",
"Private key password successfully updated." => "秘密鍵のパスワードが正常に更新されました。",
"Could not update the private key password. Maybe the old password was not correct." => "秘密鍵のパスワードを更新できませんでした。古いパスワードが正確でない場合があります。",
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "暗号化アプリが初期化されていません。暗号化アプリが接続中に再度有効かされた可能性があります。暗号化アプリを初期化する為に、1回ログアウトしてログインしなおしてください。",
"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "秘密鍵が有効ではありません。パスワードがownCloudシステムの外部(例えば、企業ディレクトリ)から変更された恐れがあります。個人設定で秘密鍵のパスワードを更新して、暗号化されたファイルを回復出来ます。",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。",
"Unknown error please check your system settings or contact your administrator" => "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。",
"Missing requirements." => "必要要件が満たされていません。",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "必ず、PHP 5.3.3もしくはそれ以上をインストールし、同時にOpenSSLのPHP拡張を有効にした上でOpenSSLも同様にインストール、適切に設定してください。現時点では暗号化アプリは無効になっています。",
"Following users are not set up for encryption:" => "以下のユーザーは、暗号化設定がされていません:",
"Saving..." => "保存中...",
"Go directly to your " => "あなたのディレクトリへ",
"personal settings" => "秘密鍵をアンロックできます",
"Encryption" => "暗号化",
"Enable recovery key (allow to recover users files in case of password loss):" => "復旧キーを有効化 (万一パスワードを亡くした場合もユーザーのファイルを回復できる):",
"Recovery key password" => "復旧キーのパスワード",
"Repeat Recovery key password" => "復旧キーのパスワードをもう一度入力",
"Enabled" => "有効",
"Disabled" => "無効",
"Change recovery key password:" => "復旧キーのパスワードを変更:",
"Old Recovery key password" => "古い復旧キーのパスワード",
"New Recovery key password" => "新しい復旧キーのパスワード",
"Repeat New Recovery key password" => "新しい復旧キーのパスワードをもう一度入力",
"Change Password" => "パスワードを変更",
"Your private key password no longer match your log-in password:" => "もはや秘密鍵はログインパスワードと一致しません:",
"Set your old private key password to your current log-in password." => "古い秘密鍵のパスワードを現在のログインパスワードに設定する。",

View file

@ -10,6 +10,8 @@ $TRANSLATIONS = array(
"Could not update the private key password. Maybe the old password was not correct." => "Kon het wachtwoord van de privésleutel niet wijzigen. Misschien was het oude wachtwoord onjuist.",
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Crypto app niet geïnitialiseerd. Misschien werd de crypto app geheractiveerd tijdens de sessie. Log uit en log daarna opnieuw in om de crypto app te initialiseren.",
"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Uw privésleutel is niet geldig! Misschien was uw wachtwoord van buitenaf gewijzigd. U kunt het wachtwoord van uw privésleutel aanpassen in uw persoonlijke instellingen om toegang tot uw versleutelde bestanden te vergaren.",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Kan dit bestand niet ontcijferen, waarschijnlijk is het een gedeeld bestand, Vraag de eigenaar om het bestand opnieuw met u te delen.",
"Unknown error please check your system settings or contact your administrator" => "Onbekende fout, Controleer uw systeeminstellingen of neem contact op met uw systeembeheerder",
"Missing requirements." => "Missende benodigdheden.",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Wees er zeker van dat PHP5.3.3 of nieuwer is geïstalleerd en dat de OpenSSL PHP extensie is ingeschakeld en correct geconfigureerd. De versleutel-app is voorlopig uitgeschakeld.",
"Following users are not set up for encryption:" => "De volgende gebruikers hebben geen configuratie voor encryptie:",

View file

@ -10,6 +10,8 @@ $TRANSLATIONS = array(
"Could not update the private key password. Maybe the old password was not correct." => "Kunde inte uppdatera lösenordet för den privata nyckeln. Kanske var det gamla lösenordet fel.",
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "Krypteringsprogrammet kunde inte initieras! Möjligen blev krypteringsprogrammet återaktiverad under din session. Försök med att logga ut och in igen för att initiera krypteringsprogrammet.",
"Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "Lösenordet för din privata nyckel är inte giltig! Troligen har ditt lösenord ändrats utanför ownCloud (t.ex. i företagets katalogtjänst). Du kan uppdatera lösenordet för den privata nyckeln under dina personliga inställningar för att återfå tillgång till dina filer.",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "Kan ej dekryptera denna fil, förmodligen är det en delad fil. Be ägaren av filen att dela den med dig.",
"Unknown error please check your system settings or contact your administrator" => "Oväntat fel, kolla dina system inställningar eller kontakta din administratör",
"Missing requirements." => "Krav som saknas",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "Kontrollera att PHP 5.3.3 eller senare är installerad och att tillägget OpenSSL PHP är aktiverad och korrekt konfigurerad. Kryptering är tillsvidare inaktiverad.",
"Following users are not set up for encryption:" => "Följande användare har inte aktiverat kryptering:",

View file

@ -69,6 +69,7 @@ class Helper {
public static function registerAppHooks() {
\OCP\Util::connectHook('OC_App', 'pre_disable', 'OCA\Encryption\Hooks', 'preDisable');
\OCP\Util::connectHook('OC_App', 'post_disable', 'OCA\Encryption\Hooks', 'postEnable');
}
/**

View file

@ -508,11 +508,18 @@ class Util {
) {
// get the size from filesystem
$fullPath = $this->view->getLocalFile($path);
$size = $this->view->filesize($path);
// fast path, else the calculation for $lastChunkNr is bogus
if ($size === 0) {
\OC_FileProxy::$enabled = $proxyStatus;
return 0;
}
// calculate last chunk nr
$lastChunkNr = floor($size / 8192);
// next highest is end of chunks, one subtracted is last one
// we have to read the last chunk, we can't just calculate it (because of padding etc)
$lastChunkNr = ceil($size/ 8192) - 1;
$lastChunkSize = $size - ($lastChunkNr * 8192);
// open stream
@ -1278,7 +1285,7 @@ class Util {
// If no record is found
if (empty($migrationStatus)) {
\OCP\Util::writeLog('Encryption library', "Could not get migration status for " . $this->userId . ", no record found", \OCP\Util::ERROR);
return false;
return self::MIGRATION_OPEN;
// If a record is found
} else {
return (int)$migrationStatus[0];

View file

@ -241,6 +241,34 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$this->view->unlink($this->userId . '/files/' . $filename);
}
/**
< * @brief Test that data that is read by the crypto stream wrapper
*/
function testGetFileSize() {
\Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1);
$filename = 'tmp-' . time();
$externalFilename = '/' . $this->userId . '/files/' . $filename;
// Test for 0 byte files
$problematicFileSizeData = "";
$cryptedFile = $this->view->file_put_contents($externalFilename, $problematicFileSizeData);
$this->assertTrue(is_int($cryptedFile));
$this->assertEquals($this->util->getFileSize($externalFilename), 0);
$decrypt = $this->view->file_get_contents($externalFilename);
$this->assertEquals($problematicFileSizeData, $decrypt);
$this->view->unlink($this->userId . '/files/' . $filename);
// Test a file with 18377 bytes as in https://github.com/owncloud/mirall/issues/1009
$problematicFileSizeData = str_pad("", 18377, "abc");
$cryptedFile = $this->view->file_put_contents($externalFilename, $problematicFileSizeData);
$this->assertTrue(is_int($cryptedFile));
$this->assertEquals($this->util->getFileSize($externalFilename), 18377);
$decrypt = $this->view->file_get_contents($externalFilename);
$this->assertEquals($problematicFileSizeData, $decrypt);
$this->view->unlink($this->userId . '/files/' . $filename);
}
/**
* @medium
*/

View file

@ -8,6 +8,7 @@ OC::$CLASSPATH['OC\Files\Cache\Shared_Permissions'] = 'files_sharing/lib/permiss
OC::$CLASSPATH['OC\Files\Cache\Shared_Updater'] = 'files_sharing/lib/updater.php';
OC::$CLASSPATH['OC\Files\Cache\Shared_Watcher'] = 'files_sharing/lib/watcher.php';
OC::$CLASSPATH['OCA\Files\Share\Api'] = 'files_sharing/lib/api.php';
OC::$CLASSPATH['OCA\Files\Share\Maintainer'] = 'files_sharing/lib/maintainer.php';
OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup');
OCP\Share::registerBackend('file', 'OC_Share_Backend_File');
OCP\Share::registerBackend('folder', 'OC_Share_Backend_Folder', 'file');
@ -17,3 +18,4 @@ OCP\Util::addScript('files_sharing', 'share');
\OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Shared_Updater', 'renameHook');
\OC_Hook::connect('OCP\Share', 'post_shared', '\OC\Files\Cache\Shared_Updater', 'shareHook');
\OC_Hook::connect('OCP\Share', 'pre_unshare', '\OC\Files\Cache\Shared_Updater', 'shareHook');
\OC_Hook::connect('OC_Appconfig', 'post_set_value', '\OCA\Files\Share\Maintainer', 'configChangeHook');

View file

@ -132,3 +132,14 @@ thead{
top: -2px;
color: #555;
}
.directLink {
margin-bottom: 20px;
}
.directLink label {
font-weight: normal;
}
.directLink input {
margin-left: 10px;
width: 300px;
}

View file

@ -67,4 +67,6 @@ $(document).ready(function() {
procesSelection();
});
$('#directLink').focus();
});

View file

@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
"This share is password-protected" => "Esta partilha está protegida por palavra-chave",
"The password is wrong. Try again." => "Password errada, por favor tente de novo",
"Password" => "Password",
"Sorry, this link doesnt seem to work anymore." => "Desculpe, mas este link parece não estar a funcionar.",

View file

@ -0,0 +1,8 @@
<?php
$TRANSLATIONS = array(
"Password" => "Пароль",
"Download" => "Загрузка",
"Upload" => "Загрузка",
"Cancel upload" => "Отмена загрузки"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";

View file

@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
"This share is password-protected" => "Den här delningen är lösenordsskyddad",
"The password is wrong. Try again." => "Lösenordet är fel. Försök igen.",
"Password" => "Lösenord",
"Sorry, this link doesnt seem to work anymore." => "Tyvärr, denna länk verkar inte fungera längre.",

View file

@ -36,10 +36,17 @@ class Api {
$params['itemSource'] = self::getFileId($_GET['path']);
$params['path'] = $_GET['path'];
$params['itemType'] = self::getItemType($_GET['path']);
if (isset($_GET['subfiles']) && $_GET['subfiles'] === 'true') {
if ( isset($_GET['reshares']) && $_GET['reshares'] !== 'false' ) {
$params['reshares'] = true;
} else {
$params['reshares'] = false;
}
if (isset($_GET['subfiles']) && $_GET['subfiles'] !== 'false') {
return self::getSharesFromFolder($params);
}
return self::getShare($params);
return self::collectShares($params);
}
$share = \OCP\Share::getItemShared('file', null);
@ -59,34 +66,49 @@ class Api {
* @return \OC_OCS_Result share information
*/
public static function getShare($params) {
// either the $params already contains a itemSource if we come from
// getAllShare() or we need to translate the shareID to a itemSource
if(isset($params['itemSource'])) {
$itemSource = $params['itemSource'];
$itemType = $params['itemType'];
$getSpecificShare = true;
} else {
$s = self::getShareFromId($params['id']);
$itemSource = $s['item_source'];
$itemType = $s['item_type'];
$getSpecificShare = false;
}
$s = self::getShareFromId($params['id']);
$params['itemSource'] = $s['item_source'];
$params['itemType'] = $s['item_type'];
$params['specificShare'] = true;
return self::collectShares($params);
}
/**
* @brief collect all share information, either of a specific share or all
* shares for a given path
* @param array $params
* @return \OC_OCS_Result
*/
private static function collectShares($params) {
$itemSource = $params['itemSource'];
$itemType = $params['itemType'];
$getSpecificShare = isset($params['specificShare']) ? $params['specificShare'] : false;
if ($itemSource !== null) {
$shares = \OCP\Share::getItemShared($itemType, $itemSource);
$reshare = \OCP\Share::getItemSharedWithBySource($itemType, $itemSource);
$receivedFrom = \OCP\Share::getItemSharedWithBySource($itemType, $itemSource);
// if a specific share was specified only return this one
if ($getSpecificShare === false) {
if ($getSpecificShare === true) {
foreach ($shares as $share) {
if ($share['id'] === (int)$params['id']) {
if ($share['id'] === (int) $params['id']) {
$shares = array('element' => $share);
break;
}
}
}
if ($reshare) {
$shares['received_from'] = $reshare['uid_owner'];
$shares['received_from_displayname'] = \OCP\User::getDisplayName($reshare['uid_owner']);
// include also reshares in the lists. This means that the result
// will contain every user with access to the file.
if (isset($params['reshares']) && $params['reshares'] === true) {
$shares = self::addReshares($shares, $itemSource);
}
if ($receivedFrom) {
$shares['received_from'] = $receivedFrom['uid_owner'];
$shares['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
}
} else {
$shares = null;
@ -99,6 +121,37 @@ class Api {
}
}
/**
* @brief add reshares to a array of shares
* @param array $shares array of shares
* @param int $itemSource item source ID
* @return array new shares array which includes reshares
*/
private static function addReshares($shares, $itemSource) {
// if there are no shares than there are also no reshares
$firstShare = reset($shares);
if ($firstShare) {
$path = $firstShare['path'];
} else {
return $shares;
}
$select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `file_source`, `path` , `permissions`, `stime`, `expiration`, `token`, `storage`, `mail_send`, `mail_send`';
$getReshares = \OC_DB::prepare('SELECT ' . $select . ' FROM `*PREFIX*share` INNER JOIN `*PREFIX*filecache` ON `file_source` = `*PREFIX*filecache`.`fileid` WHERE `*PREFIX*share`.`file_source` = ? AND `*PREFIX*share`.`item_type` IN (\'file\', \'folder\') AND `uid_owner` != ?');
$reshares = $getReshares->execute(array($itemSource, \OCP\User::getUser()))->fetchAll();
foreach ($reshares as $key => $reshare) {
if (isset($reshare['share_with']) && $reshare['share_with'] !== '') {
$reshares[$key]['share_with_displayname'] = \OCP\User::getDisplayName($reshare['share_with']);
}
// add correct path to the result
$reshares[$key]['path'] = $path;
}
return array_merge($shares, $reshares);
}
/**
* @brief get share from all files in a given folder (non-recursive)
* @param array $params contains 'path' to the folder
@ -119,10 +172,10 @@ class Api {
// workaround because folders are named 'dir' in this context
$itemType = $file['type'] === 'file' ? 'file' : 'folder';
$share = \OCP\Share::getItemShared($itemType, $file['fileid']);
$reshare = \OCP\Share::getItemSharedWithBySource($itemType, $file['fileid']);
if ($reshare) {
$share['received_from'] = $reshare['uid_owner'];
$share['received_from_displayname'] = \OCP\User::getDisplayName($reshare['uid_owner']);
$receivedFrom = \OCP\Share::getItemSharedWithBySource($itemType, $file['fileid']);
if ($receivedFrom) {
$share['received_from'] = $receivedFrom['uid_owner'];
$share['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
}
if ($share) {
$share['filename'] = $file['name'];

View file

@ -0,0 +1,44 @@
<?php
/**
* ownCloud
*
* @author Morris Jobke
* @copyright 2013 Morris Jobke morris.jobke@gmail.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCA\Files\Share;
/**
* Maintains stuff around the sharing functionality
*
* for example: on disable of "allow links" it removes all link shares
*/
class Maintainer {
/**
* Keeps track of the "allow links" config setting
* and removes all link shares if the config option is set to "no"
*
* @param array with app, key, value as named values
*/
static public function configChangeHook($params) {
if($params['app'] === 'core' && $params['key'] === 'shareapi_allow_links' && $params['value'] === 'no') {
\OCP\Share::removeAllLinkShares();
}
}
}

View file

@ -32,17 +32,19 @@ class Shared_Updater {
$uid = \OCP\User::getUser();
$uidOwner = \OC\Files\Filesystem::getOwner($target);
$info = \OC\Files\Filesystem::getFileInfo($target);
$checkedUser = array($uidOwner);
// Correct Shared folders of other users shared with
$users = \OCP\Share::getUsersItemShared('file', $info['fileid'], $uidOwner, true);
if (!empty($users)) {
while (!empty($users)) {
$reshareUsers = array();
foreach ($users as $user) {
if ( $user !== $uidOwner ) {
if ( !in_array($user, $checkedUser) ) {
$etag = \OC\Files\Filesystem::getETag('');
\OCP\Config::setUserValue($user, 'files_sharing', 'etag', $etag);
// Look for reshares
$reshareUsers = array_merge($reshareUsers, \OCP\Share::getUsersItemShared('file', $info['fileid'], $user, true));
$checkedUser[] = $user;
}
}
$users = $reshareUsers;

View file

@ -234,8 +234,9 @@ if (isset($path)) {
$folder->assign('allowZipDownload', intval(OCP\Config::getSystemValue('allowZipDownload', true)));
$folder->assign('usedSpacePercent', 0);
$tmpl->assign('folder', $folder->fetchPage());
$maxInputFileSize = OCP\Config::getSystemValue('maxZipInputSize', OCP\Util::computerFileSize('800 MB'));
$allowZip = OCP\Config::getSystemValue('allowZipDownload', true)
&& $totalSize <= OCP\Config::getSystemValue('maxZipInputSize', OCP\Util::computerFileSize('800 MB'));
&& ( $maxInputFileSize === 0 || $totalSize <= $maxInputFileSize);
$tmpl->assign('allowZipDownload', intval($allowZip));
$tmpl->assign('downloadURL',
OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download&path=' . urlencode($getPath));

View file

@ -15,10 +15,10 @@
<div class="header-right">
<?php if (isset($_['folder'])): ?>
<span id="details"><?php p($l->t('%s shared the folder %s with you',
array($_['displayName'], $_['fileTarget']))) ?></span>
array($_['displayName'], $_['filename']))) ?></span>
<?php else: ?>
<span id="details"><?php p($l->t('%s shared the file %s with you',
array($_['displayName'], $_['fileTarget']))) ?></span>
array($_['displayName'], $_['filename']))) ?></span>
<?php endif; ?>
@ -88,13 +88,14 @@
<?php else: ?>
<ul id="noPreview">
<li class="error">
<?php p($l->t('No preview available for').' '.$_['fileTarget']); ?><br />
<?php p($l->t('No preview available for').' '.$_['filename']); ?><br />
<a href="<?php p($_['downloadURL']); ?>" id="download"><img class="svg" alt="Download"
src="<?php print_unescaped(OCP\image_path("core", "actions/download.svg")); ?>"
/><?php p($l->t('Download'))?></a>
</li>
</ul>
<?php endif; ?>
<div class="directLink"><label for="directLink"><?php p($l->t('Direct link')) ?></label><input id="directLink" type="text" readonly value="<?php p($_['downloadURL']); ?>"></input></div>
<?php endif; ?>
</div>
<footer>

View file

@ -31,6 +31,7 @@ class Test_Files_Sharing_Api extends \PHPUnit_Framework_TestCase {
const TEST_FILES_SHARING_API_USER1 = "test-share-user1";
const TEST_FILES_SHARING_API_USER2 = "test-share-user2";
const TEST_FILES_SHARING_API_USER3 = "test-share-user3";
public $stateFilesEncryption;
public $filename;
@ -54,6 +55,7 @@ class Test_Files_Sharing_Api extends \PHPUnit_Framework_TestCase {
// create users
self::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1, true);
self::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, true);
self::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3, true);
}
@ -101,6 +103,7 @@ class Test_Files_Sharing_Api extends \PHPUnit_Framework_TestCase {
// cleanup users
\OC_User::deleteUser(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1);
\OC_User::deleteUser(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
\OC_User::deleteUser(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3);
}
/**
@ -197,10 +200,9 @@ class Test_Files_Sharing_Api extends \PHPUnit_Framework_TestCase {
\OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK,
null, 1);
$params = array('itemSource' => $fileInfo['fileid'],
'itemType' => 'file');
$_GET['path'] = $this->filename;
$result = Share\Api::getShare($params);
$result = Share\Api::getAllShares(array());
$this->assertTrue($result->succeeded());
@ -214,6 +216,60 @@ class Test_Files_Sharing_Api extends \PHPUnit_Framework_TestCase {
}
/**
* @medium
* @depends testCreateShare
*/
function testGetShareFromSourceWithReshares() {
$fileInfo = $this->view->getFileInfo($this->filename);
// share the file as user1 to user2
\OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
// login as user2 and reshare the file to user3
\Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
\OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3, 31);
// login as user1 again
\Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1);
$_GET['path'] = $this->filename;
$result = Share\Api::getAllShares(array());
$this->assertTrue($result->succeeded());
// test should return one share
$this->assertTrue(count($result->getData()) === 1);
// now also ask for the reshares
$_GET['reshares'] = 'true';
$result = Share\Api::getAllShares(array());
$this->assertTrue($result->succeeded());
// now we should get two shares, the initial share and the reshare
$this->assertTrue(count($result->getData()) === 2);
// unshare files again
\Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
\OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3);
\Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1);
\OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
}
/**
* @medium
* @depends testCreateShare

View file

@ -0,0 +1,5 @@
<?php
$TRANSLATIONS = array(
"Error" => "Ошибка"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";

View file

@ -1,5 +1,12 @@
$(document).ready(function(){
if ($('#isPublic').val()){
// no versions actions in public mode
// beware of https://github.com/owncloud/core/issues/4545
// as enabling this might hang Chrome
return;
}
if (typeof FileActions !== 'undefined') {
// Add versions button to 'files/index.php'
FileActions.register(

View file

@ -0,0 +1,96 @@
<?php
/**
* ownCloud - user_ldap
*
* @author Arthur Schiwon
* @copyright 2013 Arthur Schiwon blizzz@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
// Check user and app status
OCP\JSON::checkAdminUser();
OCP\JSON::checkAppEnabled('user_ldap');
OCP\JSON::callCheck();
$l=OC_L10N::get('user_ldap');
if(!isset($_POST['action'])) {
\OCP\JSON::error(array('message' => $l->t('No action specified')));
}
$action = $_POST['action'];
if(!isset($_POST['ldap_serverconfig_chooser'])) {
\OCP\JSON::error(array('message' => $l->t('No configuration specified')));
}
$prefix = $_POST['ldap_serverconfig_chooser'];
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
$configuration = new \OCA\user_ldap\lib\Configuration($prefix);
$wizard = new \OCA\user_ldap\lib\Wizard($configuration, $ldapWrapper);
switch($action) {
case 'guessPortAndTLS':
case 'guessBaseDN':
case 'determineGroupMemberAssoc':
case 'determineUserObjectClasses':
case 'determineGroupObjectClasses':
case 'determineGroupsForUsers':
case 'determineGroupsForGroups':
case 'determineAttributes':
case 'getUserListFilter':
case 'getUserLoginFilter':
case 'getGroupFilter':
case 'countUsers':
case 'countGroups':
try {
$result = $wizard->$action();
if($result !== false) {
OCP\JSON::success($result->getResultArray());
exit;
}
} catch (\Exception $e) {
\OCP\JSON::error(array('message' => $e->getMessage()));
exit;
}
\OCP\JSON::error();
exit;
break;
case 'save':
$key = isset($_POST['cfgkey']) ? $_POST['cfgkey'] : false;
$val = isset($_POST['cfgval']) ? $_POST['cfgval'] : null;
if($key === false || is_null($val)) {
\OCP\JSON::error(array('message' => $l->t('No data specified')));
exit;
}
$cfg = array($key => $val);
$setParameters = array();
$configuration->setConfiguration($cfg, $setParameters);
if(!in_array($key, $setParameters)) {
\OCP\JSON::error(array('message' => $l->t($key.
' Could not set configuration %s', $setParameters[0])));
exit;
}
$configuration->saveConfiguration();
OCP\JSON::success();
break;
default:
//TODO: return 4xx error
break;
}

View file

@ -30,7 +30,7 @@ if(count($configPrefixes) === 1) {
$ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper);
$userBackend = new OCA\user_ldap\USER_LDAP($ldapAccess);
$groupBackend = new OCA\user_ldap\GROUP_LDAP($ldapAccess);
} else {
} else if(count($configPrefixes) > 1) {
$userBackend = new OCA\user_ldap\User_Proxy($configPrefixes, $ldapWrapper);
$groupBackend = new OCA\user_ldap\Group_Proxy($configPrefixes, $ldapWrapper);
}

View file

@ -1,3 +1,85 @@
.table {
display: table;
width: 60%;
}
.tablecell {
display: table-cell !important;
white-space: nowrap;
}
.tablerow {
display: table-row;
}
.tablerow input, .tablerow textarea {
width: 100% !important;
}
.tablerow textarea {
height: 15px;
}
.invisible {
visibility: hidden;
}
.ldapSettingsTabs {
float: right !important;
}
.ldapWizardControls {
width: 60%;
text-align: right;
}
.ldapWizardInfo {
width: 100% !important;
height: 50px;
background-color: lightyellow;
border-radius: 0.5em;
padding: 0.6em 0.5em 0.4em !important;
margin-bottom: 0.3em;
}
#ldapWizard1 .hostPortCombinator {
width: 60%;
display: table;
}
#ldapWizard1 .hostPortCombinator div span {
width: 7%;
display: table-cell;
text-align: right;
}
#ldapWizard1 .host {
width: 96.5% !important;
}
.tableCellInput {
margin-left: -40%;
width: 100%;
}
.tableCellLabel {
text-align: right;
padding-right: 25%;
}
.ldapIndent {
margin-left: 50px;
}
.ldapwarning {
margin-left: 1.4em;
color: #FF3B3B;
}
.wizSpinner {
height: 15px;
}
#ldap fieldset p label {
width: 20%;
max-width: 200px;
@ -9,7 +91,7 @@
}
#ldap fieldset input, #ldap fieldset textarea {
width: 60%;
width: 60%;
display: inline-block;
}
@ -17,11 +99,9 @@
vertical-align: bottom;
}
.ldapIndent {
margin-left: 50px;
}
.ldapwarning {
margin-left: 1.4em;
color: #FF3B3B;
select[multiple=multiple] + button {
height: 28px;
padding-top: 6px !important;
min-width: 40%;
max-width: 40%;
}

View file

@ -30,6 +30,7 @@ var LdapConfiguration = {
// assign the value
$('#'+configkey).val(configvalue);
});
LdapWizard.init();
}
}
);
@ -91,6 +92,7 @@ var LdapConfiguration = {
$('#ldap_serverconfig_chooser option:selected').removeAttr('selected');
var html = '<option value="'+result.configPrefix+'" selected="selected">'+$('#ldap_serverconfig_chooser option').length+'. Server</option>';
$('#ldap_serverconfig_chooser option:last').before(html);
LdapWizard.init();
} else {
OC.dialogs.alert(
result.message,
@ -122,13 +124,546 @@ var LdapConfiguration = {
}
};
var LdapWizard = {
checkPortInfoShown: false,
saveBlacklist: {},
userFilterGroupSelectState: 'enable',
spinner: '<img class="wizSpinner" src="'+ OC.imagePath('core', 'loading.gif') +'">',
ajax: function(param, fnOnSuccess, fnOnError) {
$.post(
OC.filePath('user_ldap','ajax','wizard.php'),
param,
function(result) {
if(result.status == 'success') {
fnOnSuccess(result);
} else {
fnOnError(result);
}
}
);
},
applyChanges: function (result) {
for (id in result.changes) {
if(!$.isArray(result.changes[id])) {
//no need to blacklist multiselect
LdapWizard.saveBlacklist[id] = true;
}
if(id.indexOf('count') > 0) {
$('#'+id).text(result.changes[id]);
} else {
$('#'+id).val(result.changes[id]);
}
}
LdapWizard.functionalityCheck();
if($('#ldapSettings').tabs('option', 'active') == 0) {
LdapWizard.basicStatusCheck();
}
},
basicStatusCheck: function() {
//criterias to continue from the first tab
// - host, port, user filter, agent dn, password, base dn
host = $('#ldap_host').val();
port = $('#ldap_port').val();
agent = $('#ldap_dn').val();
pwd = $('#ldap_agent_password').val();
base = $('#ldap_base').val();
if(host && port && agent && pwd && base) {
$('.ldap_action_continue').removeAttr('disabled');
$('#ldapSettings').tabs('option', 'disabled', []);
} else {
$('.ldap_action_continue').attr('disabled', 'disabled');
$('#ldapSettings').tabs('option', 'disabled', [1, 2, 3, 4, 5]);
}
},
checkBaseDN: function() {
host = $('#ldap_host').val();
port = $('#ldap_port').val();
user = $('#ldap_dn').val();
pass = $('#ldap_agent_password').val();
if(host && port && user && pass) {
param = 'action=guessBaseDN'+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
LdapWizard.showSpinner('#ldap_base');
LdapWizard.ajax(param,
function(result) {
LdapWizard.applyChanges(result);
LdapWizard.hideSpinner('#ldap_base');
if($('#ldap_base').val()) {
$('#ldap_base').removeClass('invisible');
LdapWizard.hideInfoBox();
}
},
function (result) {
LdapWizard.hideSpinner('#ldap_base');
$('#ldap_base').removeClass('invisible');
LdapWizard.showInfoBox('Please specify a port');
}
);
}
},
checkPort: function() {
host = $('#ldap_host').val();
user = $('#ldap_dn').val();
pass = $('#ldap_agent_password').val();
if(host && user && pass) {
param = 'action=guessPortAndTLS'+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
LdapWizard.showSpinner('#ldap_port');
LdapWizard.ajax(param,
function(result) {
LdapWizard.applyChanges(result);
LdapWizard.hideSpinner('#ldap_port');
if($('#ldap_port').val()) {
LdapWizard.checkBaseDN();
$('#ldap_port').removeClass('invisible');
LdapWizard.hideInfoBox();
}
},
function (result) {
LdapWizard.hideSpinner('#ldap_port');
$('#ldap_port').removeClass('invisible');
LdapWizard.showInfoBox('Please specify the BaseDN');
}
);
}
},
composeFilter: function(type) {
if(type == 'user') {
action = 'getUserListFilter';
} else if(type == 'login') {
action = 'getUserLoginFilter';
} else if(type == 'group') {
action = 'getGroupFilter';
}
param = 'action='+action+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
LdapWizard.ajax(param,
function(result) {
LdapWizard.applyChanges(result);
if(type == 'user') {
LdapWizard.countUsers();
} else if(type == 'group') {
LdapWizard.countGroups();
LdapWizard.detectGroupMemberAssoc();
}
},
function (result) {
// error handling
}
);
},
controlBack: function() {
curTabIndex = $('#ldapSettings').tabs('option', 'active');
if(curTabIndex == 0) {
return;
}
if(curTabIndex == 1) {
$('.ldap_action_back').addClass('invisible');
}
$('#ldapSettings').tabs('option', 'active', curTabIndex - 1);
if(curTabIndex == 3) {
$('.ldap_action_continue').removeClass('invisible');
}
},
controlContinue: function() {
curTabIndex = $('#ldapSettings').tabs('option', 'active');
if(curTabIndex == 3) {
return;
}
$('#ldapSettings').tabs('option', 'active', 1 + curTabIndex);
if(curTabIndex == 2) {
//now last tab
$('.ldap_action_continue').addClass('invisible');
}
if(curTabIndex == 0) {
$('.ldap_action_back').removeClass('invisible');
}
},
_countThings: function(method) {
param = 'action='+method+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
LdapWizard.ajax(param,
function(result) {
LdapWizard.applyChanges(result);
},
function (result) {
// error handling
}
);
},
countGroups: function() {
LdapWizard._countThings('countGroups');
},
countUsers: function() {
LdapWizard._countThings('countUsers');
},
detectGroupMemberAssoc: function() {
param = 'action=determineGroupMemberAssoc'+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
LdapWizard.ajax(param,
function(result) {
//pure background story
},
function (result) {
// error handling
}
);
},
findAttributes: function() {
param = 'action=determineAttributes'+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
LdapWizard.showSpinner('#ldap_loginfilter_attributes');
LdapWizard.ajax(param,
function(result) {
$('#ldap_loginfilter_attributes').find('option').remove();
for (i in result.options['ldap_loginfilter_attributes']) {
//FIXME: move HTML into template
attr = result.options['ldap_loginfilter_attributes'][i];
$('#ldap_loginfilter_attributes').append(
"<option value='"+attr+"'>"+attr+"</option>");
}
LdapWizard.hideSpinner('#ldap_loginfilter_attributes');
LdapWizard.applyChanges(result);
$('#ldap_loginfilter_attributes').multiselect('refresh');
$('#ldap_loginfilter_attributes').multiselect('enable');
},
function (result) {
//deactivate if no attributes found
$('#ldap_loginfilter_attributes').multiselect(
{noneSelectedText : 'No attributes found'});
$('#ldap_loginfilter_attributes').multiselect('disable');
LdapWizard.hideSpinner('#ldap_loginfilter_attributes');
}
);
},
findAvailableGroups: function(multisel, type) {
if(type != 'Users' && type != 'Groups') {
return false;
}
param = 'action=determineGroupsFor'+type+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
LdapWizard.showSpinner('#'+multisel);
LdapWizard.ajax(param,
function(result) {
$('#'+multisel).find('option').remove();
for (i in result.options[multisel]) {
//FIXME: move HTML into template
objc = result.options[multisel][i];
$('#'+multisel).append("<option value='"+objc+"'>"+objc+"</option>");
}
LdapWizard.hideSpinner('#'+multisel);
LdapWizard.applyChanges(result);
$('#'+multisel).multiselect('refresh');
$('#'+multisel).multiselect('enable');
},
function (result) {
LdapWizard.hideSpinner('#'+multisel);
$('#'+multisel).multiselect('disable');
}
);
},
findObjectClasses: function(multisel, type) {
if(type != 'User' && type != 'Group') {
return false;
}
param = 'action=determine'+type+'ObjectClasses'+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
LdapWizard.showSpinner('#'+multisel);
LdapWizard.ajax(param,
function(result) {
$('#'+multisel).find('option').remove();
for (i in result.options[multisel]) {
//FIXME: move HTML into template
objc = result.options[multisel][i];
$('#'+multisel).append("<option value='"+objc+"'>"+objc+"</option>");
}
LdapWizard.hideSpinner('#'+multisel);
LdapWizard.applyChanges(result);
$('#'+multisel).multiselect('refresh');
},
function (result) {
LdapWizard.hideSpinner('#'+multisel);
//TODO: error handling
}
);
},
functionalityCheck: function() {
//criterias to enable the connection:
// - host, port, user filter, login filter
host = $('#ldap_host').val();
port = $('#ldap_port').val();
userfilter = $('#ldap_dn').val();
loginfilter = $('#ldap_agent_password').val();
//FIXME: activates a manually deactivated configuration.
if(host && port && userfilter && loginfilter) {
if($('#ldap_configuration_active').is(':checked')) {
return;
}
$('#ldap_configuration_active').prop('checked', true);
LdapWizard.save($('#ldap_configuration_active')[0]);
} else {
if($('#ldap_configuration_active').is(':checked')) {
$('#ldap_configuration_active').prop('checked', false);
LdapWizard.save($('#ldap_configuration_active')[0]);
}
}
},
hideInfoBox: function() {
if(LdapWizard.checkInfoShown) {
$('#ldapWizard1 .ldapWizardInfo').addClass('invisible');
LdapWizard.checkInfoShown = false;
}
},
hideSpinner: function(id) {
$(id+' + .wizSpinner').remove();
$(id + " + button").css('display', 'inline');
},
init: function() {
if($('#ldap_port').val()) {
$('#ldap_port').removeClass('invisible');
}
if($('#ldap_base').val()) {
$('#ldap_base').removeClass('invisible');
}
LdapWizard.basicStatusCheck();
},
initGroupFilter: function() {
LdapWizard.findObjectClasses('ldap_groupfilter_objectclass', 'Group');
LdapWizard.findAvailableGroups('ldap_groupfilter_groups', 'Groups');
LdapWizard.composeFilter('group');
LdapWizard.countGroups();
},
initLoginFilter: function() {
LdapWizard.findAttributes();
LdapWizard.composeFilter('login');
},
initMultiSelect: function(object, id, caption) {
object.multiselect({
header: false,
selectedList: 9,
noneSelectedText: caption,
click: function(event, ui) {
LdapWizard.saveMultiSelect(id,
$('#'+id).multiselect("getChecked"));
}
});
},
initUserFilter: function() {
LdapWizard.findObjectClasses('ldap_userfilter_objectclass', 'User');
LdapWizard.findAvailableGroups('ldap_userfilter_groups', 'Users');
LdapWizard.composeFilter('user');
LdapWizard.countUsers();
},
onTabChange: function(event, ui) {
if(ui.newTab[0].id === '#ldapWizard2') {
LdapWizard.initUserFilter();
} else if(ui.newTab[0].id === '#ldapWizard3') {
LdapWizard.initLoginFilter();
} else if(ui.newTab[0].id === '#ldapWizard4') {
LdapWizard.initGroupFilter();
}
},
processChanges: function(triggerObj) {
if(triggerObj.id == 'ldap_host'
|| triggerObj.id == 'ldap_port'
|| triggerObj.id == 'ldap_dn'
|| triggerObj.id == 'ldap_agent_password') {
LdapWizard.checkPort();
if($('#ldap_port').val()) {
//if Port is already set, check BaseDN
LdapWizard.checkBaseDN();
}
}
if(triggerObj.id == 'ldap_userlist_filter') {
LdapWizard.countUsers();
} else if(triggerObj.id == 'ldap_group_filter') {
LdapWizard.countGroups();
LdapWizard.detectGroupMemberAssoc();
}
if(triggerObj.id == 'ldap_loginfilter_username'
|| triggerObj.id == 'ldap_loginfilter_email') {
LdapWizard.composeFilter('login');
}
if($('#ldapSettings').tabs('option', 'active') == 0) {
LdapWizard.basicStatusCheck();
}
},
save: function(inputObj) {
if(LdapWizard.saveBlacklist.hasOwnProperty(inputObj.id)) {
delete LdapWizard.saveBlacklist[inputObj.id];
return;
}
if($(inputObj).is('input[type=checkbox]')
&& !$(inputObj).is(':checked')) {
val = 0;
} else {
val = $(inputObj).val();
}
LdapWizard._save(inputObj, val);
},
saveMultiSelect: function(originalObj, resultObj) {
values = '';
for(i = 0; i < resultObj.length; i++) {
values = values + "\n" + resultObj[i].value;
}
LdapWizard._save($('#'+originalObj)[0], $.trim(values));
if(originalObj == 'ldap_userfilter_objectclass'
|| originalObj == 'ldap_userfilter_groups') {
LdapWizard.composeFilter('user');
//when user filter is changed afterwards, login filter needs to
//be adjusted, too
LdapWizard.composeFilter('login');
} else if(originalObj == 'ldap_loginfilter_attributes') {
LdapWizard.composeFilter('login');
} else if(originalObj == 'ldap_groupfilter_objectclass'
|| originalObj == 'ldap_groupfilter_groups') {
LdapWizard.composeFilter('group');
}
},
_save: function(object, value) {
param = 'cfgkey='+object.id+
'&cfgval='+value+
'&action=save'+
'&ldap_serverconfig_chooser='+$('#ldap_serverconfig_chooser').val();
$.post(
OC.filePath('user_ldap','ajax','wizard.php'),
param,
function(result) {
if(result.status == 'success') {
LdapWizard.processChanges(object);
} else {
// alert('Oooooooooooh :(');
}
}
);
},
showInfoBox: function(text) {
$('#ldapWizard1 .ldapWizardInfo').text(t('user_ldap', text));
$('#ldapWizard1 .ldapWizardInfo').removeClass('invisible');
LdapWizard.checkInfoShown = true;
},
showSpinner: function(id) {
if($(id + ' + .wizSpinner').length == 0) {
$(LdapWizard.spinner).insertAfter($(id));
$(id + " + img + button").css('display', 'none');
}
},
toggleRawFilter: function(container, moc, mg, stateVar) {
if($(container).hasClass('invisible')) {
$(container).removeClass('invisible');
$(moc).multiselect('disable');
if($(mg).multiselect().attr('disabled') == 'disabled') {
LdapWizard[stateVar] = 'disable';
} else {
LdapWizard[stateVar] = 'enable';
}
$(mg).multiselect('disable');
} else {
$(container).addClass('invisible');
$(mg).multiselect(LdapWizard[stateVar]);
$(moc).multiselect('enable');
}
},
toggleRawGroupFilter: function() {
LdapWizard.toggleRawFilter('#rawGroupFilterContainer',
'#ldap_groupfilter_objectclass',
'#ldap_groupfilter_groups',
'groupFilterGroupSelectState'
);
},
toggleRawUserFilter: function() {
LdapWizard.toggleRawFilter('#rawUserFilterContainer',
'#ldap_userfilter_objectclass',
'#ldap_userfilter_groups',
'userFilterGroupSelectState'
);
}
};
$(document).ready(function() {
$('#ldapAdvancedAccordion').accordion({ heightStyle: 'content', animate: 'easeInOutCirc'});
$('#ldapSettings').tabs();
$('#ldapSettings').tabs({ beforeActivate: LdapWizard.onTabChange });
$('#ldap_submit').button();
$('#ldap_action_test_connection').button();
$('#ldap_action_delete_configuration').button();
LdapWizard.initMultiSelect($('#ldap_userfilter_groups'),
'ldap_userfilter_groups',
t('user_ldap', 'Select groups'));
LdapWizard.initMultiSelect($('#ldap_userfilter_objectclass'),
'ldap_userfilter_objectclass',
t('user_ldap', 'Select object classes'));
LdapWizard.initMultiSelect($('#ldap_loginfilter_attributes'),
'ldap_loginfilter_attributes',
t('user_ldap', 'Select attributes'));
LdapWizard.initMultiSelect($('#ldap_groupfilter_groups'),
'ldap_groupfilter_groups',
t('user_ldap', 'Select groups'));
LdapWizard.initMultiSelect($('#ldap_groupfilter_objectclass'),
'ldap_groupfilter_objectclass',
t('user_ldap', 'Select object classes'));
$('.lwautosave').change(function() { LdapWizard.save(this); });
$('#toggleRawUserFilter').click(LdapWizard.toggleRawUserFilter);
$('#toggleRawGroupFilter').click(LdapWizard.toggleRawGroupFilter);
LdapConfiguration.refreshConfig();
$('.ldap_action_continue').click(function(event) {
event.preventDefault();
LdapWizard.controlContinue();
});
$('.ldap_action_back').click(function(event) {
event.preventDefault();
LdapWizard.controlBack();
});
$('#ldap_action_test_connection').click(function(event){
event.preventDefault();
$.post(

View file

@ -76,6 +76,8 @@ $TRANSLATIONS = array(
"Internal Username Attribute:" => "Attributo nome utente interno:",
"Override UUID detection" => "Ignora rilevamento UUID",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "In modo predefinito, l'attributo UUID viene rilevato automaticamente. L'attributo UUID è utilizzato per identificare senza alcun dubbio gli utenti e i gruppi LDAP. Inoltre, il nome utente interno sarà creato sulla base dell'UUID, se non è specificato in precedenza. Puoi ignorare l'impostazione e fornire un attributo di tua scelta. Assicurati che l'attributo scelto possa essere ottenuto sia per gli utenti che per i gruppi e che sia univoco. Lascialo vuoto per ottenere il comportamento predefinito. Le modifiche avranno effetto solo sui nuovi utenti e gruppi LDAP associati (aggiunti).",
"UUID Attribute for Users:" => "Attributo UUID per gli utenti:",
"UUID Attribute for Groups:" => "Attributo UUID per i gruppi:",
"Username-LDAP User Mapping" => "Associazione Nome utente-Utente LDAP",
"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "I nomi utente sono utilizzati per archiviare e assegnare i (meta) dati. Per identificare con precisione e riconoscere gli utenti, ogni utente LDAP avrà un nome utente interno. Ciò richiede un'associazione tra il nome utente e l'utente LDAP. In aggiunta, il DN viene mantenuto in cache per ridurre l'interazione con LDAP, ma non è utilizzato per l'identificazione. Se il DN cambia, le modifiche saranno rilevate. Il nome utente interno è utilizzato dappertutto. La cancellazione delle associazioni lascerà tracce residue ovunque e interesserà esclusivamente la configurazione LDAP. Non cancellare mai le associazioni in un ambiente di produzione, ma solo in una fase sperimentale o di test.",
"Clear Username-LDAP User Mapping" => "Cancella associazione Nome utente-Utente LDAP",

View file

@ -0,0 +1,6 @@
<?php
$TRANSLATIONS = array(
"Error" => "Ошибка",
"Password" => "Пароль"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";

View file

@ -76,6 +76,8 @@ $TRANSLATIONS = array(
"Internal Username Attribute:" => "Atribút interného používateľského mena:",
"Override UUID detection" => "Prepísať UUID detekciu",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "V predvolenom nastavení je UUID atribút detekovaný automaticky. UUID atribút je použitý na jedinečnú identifikáciu používateľov a skupín z LDAP. Naviac je na základe UUID vytvorené tiež interné použivateľské meno, ak nie je nastavené inak. Môžete predvolené nastavenie prepísať a použiť atribút ktorý si sami zvolíte. Musíte sa ale ubezpečiť, že atribút ktorý vyberiete bude uvedený pri použivateľoch, aj pri skupinách a je jedinečný. Ponechajte prázdne pre predvolené správanie. Zmena bude mať vplyv len na novo namapovaných (pridaných) používateľov a skupiny z LDAP.",
"UUID Attribute for Users:" => "UUID atribút pre používateľov:",
"UUID Attribute for Groups:" => "UUID atribút pre skupiny:",
"Username-LDAP User Mapping" => "Mapovanie názvov LDAP používateľských mien",
"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Použivateľské mená sa používajú pre uchovávanie a priraďovanie (meta)dát. Pre správnu identifikáciu a rozpoznanie používateľov bude mať každý používateľ z LDAP interné používateľské meno. To je nevyhnutné pre namapovanie používateľských mien na používateľov v LDAP. Vytvorené používateľské meno je namapované na UUID používateľa v LDAP. Naviac je cachovaná DN pre obmedzenie interakcie s LDAP, ale nie je používaná pre identifikáciu. Ak sa DN zmení, bude to správne rozpoznané. Interné používateľské meno sa používa všade. Vyčistenie namapování vymaže zvyšky všade. Vyčistenie naviac nie je špecifické, bude mať vplyv na všetky LDAP konfigurácie! Nikdy nečistite namapovanie v produkčnom prostredí, len v testovacej alebo experimentálnej fáze.",
"Clear Username-LDAP User Mapping" => "Zrušiť mapovanie LDAP používateľských mien",

View file

@ -76,6 +76,8 @@ $TRANSLATIONS = array(
"Internal Username Attribute:" => "Internt Användarnamn Attribut:",
"Override UUID detection" => "Åsidosätt UUID detektion",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "Som standard upptäcker ownCloud automatiskt UUID-attributet. Det UUID-attributet används för att utan tvivel identifiera LDAP-användare och grupper. Dessutom kommer interna användarnamn skapas baserat på detta UUID, om inte annat anges ovan. Du kan åsidosätta inställningen och passera ett attribut som du själv väljer. Du måste se till att attributet som du väljer kan hämtas för både användare och grupper och att det är unikt. Lämna det tomt för standard beteende. Förändringar kommer endast att påverka nyligen mappade (tillagda) LDAP-användare och grupper.",
"UUID Attribute for Users:" => "UUID Attribut för Användare:",
"UUID Attribute for Groups:" => "UUID Attribut för Grupper:",
"Username-LDAP User Mapping" => "Användarnamn-LDAP User Mapping",
"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "ownCloud använder sig av användarnamn för att lagra och tilldela (meta) data. För att exakt kunna identifiera och känna igen användare, kommer varje LDAP-användare ha ett internt användarnamn. Detta kräver en mappning från ownCloud-användarnamn till LDAP-användare. Det skapade användarnamnet mappas till UUID för LDAP-användaren. Dessutom cachas DN samt minska LDAP-interaktionen, men den används inte för identifiering. Om DN förändras, kommer förändringarna hittas av ownCloud. Det interna ownCloud-namnet används överallt i ownCloud. Om du rensar/raderar mappningarna kommer att lämna referenser överallt i systemet. Men den är inte konfigurationskänslig, den påverkar alla LDAP-konfigurationer! Rensa/radera aldrig mappningarna i en produktionsmiljö. Utan gör detta endast på i testmiljö!",
"Clear Username-LDAP User Mapping" => "Rensa Användarnamn-LDAP User Mapping",

View file

@ -831,7 +831,7 @@ class Access extends LDAPUtility {
private function combineFilter($filters, $operator) {
$combinedFilter = '('.$operator;
foreach($filters as $filter) {
if($filter[0] !== '(') {
if(!empty($filter) && $filter[0] !== '(') {
$filter = '('.$filter.')';
}
$combinedFilter.=$filter;
@ -1021,7 +1021,7 @@ class Access extends LDAPUtility {
$bases = $this->sanitizeDN($bases);
foreach($bases as $base) {
$belongsToBase = true;
if(mb_strripos($dn, $base, 0, 'UTF-8') !== (mb_strlen($dn, 'UTF-8')-mb_strlen($base))) {
if(mb_strripos($dn, $base, 0, 'UTF-8') !== (mb_strlen($dn, 'UTF-8')-mb_strlen($base, 'UTF-8'))) {
$belongsToBase = false;
}
if($belongsToBase) {

View file

@ -0,0 +1,384 @@
<?php
/**
* ownCloud LDAP Connection
*
* @author Arthur Schiwon
* @copyright 2012, 2013 Arthur Schiwon blizzz@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\user_ldap\lib;
class Configuration {
protected $configPrefix = null;
protected $configRead = false;
//settings
protected $config = array(
'ldapHost' => null,
'ldapPort' => null,
'ldapBackupHost' => null,
'ldapBackupPort' => null,
'ldapBase' => null,
'ldapBaseUsers' => null,
'ldapBaseGroups' => null,
'ldapAgentName' => null,
'ldapAgentPassword' => null,
'ldapTLS' => null,
'ldapNoCase' => null,
'turnOffCertCheck' => null,
'ldapIgnoreNamingRules' => null,
'ldapUserDisplayName' => null,
'ldapUserFilterObjectclass' => null,
'ldapUserFilterGroups' => null,
'ldapUserFilter' => null,
'ldapGroupFilter' => null,
'ldapGroupFilterObjectclass' => null,
'ldapGroupFilterGroups' => null,
'ldapGroupDisplayName' => null,
'ldapGroupMemberAssocAttr' => null,
'ldapLoginFilter' => null,
'ldapLoginFilterEmail' => null,
'ldapLoginFilterUsername' => null,
'ldapLoginFilterAttributes' => null,
'ldapQuotaAttribute' => null,
'ldapQuotaDefault' => null,
'ldapEmailAttribute' => null,
'ldapCacheTTL' => null,
'ldapUuidUserAttribute' => 'auto',
'ldapUuidGroupAttribute' => 'auto',
'ldapOverrideMainServer' => false,
'ldapConfigurationActive' => false,
'ldapAttributesForUserSearch' => null,
'ldapAttributesForGroupSearch' => null,
'homeFolderNamingRule' => null,
'hasPagedResultSupport' => false,
'hasMemberOfFilterSupport' => false,
'ldapExpertUsernameAttr' => null,
'ldapExpertUUIDUserAttr' => null,
'ldapExpertUUIDGroupAttr' => null,
);
public function __construct($configPrefix, $autoread = true) {
$this->configPrefix = $configPrefix;
if($autoread) {
$this->readConfiguration();
}
}
public function __get($name) {
if(isset($this->config[$name])) {
return $this->config[$name];
}
}
public function __set($name, $value) {
$this->setConfiguration(array($name => $value));
}
public function getConfiguration() {
return $this->config;
}
/**
* @brief set LDAP configuration with values delivered by an array, not read
* from configuration. It does not save the configuration! To do so, you
* must call saveConfiguration afterwards.
* @param $config array that holds the config parameters in an associated
* array
* @param &$applied optional; array where the set fields will be given to
* @return null
*/
public function setConfiguration($config, &$applied = null) {
if(!is_array($config)) {
return false;
}
$cta = $this->getConfigTranslationArray();
foreach($config as $inputkey => $val) {
if(strpos($inputkey, '_') !== false && isset($cta[$inputkey])) {
$key = $cta[$inputkey];
} elseif(isset($this->config[$inputkey])) {
$key = $inputkey;
} else {
continue;
}
$setMethod = 'setValue';
switch($key) {
case 'homeFolderNamingRule':
if(!empty($val) && strpos($val, 'attr:') === false) {
$val = 'attr:'.$val;
}
case 'ldapBase':
case 'ldapBaseUsers':
case 'ldapBaseGroups':
case 'ldapAttributesForUserSearch':
case 'ldapAttributesForGroupSearch':
case 'ldapUserFilterObjectclass':
case 'ldapUserFilterGroups':
case 'ldapGroupFilterObjectclass':
case 'ldapGroupFilterGroups':
case 'ldapLoginFilterAttributes':
$setMethod = 'setMultiLine';
default:
$this->$setMethod($key, $val);
if(is_array($applied)) {
$applied[] = $inputkey;
}
}
}
}
public function readConfiguration() {
if(!$this->configRead && !is_null($this->configPrefix)) {
$cta = array_flip($this->getConfigTranslationArray());
foreach($this->config as $key => $val) {
if(!isset($cta[$key])) {
//some are determined
continue;
}
$dbkey = $cta[$key];
switch($key) {
case 'ldapBase':
case 'ldapBaseUsers':
case 'ldapBaseGroups':
case 'ldapAttributesForUserSearch':
case 'ldapAttributesForGroupSearch':
case 'ldapUserFilterObjectclass':
case 'ldapUserFilterGroups':
case 'ldapGroupFilterObjectclass':
case 'ldapGroupFilterGroups':
case 'ldapLoginFilterAttributes':
$readMethod = 'getMultiLine';
break;
case 'ldapIgnoreNamingRules':
$readMethod = 'getSystemValue';
$dbkey = $key;
break;
case 'ldapAgentPassword':
$readMethod = 'getPwd';
break;
case 'ldapUserDisplayName':
case 'ldapGroupDisplayName':
$readMethod = 'getLcValue';
break;
default:
$readMethod = 'getValue';
break;
}
$this->config[$key] = $this->$readMethod($dbkey);
}
$this->configRead = true;
}
}
/**
* @brief saves the current Configuration in the database
*/
public function saveConfiguration() {
$cta = array_flip($this->getConfigTranslationArray());
foreach($this->config as $key => $value) {
switch ($key) {
case 'ldapAgentPassword':
$value = base64_encode($value);
break;
case 'ldapBase':
case 'ldapBaseUsers':
case 'ldapBaseGroups':
case 'ldapAttributesForUserSearch':
case 'ldapAttributesForGroupSearch':
case 'ldapUserFilterObjectclass':
case 'ldapUserFilterGroups':
case 'ldapGroupFilterObjectclass':
case 'ldapGroupFilterGroups':
case 'ldapLoginFilterAttributes':
if(is_array($value)) {
$value = implode("\n", $value);
}
break;
//following options are not stored but detected, skip them
case 'ldapIgnoreNamingRules':
case 'hasPagedResultSupport':
case 'ldapUuidUserAttribute':
case 'ldapUuidGroupAttribute':
continue 2;
}
if(is_null($value)) {
$value = '';
}
$this->saveValue($cta[$key], $value);
}
}
protected function getMultiLine($varname) {
$value = $this->getValue($varname);
if(empty($value)) {
$value = '';
} else {
$value = preg_split('/\r\n|\r|\n/', $value);
}
return $value;
}
protected function setMultiLine($varname, $value) {
if(empty($value)) {
$value = '';
} else {
$value = preg_split('/\r\n|\r|\n/', $value);
if($value === false) {
$value = '';
}
}
$this->setValue($varname, $value);
}
protected function getPwd($varname) {
return base64_decode($this->getValue($varname));
}
protected function getLcValue($varname) {
return mb_strtolower($this->getValue($varname), 'UTF-8');
}
protected function getSystemValue($varname) {
//FIXME: if another system value is added, softcode the default value
return \OCP\Config::getSystemValue($varname, false);
}
protected function getValue($varname) {
static $defaults;
if(is_null($defaults)) {
$defaults = $this->getDefaults();
}
return \OCP\Config::getAppValue('user_ldap',
$this->configPrefix.$varname,
$defaults[$varname]);
}
protected function setValue($varname, $value) {
$this->config[$varname] = $value;
}
protected function saveValue($varname, $value) {
return \OCP\Config::setAppValue('user_ldap',
$this->configPrefix.$varname,
$value);
}
/**
* @returns an associative array with the default values. Keys are correspond
* to config-value entries in the database table
*/
public function getDefaults() {
return array(
'ldap_host' => '',
'ldap_port' => '',
'ldap_backup_host' => '',
'ldap_backup_port' => '',
'ldap_override_main_server' => '',
'ldap_dn' => '',
'ldap_agent_password' => '',
'ldap_base' => '',
'ldap_base_users' => '',
'ldap_base_groups' => '',
'ldap_userlist_filter' => '',
'ldap_userfilter_objectclass' => '',
'ldap_userfilter_groups' => '',
'ldap_login_filter' => 'uid=%uid',
'ldap_loginfilter_email' => 0,
'ldap_loginfilter_username' => 1,
'ldap_loginfilter_attributes' => '',
'ldap_group_filter' => '',
'ldap_groupfilter_objectclass' => '',
'ldap_groupfilter_groups' => '',
'ldap_display_name' => 'displayName',
'ldap_group_display_name' => 'cn',
'ldap_tls' => 1,
'ldap_nocase' => 0,
'ldap_quota_def' => '',
'ldap_quota_attr' => '',
'ldap_email_attr' => '',
'ldap_group_member_assoc_attribute' => 'uniqueMember',
'ldap_cache_ttl' => 600,
'ldap_uuid_user_attribute' => 'auto',
'ldap_uuid_group_attribute' => 'auto',
'home_folder_naming_rule' => '',
'ldap_turn_off_cert_check' => 0,
'ldap_configuration_active' => 0,
'ldap_attributes_for_user_search' => '',
'ldap_attributes_for_group_search' => '',
'ldap_expert_username_attr' => '',
'ldap_expert_uuid_user_attr' => '',
'ldap_expert_uuid_group_attr' => '',
'has_memberof_filter_support' => 0,
);
}
/**
* @return returns an array that maps internal variable names to database fields
*/
public function getConfigTranslationArray() {
//TODO: merge them into one representation
static $array = array(
'ldap_host' => 'ldapHost',
'ldap_port' => 'ldapPort',
'ldap_backup_host' => 'ldapBackupHost',
'ldap_backup_port' => 'ldapBackupPort',
'ldap_override_main_server' => 'ldapOverrideMainServer',
'ldap_dn' => 'ldapAgentName',
'ldap_agent_password' => 'ldapAgentPassword',
'ldap_base' => 'ldapBase',
'ldap_base_users' => 'ldapBaseUsers',
'ldap_base_groups' => 'ldapBaseGroups',
'ldap_userfilter_objectclass' => 'ldapUserFilterObjectclass',
'ldap_userfilter_groups' => 'ldapUserFilterGroups',
'ldap_userlist_filter' => 'ldapUserFilter',
'ldap_login_filter' => 'ldapLoginFilter',
'ldap_loginfilter_email' => 'ldapLoginFilterEmail',
'ldap_loginfilter_username' => 'ldapLoginFilterUsername',
'ldap_loginfilter_attributes' => 'ldapLoginFilterAttributes',
'ldap_group_filter' => 'ldapGroupFilter',
'ldap_groupfilter_objectclass' => 'ldapGroupFilterObjectclass',
'ldap_groupfilter_groups' => 'ldapGroupFilterGroups',
'ldap_display_name' => 'ldapUserDisplayName',
'ldap_group_display_name' => 'ldapGroupDisplayName',
'ldap_tls' => 'ldapTLS',
'ldap_nocase' => 'ldapNoCase',
'ldap_quota_def' => 'ldapQuotaDefault',
'ldap_quota_attr' => 'ldapQuotaAttribute',
'ldap_email_attr' => 'ldapEmailAttribute',
'ldap_group_member_assoc_attribute' => 'ldapGroupMemberAssocAttr',
'ldap_cache_ttl' => 'ldapCacheTTL',
'home_folder_naming_rule' => 'homeFolderNamingRule',
'ldap_turn_off_cert_check' => 'turnOffCertCheck',
'ldap_configuration_active' => 'ldapConfigurationActive',
'ldap_attributes_for_user_search' => 'ldapAttributesForUserSearch',
'ldap_attributes_for_group_search' => 'ldapAttributesForGroupSearch',
'ldap_expert_username_attr' => 'ldapExpertUsernameAttr',
'ldap_expert_uuid_user_attr' => 'ldapExpertUUIUserDAttr',
'ldap_expert_uuid_group_attr' => 'ldapExpertUUIDGroupAttr',
'has_memberof_filter_support' => 'hasMemberOfFilterSupport',
);
return $array;
}
}

View file

@ -1,7 +1,7 @@
<?php
/**
* ownCloud LDAP Access
* ownCloud LDAP Connection
*
* @author Arthur Schiwon
* @copyright 2012, 2013 Arthur Schiwon blizzz@owncloud.com
@ -31,48 +31,13 @@ class Connection extends LDAPUtility {
//whether connection should be kept on __destruct
private $dontDestruct = false;
private $hasPagedResultSupport = true;
//cache handler
protected $cache;
//settings
protected $config = array(
'ldapHost' => null,
'ldapPort' => null,
'ldapBackupHost' => null,
'ldapBackupPort' => null,
'ldapBase' => null,
'ldapBaseUsers' => null,
'ldapBaseGroups' => null,
'ldapAgentName' => null,
'ldapAgentPassword' => null,
'ldapTLS' => null,
'ldapNoCase' => null,
'turnOffCertCheck' => null,
'ldapIgnoreNamingRules' => null,
'ldapUserDisplayName' => null,
'ldapUserFilter' => null,
'ldapGroupFilter' => null,
'ldapGroupDisplayName' => null,
'ldapGroupMemberAssocAttr' => null,
'ldapLoginFilter' => null,
'ldapQuotaAttribute' => null,
'ldapQuotaDefault' => null,
'ldapEmailAttribute' => null,
'ldapCacheTTL' => null,
'ldapUuidUserAttribute' => 'auto',
'ldapUuidGroupAttribute' => 'auto',
'ldapOverrideUuidAttribute' => null,
'ldapOverrideMainServer' => false,
'ldapConfigurationActive' => false,
'ldapAttributesForUserSearch' => null,
'ldapAttributesForGroupSearch' => null,
'homeFolderNamingRule' => null,
'hasPagedResultSupport' => false,
'ldapExpertUsernameAttr' => null,
'ldapExpertUUIDUserAttr' => null,
'ldapExpertUUIDGroupAttr' => null,
);
//settings handler
protected $configuration;
/**
* @brief Constructor
@ -83,13 +48,14 @@ class Connection extends LDAPUtility {
parent::__construct($ldap);
$this->configPrefix = $configPrefix;
$this->configID = $configID;
$this->configuration = new Configuration($configPrefix);
$memcache = new \OC\Memcache\Factory();
if($memcache->isAvailable()) {
$this->cache = $memcache->create();
} else {
$this->cache = \OC_Cache::getGlobalCache();
}
$this->config['hasPagedResultSupport'] =
$this->hasPagedResultSupport =
$this->ldap->hasPagedResultSupport();
}
@ -114,23 +80,21 @@ class Connection extends LDAPUtility {
$this->readConfiguration();
}
if(isset($this->config[$name])) {
return $this->config[$name];
if($name === 'hasPagedResultSupport') {
return $this->hasPagedResultSupport;
}
return $this->configuration->$name;
}
public function __set($name, $value) {
$changed = false;
//only few options are writable
if($name === 'ldapUuidUserAttribute' || $name === 'ldapUuidGroupAttribute') {
\OCP\Util::writeLog('user_ldap', 'Set config '.$name.' to '.$value, \OCP\Util::DEBUG);
$this->config[$name] = $value;
$before = $this->configuration->$name;
$this->configuration->$name = $value;
$after = $this->configuration->$name;
if($before !== $after) {
if(!empty($this->configID)) {
\OCP\Config::setAppValue($this->configID, $this->configPrefix.$name, $value);
$this->configuration->saveConfiguration();
}
$changed = true;
}
if($changed) {
$this->validateConfiguration();
}
}
@ -174,7 +138,7 @@ class Connection extends LDAPUtility {
if(!$this->configured) {
$this->readConfiguration();
}
if(!$this->config['ldapCacheTTL']) {
if(!$this->configuration->ldapCacheTTL) {
return null;
}
if(!$this->isCached($key)) {
@ -190,7 +154,7 @@ class Connection extends LDAPUtility {
if(!$this->configured) {
$this->readConfiguration();
}
if(!$this->config['ldapCacheTTL']) {
if(!$this->configuration->ldapCacheTTL) {
return false;
}
$key = $this->getCacheKey($key);
@ -201,156 +165,32 @@ class Connection extends LDAPUtility {
if(!$this->configured) {
$this->readConfiguration();
}
if(!$this->config['ldapCacheTTL']
|| !$this->config['ldapConfigurationActive']) {
if(!$this->configuration->ldapCacheTTL
|| !$this->configuration->ldapConfigurationActive) {
return null;
}
$key = $this->getCacheKey($key);
$value = base64_encode(serialize($value));
$this->cache->set($key, $value, $this->config['ldapCacheTTL']);
$this->cache->set($key, $value, $this->configuration->ldapCacheTTL);
}
public function clearCache() {
$this->cache->clear($this->getCacheKey(null));
}
private function getValue($varname) {
static $defaults;
if(is_null($defaults)) {
$defaults = $this->getDefaults();
}
return \OCP\Config::getAppValue($this->configID,
$this->configPrefix.$varname,
$defaults[$varname]);
}
private function setValue($varname, $value) {
\OCP\Config::setAppValue($this->configID,
$this->configPrefix.$varname,
$value);
}
/**
* Special handling for reading Base Configuration
*
* @param $base the internal name of the config key
* @param $value the value stored for the base
*/
private function readBase($base, $value) {
if(empty($value)) {
$value = '';
} else {
$value = preg_split('/\r\n|\r|\n/', $value);
}
$this->config[$base] = $value;
}
/**
* Caches the general LDAP configuration.
* @brief Caches the general LDAP configuration.
* @param $force optional. true, if the re-read should be forced. defaults
* to false.
* @return null
*/
private function readConfiguration($force = false) {
if((!$this->configured || $force) && !is_null($this->configID)) {
$v = 'getValue';
$this->config['ldapHost'] = $this->$v('ldap_host');
$this->config['ldapBackupHost'] = $this->$v('ldap_backup_host');
$this->config['ldapPort'] = $this->$v('ldap_port');
$this->config['ldapBackupPort'] = $this->$v('ldap_backup_port');
$this->config['ldapOverrideMainServer']
= $this->$v('ldap_override_main_server');
$this->config['ldapAgentName'] = $this->$v('ldap_dn');
$this->config['ldapAgentPassword']
= base64_decode($this->$v('ldap_agent_password'));
$this->readBase('ldapBase', $this->$v('ldap_base'));
$this->readBase('ldapBaseUsers', $this->$v('ldap_base_users'));
$this->readBase('ldapBaseGroups', $this->$v('ldap_base_groups'));
$this->config['ldapTLS'] = $this->$v('ldap_tls');
$this->config['ldapNoCase'] = $this->$v('ldap_nocase');
$this->config['turnOffCertCheck']
= $this->$v('ldap_turn_off_cert_check');
$this->config['ldapUserDisplayName']
= mb_strtolower($this->$v('ldap_display_name'), 'UTF-8');
$this->config['ldapUserFilter']
= $this->$v('ldap_userlist_filter');
$this->config['ldapGroupFilter'] = $this->$v('ldap_group_filter');
$this->config['ldapLoginFilter'] = $this->$v('ldap_login_filter');
$this->config['ldapGroupDisplayName']
= mb_strtolower($this->$v('ldap_group_display_name'), 'UTF-8');
$this->config['ldapQuotaAttribute']
= $this->$v('ldap_quota_attr');
$this->config['ldapQuotaDefault']
= $this->$v('ldap_quota_def');
$this->config['ldapEmailAttribute']
= $this->$v('ldap_email_attr');
$this->config['ldapGroupMemberAssocAttr']
= $this->$v('ldap_group_member_assoc_attribute');
$this->config['ldapIgnoreNamingRules']
= \OCP\Config::getSystemValue('ldapIgnoreNamingRules', false);
$this->config['ldapCacheTTL'] = $this->$v('ldap_cache_ttl');
$this->config['ldapUuidUserAttribute']
= $this->$v('ldap_uuid_user_attribute');
$this->config['ldapUuidGroupAttribute']
= $this->$v('ldap_uuid_group_attribute');
$this->config['ldapOverrideUuidAttribute']
= $this->$v('ldap_override_uuid_attribute');
$this->config['homeFolderNamingRule']
= $this->$v('home_folder_naming_rule');
$this->config['ldapConfigurationActive']
= $this->$v('ldap_configuration_active');
$this->config['ldapAttributesForUserSearch']
= preg_split('/\r\n|\r|\n/', $this->$v('ldap_attributes_for_user_search'));
$this->config['ldapAttributesForGroupSearch']
= preg_split('/\r\n|\r|\n/', $this->$v('ldap_attributes_for_group_search'));
$this->config['ldapExpertUsernameAttr']
= $this->$v('ldap_expert_username_attr');
$this->config['ldapExpertUUIDUserAttr']
= $this->$v('ldap_expert_uuid_user_attr');
$this->config['ldapExpertUUIDGroupAttr']
= $this->$v('ldap_expert_uuid_group_attr');
$this->configuration->readConfiguration();
$this->configured = $this->validateConfiguration();
}
}
/**
* @return returns an array that maps internal variable names to database fields
*/
private function getConfigTranslationArray() {
static $array = array(
'ldap_host'=>'ldapHost',
'ldap_port'=>'ldapPort',
'ldap_backup_host'=>'ldapBackupHost',
'ldap_backup_port'=>'ldapBackupPort',
'ldap_override_main_server' => 'ldapOverrideMainServer',
'ldap_dn'=>'ldapAgentName',
'ldap_agent_password'=>'ldapAgentPassword',
'ldap_base'=>'ldapBase',
'ldap_base_users'=>'ldapBaseUsers',
'ldap_base_groups'=>'ldapBaseGroups',
'ldap_userlist_filter'=>'ldapUserFilter',
'ldap_login_filter'=>'ldapLoginFilter',
'ldap_group_filter'=>'ldapGroupFilter',
'ldap_display_name'=>'ldapUserDisplayName',
'ldap_group_display_name'=>'ldapGroupDisplayName',
'ldap_tls'=>'ldapTLS',
'ldap_nocase'=>'ldapNoCase',
'ldap_quota_def'=>'ldapQuotaDefault',
'ldap_quota_attr'=>'ldapQuotaAttribute',
'ldap_email_attr'=>'ldapEmailAttribute',
'ldap_group_member_assoc_attribute'=>'ldapGroupMemberAssocAttr',
'ldap_cache_ttl'=>'ldapCacheTTL',
'home_folder_naming_rule' => 'homeFolderNamingRule',
'ldap_turn_off_cert_check' => 'turnOffCertCheck',
'ldap_configuration_active' => 'ldapConfigurationActive',
'ldap_attributes_for_user_search' => 'ldapAttributesForUserSearch',
'ldap_attributes_for_group_search' => 'ldapAttributesForGroupSearch',
'ldap_expert_username_attr' => 'ldapExpertUsernameAttr',
'ldap_expert_uuid_user_attr' => 'ldapExpertUUIDUserAttr',
'ldap_expert_uuid_group_attr' => 'ldapExpertUUIDGroupAttr',
);
return $array;
}
/**
* @brief set LDAP configuration with values delivered by an array, not read from configuration
* @param $config array that holds the config parameters in an associated array
@ -358,79 +198,24 @@ class Connection extends LDAPUtility {
* @return true if config validates, false otherwise. Check with $setParameters for detailed success on single parameters
*/
public function setConfiguration($config, &$setParameters = null) {
if(!is_array($config)) {
return false;
if(is_null($setParameters)) {
$setParameters = array();
}
$params = $this->getConfigTranslationArray();
foreach($config as $parameter => $value) {
if(($parameter === 'homeFolderNamingRule'
|| (isset($params[$parameter])
&& $params[$parameter] === 'homeFolderNamingRule'))
&& !empty($value)) {
$value = 'attr:'.$value;
} else if (strpos($parameter, 'ldapBase') !== false
|| (isset($params[$parameter])
&& strpos($params[$parameter], 'ldapBase') !== false)) {
$this->readBase($params[$parameter], $value);
if(is_array($setParameters)) {
$setParameters[] = $parameter;
}
continue;
}
if(isset($this->config[$parameter])) {
$this->config[$parameter] = $value;
if(is_array($setParameters)) {
$setParameters[] = $parameter;
}
} else if(isset($params[$parameter])) {
$this->config[$params[$parameter]] = $value;
if(is_array($setParameters)) {
$setParameters[] = $params[$parameter];
}
}
$this->configuration->setConfiguration($config, $setParameters);
if(count($setParameters) > 0) {
$this->configured = $this->validateConfiguration();
}
$this->configured = $this->validateConfiguration();
return $this->configured;
}
/**
* @brief saves the current Configuration in the database
* @brief saves the current Configuration in the database and empties the
* cache
* @return null
*/
public function saveConfiguration() {
$trans = array_flip($this->getConfigTranslationArray());
foreach($this->config as $key => $value) {
\OCP\Util::writeLog('user_ldap', 'LDAP: storing key '.$key.
' value '.print_r($value, true), \OCP\Util::DEBUG);
switch ($key) {
case 'ldapAgentPassword':
$value = base64_encode($value);
break;
case 'ldapBase':
case 'ldapBaseUsers':
case 'ldapBaseGroups':
case 'ldapAttributesForUserSearch':
case 'ldapAttributesForGroupSearch':
if(is_array($value)) {
$value = implode("\n", $value);
}
break;
case 'ldapIgnoreNamingRules':
case 'ldapOverrideUuidAttribute':
case 'ldapUuidUserAttribute':
case 'ldapUuidGroupAttribute':
case 'hasPagedResultSupport':
continue 2;
}
if(is_null($value)) {
$value = '';
}
$this->setValue($trans[$key], $value);
}
$this->configuration->saveConfiguration();
$this->clearCache();
}
@ -440,26 +225,175 @@ class Connection extends LDAPUtility {
*/
public function getConfiguration() {
$this->readConfiguration();
$trans = $this->getConfigTranslationArray();
$config = array();
foreach($trans as $dbKey => $classKey) {
if($classKey === 'homeFolderNamingRule') {
if(strpos($this->config[$classKey], 'attr:') === 0) {
$config[$dbKey] = substr($this->config[$classKey], 5);
} else {
$config[$dbKey] = '';
}
continue;
} else if((strpos($classKey, 'ldapBase') !== false
|| strpos($classKey, 'ldapAttributes') !== false)
&& is_array($this->config[$classKey])) {
$config[$dbKey] = implode("\n", $this->config[$classKey]);
continue;
$config = $this->configuration->getConfiguration();
$cta = $this->configuration->getConfigTranslationArray();
$result = array();
foreach($cta as $dbkey => $configkey) {
switch($configkey) {
case 'homeFolderNamingRule':
if(strpos($config[$configkey], 'attr:') === 0) {
$result[$dbkey] = substr($config[$configkey], 5);
} else {
$result[$dbkey] = '';
}
break;
case 'ldapBase':
case 'ldapBaseUsers':
case 'ldapBaseGroups':
case 'ldapAttributesForUserSearch':
case 'ldapAttributesForGroupSearch':
if(is_array($config[$configkey])) {
$result[$dbkey] = implode("\n", $config[$configkey]);
break;
} //else follows default
default:
$result[$dbkey] = $config[$configkey];
}
}
return $result;
}
private function doSoftValidation() {
//if User or Group Base are not set, take over Base DN setting
foreach(array('ldapBaseUsers', 'ldapBaseGroups') as $keyBase) {
$val = $this->configuration->$keyBase;
if(empty($val)) {
$obj = strpos('Users', $keyBase) !== false ? 'Users' : 'Groups';
\OCP\Util::writeLog('user_ldap',
'Base tree for '.$obj.
' is empty, using Base DN',
\OCP\Util::INFO);
$this->configuration->$keyBase = $this->configuration->ldapBase;
}
$config[$dbKey] = $this->config[$classKey];
}
return $config;
$groupFilter = $this->configuration->ldapGroupFilter;
if(empty($groupFilter)) {
\OCP\Util::writeLog('user_ldap',
'No group filter is specified, LDAP group '.
'feature will not be used.',
\OCP\Util::INFO);
}
foreach(array('ldapExpertUUIDUserAttr' => 'ldapUuidUserAttribute',
'ldapExpertUUIDGroupAttr' => 'ldapUuidGroupAttribute')
as $expertSetting => $effectiveSetting) {
$uuidOverride = $this->configuration->$expertSetting;
if(!empty($uuidOverride)) {
$this->configuration->$effectiveSetting = $uuidOverride;
} else {
$uuidAttributes = array('auto', 'entryuuid', 'nsuniqueid',
'objectguid', 'guid');
if(!in_array($this->configuration->$effectiveSetting,
$uuidAttributes)
&& (!is_null($this->configID))) {
$this->configuration->$effectiveSetting = 'auto';
$this->configuration->saveConfiguration();
\OCP\Util::writeLog('user_ldap',
'Illegal value for the '.
$effectiveSetting.', '.'reset to '.
'autodetect.', \OCP\Util::INFO);
}
}
}
$backupPort = $this->configuration->ldapBackupPort;
if(empty($backupPort)) {
$this->configuration->backupPort = $this->configuration->ldapPort;
}
//make sure empty search attributes are saved as simple, empty array
$sakeys = array('ldapAttributesForUserSearch',
'ldapAttributesForGroupSearch');
foreach($sakeys as $key) {
$val = $this->configuration->$key;
if(is_array($val) && count($val) === 1 && empty($val[0])) {
$this->configuration->$key = array();
}
}
if((stripos($this->configuration->ldapHost, 'ldaps://') === 0)
&& $this->configuration->ldapTLS) {
$this->configuration->ldapTLS = false;
\OCP\Util::writeLog('user_ldap',
'LDAPS (already using secure connection) and '.
'TLS do not work together. Switched off TLS.',
\OCP\Util::INFO);
}
}
private function doCriticalValidation() {
$configurationOK = true;
$errorStr = 'Configuration Error (prefix '.
strval($this->configPrefix).'): ';
//options that shall not be empty
$options = array('ldapHost', 'ldapPort', 'ldapUserDisplayName',
'ldapGroupDisplayName', 'ldapLoginFilter');
foreach($options as $key) {
$val = $this->configuration->$key;
if(empty($val)) {
switch($key) {
case 'ldapHost':
$subj = 'LDAP Host';
break;
case 'ldapPort':
$subj = 'LDAP Port';
break;
case 'ldapUserDisplayName':
$subj = 'LDAP User Display Name';
break;
case 'ldapGroupDisplayName':
$subj = 'LDAP Group Display Name';
break;
case 'ldapLoginFilter':
$subj = 'LDAP Login Filter';
break;
default:
$subj = $key;
break;
}
$configurationOK = false;
\OCP\Util::writeLog('user_ldap',
$errorStr.'No '.$subj.' given!',
\OCP\Util::WARN);
}
}
//combinations
$agent = $this->configuration->ldapAgentName;
$pwd = $this->configuration->ldapAgentPassword;
if((empty($agent) && !empty($pwd)) || (!empty($agent) && empty($pwd))) {
\OCP\Util::writeLog('user_ldap',
$errorStr.'either no password is given for the'.
'user agent or a password is given, but not an'.
'LDAP agent.',
\OCP\Util::WARN);
$configurationOK = false;
}
$base = $this->configuration->ldapBase;
$baseUsers = $this->configuration->ldapBaseUsers;
$baseGroups = $this->configuration->ldapBaseGroups;
if(empty($base) && empty($baseUsers) && empty($baseGroups)) {
\OCP\Util::writeLog('user_ldap',
$errorStr.'Not a single Base DN given.',
\OCP\Util::WARN);
$configurationOK = false;
}
if(mb_strpos($this->configuration->ldapLoginFilter, '%uid', 0, 'UTF-8')
=== false) {
\OCP\Util::writeLog('user_ldap',
$errorStr.'login filter does not contain %uid '.
'place holder.',
\OCP\Util::WARN);
$configurationOK = false;
}
return $configurationOK;
}
/**
@ -469,162 +403,19 @@ class Connection extends LDAPUtility {
private function validateConfiguration() {
// first step: "soft" checks: settings that are not really
// necessary, but advisable. If left empty, give an info message
if(empty($this->config['ldapBaseUsers'])) {
\OCP\Util::writeLog('user_ldap', 'Base tree for Users is empty, using Base DN', \OCP\Util::INFO);
$this->config['ldapBaseUsers'] = $this->config['ldapBase'];
}
if(empty($this->config['ldapBaseGroups'])) {
\OCP\Util::writeLog('user_ldap', 'Base tree for Groups is empty, using Base DN', \OCP\Util::INFO);
$this->config['ldapBaseGroups'] = $this->config['ldapBase'];
}
if(empty($this->config['ldapGroupFilter']) && empty($this->config['ldapGroupMemberAssocAttr'])) {
\OCP\Util::writeLog('user_ldap',
'No group filter is specified, LDAP group feature will not be used.',
\OCP\Util::INFO);
}
$uuidAttributes = array(
'auto', 'entryuuid', 'nsuniqueid', 'objectguid', 'guid');
$uuidSettings = array(
'ldapUuidUserAttribute' => 'ldapExpertUUIDUserAttr',
'ldapUuidGroupAttribute' => 'ldapExpertUUIDGroupAttr');
$cta = array_flip($this->getConfigTranslationArray());
foreach($uuidSettings as $defaultKey => $overrideKey) {
if( !in_array($this->config[$defaultKey], $uuidAttributes)
&& is_null($this->config[$overrideKey])
&& !is_null($this->configID)) {
\OCP\Config::setAppValue($this->configID,
$this->configPrefix.$cta[$defaultKey],
'auto');
\OCP\Util::writeLog('user_ldap',
'Illegal value for'.$defaultKey.', reset to autodetect.',
\OCP\Util::DEBUG);
}
}
$this->doSoftValidation();
if(empty($this->config['ldapBackupPort'])) {
//force default
$this->config['ldapBackupPort'] = $this->config['ldapPort'];
}
foreach(array('ldapAttributesForUserSearch', 'ldapAttributesForGroupSearch') as $key) {
if(is_array($this->config[$key])
&& count($this->config[$key]) === 1
&& empty($this->config[$key][0])) {
$this->config[$key] = array();
}
}
if((strpos($this->config['ldapHost'], 'ldaps') === 0)
&& $this->config['ldapTLS']) {
$this->config['ldapTLS'] = false;
\OCP\Util::writeLog('user_ldap',
'LDAPS (already using secure connection) and TLS do not work together. Switched off TLS.',
\OCP\Util::INFO);
}
//second step: critical checks. If left empty or filled wrong, set as unconfigured and give a warning.
$configurationOK = true;
if(empty($this->config['ldapHost'])) {
\OCP\Util::writeLog('user_ldap', 'No LDAP host given, won`t connect.', \OCP\Util::WARN);
$configurationOK = false;
}
if(empty($this->config['ldapPort'])) {
\OCP\Util::writeLog('user_ldap', 'No LDAP Port given, won`t connect.', \OCP\Util::WARN);
$configurationOK = false;
}
if((empty($this->config['ldapAgentName']) && !empty($this->config['ldapAgentPassword']))
|| (!empty($this->config['ldapAgentName']) && empty($this->config['ldapAgentPassword']))) {
\OCP\Util::writeLog('user_ldap',
'Either no password given for the user agent or a password is given, but no LDAP agent; won`t connect.',
\OCP\Util::WARN);
$configurationOK = false;
}
//TODO: check if ldapAgentName is in DN form
if(empty($this->config['ldapBase'])
&& (empty($this->config['ldapBaseUsers'])
&& empty($this->config['ldapBaseGroups']))) {
\OCP\Util::writeLog('user_ldap', 'No Base DN given, won`t connect.', \OCP\Util::WARN);
$configurationOK = false;
}
if(empty($this->config['ldapUserDisplayName'])) {
\OCP\Util::writeLog('user_ldap',
'No user display name attribute specified, won`t connect.',
\OCP\Util::WARN);
$configurationOK = false;
}
if(empty($this->config['ldapGroupDisplayName'])) {
\OCP\Util::writeLog('user_ldap',
'No group display name attribute specified, won`t connect.',
\OCP\Util::WARN);
$configurationOK = false;
}
if(empty($this->config['ldapLoginFilter'])) {
\OCP\Util::writeLog('user_ldap', 'No login filter specified, won`t connect.', \OCP\Util::WARN);
$configurationOK = false;
}
if(mb_strpos($this->config['ldapLoginFilter'], '%uid', 0, 'UTF-8') === false) {
\OCP\Util::writeLog('user_ldap',
'Login filter does not contain %uid place holder, won`t connect.',
\OCP\Util::WARN);
\OCP\Util::writeLog('user_ldap', 'Login filter was ' . $this->config['ldapLoginFilter'], \OCP\Util::DEBUG);
$configurationOK = false;
}
if(!empty($this->config['ldapExpertUUIDUserAttr'])) {
$this->config['ldapUuidUserAttribute'] = $this->config['ldapExpertUUIDUserAttr'];
}
if(!empty($this->config['ldapExpertUUIDGroupAttr'])) {
$this->config['ldapUuidGroupAttribute'] = $this->config['ldapExpertUUIDGroupAttr'];
}
return $configurationOK;
//second step: critical checks. If left empty or filled wrong, set as
//unconfigured and give a warning.
return $this->doCriticalValidation();
}
/**
* @returns an associative array with the default values. Keys are correspond
* to config-value entries in the database table
*/
static public function getDefaults() {
return array(
'ldap_host' => '',
'ldap_port' => '389',
'ldap_backup_host' => '',
'ldap_backup_port' => '',
'ldap_override_main_server' => '',
'ldap_dn' => '',
'ldap_agent_password' => '',
'ldap_base' => '',
'ldap_base_users' => '',
'ldap_base_groups' => '',
'ldap_userlist_filter' => 'objectClass=person',
'ldap_login_filter' => 'uid=%uid',
'ldap_group_filter' => 'objectClass=posixGroup',
'ldap_display_name' => 'cn',
'ldap_group_display_name' => 'cn',
'ldap_tls' => 1,
'ldap_nocase' => 0,
'ldap_quota_def' => '',
'ldap_quota_attr' => '',
'ldap_email_attr' => '',
'ldap_group_member_assoc_attribute' => 'uniqueMember',
'ldap_cache_ttl' => 600,
'ldap_uuid_user_attribute' => 'auto',
'ldap_uuid_group_attribute' => 'auto',
'ldap_override_uuid_attribute' => 0,
'home_folder_naming_rule' => '',
'ldap_turn_off_cert_check' => 0,
'ldap_configuration_active' => 1,
'ldap_attributes_for_user_search' => '',
'ldap_attributes_for_group_search' => '',
'ldap_expert_username_attr' => '',
'ldap_expert_uuid_user_attr' => '',
'ldap_expert_uuid_group_attr' => '',
);
}
/**
* Connects and Binds to LDAP
*/
private function establishConnection() {
if(!$this->config['ldapConfigurationActive']) {
if(!$this->configuration->ldapConfigurationActive) {
return null;
}
static $phpLDAPinstalled = true;
@ -632,29 +423,36 @@ class Connection extends LDAPUtility {
return false;
}
if(!$this->configured) {
\OCP\Util::writeLog('user_ldap', 'Configuration is invalid, cannot connect', \OCP\Util::WARN);
\OCP\Util::writeLog('user_ldap',
'Configuration is invalid, cannot connect',
\OCP\Util::WARN);
return false;
}
if(!$this->ldapConnectionRes) {
if(!$this->ldap->areLDAPFunctionsAvailable()) {
$phpLDAPinstalled = false;
\OCP\Util::writeLog('user_ldap',
'function ldap_connect is not available. Make sure that the PHP ldap module is installed.',
\OCP\Util::ERROR);
'function ldap_connect is not available. Make '.
'sure that the PHP ldap module is installed.',
\OCP\Util::ERROR);
return false;
}
if($this->config['turnOffCertCheck']) {
if($this->configuration->turnOffCertCheck) {
if(putenv('LDAPTLS_REQCERT=never')) {
\OCP\Util::writeLog('user_ldap',
'Turned off SSL certificate validation successfully.',
\OCP\Util::WARN);
} else {
\OCP\Util::writeLog('user_ldap', 'Could not turn off SSL certificate validation.', \OCP\Util::WARN);
\OCP\Util::writeLog('user_ldap',
'Could not turn off SSL certificate validation.',
\OCP\Util::WARN);
}
}
if(!$this->config['ldapOverrideMainServer'] && !$this->getFromCache('overrideMainServer')) {
$this->doConnect($this->config['ldapHost'], $this->config['ldapPort']);
if(!$this->configuration->ldapOverrideMainServer
&& !$this->getFromCache('overrideMainServer')) {
$this->doConnect($this->configuration->ldapHost,
$this->configuration->ldapPort);
$bindStatus = $this->bind();
$error = $this->ldap->isResource($this->ldapConnectionRes) ?
$this->ldap->errno($this->ldapConnectionRes) : -1;
@ -665,9 +463,10 @@ class Connection extends LDAPUtility {
//if LDAP server is not reachable, try the Backup (Replica!) Server
if((!$bindStatus && ($error !== 0))
|| $this->config['ldapOverrideMainServer']
|| $this->configuration->ldapOverrideMainServer
|| $this->getFromCache('overrideMainServer')) {
$this->doConnect($this->config['ldapBackupHost'], $this->config['ldapBackupPort']);
$this->doConnect($this->configuration->ldapBackupHost,
$this->configuration->ldapBackupPort);
$bindStatus = $this->bind();
if(!$bindStatus && $error === -1) {
//when bind to backup server succeeded and failed to main server,
@ -690,7 +489,7 @@ class Connection extends LDAPUtility {
$this->ldapConnectionRes = $this->ldap->connect($host, $port);
if($this->ldap->setOption($this->ldapConnectionRes, LDAP_OPT_PROTOCOL_VERSION, 3)) {
if($this->ldap->setOption($this->ldapConnectionRes, LDAP_OPT_REFERRALS, 0)) {
if($this->config['ldapTLS']) {
if($this->configuration->ldapTLS) {
$this->ldap->startTls($this->ldapConnectionRes);
}
}
@ -702,7 +501,7 @@ class Connection extends LDAPUtility {
*/
public function bind() {
static $getConnectionResourceAttempt = false;
if(!$this->config['ldapConfigurationActive']) {
if(!$this->configuration->ldapConfigurationActive) {
return false;
}
if($getConnectionResourceAttempt) {
@ -716,8 +515,8 @@ class Connection extends LDAPUtility {
return false;
}
$ldapLogin = @$this->ldap->bind($cr,
$this->config['ldapAgentName'],
$this->config['ldapAgentPassword']);
$this->configuration->ldapAgentName,
$this->configuration->ldapAgentPassword);
if(!$ldapLogin) {
\OCP\Util::writeLog('user_ldap',
'Bind failed: ' . $this->ldap->errno($cr) . ': ' . $this->ldap->error($cr),

View file

@ -161,4 +161,25 @@ class Helper {
return true;
}
/**
* @brief extractsthe domain from a given URL
* @param $url the URL
* @return mixed, domain as string on success, false otherwise
*/
static public function getDomainFromURL($url) {
$uinfo = parse_url($url);
if(!is_array($uinfo)) {
return false;
}
$domain = false;
if(isset($uinfo['host'])) {
$domain = $uinfo['host'];
} else if(isset($uinfo['path'])) {
$domain = $uinfo['path'];
}
return $domain;
}
}

View file

@ -67,6 +67,14 @@ interface ILDAPWrapper {
*/
public function controlPagedResultResponse($link, $result, &$cookie);
/**
* @brief Count the number of entries in a search
* @param $link LDAP link resource
* @param $result LDAP result resource
* @return mixed, number of results on success, false otherwise
*/
public function countEntries($link, $result);
/**
* @brief Return the LDAP error number of the last LDAP command
* @param $link LDAP link resource
@ -97,6 +105,14 @@ interface ILDAPWrapper {
* */
public function getAttributes($link, $result);
/**
* @brief Get the DN of a result entry
* @param $link LDAP link resource
* @param $result LDAP result resource
* @return string containing the DN, false on error
*/
public function getDN($link, $result);
/**
* @brief Get all result entries
* @param $link LDAP link resource
@ -105,6 +121,14 @@ interface ILDAPWrapper {
*/
public function getEntries($link, $result);
/**
* @brief Return next result id
* @param $link LDAP link resource
* @param $result LDAP entry result resource
* @return an LDAP search result resource
* */
public function nextEntry($link, $result);
/**
* @brief Read an entry
* @param $link LDAP link resource

View file

@ -49,6 +49,10 @@ class LDAP implements ILDAPWrapper {
$isCritical, $cookie);
}
public function countEntries($link, $result) {
return $this->invokeLDAPMethod('count_entries', $link, $result);
}
public function errno($link) {
return $this->invokeLDAPMethod('errno', $link);
}
@ -65,10 +69,18 @@ class LDAP implements ILDAPWrapper {
return $this->invokeLDAPMethod('get_attributes', $link, $result);
}
public function getDN($link, $result) {
return $this->invokeLDAPMethod('get_dn', $link, $result);
}
public function getEntries($link, $result) {
return $this->invokeLDAPMethod('get_entries', $link, $result);
}
public function nextEntry($link, $result) {
return $this->invokeLDAPMethod('next_entry', $link, $result);
}
public function read($link, $baseDN, $filter, $attr) {
return $this->invokeLDAPMethod('read', $link, $baseDN, $filter, $attr);
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,58 @@
<?php
/**
* ownCloud LDAP Wizard Result
*
* @author Arthur Schiwon
* @copyright 2013 Arthur Schiwon blizzz@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\user_ldap\lib;
class WizardResult {
protected $changes = array();
protected $options = array();
protected $markedChange = false;
public function addChange($key, $value) {
$this->changes[$key] = $value;
}
public function markChange() {
$this->markedChange = true;
}
public function addOptions($key, $values) {
if(!is_array($values)) {
$values = array($values);
}
$this->options[$key] = $values;
}
public function hasChanges() {
return (count($this->changes) > 0 || $this->markedChange);
}
public function getResultArray() {
$result = array();
$result['changes'] = $this->changes;
if(count($this->options) > 0) {
$result['options'] = $this->options;
}
return $result;
}
}

View file

@ -25,19 +25,50 @@
OC_Util::checkAdminUser();
OCP\Util::addscript('user_ldap', 'settings');
OCP\Util::addstyle('user_ldap', 'settings');
OCP\Util::addScript('user_ldap', 'settings');
OCP\Util::addScript('core', 'jquery.multiselect');
OCP\Util::addStyle('user_ldap', 'settings');
OCP\Util::addStyle('core', 'jquery.multiselect');
OCP\Util::addStyle('core', 'jquery-ui-1.10.0.custom');
// fill template
$tmpl = new OCP\Template('user_ldap', 'settings');
$prefixes = \OCA\user_ldap\lib\Helper::getServerConfigurationPrefixes();
$hosts = \OCA\user_ldap\lib\Helper::getServerConfigurationHosts();
$tmpl->assign('serverConfigurationPrefixes', $prefixes);
$tmpl->assign('serverConfigurationHosts', $hosts);
$wizardHtml = '';
$toc = array();
$wControls = new OCP\Template('user_ldap', 'part.wizardcontrols');
$wControls = $wControls->fetchPage();
$sControls = new OCP\Template('user_ldap', 'part.settingcontrols');
$sControls = $sControls->fetchPage();
$wizTabs = array();
$wizTabs[] = array('tpl' => 'part.wizard-server', 'cap' => 'Server');
$wizTabs[] = array('tpl' => 'part.wizard-userfilter', 'cap' => 'User Filter');
$wizTabs[] = array('tpl' => 'part.wizard-loginfilter', 'cap' => 'Login Filter');
$wizTabs[] = array('tpl' => 'part.wizard-groupfilter', 'cap' => 'Group Filter');
for($i = 0; $i < count($wizTabs); $i++) {
$tab = new OCP\Template('user_ldap', $wizTabs[$i]['tpl']);
if($i === 0) {
$tab->assign('serverConfigurationPrefixes', $prefixes);
$tab->assign('serverConfigurationHosts', $hosts);
}
$tab->assign('wizardControls', $wControls);
$wizardHtml .= $tab->fetchPage();
$toc['#ldapWizard'.($i+1)] = $wizTabs[$i]['cap'];
}
$tmpl->assign('tabs', $wizardHtml);
$tmpl->assign('toc', $toc);
$tmpl->assign('settingControls', $sControls);
// assign default values
$defaults = \OCA\user_ldap\lib\Connection::getDefaults();
$config = new \OCA\user_ldap\lib\Configuration('', false);
$defaults = $config->getDefaults();
foreach($defaults as $key => $default) {
$tmpl->assign($key.'_default', $default);
}

View file

@ -0,0 +1,12 @@
<div class="ldapSettingControls">
<input id="ldap_submit" type="submit" value="Save" />
<button id="ldap_action_test_connection" name="ldap_action_test_connection">
<?php p($l->t('Test Configuration'));?>
</button>
<a href="<?php p($theme->getDocBaseUrl()); ?>/server/5.0/admin_manual/auth_ldap.html"
target="_blank">
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
style="height:1.75ex" />
<?php p($l->t('Help'));?>
</a>
</div>

View file

@ -0,0 +1,42 @@
<fieldset id="ldapWizard4">
<div>
<p>
<?php p($l->t('Limit the access to %s to groups meeting this criteria:', $theme->getName()));?>
</p>
<p>
<label for="ldap_groupfilter_objectclass">
<?php p($l->t('only those object classes:'));?>
</label>
<select id="ldap_groupfilter_objectclass" multiple="multiple"
name="ldap_groupfilter_objectclass">
</select>
</p>
<p>
<label for="ldap_groupfilter_groups">
<?php p($l->t('only from those groups:'));?>
</label>
<select id="ldap_groupfilter_groups" multiple="multiple"
name="ldap_groupfilter_groups">
</select>
</p>
<p>
<label><a id='toggleRawGroupFilter'> <?php p($l->t('Edit raw filter instead'));?></a></label>
</p>
<p id="rawGroupFilterContainer" class="invisible">
<input type="text" id="ldap_group_filter" name="ldap_group_filter"
class="lwautosave"
placeholder="<?php p($l->t('Raw LDAP filter'));?>"
title="<?php p($l->t('The filter specifies which LDAP groups shall have access to the %s instance.', $theme->getName()));?>"
/>
</p>
<p>
<div class="ldapWizardInfo invisible">&nbsp;</div>
</p>
<p>
<span id="ldap_group_count">0 <?php p($l->t('groups found'));?></span>
</p>
<?php print_unescaped($_['wizardControls']); ?>
</div>
</fieldset>

View file

@ -0,0 +1,37 @@
<fieldset id="ldapWizard3">
<div>
<p>
<?php p($l->t('What attribute shall be used as login name:'));?>
</p>
<p>
<label for="ldap_loginfilter_username">
<?php p($l->t('LDAP Username:'));?>
</label>
<input type="checkbox" id="ldap_loginfilter_username"
name="ldap_loginfilter_username" value="1" class="lwautosave" />
</p>
<p>
<label for="ldap_loginfilter_email">
<?php p($l->t('LDAP Email Address:'));?>
</label>
<input type="checkbox" id="ldap_loginfilter_email"
name="ldap_loginfilter_email" value="1" class="lwautosave" />
</p>
<p>
<label for="ldap_loginfilter_attributes">
<?php p($l->t('Other Attributes:'));?>
</label>
<select id="ldap_loginfilter_attributes" multiple="multiple"
name="ldap_loginfilter_attributes">
</select>
</p>
<p>
<div class="ldapWizardInfo invisible">&nbsp;</div>
</p>
<?php print_unescaped($_['wizardControls']); ?>
</div>
</fieldset>

View file

@ -0,0 +1,71 @@
<fieldset id="ldapWizard1">
<p>
<select id="ldap_serverconfig_chooser" name="ldap_serverconfig_chooser">
<?php if(count($_['serverConfigurationPrefixes']) === 0 ) {
?>
<option value="" selected>1. Server</option>');
<?php
} else {
$i = 1;
$sel = ' selected';
foreach($_['serverConfigurationPrefixes'] as $prefix) {
?>
<option value="<?php p($prefix); ?>"<?php p($sel); $sel = ''; ?>><?php p($i++); ?>. Server: <?php p($_['serverConfigurationHosts'][$prefix]); ?></option>
<?php
}
}
?>
<option value="NEW"><?php p($l->t('Add Server Configuration'));?></option>
</select>
<button id="ldap_action_delete_configuration"
name="ldap_action_delete_configuration">Delete Configuration</button>
</p>
<div class="hostPortCombinator">
<div class="tablerow">
<div class="tablecell">
<div class="table">
<input type="text" class="host tablecell lwautosave" id="ldap_host"
name="ldap_host"
placeholder="<?php p($l->t('Host'));?>"
title="<?php p($l->t('You can omit the protocol, except you require SSL. Then start with ldaps://'));?>"
/>
<span>
<input type="number" id="ldap_port" name="ldap_port"
class="invisible lwautosave"
placeholder="<?php p($l->t('Port'));?>" />
</span>
</div>
</div>
</div>
<div class="tablerow">
<input type="text" id="ldap_dn" name="ldap_dn"
class="tablecell lwautosave"
placeholder="<?php p($l->t('User DN'));?>"
title="<?php p($l->t('The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty.'));?>"
/>
</div>
<div class="tablerow">
<input type="password" id="ldap_agent_password"
class="tablecell lwautosave" name="ldap_agent_password"
placeholder="<?php p($l->t('Password'));?>"
title="<?php p($l->t('For anonymous access, leave DN and Password empty.'));?>"
/>
</div>
<div class="tablerow">
<textarea id="ldap_base" name="ldap_base"
class="tablecell invisible lwautosave"
placeholder="<?php p($l->t('One Base DN per line'));?>"
title="<?php p($l->t('You can specify Base DN for users and groups in the Advanced tab'));?>">
</textarea>
</div>
<div class="tablerow">
<div class="tablecell ldapWizardInfo invisible">&nbsp;
</div>
</div>
</div>
<?php print_unescaped($_['wizardControls']); ?>
</fieldset>

View file

@ -0,0 +1,42 @@
<fieldset id="ldapWizard2">
<div>
<p>
<?php p($l->t('Limit the access to %s to users meeting this criteria:', $theme->getName()));?>
</p>
<p>
<label for="ldap_userfilter_objectclass">
<?php p($l->t('only those object classes:'));?>
</label>
<select id="ldap_userfilter_objectclass" multiple="multiple"
name="ldap_userfilter_objectclass">
</select>
</p>
<p>
<label for="ldap_userfilter_groups">
<?php p($l->t('only from those groups:'));?>
</label>
<select id="ldap_userfilter_groups" multiple="multiple"
name="ldap_userfilter_groups">
</select>
</p>
<p>
<label><a id='toggleRawUserFilter'> <?php p($l->t('Edit raw filter instead'));?></a></label>
</p>
<p id="rawUserFilterContainer" class="invisible">
<input type="text" id="ldap_userlist_filter" name="ldap_userlist_filter"
class="lwautosave"
placeholder="<?php p($l->t('Raw LDAP filter'));?>"
title="<?php p($l->t('The filter specifies which LDAP users shall have access to the %s instance.', $theme->getName()));?>"
/>
</p>
<p>
<div class="ldapWizardInfo invisible">&nbsp;</div>
</p>
<p>
<span id="ldap_user_count">0 <?php p($l->t('users found'));?></span>
</p>
<?php print_unescaped($_['wizardControls']); ?>
</div>
</fieldset>

View file

@ -0,0 +1,15 @@
<div class="ldapWizardControls">
<button class="ldap_action_back invisible" name="ldap_action_back"
type="button">
<?php p($l->t('Back'));?>
</button>
<button class="ldap_action_continue" name="ldap_action_continue" type="button">
<?php p($l->t('Continue'));?>
</button>
<a href="<?php p($theme->getDocBaseUrl()); ?>/server/5.0/admin_manual/auth_ldap.html"
target="_blank">
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
style="height:1.75ex" />
<?php p($l->t('Help'));?>
</a>
</div>

View file

@ -1,9 +1,11 @@
<form id="ldap" action="#" method="post">
<div id="ldapSettings" class="personalblock">
<ul>
<li><a href="#ldapSettings-1">LDAP Basic</a></li>
<li><a href="#ldapSettings-2">Advanced</a></li>
<li><a href="#ldapSettings-3">Expert</a></li>
<?php foreach($_['toc'] as $id => $title) { ?>
<li id="<?php p($id); ?>"><a href="<?php p($id); ?>"><?php p($title); ?></a></li>
<?php } ?>
<li class="ldapSettingsTabs"><a href="#ldapSettings-2">Expert</a></li>
<li class="ldapSettingsTabs"><a href="#ldapSettings-1">Advanced</a></li>
</ul>
<?php if(OCP\App::isEnabled('user_webdavauth')) {
print_unescaped('<p class="ldapwarning">'.$l->t('<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them.').'</p>');
@ -12,65 +14,19 @@
print_unescaped('<p class="ldapwarning">'.$l->t('<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it.').'</p>');
}
?>
<?php print_unescaped($_['tabs']); ?>
<fieldset id="ldapSettings-1">
<p><label for="ldap_serverconfig_chooser"><?php p($l->t('Server configuration'));?></label>
<select id="ldap_serverconfig_chooser" name="ldap_serverconfig_chooser">
<?php if(count($_['serverConfigurationPrefixes']) === 0 ) {
?>
<option value="" selected>1. Server</option>');
<?php
} else {
$i = 1;
$sel = ' selected';
foreach($_['serverConfigurationPrefixes'] as $prefix) {
?>
<option value="<?php p($prefix); ?>"<?php p($sel); $sel = ''; ?>><?php p($i++); ?>. Server: <?php p($_['serverConfigurationHosts'][$prefix]); ?></option>
<?php
}
}
?>
<option value="NEW"><?php p($l->t('Add Server Configuration'));?></option>
</select>
<button id="ldap_action_delete_configuration"
name="ldap_action_delete_configuration">Delete Configuration</button>
</p>
<p><label for="ldap_host"><?php p($l->t('Host'));?></label>
<input type="text" id="ldap_host" name="ldap_host" data-default="<?php p($_['ldap_host_default']); ?>"
title="<?php p($l->t('You can omit the protocol, except you require SSL. Then start with ldaps://'));?>"></p>
<p><label for="ldap_base"><?php p($l->t('Base DN'));?></label>
<textarea id="ldap_base" name="ldap_base" placeholder="<?php p($l->t('One Base DN per line'));?>"
title="<?php p($l->t('You can specify Base DN for users and groups in the Advanced tab'));?>"
data-default="<?php p($_['ldap_base_default']); ?>" ></textarea></p>
<p><label for="ldap_dn"><?php p($l->t('User DN'));?></label>
<input type="text" id="ldap_dn" name="ldap_dn" data-default="<?php p($_['ldap_dn_default']); ?>"
title="<?php p($l->t('The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty.'));?>" /></p>
<p><label for="ldap_agent_password"><?php p($l->t('Password'));?></label>
<input type="password" id="ldap_agent_password" name="ldap_agent_password"
data-default="<?php p($_['ldap_agent_password_default']); ?>"
title="<?php p($l->t('For anonymous access, leave DN and Password empty.'));?>" /></p>
<p><label for="ldap_login_filter"><?php p($l->t('User Login Filter'));?></label>
<input type="text" id="ldap_login_filter" name="ldap_login_filter"
data-default="<?php p($_['ldap_login_filter_default']); ?>"
title="<?php p($l->t('Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: "uid=%%uid"'));?>" /></p>
<p><label for="ldap_userlist_filter"><?php p($l->t('User List Filter'));?></label>
<input type="text" id="ldap_userlist_filter" name="ldap_userlist_filter"
data-default="<?php p($_['ldap_userlist_filter_default']); ?>"
title="<?php p($l->t('Defines the filter to apply, when retrieving users (no placeholders). Example: "objectClass=person"'));?>" /></p>
<p><label for="ldap_group_filter"><?php p($l->t('Group Filter'));?></label>
<input type="text" id="ldap_group_filter" name="ldap_group_filter"
data-default="<?php p($_['ldap_group_filter_default']); ?>"
title="<?php p($l->t('Defines the filter to apply, when retrieving groups (no placeholders). Example: "objectClass=posixGroup"'));?>" /></p>
</fieldset>
<fieldset id="ldapSettings-2">
<div id="ldapAdvancedAccordion">
<h3><?php p($l->t('Connection Settings'));?></h3>
<div>
<p><label for="ldap_configuration_active"><?php p($l->t('Configuration Active'));?></label><input type="checkbox" id="ldap_configuration_active" name="ldap_configuration_active" value="1" data-default="<?php p($_['ldap_configuration_active_default']); ?>" title="<?php p($l->t('When unchecked, this configuration will be skipped.'));?>" /></p>
<p><label for="ldap_port"><?php p($l->t('Port'));?></label><input type="number" id="ldap_port" name="ldap_port" data-default="<?php p($_['ldap_port_default']); ?>" /></p>
<p><label for="ldap_login_filter"><?php p($l->t('User Login Filter'));?></label>
<input type="text" id="ldap_login_filter" name="ldap_login_filter"
data-default="<?php p($_['ldap_login_filter_default']); ?>"
title="<?php p($l->t('Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: "uid=%%uid"'));?>" /></p>
<p><label for="ldap_backup_host"><?php p($l->t('Backup (Replica) Host'));?></label><input type="text" id="ldap_backup_host" name="ldap_backup_host" data-default="<?php p($_['ldap_backup_host_default']); ?>" title="<?php p($l->t('Give an optional backup host. It must be a replica of the main LDAP/AD server.'));?>"></p>
<p><label for="ldap_backup_port"><?php p($l->t('Backup (Replica) Port'));?></label><input type="number" id="ldap_backup_port" name="ldap_backup_port" data-default="<?php p($_['ldap_backup_port_default']); ?>" /></p>
<p><label for="ldap_override_main_server"><?php p($l->t('Disable Main Server'));?></label><input type="checkbox" id="ldap_override_main_server" name="ldap_override_main_server" value="1" data-default="<?php p($_['ldap_override_main_server_default']); ?>" title="<?php p($l->t('Only connect to the replica server.'));?>" /></p>
<p><label for="ldap_tls"><?php p($l->t('Use TLS'));?></label><input type="checkbox" id="ldap_tls" name="ldap_tls" value="1" data-default="<?php p($_['ldap_tls_default']); ?>" title="<?php p($l->t('Do not use it additionally for LDAPS connections, it will fail.'));?>" /></p>
<p><label for="ldap_nocase"><?php p($l->t('Case insensitve LDAP server (Windows)'));?></label><input type="checkbox" id="ldap_nocase" name="ldap_nocase" data-default="<?php p($_['ldap_nocase_default']); ?>" value="1"<?php if (isset($_['ldap_nocase']) && ($_['ldap_nocase'])) p(' checked'); ?>></p>
<p><label for="ldap_turn_off_cert_check"><?php p($l->t('Turn off SSL certificate validation.'));?></label><input type="checkbox" id="ldap_turn_off_cert_check" name="ldap_turn_off_cert_check" title="<?php p($l->t('Not recommended, use it for testing only! If connection only works with this option, import the LDAP server\'s SSL certificate in your %s server.', $theme->getName() ));?>" data-default="<?php p($_['ldap_turn_off_cert_check_default']); ?>" value="1"><br/></p>
<p><label for="ldap_cache_ttl"><?php p($l->t('Cache Time-To-Live'));?></label><input type="number" id="ldap_cache_ttl" name="ldap_cache_ttl" title="<?php p($l->t('in seconds. A change empties the cache.'));?>" data-default="<?php p($_['ldap_cache_ttl_default']); ?>" /></p>
@ -93,8 +49,9 @@
<p><label for="home_folder_naming_rule"><?php p($l->t('User Home Folder Naming Rule'));?></label><input type="text" id="home_folder_naming_rule" name="home_folder_naming_rule" title="<?php p($l->t('Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute.'));?>" data-default="<?php p($_['home_folder_naming_rule_default']); ?>" /></p>
</div>
</div>
<?php print_unescaped($_['settingControls']); ?>
</fieldset>
<fieldset id="ldapSettings-3">
<fieldset id="ldapSettings-2">
<p><strong><?php p($l->t('Internal Username'));?></strong></p>
<p class="ldapIndent"><?php p($l->t('By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users.'));?></p>
<p class="ldapIndent"><label for="ldap_expert_username_attr"><?php p($l->t('Internal Username Attribute:'));?></label><input type="text" id="ldap_expert_username_attr" name="ldap_expert_username_attr" data-default="<?php p($_['ldap_expert_username_attr_default']); ?>" /></p>
@ -105,8 +62,8 @@
<p><strong><?php p($l->t('Username-LDAP User Mapping'));?></strong></p>
<p class="ldapIndent"><?php p($l->t('Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.'));?></p>
<p class="ldapIndent"><button id="ldap_action_clear_user_mappings" name="ldap_action_clear_user_mappings"><?php p($l->t('Clear Username-LDAP User Mapping'));?></button><br/><button id="ldap_action_clear_group_mappings" name="ldap_action_clear_group_mappings"><?php p($l->t('Clear Groupname-LDAP Group Mapping'));?></button></p>
<?php print_unescaped($_['settingControls']); ?>
</fieldset>
<input id="ldap_submit" type="submit" value="Save" /> <button id="ldap_action_test_connection" name="ldap_action_test_connection"><?php p($l->t('Test Configuration'));?></button> <a href="<?php p($theme->getDocBaseUrl()); ?>/server/5.0/admin_manual/auth_ldap.html" target="_blank"><img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>" style="height:1.75ex" /> <?php p($l->t('Help'));?></a>
</div>
</form>

View file

@ -129,6 +129,12 @@ $CONFIG = array(
/* Are we connected to the internet or are we running in a closed network? */
"has_internet_connection" => true,
/* Check if the ownCloud WebDAV server is working correctly. Can be disabled if not needed in special situations*/
"check_for_working_webdav" => true,
/* Check if .htaccess protection of data is working correctly. Can be disabled if not needed in special situations*/
"check_for_working_htaccess" => true,
/* Place to log to, can be owncloud and syslog (owncloud is log menu item in admin menu) */
"log_type" => "owncloud",

View file

@ -83,7 +83,7 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
($return) ? OC_JSON::success() : OC_JSON::error();
}
break;
case 'informRecipients':
case 'informRecipients':
$l = OC_L10N::get('core');
@ -305,8 +305,9 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
&& $uid != OC_User::getUser()) {
$shareWith[] = array(
'label' => $displayName,
'value' => array('shareType' => OCP\Share::SHARE_TYPE_USER,
'shareWith' => $uid)
'value' => array(
'shareType' => OCP\Share::SHARE_TYPE_USER,
'shareWith' => $uid)
);
$count++;
}
@ -324,7 +325,7 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
|| !is_array($_GET['itemShares'][OCP\Share::SHARE_TYPE_GROUP])
|| !in_array($group, $_GET['itemShares'][OCP\Share::SHARE_TYPE_GROUP])) {
$shareWith[] = array(
'label' => $group.' ('.$l->t('group').')',
'label' => $group,
'value' => array(
'shareType' => OCP\Share::SHARE_TYPE_GROUP,
'shareWith' => $group

View file

@ -48,3 +48,8 @@
.ie8 .oc-dialog {
border: 1px solid #888888;
}
/* IE8 doesn't support transparent background - let's emulate black with an opacity of .3 on a dark blue background*/
.ie8 fieldset .warning, .ie8 #body-login .error {
background-color: #1B314D;
}

View file

@ -58,7 +58,9 @@ button, .button,
}
input[type="hidden"] { height:0; width:0; }
input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"], textarea {
background:#f8f8f8; color:#555; cursor:text;
background: #fff;
color: #555;
cursor: text;
font-family: inherit; /* use default ownCloud font instead of default textarea monospace */
}
input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"] {
@ -72,7 +74,7 @@ input[type="number"]:hover, input[type="number"]:focus, input[type="number"]:act
input[type="email"]:hover, input[type="email"]:focus, input[type="email"]:active,
input[type="url"]:hover, input[type="url"]:focus, input[type="url"]:active,
textarea:hover, textarea:focus, textarea:active {
background-color:#fff; color:#333;
color: #333;
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1;
}
input[type="checkbox"] { margin:0; padding:0; height:auto; width:auto; }
@ -798,7 +800,8 @@ div.crumb {
background: url('../img/breadcrumb.svg') no-repeat right center;
height: 44px;
}
div.crumb a {
div.crumb a,
div.crumb span {
position: relative;
top: 12px;
padding: 14px 24px 14px 17px;

View file

@ -203,7 +203,8 @@ OC.Share={
html += '<input id="shareWith" type="text" placeholder="'+t('core', 'Share with')+'" />';
html += '<ul id="shareWithList">';
html += '</ul>';
if (link) {
var linksAllowed = $('#allowShareWithLink').val() === 'yes';
if (link && linksAllowed) {
html += '<div id="link">';
html += '<input type="checkbox" name="linkCheckbox" id="linkCheckbox" value="1" /><label for="linkCheckbox">'+t('core', 'Share with link')+'</label>';
html += '<br />';
@ -290,12 +291,14 @@ OC.Share={
})
// customize internal _renderItem function to display groups and users differently
.data("ui-autocomplete")._renderItem = function( ul, item ) {
var insert = $( "<a>" ).text( item.label );
if(item.label.length > 8 && item.label.substr(item.label.length-8) === ' (group)') {
// current label is group - wrap "strong" element
insert = insert.wrapInner('<strong>');
var insert = $( "<a>" );
var text = (item.value.shareType == 1)? item.label + ' ('+t('core', 'group')+')' : item.label;
insert.text( text );
if(item.value.shareType == 1) {
insert = insert.wrapInner('<strong></strong>');
}
return $( "<li>" )
.addClass((item.value.shareType == 1)?'group':'user')
.append( insert )
.appendTo( ul );
};
@ -322,6 +325,9 @@ OC.Share={
});
},
addShareWith:function(shareType, shareWith, shareWithDisplayName, permissions, possiblePermissions, mailSend, collection) {
if (shareType === 1) {
shareWithDisplayName = shareWithDisplayName + " (" + t('core', 'group') + ')';
}
if (!OC.Share.itemShares[shareType]) {
OC.Share.itemShares[shareType] = [];
}
@ -525,13 +531,13 @@ $(document).ready(function() {
});
$(document).on('click', '#dropdown .unshare', function() {
var li = $(this).parent();
var $li = $(this).closest('li');
var itemType = $('#dropdown').data('item-type');
var itemSource = $('#dropdown').data('item-source');
var shareType = $(li).data('share-type');
var shareWith = $(li).data('share-with');
var shareType = $li.data('share-type');
var shareWith = $li.data('share-with');
OC.Share.unshare(itemType, itemSource, shareType, shareWith, function() {
$(li).remove();
$li.remove();
var index = OC.Share.itemShares[shareType].indexOf(shareWith);
OC.Share.itemShares[shareType].splice(index, 1);
OC.Share.updateIcon(itemType, itemSource);
@ -543,8 +549,8 @@ $(document).ready(function() {
});
$(document).on('change', '#dropdown .permissions', function() {
var li = $(this).closest('li');
if ($(this).attr('name') == 'edit') {
var li = $(this).parent().parent();
var checkboxes = $('.permissions', li);
var checked = $(this).is(':checked');
// Check/uncheck Create, Update, and Delete checkboxes if Edit is checked/unck
@ -552,7 +558,6 @@ $(document).ready(function() {
$(checkboxes).filter('input[name="update"]').attr('checked', checked);
$(checkboxes).filter('input[name="delete"]').attr('checked', checked);
} else {
var li = $(this).parent().parent().parent();
var checkboxes = $('.permissions', li);
// Uncheck Edit if Create, Update, and Delete are not checked
if (!$(this).is(':checked')
@ -575,8 +580,8 @@ $(document).ready(function() {
});
OC.Share.setPermissions($('#dropdown').data('item-type'),
$('#dropdown').data('item-source'),
$(li).data('share-type'),
$(li).data('share-with'),
li.data('share-type'),
li.data('share-with'),
permissions);
});
@ -709,14 +714,14 @@ $(document).ready(function() {
var file = $('tr').filterAttr('data-id', String(itemSource)).data('file');
var email = $('#email').val();
if (email != '') {
$('#email').attr('disabled', "disabled");
$('#email').prop('disabled', true);
$('#email').val(t('core', 'Sending ...'));
$('#emailButton').attr('disabled', "disabled");
$('#emailButton').prop('disabled', true);
$.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'email', toaddress: email, link: link, itemType: itemType, itemSource: itemSource, file: file},
function(result) {
$('#email').attr('disabled', "false");
$('#emailButton').attr('disabled', "false");
$('#email').prop('disabled', false);
$('#emailButton').prop('disabled', false);
if (result && result.status == 'success') {
$('#email').css('font-weight', 'bold');
$('#email').animate({ fontWeight: 'normal' }, 2000, function() {
@ -730,7 +735,7 @@ $(document).ready(function() {
});
$(document).on('click', '#dropdown input[name=mailNotification]', function() {
var li = $(this).parent();
var $li = $(this).closest('li');
var itemType = $('#dropdown').data('item-type');
var itemSource = $('#dropdown').data('item-source');
var action = '';
@ -740,8 +745,8 @@ $(document).ready(function() {
action = 'informRecipientsDisabled';
}
var shareType = $(li).data('share-type');
var shareWith = $(li).data('share-with');
var shareType = $li.data('share-type');
var shareWith = $li.data('share-with');
$.post(OC.filePath('core', 'ajax', 'share.php'), {action: action, recipient: shareWith, shareType: shareType, itemSource: itemSource, itemType: itemType}, function(result) {
if (result.status !== 'success') {

View file

@ -96,8 +96,12 @@ $TRANSLATIONS = array(
"Email sent" => "Email envoyé",
"Warning" => "Attention",
"The object type is not specified." => "Le type d'objet n'est pas spécifié.",
"Enter new" => "Saisir un nouveau",
"Delete" => "Supprimer",
"Add" => "Ajouter",
"Edit tags" => "Modifier les balises",
"Error loading dialog template: {error}" => "Erreur de chargement du modèle de dialogue : {error}",
"No tags selected for deletion." => "Aucune balise sélectionnée pour la suppression.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." => "La mise à jour a échoué. Veuillez signaler ce problème à la <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">communauté ownCloud</a>.",
"The update was successful. Redirecting you to ownCloud now." => "La mise à jour a réussi. Vous êtes redirigé maintenant vers ownCloud.",
"%s password reset" => "Réinitialisation de votre mot de passe %s",
@ -118,6 +122,13 @@ $TRANSLATIONS = array(
"Apps" => "Applications",
"Admin" => "Administration",
"Help" => "Aide",
"Error loading tags" => "Erreur de chargement des balises.",
"Tag already exists" => "La balise existe déjà.",
"Error deleting tag(s)" => "Erreur de suppression de(s) balise(s)",
"Error tagging" => "Erreur lors de la mise en place de la balise",
"Error untagging" => "Erreur lors de la suppression de la balise",
"Error favoriting" => "Erreur lors de la mise en favori",
"Error unfavoriting" => "Erreur lors de la suppression des favoris",
"Access forbidden" => "Accès interdit",
"Cloud not found" => "Introuvable",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Bonjour,\n\nJuste pour vous signaler que %s a partagé %s avec vous.\nConsultez-le : %s\n",

View file

@ -96,6 +96,7 @@ $TRANSLATIONS = array(
"Email sent" => "Correo enviado",
"Warning" => "Aviso",
"The object type is not specified." => "Non se especificou o tipo de obxecto.",
"Enter new" => "Introduza o novo",
"Delete" => "Eliminar",
"Add" => "Engadir",
"Edit tags" => "Editar etiquetas",
@ -124,6 +125,10 @@ $TRANSLATIONS = array(
"Error loading tags" => "Produciuse un erro ao cargar as etiquetas",
"Tag already exists" => "Xa existe a etiqueta",
"Error deleting tag(s)" => "Produciuse un erro ao eliminar a(s) etiqueta(s)",
"Error tagging" => "Produciuse un erro ao etiquetar",
"Error untagging" => "Produciuse un erro ao eliminar a etiqueta",
"Error favoriting" => "Produciuse un erro ao marcar como favorito",
"Error unfavoriting" => "Produciuse un erro ao desmarcar como favorito",
"Access forbidden" => "Acceso denegado",
"Cloud not found" => "Nube non atopada",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Ola,\n\nsó facerlle saber que %s compartiu %s con vostede.\nVéxao en: %s\n\n",

View file

@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"%s shared »%s« with you" => "%s megosztotta Önnel ezt: »%s«",
"Couldn't send mail to following users: %s " => "Nem sikerült e-mailt küldeni a következő felhasználóknak: %s",
"group" => "csoport",
"Turned on maintenance mode" => "A karbantartási mód bekapcsolva",
"Turned off maintenance mode" => "A karbantartási mód kikapcsolva",
@ -34,13 +35,13 @@ $TRANSLATIONS = array(
"December" => "december",
"Settings" => "Beállítások",
"seconds ago" => "pár másodperce",
"_%n minute ago_::_%n minutes ago_" => array("",""),
"_%n hour ago_::_%n hours ago_" => array("",""),
"_%n minute ago_::_%n minutes ago_" => array("%n perccel ezelőtt","%n perccel ezelőtt"),
"_%n hour ago_::_%n hours ago_" => array("%n órával ezelőtt","%n órával ezelőtt"),
"today" => "ma",
"yesterday" => "tegnap",
"_%n day ago_::_%n days ago_" => array("",""),
"_%n day ago_::_%n days ago_" => array("%n nappal ezelőtt","%n nappal ezelőtt"),
"last month" => "múlt hónapban",
"_%n month ago_::_%n months ago_" => array("",""),
"_%n month ago_::_%n months ago_" => array("%n hónappal ezelőtt","%n hónappal ezelőtt"),
"months ago" => "több hónapja",
"last year" => "tavaly",
"years ago" => "több éve",
@ -50,7 +51,7 @@ $TRANSLATIONS = array(
"No" => "Nem",
"Ok" => "Ok",
"Error loading message template: {error}" => "Nem sikerült betölteni az üzenet sablont: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("",""),
"_{count} file conflict_::_{count} file conflicts_" => array("{count} fájl ütközik","{count} fájl ütközik"),
"One file conflict" => "Egy file ütközik",
"Which files do you want to keep?" => "Melyik file-okat akarod megtartani?",
"If you select both versions, the copied file will have a number added to its name." => "Ha kiválasztod mindazokaz a verziókat, a másolt fileok neve sorszámozva lesz.",
@ -81,6 +82,7 @@ $TRANSLATIONS = array(
"Resharing is not allowed" => "Ezt az állományt csak a tulajdonosa oszthatja meg másokkal",
"Shared in {item} with {user}" => "Megosztva {item}-ben {user}-rel",
"Unshare" => "A megosztás visszavonása",
"notify user by email" => "felhasználó értesítése e-mailben",
"can edit" => "módosíthat",
"access control" => "jogosultság",
"create" => "létrehoz",
@ -94,8 +96,12 @@ $TRANSLATIONS = array(
"Email sent" => "Az emailt elküldtük",
"Warning" => "Figyelmeztetés",
"The object type is not specified." => "Az objektum típusa nincs megadva.",
"Enter new" => "Új beírása",
"Delete" => "Törlés",
"Add" => "Hozzáadás",
"Edit tags" => "Címkék szerkesztése",
"Error loading dialog template: {error}" => "Hiba a párbeszédpanel-sablon betöltésekor: {error}",
"No tags selected for deletion." => "Nincs törlésre kijelölt címke.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." => "A frissítés nem sikerült. Kérem értesítse erről a problémáról az <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud közösséget</a>.",
"The update was successful. Redirecting you to ownCloud now." => "A frissítés sikeres volt. Visszairányítjuk az ownCloud szolgáltatáshoz.",
"%s password reset" => "%s jelszó visszaállítás",
@ -116,8 +122,18 @@ $TRANSLATIONS = array(
"Apps" => "Alkalmazások",
"Admin" => "Adminsztráció",
"Help" => "Súgó",
"Error loading tags" => "Hiba a címkék betöltésekor",
"Tag already exists" => "A címke már létezik",
"Error deleting tag(s)" => "Hiba a címkék törlésekor",
"Error tagging" => "Hiba a címkézéskor",
"Error untagging" => "Hiba a címkék eltávolításakor",
"Error favoriting" => "Hiba a kedvencekhez adáskor",
"Error unfavoriting" => "Hiba a kedvencekből törléskor",
"Access forbidden" => "A hozzáférés nem engedélyezett",
"Cloud not found" => "A felhő nem található",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Szia!\\n\n\\n\nÉrtesítünk, hogy %s megosztotta veled a következőt: %s.\\n\nItt tudod megnézni: %s\\n\n\\n",
"The share will expire on %s.\n\n" => "A megosztás ekkor jár le: %s\\n\n\\n",
"Cheers!" => "Üdv.",
"Security Warning" => "Biztonsági figyelmeztetés",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Az Ön PHP verziója sebezhető a NULL bájtos támadással szemben (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Kérjük frissítse a telepített PHP csomagjait, hogy biztonságos legyen az %s szolgáltatása.",
@ -136,15 +152,20 @@ $TRANSLATIONS = array(
"Database tablespace" => "Az adatbázis táblázattér (tablespace)",
"Database host" => "Adatbázis szerver",
"Finish setup" => "A beállítások befejezése",
"Finishing …" => "Befejezés ...",
"%s is available. Get more information on how to update." => "%s rendelkezésre áll. További információ a frissítéshez.",
"Log out" => "Kilépés",
"Automatic logon rejected!" => "Az automatikus bejelentkezés sikertelen!",
"If you did not change your password recently, your account may be compromised!" => "Ha mostanában nem módosította a jelszavát, akkor lehetséges, hogy idegenek jutottak be a rendszerbe az Ön nevében!",
"Please change your password to secure your account again." => "A biztonsága érdekében változtassa meg a jelszavát!",
"Server side authentication failed!" => "A szerveroldali hitelesítés sikertelen!",
"Please contact your administrator." => "Kérjük, lépjen kapcsolatba a rendszergazdával.",
"Lost your password?" => "Elfelejtette a jelszavát?",
"remember" => "emlékezzen",
"Log in" => "Bejelentkezés",
"Alternative Logins" => "Alternatív bejelentkezés",
"Hey there,<br><br>just letting you know that %s shared »%s« with you.<br><a href=\"%s\">View it!</a><br><br>" => "Szia!<br><br>Értesítünk, hogy %s megosztotta veled a következőt: »%s«.<br><a href=\"%s\">Ide kattintva tudod megnézni</a><br><br>",
"The share will expire on %s.<br><br>" => "A megosztás ekkor jár le: %s<br><br>",
"Updating ownCloud to version %s, this may take a while." => "Owncloud frissítés a %s verzióra folyamatban. Kis türelmet."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";

View file

@ -96,8 +96,12 @@ $TRANSLATIONS = array(
"Email sent" => "Messaggio inviato",
"Warning" => "Avviso",
"The object type is not specified." => "Il tipo di oggetto non è specificato.",
"Enter new" => "Inserisci nuovo",
"Delete" => "Elimina",
"Add" => "Aggiungi",
"Edit tags" => "Modifica etichette",
"Error loading dialog template: {error}" => "Errore durante il caricamento del modello di finestra: {error}",
"No tags selected for deletion." => "Nessuna etichetta selezionata per l'eliminazione.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." => "L'aggiornamento non è riuscito. Segnala il problema alla <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">comunità di ownCloud</a>.",
"The update was successful. Redirecting you to ownCloud now." => "L'aggiornamento è stato effettuato correttamente. Stai per essere reindirizzato a ownCloud.",
"%s password reset" => "Ripristino password di %s",
@ -118,6 +122,13 @@ $TRANSLATIONS = array(
"Apps" => "Applicazioni",
"Admin" => "Admin",
"Help" => "Aiuto",
"Error loading tags" => "Errore di caricamento delle etichette",
"Tag already exists" => "L'etichetta esiste già",
"Error deleting tag(s)" => "Errore di eliminazione delle etichette",
"Error tagging" => "Errore di assegnazione delle etichette",
"Error untagging" => "Errore di rimozione delle etichette",
"Error favoriting" => "Errore di creazione dei preferiti",
"Error unfavoriting" => "Errore di rimozione dai preferiti",
"Access forbidden" => "Accesso negato",
"Cloud not found" => "Nuvola non trovata",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Ciao,\n\nvolevo informarti che %s ha condiviso %s con te.\nVedi: %s\n\n",
@ -147,6 +158,8 @@ $TRANSLATIONS = array(
"Automatic logon rejected!" => "Accesso automatico rifiutato.",
"If you did not change your password recently, your account may be compromised!" => "Se non hai cambiato la password recentemente, il tuo account potrebbe essere compromesso.",
"Please change your password to secure your account again." => "Cambia la password per rendere nuovamente sicuro il tuo account.",
"Server side authentication failed!" => "Autenticazione lato server non riuscita!",
"Please contact your administrator." => "Contatta il tuo amministratore di sistema.",
"Lost your password?" => "Hai perso la password?",
"remember" => "ricorda",
"Log in" => "Accedi",

View file

@ -100,6 +100,7 @@ $TRANSLATIONS = array(
"Delete" => "削除",
"Add" => "追加",
"Edit tags" => "タグを編集",
"Error loading dialog template: {error}" => "メッセージテンプレートの読み込みエラー: {error}",
"No tags selected for deletion." => "削除するタグが選択されていません。",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." => "更新に成功しました。この問題を <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a> にレポートしてください。",
"The update was successful. Redirecting you to ownCloud now." => "更新に成功しました。今すぐownCloudにリダイレクトします。",
@ -126,9 +127,13 @@ $TRANSLATIONS = array(
"Error deleting tag(s)" => "タグの削除エラー",
"Error tagging" => "タグの付与エラー",
"Error untagging" => "タグの解除エラー",
"Error favoriting" => "お気に入りに追加エラー",
"Error unfavoriting" => "お気に入りから削除エラー",
"Access forbidden" => "アクセスが禁止されています",
"Cloud not found" => "見つかりません",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "こんにちは、\n\n%s があなたと %s を共有したことをお知らせします。\nそれを表示: %s\n",
"The share will expire on %s.\n\n" => "共有は %s で有効期限が切れます。\n\n",
"Cheers!" => "それでは!",
"Security Warning" => "セキュリティ警告",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "あなたのPHPのバージョンには、Null Byte攻撃(CVE-2006-7243)という脆弱性が含まれています。",
"Please update your PHP installation to use %s securely." => "%s を安全に利用する為に インストールされているPHPをアップデートしてください。",
@ -159,6 +164,7 @@ $TRANSLATIONS = array(
"remember" => "パスワードを記憶する",
"Log in" => "ログイン",
"Alternative Logins" => "代替ログイン",
"Hey there,<br><br>just letting you know that %s shared »%s« with you.<br><a href=\"%s\">View it!</a><br><br>" => "こんにちは、<br><br>%sがあなたと »%s« を共有したことをお知らせします。<br><a href=\"%s\">それを表示</a><br><br>",
"The share will expire on %s.<br><br>" => "共有は %s で有効期限が切れます。<br><br>",
"Updating ownCloud to version %s, this may take a while." => "ownCloud をバージョン %s に更新しています、しばらくお待ち下さい。"
);

View file

@ -96,8 +96,12 @@ $TRANSLATIONS = array(
"Email sent" => "E-mail verzonden",
"Warning" => "Waarschuwing",
"The object type is not specified." => "Het object type is niet gespecificeerd.",
"Enter new" => "Opgeven nieuw",
"Delete" => "Verwijder",
"Add" => "Toevoegen",
"Edit tags" => "Bewerken tags",
"Error loading dialog template: {error}" => "Fout bij laden dialoog sjabloon: {error}",
"No tags selected for deletion." => "Geen tags geselecteerd voor verwijdering.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." => "De update is niet geslaagd. Meld dit probleem aan bij de <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>.",
"The update was successful. Redirecting you to ownCloud now." => "De update is geslaagd. Je wordt teruggeleid naar je eigen ownCloud.",
"%s password reset" => "%s wachtwoord reset",
@ -118,6 +122,13 @@ $TRANSLATIONS = array(
"Apps" => "Apps",
"Admin" => "Beheerder",
"Help" => "Help",
"Error loading tags" => "Fout bij laden tags",
"Tag already exists" => "Tag bestaat al",
"Error deleting tag(s)" => "Fout bij verwijderen tag(s)",
"Error tagging" => "Fout bij taggen",
"Error untagging" => "Fout bij ont-taggen",
"Error favoriting" => "Fout bij favoriet maken",
"Error unfavoriting" => "Fout bij verwijderen favorietstatus",
"Access forbidden" => "Toegang verboden",
"Cloud not found" => "Cloud niet gevonden",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hallo daar,\n\neven een berichtje dat %s %s met u deelde.\nBekijk het: %s\n\n",

View file

@ -50,6 +50,9 @@ $TRANSLATIONS = array(
"Error loading message template: {error}" => "Erro ao carregar o template: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("",""),
"Cancel" => "Cancelar",
"Continue" => "Continuar",
"(all selected)" => "(todos seleccionados)",
"({count} selected)" => "({count} seleccionados)",
"Shared" => "Partilhado",
"Share" => "Partilhar",
"Error" => "Erro",
@ -72,6 +75,7 @@ $TRANSLATIONS = array(
"Resharing is not allowed" => "Não é permitido partilhar de novo",
"Shared in {item} with {user}" => "Partilhado em {item} com {user}",
"Unshare" => "Deixar de partilhar",
"notify user by email" => "notificar utilizador por correio electrónico",
"can edit" => "pode editar",
"access control" => "Controlo de acesso",
"create" => "criar",
@ -127,6 +131,7 @@ $TRANSLATIONS = array(
"Database tablespace" => "Tablespace da base de dados",
"Database host" => "Anfitrião da base de dados",
"Finish setup" => "Acabar instalação",
"Finishing …" => "A terminar...",
"%s is available. Get more information on how to update." => "%s está disponível. Tenha mais informações como actualizar.",
"Log out" => "Sair",
"Automatic logon rejected!" => "Login automático rejeitado!",

18
core/l10n/ru_RU.php Normal file
View file

@ -0,0 +1,18 @@
<?php
$TRANSLATIONS = array(
"Settings" => "Настройки",
"_%n minute ago_::_%n minutes ago_" => array("","",""),
"_%n hour ago_::_%n hours ago_" => array("","",""),
"_%n day ago_::_%n days ago_" => array("","",""),
"_%n month ago_::_%n months ago_" => array("","",""),
"Yes" => "Да",
"No" => "Нет",
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
"Cancel" => "Отмена",
"Share" => "Сделать общим",
"Error" => "Ошибка",
"Password" => "Пароль",
"Warning" => "Предупреждение",
"Username" => "Имя пользователя"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";

View file

@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"%s shared »%s« with you" => "%s s Vami zdieľa »%s«",
"Couldn't send mail to following users: %s " => "Nebolo možné odoslať email týmto používateľom: %s ",
"group" => "skupina",
"Turned on maintenance mode" => "Mód údržby zapnutý",
"Turned off maintenance mode" => "Mód údržby vypnutý",
@ -8,6 +9,11 @@ $TRANSLATIONS = array(
"Updating filecache, this may take really long..." => "Aktualizácia \"filecache\", toto môže trvať dlhšie...",
"Updated filecache" => "\"Filecache\" aktualizovaná",
"... %d%% done ..." => "... %d%% dokončených ...",
"No image or file provided" => "Obrázok alebo súbor nebol zadaný",
"Unknown filetype" => "Neznámy typ súboru",
"Invalid image" => "Chybný obrázok",
"No temporary profile picture available, try again" => "Dočasný profilový obrázok nie je k dispozícii, skúste to znovu",
"No crop data provided" => "Dáta pre orezanie neboli zadané",
"Sunday" => "Nedeľa",
"Monday" => "Pondelok",
"Tuesday" => "Utorok",
@ -40,11 +46,19 @@ $TRANSLATIONS = array(
"last year" => "minulý rok",
"years ago" => "pred rokmi",
"Choose" => "Výber",
"Error loading file picker template: {error}" => "Chyba pri nahrávaní šablóny výberu súborov: {error}",
"Yes" => "Áno",
"No" => "Nie",
"Ok" => "Ok",
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
"Error loading message template: {error}" => "Chyba pri nahrávaní šablóny správy: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("{count} konflikt súboru","{count} konflikty súboru","{count} konfliktov súboru"),
"One file conflict" => "Jeden konflikt súboru",
"Which files do you want to keep?" => "Ktoré súbory chcete ponechať?",
"If you select both versions, the copied file will have a number added to its name." => "Ak zvolíte obe verzie, názov nakopírovaného súboru bude doplnený o číslo.",
"Cancel" => "Zrušiť",
"Continue" => "Pokračovať",
"(all selected)" => "(všetko vybrané)",
"({count} selected)" => "({count} vybraných)",
"Shared" => "Zdieľané",
"Share" => "Zdieľať",
"Error" => "Chyba",
@ -67,6 +81,7 @@ $TRANSLATIONS = array(
"Resharing is not allowed" => "Zdieľanie už zdieľanej položky nie je povolené",
"Shared in {item} with {user}" => "Zdieľané v {item} s {user}",
"Unshare" => "Zrušiť zdieľanie",
"notify user by email" => "upozorniť používateľa emailom",
"can edit" => "môže upraviť",
"access control" => "prístupové práva",
"create" => "vytvoriť",
@ -80,8 +95,12 @@ $TRANSLATIONS = array(
"Email sent" => "Email odoslaný",
"Warning" => "Varovanie",
"The object type is not specified." => "Nešpecifikovaný typ objektu.",
"Enter new" => "Zadať nový",
"Delete" => "Zmazať",
"Add" => "Pridať",
"Edit tags" => "Upraviť štítky",
"Error loading dialog template: {error}" => "Chyba pri načítaní šablóny dialógu: {error}",
"No tags selected for deletion." => "Nie sú vybraté štítky na zmazanie.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." => "Aktualizácia nebola úspešná. Problém nahláste na <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>.",
"The update was successful. Redirecting you to ownCloud now." => "Aktualizácia bola úspešná. Presmerovávam na prihlasovaciu stránku.",
"%s password reset" => "reset hesla %s",
@ -102,8 +121,18 @@ $TRANSLATIONS = array(
"Apps" => "Aplikácie",
"Admin" => "Administrátor",
"Help" => "Pomoc",
"Error loading tags" => "Chyba pri načítaní štítkov",
"Tag already exists" => "Štítok už existuje",
"Error deleting tag(s)" => "Chyba pri mazaní štítka(ov)",
"Error tagging" => "Chyba pri pridaní štítka",
"Error untagging" => "Chyba pri odobratí štítka",
"Error favoriting" => "Chyba pri pridaní do obľúbených",
"Error unfavoriting" => "Chyba pri odobratí z obľúbených",
"Access forbidden" => "Prístup odmietnutý",
"Cloud not found" => "Nenájdené",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Ahoj,\n\nchcem ti dať navedomie, že %s zdieľa %s s tebou.\nZobrazenie tu: %s\n\n",
"The share will expire on %s.\n\n" => "Zdieľanie vyexpiruje %s.\n\n",
"Cheers!" => "Za zdravie!",
"Security Warning" => "Bezpečnostné varovanie",
"Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" => "Verzia Vášho PHP je napadnuteľná pomocou techniky \"NULL Byte\" (CVE-2006-7243)",
"Please update your PHP installation to use %s securely." => "Aktualizujte prosím vašu inštanciu PHP pre bezpečné používanie %s.",
@ -122,15 +151,20 @@ $TRANSLATIONS = array(
"Database tablespace" => "Tabuľkový priestor databázy",
"Database host" => "Server databázy",
"Finish setup" => "Dokončiť inštaláciu",
"Finishing …" => "Dokončujem...",
"%s is available. Get more information on how to update." => "%s je dostupná. Získajte viac informácií k postupu aktualizáce.",
"Log out" => "Odhlásiť",
"Automatic logon rejected!" => "Automatické prihlásenie bolo zamietnuté!",
"If you did not change your password recently, your account may be compromised!" => "V nedávnej dobe ste nezmenili svoje heslo, Váš účet môže byť kompromitovaný.",
"Please change your password to secure your account again." => "Prosím, zmeňte svoje heslo pre opätovné zabezpečenie Vášho účtu",
"Server side authentication failed!" => "Autentifikácia na serveri zlyhala!",
"Please contact your administrator." => "Kontaktujte prosím vášho administrátora.",
"Lost your password?" => "Zabudli ste heslo?",
"remember" => "zapamätať",
"Log in" => "Prihlásiť sa",
"Alternative Logins" => "Alternatívne prihlasovanie",
"Hey there,<br><br>just letting you know that %s shared »%s« with you.<br><a href=\"%s\">View it!</a><br><br>" => "Ahoj,<br><br>chcem ti dať navedomie, že %s zdieľa »%s« s tebou.<br><a href=\"%s\">Zobrazenie tu!</a><br><br>",
"The share will expire on %s.<br><br>" => "Zdieľanie vyexpiruje %s.<br><br>",
"Updating ownCloud to version %s, this may take a while." => "Aktualizujem ownCloud na verziu %s, môže to chvíľu trvať."
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";

View file

@ -96,6 +96,7 @@ $TRANSLATIONS = array(
"Email sent" => "E-post skickat",
"Warning" => "Varning",
"The object type is not specified." => "Objekttypen är inte specificerad.",
"Enter new" => "Skriv nytt",
"Delete" => "Radera",
"Add" => "Lägg till",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." => "Uppdateringen misslyckades. Rapportera detta problem till <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud Community</a>.",
@ -118,6 +119,7 @@ $TRANSLATIONS = array(
"Apps" => "Program",
"Admin" => "Admin",
"Help" => "Hjälp",
"Error favoriting" => "Fel favorisering",
"Access forbidden" => "Åtkomst förbjuden",
"Cloud not found" => "Hittade inget moln",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" => "Hej där,⏎\n\nville bara meddela dig att %s delade %s med dig.⏎\nTitta på den: %s⏎\n\n",

View file

@ -39,7 +39,7 @@
<p><?php p($l->t('Your data directory and files are probably accessible from the internet because the .htaccess file does not work.'));?><br>
<?php print_unescaped($l->t(
'For information how to properly configure your server, please see the <a href="%s" target="_blank">documentation</a>.',
$theme->getDocBaseUrl().'/server/5.0/admin_manual/installation.html'
link_to_docs('admin-install')
)); ?></p>
</fieldset>
<?php endif; ?>

View file

@ -30,8 +30,9 @@ try {
OC::handleRequest();
} catch (Exception $ex) {
\OCP\Util::logException('index', $ex);
//show the user a detailed error page
\OCP\Util::writeLog('index', $ex->getMessage(), \OCP\Util::FATAL);
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
OC_Template::printExceptionErrorPage($ex);
}

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-10 22:26-0400\n"
"PO-Revision-Date: 2013-10-11 02:26+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Acoli (http://www.transifex.com/projects/p/owncloud/language/ach/)\n"
"MIME-Version: 1.0\n"
@ -78,3 +78,7 @@ msgstr ""
#: templates/public.php:91
msgid "No preview available for"
msgstr ""
#: templates/public.php:98
msgid "Direct link"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-16 11:33-0400\n"
"PO-Revision-Date: 2013-09-16 15:34+0000\n"
"POT-Creation-Date: 2013-10-17 13:47-0400\n"
"PO-Revision-Date: 2013-10-17 17:47+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Acoli (http://www.transifex.com/projects/p/owncloud/language/ach/)\n"
"MIME-Version: 1.0\n"
@ -17,318 +17,321 @@ msgstr ""
"Language: ach\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: app.php:239
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: app.php:250
#: private/app.php:254
msgid "No app name specified"
msgstr ""
#: app.php:361
#: private/app.php:359
msgid "Help"
msgstr ""
#: app.php:374
#: private/app.php:372
msgid "Personal"
msgstr ""
#: app.php:385
#: private/app.php:383
msgid "Settings"
msgstr ""
#: app.php:397
#: private/app.php:395
msgid "Users"
msgstr ""
#: app.php:410
#: private/app.php:408
msgid "Admin"
msgstr ""
#: app.php:839
#: private/app.php:872
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
#: avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr ""
#: avatar.php:64
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr ""
#: avatar.php:69
#: private/avatar.php:65
msgid "Invalid image"
msgstr ""
#: defaults.php:35
#: private/defaults.php:36
msgid "web services under your control"
msgstr ""
#: files.php:66 files.php:98
#: private/files.php:66 private/files.php:98
#, php-format
msgid "cannot open \"%s\""
msgstr ""
#: files.php:226
#: private/files.php:226
msgid "ZIP download is turned off."
msgstr ""
#: files.php:227
#: private/files.php:227
msgid "Files need to be downloaded one by one."
msgstr ""
#: files.php:228 files.php:256
#: private/files.php:228 private/files.php:256
msgid "Back to Files"
msgstr ""
#: files.php:253
#: private/files.php:253
msgid "Selected files too large to generate zip file."
msgstr ""
#: files.php:254
#: private/files.php:254
msgid ""
"Download the files in smaller chunks, seperately or kindly ask your "
"administrator."
msgstr ""
#: installer.php:63
#: private/installer.php:63
msgid "No source specified when installing app"
msgstr ""
#: installer.php:70
#: private/installer.php:70
msgid "No href specified when installing app from http"
msgstr ""
#: installer.php:75
#: private/installer.php:75
msgid "No path specified when installing app from local file"
msgstr ""
#: installer.php:89
#: private/installer.php:89
#, php-format
msgid "Archives of type %s are not supported"
msgstr ""
#: installer.php:103
#: private/installer.php:103
msgid "Failed to open archive when installing app"
msgstr ""
#: installer.php:125
#: private/installer.php:125
msgid "App does not provide an info.xml file"
msgstr ""
#: installer.php:131
#: private/installer.php:131
msgid "App can't be installed because of not allowed code in the App"
msgstr ""
#: installer.php:140
#: private/installer.php:140
msgid ""
"App can't be installed because it is not compatible with this version of "
"ownCloud"
msgstr ""
#: installer.php:146
#: private/installer.php:146
msgid ""
"App can't be installed because it contains the <shipped>true</shipped> tag "
"which is not allowed for non shipped apps"
msgstr ""
#: installer.php:152
#: private/installer.php:152
msgid ""
"App can't be installed because the version in info.xml/version is not the "
"same as the version reported from the app store"
msgstr ""
#: installer.php:162
#: private/installer.php:162
msgid "App directory already exists"
msgstr ""
#: installer.php:175
#: private/installer.php:175
#, php-format
msgid "Can't create app folder. Please fix permissions. %s"
msgstr ""
#: json.php:28
#: private/json.php:28
msgid "Application is not enabled"
msgstr ""
#: json.php:39 json.php:62 json.php:73
#: private/json.php:39 private/json.php:62 private/json.php:73
msgid "Authentication error"
msgstr ""
#: json.php:51
#: private/json.php:51
msgid "Token expired. Please reload page."
msgstr ""
#: search/provider/file.php:17 search/provider/file.php:35
#: private/search/provider/file.php:18 private/search/provider/file.php:36
msgid "Files"
msgstr ""
#: search/provider/file.php:26 search/provider/file.php:33
#: private/search/provider/file.php:27 private/search/provider/file.php:34
msgid "Text"
msgstr ""
#: search/provider/file.php:29
#: private/search/provider/file.php:30
msgid "Images"
msgstr ""
#: setup/abstractdatabase.php:22
#: private/setup/abstractdatabase.php:22
#, php-format
msgid "%s enter the database username."
msgstr ""
#: setup/abstractdatabase.php:25
#: private/setup/abstractdatabase.php:25
#, php-format
msgid "%s enter the database name."
msgstr ""
#: setup/abstractdatabase.php:28
#: private/setup/abstractdatabase.php:28
#, php-format
msgid "%s you may not use dots in the database name"
msgstr ""
#: setup/mssql.php:20
#: private/setup/mssql.php:20
#, php-format
msgid "MS SQL username and/or password not valid: %s"
msgstr ""
#: setup/mssql.php:21 setup/mysql.php:13 setup/oci.php:114
#: setup/postgresql.php:24 setup/postgresql.php:70
#: private/setup/mssql.php:21 private/setup/mysql.php:13
#: private/setup/oci.php:114 private/setup/postgresql.php:24
#: private/setup/postgresql.php:70
msgid "You need to enter either an existing account or the administrator."
msgstr ""
#: setup/mysql.php:12
#: private/setup/mysql.php:12
msgid "MySQL username and/or password not valid"
msgstr ""
#: setup/mysql.php:67 setup/oci.php:54 setup/oci.php:121 setup/oci.php:147
#: setup/oci.php:154 setup/oci.php:165 setup/oci.php:172 setup/oci.php:181
#: setup/oci.php:189 setup/oci.php:198 setup/oci.php:204
#: setup/postgresql.php:89 setup/postgresql.php:98 setup/postgresql.php:115
#: setup/postgresql.php:125 setup/postgresql.php:134
#: private/setup/mysql.php:67 private/setup/oci.php:54
#: private/setup/oci.php:121 private/setup/oci.php:147
#: private/setup/oci.php:154 private/setup/oci.php:165
#: private/setup/oci.php:172 private/setup/oci.php:181
#: private/setup/oci.php:189 private/setup/oci.php:198
#: private/setup/oci.php:204 private/setup/postgresql.php:89
#: private/setup/postgresql.php:98 private/setup/postgresql.php:115
#: private/setup/postgresql.php:125 private/setup/postgresql.php:134
#, php-format
msgid "DB Error: \"%s\""
msgstr ""
#: setup/mysql.php:68 setup/oci.php:55 setup/oci.php:122 setup/oci.php:148
#: setup/oci.php:155 setup/oci.php:166 setup/oci.php:182 setup/oci.php:190
#: setup/oci.php:199 setup/postgresql.php:90 setup/postgresql.php:99
#: setup/postgresql.php:116 setup/postgresql.php:126 setup/postgresql.php:135
#: private/setup/mysql.php:68 private/setup/oci.php:55
#: private/setup/oci.php:122 private/setup/oci.php:148
#: private/setup/oci.php:155 private/setup/oci.php:166
#: private/setup/oci.php:182 private/setup/oci.php:190
#: private/setup/oci.php:199 private/setup/postgresql.php:90
#: private/setup/postgresql.php:99 private/setup/postgresql.php:116
#: private/setup/postgresql.php:126 private/setup/postgresql.php:135
#, php-format
msgid "Offending command was: \"%s\""
msgstr ""
#: setup/mysql.php:85
#: private/setup/mysql.php:85
#, php-format
msgid "MySQL user '%s'@'localhost' exists already."
msgstr ""
#: setup/mysql.php:86
#: private/setup/mysql.php:86
msgid "Drop this user from MySQL"
msgstr ""
#: setup/mysql.php:91
#: private/setup/mysql.php:91
#, php-format
msgid "MySQL user '%s'@'%%' already exists"
msgstr ""
#: setup/mysql.php:92
#: private/setup/mysql.php:92
msgid "Drop this user from MySQL."
msgstr ""
#: setup/oci.php:34
#: private/setup/oci.php:34
msgid "Oracle connection could not be established"
msgstr ""
#: setup/oci.php:41 setup/oci.php:113
#: private/setup/oci.php:41 private/setup/oci.php:113
msgid "Oracle username and/or password not valid"
msgstr ""
#: setup/oci.php:173 setup/oci.php:205
#: private/setup/oci.php:173 private/setup/oci.php:205
#, php-format
msgid "Offending command was: \"%s\", name: %s, password: %s"
msgstr ""
#: setup/postgresql.php:23 setup/postgresql.php:69
#: private/setup/postgresql.php:23 private/setup/postgresql.php:69
msgid "PostgreSQL username and/or password not valid"
msgstr ""
#: setup.php:28
#: private/setup.php:28
msgid "Set an admin username."
msgstr ""
#: setup.php:31
#: private/setup.php:31
msgid "Set an admin password."
msgstr ""
#: setup.php:184
#: private/setup.php:184
msgid ""
"Your web server is not yet properly setup to allow files synchronization "
"because the WebDAV interface seems to be broken."
msgstr ""
#: setup.php:185
#: private/setup.php:185
#, php-format
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr ""
#: template/functions.php:96
#: private/tags.php:194
#, php-format
msgid "Could not find category \"%s\""
msgstr ""
#: private/template/functions.php:122
msgid "seconds ago"
msgstr ""
#: template/functions.php:97
#: private/template/functions.php:123
msgid "%n minute ago"
msgid_plural "%n minutes ago"
msgstr[0] ""
msgstr[1] ""
#: template/functions.php:98
#: private/template/functions.php:124
msgid "%n hour ago"
msgid_plural "%n hours ago"
msgstr[0] ""
msgstr[1] ""
#: template/functions.php:99
#: private/template/functions.php:125
msgid "today"
msgstr ""
#: template/functions.php:100
#: private/template/functions.php:126
msgid "yesterday"
msgstr ""
#: template/functions.php:101
#: private/template/functions.php:128
msgid "%n day go"
msgid_plural "%n days ago"
msgstr[0] ""
msgstr[1] ""
#: template/functions.php:102
#: private/template/functions.php:130
msgid "last month"
msgstr ""
#: template/functions.php:103
#: private/template/functions.php:131
msgid "%n month ago"
msgid_plural "%n months ago"
msgstr[0] ""
msgstr[1] ""
#: template/functions.php:104
#: private/template/functions.php:133
msgid "last year"
msgstr ""
#: template/functions.php:105
#: private/template/functions.php:134
msgid "years ago"
msgstr ""
#: template.php:297
#: private/template.php:297
msgid "Caused by:"
msgstr ""
#: vcategories.php:188 vcategories.php:249
#, php-format
msgid "Could not find category \"%s\""
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-06 19:07-0400\n"
"PO-Revision-Date: 2013-10-05 15:12+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Acoli (http://www.transifex.com/projects/p/owncloud/language/ach/)\n"
"MIME-Version: 1.0\n"
@ -157,15 +157,15 @@ msgstr ""
msgid "Updated"
msgstr ""
#: js/personal.js:225
#: js/personal.js:220
msgid "Select a profile picture"
msgstr ""
#: js/personal.js:270
#: js/personal.js:265
msgid "Decrypting files... Please wait, this can take some time."
msgstr ""
#: js/personal.js:292
#: js/personal.js:287
msgid "Saving..."
msgstr ""
@ -181,32 +181,32 @@ msgstr ""
msgid "Unable to remove user"
msgstr ""
#: js/users.js:92 templates/users.php:26 templates/users.php:90
#: js/users.js:95 templates/users.php:26 templates/users.php:90
#: templates/users.php:118
msgid "Groups"
msgstr ""
#: js/users.js:97 templates/users.php:92 templates/users.php:130
#: js/users.js:100 templates/users.php:92 templates/users.php:130
msgid "Group Admin"
msgstr ""
#: js/users.js:120 templates/users.php:170
#: js/users.js:123 templates/users.php:170
msgid "Delete"
msgstr ""
#: js/users.js:277
#: js/users.js:280
msgid "add group"
msgstr ""
#: js/users.js:436
#: js/users.js:442
msgid "A valid username must be provided"
msgstr ""
#: js/users.js:437 js/users.js:443 js/users.js:458
#: js/users.js:443 js/users.js:449 js/users.js:464
msgid "Error creating user"
msgstr ""
#: js/users.js:442
#: js/users.js:448
msgid "A valid password must be provided"
msgstr ""
@ -287,12 +287,12 @@ msgstr ""
#: templates/admin.php:107
msgid ""
"cron.php is registered at a webcron service to call cron.php once a minute "
"over http."
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:115
msgid "Use systems cron service to call the cron.php file once a minute."
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:120
@ -384,11 +384,11 @@ msgstr ""
msgid "Less"
msgstr ""
#: templates/admin.php:250 templates/personal.php:161
#: templates/admin.php:250 templates/personal.php:169
msgid "Version"
msgstr ""
#: templates/admin.php:254 templates/personal.php:164
#: templates/admin.php:254 templates/personal.php:172
msgid ""
"Developed by the <a href=\"http://ownCloud.org/contact\" "
"target=\"_blank\">ownCloud community</a>, the <a "
@ -527,34 +527,34 @@ msgstr ""
msgid "Language"
msgstr ""
#: templates/personal.php:119
#: templates/personal.php:126
msgid "Help translate"
msgstr ""
#: templates/personal.php:125
#: templates/personal.php:133
msgid "WebDAV"
msgstr ""
#: templates/personal.php:127
#: templates/personal.php:135
#, php-format
msgid ""
"Use this address to <a href=\"%s/server/5.0/user_manual/files/files.html\" "
"target=\"_blank\">access your Files via WebDAV</a>"
msgstr ""
#: templates/personal.php:138
#: templates/personal.php:146
msgid "Encryption"
msgstr ""
#: templates/personal.php:140
#: templates/personal.php:148
msgid "The encryption app is no longer enabled, decrypt all your file"
msgstr ""
#: templates/personal.php:146
#: templates/personal.php:154
msgid "Log-in password"
msgstr ""
#: templates/personal.php:151
#: templates/personal.php:159
msgid "Decrypt all Files"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-10 22:26-0400\n"
"PO-Revision-Date: 2013-10-11 02:26+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Adyghe (http://www.transifex.com/projects/p/owncloud/language/ady/)\n"
"MIME-Version: 1.0\n"
@ -78,3 +78,7 @@ msgstr ""
#: templates/public.php:91
msgid "No preview available for"
msgstr ""
#: templates/public.php:98
msgid "Direct link"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-07 12:17-0400\n"
"PO-Revision-Date: 2013-10-07 15:03+0000\n"
"POT-Creation-Date: 2013-10-17 13:47-0400\n"
"PO-Revision-Date: 2013-10-17 17:47+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Adyghe (http://www.transifex.com/projects/p/owncloud/language/ady/)\n"
"MIME-Version: 1.0\n"
@ -17,51 +17,47 @@ msgstr ""
"Language: ady\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: private/app.php:237
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: private/app.php:248
#: private/app.php:254
msgid "No app name specified"
msgstr ""
#: private/app.php:352
#: private/app.php:359
msgid "Help"
msgstr ""
#: private/app.php:365
#: private/app.php:372
msgid "Personal"
msgstr ""
#: private/app.php:376
#: private/app.php:383
msgid "Settings"
msgstr ""
#: private/app.php:388
#: private/app.php:395
msgid "Users"
msgstr ""
#: private/app.php:401
#: private/app.php:408
msgid "Admin"
msgstr ""
#: private/app.php:832
#: private/app.php:872
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
#: private/avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr ""
#: private/avatar.php:64
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr ""
#: private/avatar.php:69
#: private/avatar.php:65
msgid "Invalid image"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-07 12:17-0400\n"
"PO-Revision-Date: 2013-10-07 15:03+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Adyghe (http://www.transifex.com/projects/p/owncloud/language/ady/)\n"
"MIME-Version: 1.0\n"
@ -157,15 +157,15 @@ msgstr ""
msgid "Updated"
msgstr ""
#: js/personal.js:225
#: js/personal.js:220
msgid "Select a profile picture"
msgstr ""
#: js/personal.js:270
#: js/personal.js:265
msgid "Decrypting files... Please wait, this can take some time."
msgstr ""
#: js/personal.js:292
#: js/personal.js:287
msgid "Saving..."
msgstr ""
@ -287,12 +287,12 @@ msgstr ""
#: templates/admin.php:107
msgid ""
"cron.php is registered at a webcron service to call cron.php once a minute "
"over http."
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:115
msgid "Use systems cron service to call the cron.php file once a minute."
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:120
@ -384,11 +384,11 @@ msgstr ""
msgid "Less"
msgstr ""
#: templates/admin.php:250 templates/personal.php:161
#: templates/admin.php:250 templates/personal.php:169
msgid "Version"
msgstr ""
#: templates/admin.php:254 templates/personal.php:164
#: templates/admin.php:254 templates/personal.php:172
msgid ""
"Developed by the <a href=\"http://ownCloud.org/contact\" "
"target=\"_blank\">ownCloud community</a>, the <a "
@ -527,34 +527,34 @@ msgstr ""
msgid "Language"
msgstr ""
#: templates/personal.php:119
#: templates/personal.php:126
msgid "Help translate"
msgstr ""
#: templates/personal.php:125
#: templates/personal.php:133
msgid "WebDAV"
msgstr ""
#: templates/personal.php:127
#: templates/personal.php:135
#, php-format
msgid ""
"Use this address to <a href=\"%s/server/5.0/user_manual/files/files.html\" "
"target=\"_blank\">access your Files via WebDAV</a>"
msgstr ""
#: templates/personal.php:138
#: templates/personal.php:146
msgid "Encryption"
msgstr ""
#: templates/personal.php:140
#: templates/personal.php:148
msgid "The encryption app is no longer enabled, decrypt all your file"
msgstr ""
#: templates/personal.php:146
#: templates/personal.php:154
msgid "Log-in password"
msgstr ""
#: templates/personal.php:151
#: templates/personal.php:159
msgid "Decrypt all Files"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-10 22:26-0400\n"
"PO-Revision-Date: 2013-10-11 02:26+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/owncloud/language/af_ZA/)\n"
"MIME-Version: 1.0\n"
@ -78,3 +78,7 @@ msgstr ""
#: templates/public.php:91
msgid "No preview available for"
msgstr ""
#: templates/public.php:98
msgid "Direct link"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-06 19:07-0400\n"
"PO-Revision-Date: 2013-10-02 13:21+0000\n"
"POT-Creation-Date: 2013-10-17 13:47-0400\n"
"PO-Revision-Date: 2013-10-17 17:47+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/owncloud/language/af_ZA/)\n"
"MIME-Version: 1.0\n"
@ -17,51 +17,47 @@ msgstr ""
"Language: af_ZA\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: private/app.php:237
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: private/app.php:248
#: private/app.php:254
msgid "No app name specified"
msgstr ""
#: private/app.php:352
#: private/app.php:359
msgid "Help"
msgstr "Hulp"
#: private/app.php:365
#: private/app.php:372
msgid "Personal"
msgstr "Persoonlik"
#: private/app.php:376
#: private/app.php:383
msgid "Settings"
msgstr "Instellings"
#: private/app.php:388
#: private/app.php:395
msgid "Users"
msgstr "Gebruikers"
#: private/app.php:401
#: private/app.php:408
msgid "Admin"
msgstr "Admin"
#: private/app.php:832
#: private/app.php:872
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
#: private/avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr ""
#: private/avatar.php:64
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr ""
#: private/avatar.php:69
#: private/avatar.php:65
msgid "Invalid image"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-06 19:07-0400\n"
"PO-Revision-Date: 2013-10-05 15:12+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/owncloud/language/af_ZA/)\n"
"MIME-Version: 1.0\n"
@ -157,15 +157,15 @@ msgstr ""
msgid "Updated"
msgstr ""
#: js/personal.js:225
#: js/personal.js:220
msgid "Select a profile picture"
msgstr ""
#: js/personal.js:270
#: js/personal.js:265
msgid "Decrypting files... Please wait, this can take some time."
msgstr ""
#: js/personal.js:292
#: js/personal.js:287
msgid "Saving..."
msgstr ""
@ -181,32 +181,32 @@ msgstr ""
msgid "Unable to remove user"
msgstr ""
#: js/users.js:92 templates/users.php:26 templates/users.php:90
#: js/users.js:95 templates/users.php:26 templates/users.php:90
#: templates/users.php:118
msgid "Groups"
msgstr ""
#: js/users.js:97 templates/users.php:92 templates/users.php:130
#: js/users.js:100 templates/users.php:92 templates/users.php:130
msgid "Group Admin"
msgstr ""
#: js/users.js:120 templates/users.php:170
#: js/users.js:123 templates/users.php:170
msgid "Delete"
msgstr ""
#: js/users.js:277
#: js/users.js:280
msgid "add group"
msgstr ""
#: js/users.js:436
#: js/users.js:442
msgid "A valid username must be provided"
msgstr ""
#: js/users.js:437 js/users.js:443 js/users.js:458
#: js/users.js:443 js/users.js:449 js/users.js:464
msgid "Error creating user"
msgstr ""
#: js/users.js:442
#: js/users.js:448
msgid "A valid password must be provided"
msgstr ""
@ -287,12 +287,12 @@ msgstr ""
#: templates/admin.php:107
msgid ""
"cron.php is registered at a webcron service to call cron.php once a minute "
"over http."
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:115
msgid "Use systems cron service to call the cron.php file once a minute."
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:120
@ -384,11 +384,11 @@ msgstr ""
msgid "Less"
msgstr ""
#: templates/admin.php:250 templates/personal.php:161
#: templates/admin.php:250 templates/personal.php:169
msgid "Version"
msgstr ""
#: templates/admin.php:254 templates/personal.php:164
#: templates/admin.php:254 templates/personal.php:172
msgid ""
"Developed by the <a href=\"http://ownCloud.org/contact\" "
"target=\"_blank\">ownCloud community</a>, the <a "
@ -527,34 +527,34 @@ msgstr ""
msgid "Language"
msgstr ""
#: templates/personal.php:119
#: templates/personal.php:126
msgid "Help translate"
msgstr ""
#: templates/personal.php:125
#: templates/personal.php:133
msgid "WebDAV"
msgstr ""
#: templates/personal.php:127
#: templates/personal.php:135
#, php-format
msgid ""
"Use this address to <a href=\"%s/server/5.0/user_manual/files/files.html\" "
"target=\"_blank\">access your Files via WebDAV</a>"
msgstr ""
#: templates/personal.php:138
#: templates/personal.php:146
msgid "Encryption"
msgstr ""
#: templates/personal.php:140
#: templates/personal.php:148
msgid "The encryption app is no longer enabled, decrypt all your file"
msgstr ""
#: templates/personal.php:146
#: templates/personal.php:154
msgid "Log-in password"
msgstr ""
#: templates/personal.php:151
#: templates/personal.php:159
msgid "Decrypt all Files"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-10 22:26-0400\n"
"PO-Revision-Date: 2013-10-11 02:26+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n"
"MIME-Version: 1.0\n"
@ -78,3 +78,7 @@ msgstr "إلغاء رفع الملفات"
#: templates/public.php:91
msgid "No preview available for"
msgstr "لا يوجد عرض مسبق لـ"
#: templates/public.php:98
msgid "Direct link"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-06 19:07-0400\n"
"PO-Revision-Date: 2013-10-02 13:21+0000\n"
"POT-Creation-Date: 2013-10-17 13:47-0400\n"
"PO-Revision-Date: 2013-10-17 17:47+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n"
"MIME-Version: 1.0\n"
@ -17,51 +17,47 @@ msgstr ""
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: private/app.php:237
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: private/app.php:248
#: private/app.php:254
msgid "No app name specified"
msgstr ""
#: private/app.php:352
#: private/app.php:359
msgid "Help"
msgstr "المساعدة"
#: private/app.php:365
#: private/app.php:372
msgid "Personal"
msgstr "شخصي"
#: private/app.php:376
#: private/app.php:383
msgid "Settings"
msgstr "إعدادات"
#: private/app.php:388
#: private/app.php:395
msgid "Users"
msgstr "المستخدمين"
#: private/app.php:401
#: private/app.php:408
msgid "Admin"
msgstr "المدير"
#: private/app.php:832
#: private/app.php:872
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
#: private/avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr ""
#: private/avatar.php:64
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr ""
#: private/avatar.php:69
#: private/avatar.php:65
msgid "Invalid image"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-16 00:26-0400\n"
"PO-Revision-Date: 2013-10-14 00:41+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n"
"MIME-Version: 1.0\n"
@ -287,12 +287,12 @@ msgstr "قم بتنفيذ مهمة واحدة مع كل صفحة تم تحميل
#: templates/admin.php:107
msgid ""
"cron.php is registered at a webcron service to call cron.php once a minute "
"over http."
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:115
msgid "Use systems cron service to call the cron.php file once a minute."
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:120

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-10 22:26-0400\n"
"PO-Revision-Date: 2013-10-11 02:26+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Belarusian (http://www.transifex.com/projects/p/owncloud/language/be/)\n"
"MIME-Version: 1.0\n"
@ -78,3 +78,7 @@ msgstr ""
#: templates/public.php:91
msgid "No preview available for"
msgstr ""
#: templates/public.php:98
msgid "Direct link"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-16 11:33-0400\n"
"PO-Revision-Date: 2013-09-16 15:34+0000\n"
"POT-Creation-Date: 2013-10-17 13:47-0400\n"
"PO-Revision-Date: 2013-10-17 17:47+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Belarusian (http://www.transifex.com/projects/p/owncloud/language/be/)\n"
"MIME-Version: 1.0\n"
@ -17,270 +17,278 @@ msgstr ""
"Language: be\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: app.php:239
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: app.php:250
#: private/app.php:254
msgid "No app name specified"
msgstr ""
#: app.php:361
#: private/app.php:359
msgid "Help"
msgstr ""
#: app.php:374
#: private/app.php:372
msgid "Personal"
msgstr ""
#: app.php:385
#: private/app.php:383
msgid "Settings"
msgstr ""
#: app.php:397
#: private/app.php:395
msgid "Users"
msgstr ""
#: app.php:410
#: private/app.php:408
msgid "Admin"
msgstr ""
#: app.php:839
#: private/app.php:872
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
#: avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr ""
#: avatar.php:64
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr ""
#: avatar.php:69
#: private/avatar.php:65
msgid "Invalid image"
msgstr ""
#: defaults.php:35
#: private/defaults.php:36
msgid "web services under your control"
msgstr ""
#: files.php:66 files.php:98
#: private/files.php:66 private/files.php:98
#, php-format
msgid "cannot open \"%s\""
msgstr ""
#: files.php:226
#: private/files.php:226
msgid "ZIP download is turned off."
msgstr ""
#: files.php:227
#: private/files.php:227
msgid "Files need to be downloaded one by one."
msgstr ""
#: files.php:228 files.php:256
#: private/files.php:228 private/files.php:256
msgid "Back to Files"
msgstr ""
#: files.php:253
#: private/files.php:253
msgid "Selected files too large to generate zip file."
msgstr ""
#: files.php:254
#: private/files.php:254
msgid ""
"Download the files in smaller chunks, seperately or kindly ask your "
"administrator."
msgstr ""
#: installer.php:63
#: private/installer.php:63
msgid "No source specified when installing app"
msgstr ""
#: installer.php:70
#: private/installer.php:70
msgid "No href specified when installing app from http"
msgstr ""
#: installer.php:75
#: private/installer.php:75
msgid "No path specified when installing app from local file"
msgstr ""
#: installer.php:89
#: private/installer.php:89
#, php-format
msgid "Archives of type %s are not supported"
msgstr ""
#: installer.php:103
#: private/installer.php:103
msgid "Failed to open archive when installing app"
msgstr ""
#: installer.php:125
#: private/installer.php:125
msgid "App does not provide an info.xml file"
msgstr ""
#: installer.php:131
#: private/installer.php:131
msgid "App can't be installed because of not allowed code in the App"
msgstr ""
#: installer.php:140
#: private/installer.php:140
msgid ""
"App can't be installed because it is not compatible with this version of "
"ownCloud"
msgstr ""
#: installer.php:146
#: private/installer.php:146
msgid ""
"App can't be installed because it contains the <shipped>true</shipped> tag "
"which is not allowed for non shipped apps"
msgstr ""
#: installer.php:152
#: private/installer.php:152
msgid ""
"App can't be installed because the version in info.xml/version is not the "
"same as the version reported from the app store"
msgstr ""
#: installer.php:162
#: private/installer.php:162
msgid "App directory already exists"
msgstr ""
#: installer.php:175
#: private/installer.php:175
#, php-format
msgid "Can't create app folder. Please fix permissions. %s"
msgstr ""
#: json.php:28
#: private/json.php:28
msgid "Application is not enabled"
msgstr ""
#: json.php:39 json.php:62 json.php:73
#: private/json.php:39 private/json.php:62 private/json.php:73
msgid "Authentication error"
msgstr ""
#: json.php:51
#: private/json.php:51
msgid "Token expired. Please reload page."
msgstr ""
#: search/provider/file.php:17 search/provider/file.php:35
#: private/search/provider/file.php:18 private/search/provider/file.php:36
msgid "Files"
msgstr ""
#: search/provider/file.php:26 search/provider/file.php:33
#: private/search/provider/file.php:27 private/search/provider/file.php:34
msgid "Text"
msgstr ""
#: search/provider/file.php:29
#: private/search/provider/file.php:30
msgid "Images"
msgstr ""
#: setup/abstractdatabase.php:22
#: private/setup/abstractdatabase.php:22
#, php-format
msgid "%s enter the database username."
msgstr ""
#: setup/abstractdatabase.php:25
#: private/setup/abstractdatabase.php:25
#, php-format
msgid "%s enter the database name."
msgstr ""
#: setup/abstractdatabase.php:28
#: private/setup/abstractdatabase.php:28
#, php-format
msgid "%s you may not use dots in the database name"
msgstr ""
#: setup/mssql.php:20
#: private/setup/mssql.php:20
#, php-format
msgid "MS SQL username and/or password not valid: %s"
msgstr ""
#: setup/mssql.php:21 setup/mysql.php:13 setup/oci.php:114
#: setup/postgresql.php:24 setup/postgresql.php:70
#: private/setup/mssql.php:21 private/setup/mysql.php:13
#: private/setup/oci.php:114 private/setup/postgresql.php:24
#: private/setup/postgresql.php:70
msgid "You need to enter either an existing account or the administrator."
msgstr ""
#: setup/mysql.php:12
#: private/setup/mysql.php:12
msgid "MySQL username and/or password not valid"
msgstr ""
#: setup/mysql.php:67 setup/oci.php:54 setup/oci.php:121 setup/oci.php:147
#: setup/oci.php:154 setup/oci.php:165 setup/oci.php:172 setup/oci.php:181
#: setup/oci.php:189 setup/oci.php:198 setup/oci.php:204
#: setup/postgresql.php:89 setup/postgresql.php:98 setup/postgresql.php:115
#: setup/postgresql.php:125 setup/postgresql.php:134
#: private/setup/mysql.php:67 private/setup/oci.php:54
#: private/setup/oci.php:121 private/setup/oci.php:147
#: private/setup/oci.php:154 private/setup/oci.php:165
#: private/setup/oci.php:172 private/setup/oci.php:181
#: private/setup/oci.php:189 private/setup/oci.php:198
#: private/setup/oci.php:204 private/setup/postgresql.php:89
#: private/setup/postgresql.php:98 private/setup/postgresql.php:115
#: private/setup/postgresql.php:125 private/setup/postgresql.php:134
#, php-format
msgid "DB Error: \"%s\""
msgstr ""
#: setup/mysql.php:68 setup/oci.php:55 setup/oci.php:122 setup/oci.php:148
#: setup/oci.php:155 setup/oci.php:166 setup/oci.php:182 setup/oci.php:190
#: setup/oci.php:199 setup/postgresql.php:90 setup/postgresql.php:99
#: setup/postgresql.php:116 setup/postgresql.php:126 setup/postgresql.php:135
#: private/setup/mysql.php:68 private/setup/oci.php:55
#: private/setup/oci.php:122 private/setup/oci.php:148
#: private/setup/oci.php:155 private/setup/oci.php:166
#: private/setup/oci.php:182 private/setup/oci.php:190
#: private/setup/oci.php:199 private/setup/postgresql.php:90
#: private/setup/postgresql.php:99 private/setup/postgresql.php:116
#: private/setup/postgresql.php:126 private/setup/postgresql.php:135
#, php-format
msgid "Offending command was: \"%s\""
msgstr ""
#: setup/mysql.php:85
#: private/setup/mysql.php:85
#, php-format
msgid "MySQL user '%s'@'localhost' exists already."
msgstr ""
#: setup/mysql.php:86
#: private/setup/mysql.php:86
msgid "Drop this user from MySQL"
msgstr ""
#: setup/mysql.php:91
#: private/setup/mysql.php:91
#, php-format
msgid "MySQL user '%s'@'%%' already exists"
msgstr ""
#: setup/mysql.php:92
#: private/setup/mysql.php:92
msgid "Drop this user from MySQL."
msgstr ""
#: setup/oci.php:34
#: private/setup/oci.php:34
msgid "Oracle connection could not be established"
msgstr ""
#: setup/oci.php:41 setup/oci.php:113
#: private/setup/oci.php:41 private/setup/oci.php:113
msgid "Oracle username and/or password not valid"
msgstr ""
#: setup/oci.php:173 setup/oci.php:205
#: private/setup/oci.php:173 private/setup/oci.php:205
#, php-format
msgid "Offending command was: \"%s\", name: %s, password: %s"
msgstr ""
#: setup/postgresql.php:23 setup/postgresql.php:69
#: private/setup/postgresql.php:23 private/setup/postgresql.php:69
msgid "PostgreSQL username and/or password not valid"
msgstr ""
#: setup.php:28
#: private/setup.php:28
msgid "Set an admin username."
msgstr ""
#: setup.php:31
#: private/setup.php:31
msgid "Set an admin password."
msgstr ""
#: setup.php:184
#: private/setup.php:184
msgid ""
"Your web server is not yet properly setup to allow files synchronization "
"because the WebDAV interface seems to be broken."
msgstr ""
#: setup.php:185
#: private/setup.php:185
#, php-format
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr ""
#: template/functions.php:96
#: private/tags.php:194
#, php-format
msgid "Could not find category \"%s\""
msgstr ""
#: private/template/functions.php:122
msgid "seconds ago"
msgstr ""
#: template/functions.php:97
#: private/template/functions.php:123
msgid "%n minute ago"
msgid_plural "%n minutes ago"
msgstr[0] ""
@ -288,7 +296,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: template/functions.php:98
#: private/template/functions.php:124
msgid "%n hour ago"
msgid_plural "%n hours ago"
msgstr[0] ""
@ -296,15 +304,15 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: template/functions.php:99
#: private/template/functions.php:125
msgid "today"
msgstr ""
#: template/functions.php:100
#: private/template/functions.php:126
msgid "yesterday"
msgstr ""
#: template/functions.php:101
#: private/template/functions.php:128
msgid "%n day go"
msgid_plural "%n days ago"
msgstr[0] ""
@ -312,11 +320,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: template/functions.php:102
#: private/template/functions.php:130
msgid "last month"
msgstr ""
#: template/functions.php:103
#: private/template/functions.php:131
msgid "%n month ago"
msgid_plural "%n months ago"
msgstr[0] ""
@ -324,19 +332,14 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: template/functions.php:104
#: private/template/functions.php:133
msgid "last year"
msgstr ""
#: template/functions.php:105
#: private/template/functions.php:134
msgid "years ago"
msgstr ""
#: template.php:297
#: private/template.php:297
msgid "Caused by:"
msgstr ""
#: vcategories.php:188 vcategories.php:249
#, php-format
msgid "Could not find category \"%s\""
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-06 19:07-0400\n"
"PO-Revision-Date: 2013-10-05 15:12+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Belarusian (http://www.transifex.com/projects/p/owncloud/language/be/)\n"
"MIME-Version: 1.0\n"
@ -157,15 +157,15 @@ msgstr ""
msgid "Updated"
msgstr ""
#: js/personal.js:225
#: js/personal.js:220
msgid "Select a profile picture"
msgstr ""
#: js/personal.js:270
#: js/personal.js:265
msgid "Decrypting files... Please wait, this can take some time."
msgstr ""
#: js/personal.js:292
#: js/personal.js:287
msgid "Saving..."
msgstr ""
@ -181,32 +181,32 @@ msgstr ""
msgid "Unable to remove user"
msgstr ""
#: js/users.js:92 templates/users.php:26 templates/users.php:90
#: js/users.js:95 templates/users.php:26 templates/users.php:90
#: templates/users.php:118
msgid "Groups"
msgstr ""
#: js/users.js:97 templates/users.php:92 templates/users.php:130
#: js/users.js:100 templates/users.php:92 templates/users.php:130
msgid "Group Admin"
msgstr ""
#: js/users.js:120 templates/users.php:170
#: js/users.js:123 templates/users.php:170
msgid "Delete"
msgstr ""
#: js/users.js:277
#: js/users.js:280
msgid "add group"
msgstr ""
#: js/users.js:436
#: js/users.js:442
msgid "A valid username must be provided"
msgstr ""
#: js/users.js:437 js/users.js:443 js/users.js:458
#: js/users.js:443 js/users.js:449 js/users.js:464
msgid "Error creating user"
msgstr ""
#: js/users.js:442
#: js/users.js:448
msgid "A valid password must be provided"
msgstr ""
@ -287,12 +287,12 @@ msgstr ""
#: templates/admin.php:107
msgid ""
"cron.php is registered at a webcron service to call cron.php once a minute "
"over http."
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:115
msgid "Use systems cron service to call the cron.php file once a minute."
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:120
@ -384,11 +384,11 @@ msgstr ""
msgid "Less"
msgstr ""
#: templates/admin.php:250 templates/personal.php:161
#: templates/admin.php:250 templates/personal.php:169
msgid "Version"
msgstr ""
#: templates/admin.php:254 templates/personal.php:164
#: templates/admin.php:254 templates/personal.php:172
msgid ""
"Developed by the <a href=\"http://ownCloud.org/contact\" "
"target=\"_blank\">ownCloud community</a>, the <a "
@ -527,34 +527,34 @@ msgstr ""
msgid "Language"
msgstr ""
#: templates/personal.php:119
#: templates/personal.php:126
msgid "Help translate"
msgstr ""
#: templates/personal.php:125
#: templates/personal.php:133
msgid "WebDAV"
msgstr ""
#: templates/personal.php:127
#: templates/personal.php:135
#, php-format
msgid ""
"Use this address to <a href=\"%s/server/5.0/user_manual/files/files.html\" "
"target=\"_blank\">access your Files via WebDAV</a>"
msgstr ""
#: templates/personal.php:138
#: templates/personal.php:146
msgid "Encryption"
msgstr ""
#: templates/personal.php:140
#: templates/personal.php:148
msgid "The encryption app is no longer enabled, decrypt all your file"
msgstr ""
#: templates/personal.php:146
#: templates/personal.php:154
msgid "Log-in password"
msgstr ""
#: templates/personal.php:151
#: templates/personal.php:159
msgid "Decrypt all Files"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-10 22:26-0400\n"
"PO-Revision-Date: 2013-10-11 02:26+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n"
"MIME-Version: 1.0\n"
@ -78,3 +78,7 @@ msgstr "Спри качването"
#: templates/public.php:91
msgid "No preview available for"
msgstr "Няма наличен преглед за"
#: templates/public.php:98
msgid "Direct link"
msgstr ""

View file

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-06 19:07-0400\n"
"PO-Revision-Date: 2013-10-02 13:20+0000\n"
"POT-Creation-Date: 2013-10-17 13:47-0400\n"
"PO-Revision-Date: 2013-10-17 17:47+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n"
"MIME-Version: 1.0\n"
@ -18,51 +18,47 @@ msgstr ""
"Language: bg_BG\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: private/app.php:237
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: private/app.php:248
#: private/app.php:254
msgid "No app name specified"
msgstr ""
#: private/app.php:352
#: private/app.php:359
msgid "Help"
msgstr "Помощ"
#: private/app.php:365
#: private/app.php:372
msgid "Personal"
msgstr "Лични"
#: private/app.php:376
#: private/app.php:383
msgid "Settings"
msgstr "Настройки"
#: private/app.php:388
#: private/app.php:395
msgid "Users"
msgstr "Потребители"
#: private/app.php:401
#: private/app.php:408
msgid "Admin"
msgstr "Админ"
#: private/app.php:832
#: private/app.php:872
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
#: private/avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr ""
#: private/avatar.php:64
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr ""
#: private/avatar.php:69
#: private/avatar.php:65
msgid "Invalid image"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-16 00:26-0400\n"
"PO-Revision-Date: 2013-10-14 00:41+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n"
"MIME-Version: 1.0\n"
@ -287,12 +287,12 @@ msgstr ""
#: templates/admin.php:107
msgid ""
"cron.php is registered at a webcron service to call cron.php once a minute "
"over http."
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:115
msgid "Use systems cron service to call the cron.php file once a minute."
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:120

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-10 22:26-0400\n"
"PO-Revision-Date: 2013-10-11 02:26+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Bengali (Bangladesh) (http://www.transifex.com/projects/p/owncloud/language/bn_BD/)\n"
"MIME-Version: 1.0\n"
@ -78,3 +78,7 @@ msgstr "আপলোড বাতিল কর"
#: templates/public.php:91
msgid "No preview available for"
msgstr "এর জন্য কোন প্রাকবীক্ষণ সুলভ নয়"
#: templates/public.php:98
msgid "Direct link"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-06 19:07-0400\n"
"PO-Revision-Date: 2013-10-02 13:20+0000\n"
"POT-Creation-Date: 2013-10-17 13:47-0400\n"
"PO-Revision-Date: 2013-10-17 17:47+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Bengali (Bangladesh) (http://www.transifex.com/projects/p/owncloud/language/bn_BD/)\n"
"MIME-Version: 1.0\n"
@ -17,51 +17,47 @@ msgstr ""
"Language: bn_BD\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: private/app.php:237
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: private/app.php:248
#: private/app.php:254
msgid "No app name specified"
msgstr ""
#: private/app.php:352
#: private/app.php:359
msgid "Help"
msgstr "সহায়িকা"
#: private/app.php:365
#: private/app.php:372
msgid "Personal"
msgstr "ব্যক্তিগত"
#: private/app.php:376
#: private/app.php:383
msgid "Settings"
msgstr "নিয়ামকসমূহ"
#: private/app.php:388
#: private/app.php:395
msgid "Users"
msgstr "ব্যবহারকারী"
#: private/app.php:401
#: private/app.php:408
msgid "Admin"
msgstr "প্রশাসন"
#: private/app.php:832
#: private/app.php:872
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
#: private/avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr ""
#: private/avatar.php:64
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr ""
#: private/avatar.php:69
#: private/avatar.php:65
msgid "Invalid image"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-16 00:26-0400\n"
"PO-Revision-Date: 2013-10-14 00:41+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Bengali (Bangladesh) (http://www.transifex.com/projects/p/owncloud/language/bn_BD/)\n"
"MIME-Version: 1.0\n"
@ -287,12 +287,12 @@ msgstr ""
#: templates/admin.php:107
msgid ""
"cron.php is registered at a webcron service to call cron.php once a minute "
"over http."
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:115
msgid "Use systems cron service to call the cron.php file once a minute."
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:120

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-10 22:26-0400\n"
"PO-Revision-Date: 2013-10-11 02:26+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Bosnian (http://www.transifex.com/projects/p/owncloud/language/bs/)\n"
"MIME-Version: 1.0\n"
@ -78,3 +78,7 @@ msgstr ""
#: templates/public.php:91
msgid "No preview available for"
msgstr ""
#: templates/public.php:98
msgid "Direct link"
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-16 11:33-0400\n"
"PO-Revision-Date: 2013-09-16 15:34+0000\n"
"POT-Creation-Date: 2013-10-17 13:47-0400\n"
"PO-Revision-Date: 2013-10-17 17:47+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Bosnian (http://www.transifex.com/projects/p/owncloud/language/bs/)\n"
"MIME-Version: 1.0\n"
@ -17,322 +17,325 @@ msgstr ""
"Language: bs\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: app.php:239
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: app.php:250
#: private/app.php:254
msgid "No app name specified"
msgstr ""
#: app.php:361
#: private/app.php:359
msgid "Help"
msgstr ""
#: app.php:374
#: private/app.php:372
msgid "Personal"
msgstr ""
#: app.php:385
#: private/app.php:383
msgid "Settings"
msgstr ""
#: app.php:397
#: private/app.php:395
msgid "Users"
msgstr ""
#: app.php:410
#: private/app.php:408
msgid "Admin"
msgstr ""
#: app.php:839
#: private/app.php:872
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
#: avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr ""
#: avatar.php:64
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr ""
#: avatar.php:69
#: private/avatar.php:65
msgid "Invalid image"
msgstr ""
#: defaults.php:35
#: private/defaults.php:36
msgid "web services under your control"
msgstr ""
#: files.php:66 files.php:98
#: private/files.php:66 private/files.php:98
#, php-format
msgid "cannot open \"%s\""
msgstr ""
#: files.php:226
#: private/files.php:226
msgid "ZIP download is turned off."
msgstr ""
#: files.php:227
#: private/files.php:227
msgid "Files need to be downloaded one by one."
msgstr ""
#: files.php:228 files.php:256
#: private/files.php:228 private/files.php:256
msgid "Back to Files"
msgstr ""
#: files.php:253
#: private/files.php:253
msgid "Selected files too large to generate zip file."
msgstr ""
#: files.php:254
#: private/files.php:254
msgid ""
"Download the files in smaller chunks, seperately or kindly ask your "
"administrator."
msgstr ""
#: installer.php:63
#: private/installer.php:63
msgid "No source specified when installing app"
msgstr ""
#: installer.php:70
#: private/installer.php:70
msgid "No href specified when installing app from http"
msgstr ""
#: installer.php:75
#: private/installer.php:75
msgid "No path specified when installing app from local file"
msgstr ""
#: installer.php:89
#: private/installer.php:89
#, php-format
msgid "Archives of type %s are not supported"
msgstr ""
#: installer.php:103
#: private/installer.php:103
msgid "Failed to open archive when installing app"
msgstr ""
#: installer.php:125
#: private/installer.php:125
msgid "App does not provide an info.xml file"
msgstr ""
#: installer.php:131
#: private/installer.php:131
msgid "App can't be installed because of not allowed code in the App"
msgstr ""
#: installer.php:140
#: private/installer.php:140
msgid ""
"App can't be installed because it is not compatible with this version of "
"ownCloud"
msgstr ""
#: installer.php:146
#: private/installer.php:146
msgid ""
"App can't be installed because it contains the <shipped>true</shipped> tag "
"which is not allowed for non shipped apps"
msgstr ""
#: installer.php:152
#: private/installer.php:152
msgid ""
"App can't be installed because the version in info.xml/version is not the "
"same as the version reported from the app store"
msgstr ""
#: installer.php:162
#: private/installer.php:162
msgid "App directory already exists"
msgstr ""
#: installer.php:175
#: private/installer.php:175
#, php-format
msgid "Can't create app folder. Please fix permissions. %s"
msgstr ""
#: json.php:28
#: private/json.php:28
msgid "Application is not enabled"
msgstr ""
#: json.php:39 json.php:62 json.php:73
#: private/json.php:39 private/json.php:62 private/json.php:73
msgid "Authentication error"
msgstr ""
#: json.php:51
#: private/json.php:51
msgid "Token expired. Please reload page."
msgstr ""
#: search/provider/file.php:17 search/provider/file.php:35
#: private/search/provider/file.php:18 private/search/provider/file.php:36
msgid "Files"
msgstr ""
#: search/provider/file.php:26 search/provider/file.php:33
#: private/search/provider/file.php:27 private/search/provider/file.php:34
msgid "Text"
msgstr ""
#: search/provider/file.php:29
#: private/search/provider/file.php:30
msgid "Images"
msgstr ""
#: setup/abstractdatabase.php:22
#: private/setup/abstractdatabase.php:22
#, php-format
msgid "%s enter the database username."
msgstr ""
#: setup/abstractdatabase.php:25
#: private/setup/abstractdatabase.php:25
#, php-format
msgid "%s enter the database name."
msgstr ""
#: setup/abstractdatabase.php:28
#: private/setup/abstractdatabase.php:28
#, php-format
msgid "%s you may not use dots in the database name"
msgstr ""
#: setup/mssql.php:20
#: private/setup/mssql.php:20
#, php-format
msgid "MS SQL username and/or password not valid: %s"
msgstr ""
#: setup/mssql.php:21 setup/mysql.php:13 setup/oci.php:114
#: setup/postgresql.php:24 setup/postgresql.php:70
#: private/setup/mssql.php:21 private/setup/mysql.php:13
#: private/setup/oci.php:114 private/setup/postgresql.php:24
#: private/setup/postgresql.php:70
msgid "You need to enter either an existing account or the administrator."
msgstr ""
#: setup/mysql.php:12
#: private/setup/mysql.php:12
msgid "MySQL username and/or password not valid"
msgstr ""
#: setup/mysql.php:67 setup/oci.php:54 setup/oci.php:121 setup/oci.php:147
#: setup/oci.php:154 setup/oci.php:165 setup/oci.php:172 setup/oci.php:181
#: setup/oci.php:189 setup/oci.php:198 setup/oci.php:204
#: setup/postgresql.php:89 setup/postgresql.php:98 setup/postgresql.php:115
#: setup/postgresql.php:125 setup/postgresql.php:134
#: private/setup/mysql.php:67 private/setup/oci.php:54
#: private/setup/oci.php:121 private/setup/oci.php:147
#: private/setup/oci.php:154 private/setup/oci.php:165
#: private/setup/oci.php:172 private/setup/oci.php:181
#: private/setup/oci.php:189 private/setup/oci.php:198
#: private/setup/oci.php:204 private/setup/postgresql.php:89
#: private/setup/postgresql.php:98 private/setup/postgresql.php:115
#: private/setup/postgresql.php:125 private/setup/postgresql.php:134
#, php-format
msgid "DB Error: \"%s\""
msgstr ""
#: setup/mysql.php:68 setup/oci.php:55 setup/oci.php:122 setup/oci.php:148
#: setup/oci.php:155 setup/oci.php:166 setup/oci.php:182 setup/oci.php:190
#: setup/oci.php:199 setup/postgresql.php:90 setup/postgresql.php:99
#: setup/postgresql.php:116 setup/postgresql.php:126 setup/postgresql.php:135
#: private/setup/mysql.php:68 private/setup/oci.php:55
#: private/setup/oci.php:122 private/setup/oci.php:148
#: private/setup/oci.php:155 private/setup/oci.php:166
#: private/setup/oci.php:182 private/setup/oci.php:190
#: private/setup/oci.php:199 private/setup/postgresql.php:90
#: private/setup/postgresql.php:99 private/setup/postgresql.php:116
#: private/setup/postgresql.php:126 private/setup/postgresql.php:135
#, php-format
msgid "Offending command was: \"%s\""
msgstr ""
#: setup/mysql.php:85
#: private/setup/mysql.php:85
#, php-format
msgid "MySQL user '%s'@'localhost' exists already."
msgstr ""
#: setup/mysql.php:86
#: private/setup/mysql.php:86
msgid "Drop this user from MySQL"
msgstr ""
#: setup/mysql.php:91
#: private/setup/mysql.php:91
#, php-format
msgid "MySQL user '%s'@'%%' already exists"
msgstr ""
#: setup/mysql.php:92
#: private/setup/mysql.php:92
msgid "Drop this user from MySQL."
msgstr ""
#: setup/oci.php:34
#: private/setup/oci.php:34
msgid "Oracle connection could not be established"
msgstr ""
#: setup/oci.php:41 setup/oci.php:113
#: private/setup/oci.php:41 private/setup/oci.php:113
msgid "Oracle username and/or password not valid"
msgstr ""
#: setup/oci.php:173 setup/oci.php:205
#: private/setup/oci.php:173 private/setup/oci.php:205
#, php-format
msgid "Offending command was: \"%s\", name: %s, password: %s"
msgstr ""
#: setup/postgresql.php:23 setup/postgresql.php:69
#: private/setup/postgresql.php:23 private/setup/postgresql.php:69
msgid "PostgreSQL username and/or password not valid"
msgstr ""
#: setup.php:28
#: private/setup.php:28
msgid "Set an admin username."
msgstr ""
#: setup.php:31
#: private/setup.php:31
msgid "Set an admin password."
msgstr ""
#: setup.php:184
#: private/setup.php:184
msgid ""
"Your web server is not yet properly setup to allow files synchronization "
"because the WebDAV interface seems to be broken."
msgstr ""
#: setup.php:185
#: private/setup.php:185
#, php-format
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr ""
#: template/functions.php:96
#: private/tags.php:194
#, php-format
msgid "Could not find category \"%s\""
msgstr ""
#: private/template/functions.php:122
msgid "seconds ago"
msgstr ""
#: template/functions.php:97
#: private/template/functions.php:123
msgid "%n minute ago"
msgid_plural "%n minutes ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: template/functions.php:98
#: private/template/functions.php:124
msgid "%n hour ago"
msgid_plural "%n hours ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: template/functions.php:99
#: private/template/functions.php:125
msgid "today"
msgstr ""
#: template/functions.php:100
#: private/template/functions.php:126
msgid "yesterday"
msgstr ""
#: template/functions.php:101
#: private/template/functions.php:128
msgid "%n day go"
msgid_plural "%n days ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: template/functions.php:102
#: private/template/functions.php:130
msgid "last month"
msgstr ""
#: template/functions.php:103
#: private/template/functions.php:131
msgid "%n month ago"
msgid_plural "%n months ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: template/functions.php:104
#: private/template/functions.php:133
msgid "last year"
msgstr ""
#: template/functions.php:105
#: private/template/functions.php:134
msgid "years ago"
msgstr ""
#: template.php:297
#: private/template.php:297
msgid "Caused by:"
msgstr ""
#: vcategories.php:188 vcategories.php:249
#, php-format
msgid "Could not find category \"%s\""
msgstr ""

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-06 19:07-0400\n"
"PO-Revision-Date: 2013-10-05 15:12+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Bosnian (http://www.transifex.com/projects/p/owncloud/language/bs/)\n"
"MIME-Version: 1.0\n"
@ -157,15 +157,15 @@ msgstr ""
msgid "Updated"
msgstr ""
#: js/personal.js:225
#: js/personal.js:220
msgid "Select a profile picture"
msgstr ""
#: js/personal.js:270
#: js/personal.js:265
msgid "Decrypting files... Please wait, this can take some time."
msgstr ""
#: js/personal.js:292
#: js/personal.js:287
msgid "Saving..."
msgstr "Spašavam..."
@ -181,32 +181,32 @@ msgstr ""
msgid "Unable to remove user"
msgstr ""
#: js/users.js:92 templates/users.php:26 templates/users.php:90
#: js/users.js:95 templates/users.php:26 templates/users.php:90
#: templates/users.php:118
msgid "Groups"
msgstr ""
#: js/users.js:97 templates/users.php:92 templates/users.php:130
#: js/users.js:100 templates/users.php:92 templates/users.php:130
msgid "Group Admin"
msgstr ""
#: js/users.js:120 templates/users.php:170
#: js/users.js:123 templates/users.php:170
msgid "Delete"
msgstr ""
#: js/users.js:277
#: js/users.js:280
msgid "add group"
msgstr ""
#: js/users.js:436
#: js/users.js:442
msgid "A valid username must be provided"
msgstr ""
#: js/users.js:437 js/users.js:443 js/users.js:458
#: js/users.js:443 js/users.js:449 js/users.js:464
msgid "Error creating user"
msgstr ""
#: js/users.js:442
#: js/users.js:448
msgid "A valid password must be provided"
msgstr ""
@ -287,12 +287,12 @@ msgstr ""
#: templates/admin.php:107
msgid ""
"cron.php is registered at a webcron service to call cron.php once a minute "
"over http."
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:115
msgid "Use systems cron service to call the cron.php file once a minute."
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:120
@ -384,11 +384,11 @@ msgstr ""
msgid "Less"
msgstr ""
#: templates/admin.php:250 templates/personal.php:161
#: templates/admin.php:250 templates/personal.php:169
msgid "Version"
msgstr ""
#: templates/admin.php:254 templates/personal.php:164
#: templates/admin.php:254 templates/personal.php:172
msgid ""
"Developed by the <a href=\"http://ownCloud.org/contact\" "
"target=\"_blank\">ownCloud community</a>, the <a "
@ -527,34 +527,34 @@ msgstr ""
msgid "Language"
msgstr ""
#: templates/personal.php:119
#: templates/personal.php:126
msgid "Help translate"
msgstr ""
#: templates/personal.php:125
#: templates/personal.php:133
msgid "WebDAV"
msgstr ""
#: templates/personal.php:127
#: templates/personal.php:135
#, php-format
msgid ""
"Use this address to <a href=\"%s/server/5.0/user_manual/files/files.html\" "
"target=\"_blank\">access your Files via WebDAV</a>"
msgstr ""
#: templates/personal.php:138
#: templates/personal.php:146
msgid "Encryption"
msgstr ""
#: templates/personal.php:140
#: templates/personal.php:148
msgid "The encryption app is no longer enabled, decrypt all your file"
msgstr ""
#: templates/personal.php:146
#: templates/personal.php:154
msgid "Log-in password"
msgstr ""
#: templates/personal.php:151
#: templates/personal.php:159
msgid "Decrypt all Files"
msgstr ""

View file

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-10 22:26-0400\n"
"PO-Revision-Date: 2013-10-11 02:26+0000\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n"
"MIME-Version: 1.0\n"
@ -79,3 +79,7 @@ msgstr "Cancel·la la pujada"
#: templates/public.php:91
msgid "No preview available for"
msgstr "No hi ha vista prèvia disponible per a"
#: templates/public.php:98
msgid "Direct link"
msgstr ""

View file

@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-06 19:07-0400\n"
"PO-Revision-Date: 2013-10-02 13:20+0000\n"
"Last-Translator: rogerc\n"
"POT-Creation-Date: 2013-10-17 13:47-0400\n"
"PO-Revision-Date: 2013-10-17 17:47+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -18,51 +18,47 @@ msgstr ""
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: private/app.php:237
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr "L'aplicació \"%s\" no es pot instal·lar perquè no és compatible amb aquesta versió d'ownCloud."
#: private/app.php:248
#: private/app.php:254
msgid "No app name specified"
msgstr "No heu especificat cap nom d'aplicació"
#: private/app.php:352
#: private/app.php:359
msgid "Help"
msgstr "Ajuda"
#: private/app.php:365
#: private/app.php:372
msgid "Personal"
msgstr "Personal"
#: private/app.php:376
#: private/app.php:383
msgid "Settings"
msgstr "Configuració"
#: private/app.php:388
#: private/app.php:395
msgid "Users"
msgstr "Usuaris"
#: private/app.php:401
#: private/app.php:408
msgid "Admin"
msgstr "Administració"
#: private/app.php:832
#: private/app.php:872
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr "Ha fallat l'actualització \"%s\"."
#: private/avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr "Les imatges de perfil personals encara no funcionen amb encriptació"
#: private/avatar.php:64
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr "Tipus de fitxer desconegut"
#: private/avatar.php:69
#: private/avatar.php:65
msgid "Invalid image"
msgstr "Imatge no vàlida"

View file

@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-16 00:26-0400\n"
"PO-Revision-Date: 2013-10-14 00:41+0000\n"
"Last-Translator: rogerc\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -289,13 +289,13 @@ msgstr "Executa una tasca per cada paquet carregat"
#: templates/admin.php:107
msgid ""
"cron.php is registered at a webcron service to call cron.php once a minute "
"over http."
msgstr "cron.php està registrat en un servei webcron que fa una crida cada minut a la pàgina cron.php a través de http."
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:115
msgid "Use systems cron service to call the cron.php file once a minute."
msgstr "Utilitzeu el sistema de servei cron per cridar el fitxer cron.php cada minut."
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:120
msgid "Sharing"

View file

@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-16 00:26-0400\n"
"PO-Revision-Date: 2013-10-15 21:35+0000\n"
"Last-Translator: pstast <petr@stastny.eu>\n"
"POT-Creation-Date: 2013-10-21 13:01-0400\n"
"PO-Revision-Date: 2013-10-21 17:02+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -79,3 +79,7 @@ msgstr "Zrušit odesílání"
#: templates/public.php:91
msgid "No preview available for"
msgstr "Náhled není dostupný pro"
#: templates/public.php:98
msgid "Direct link"
msgstr ""

Some files were not shown because too many files have changed in this diff Show more