Merge branch 'master' into fixing-4011-master

This commit is contained in:
Thomas Müller 2013-10-04 14:06:42 +02:00
commit aebc330f26
484 changed files with 10455 additions and 2131 deletions

View File

@ -3,10 +3,6 @@
// only need filesystem apps
$RUNTIME_APPTYPES=array('filesystem');
// Init owncloud
require_once 'lib/template.php';
OCP\JSON::checkLoggedIn();
// Load the files
@ -26,7 +22,7 @@ $files = array();
if($mimetypes && !in_array('httpd/unix-directory', $mimetypes)) {
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, 'httpd/unix-directory' ) as $file ) {
$file['directory'] = $dir;
$file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
$file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
$file["date"] = OCP\Util::formatDate($file["mtime"]);
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
$files[] = $file;
@ -37,7 +33,7 @@ if (is_array($mimetypes) && count($mimetypes)) {
foreach ($mimetypes as $mimetype) {
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $file ) {
$file['directory'] = $dir;
$file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
$file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
$file["date"] = OCP\Util::formatDate($file["mtime"]);
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
$files[] = $file;
@ -46,7 +42,7 @@ if (is_array($mimetypes) && count($mimetypes)) {
} else {
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $file ) {
$file['directory'] = $dir;
$file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
$file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
$file["date"] = OCP\Util::formatDate($file["mtime"]);
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
$files[] = $file;

View File

@ -7,68 +7,54 @@
.actions input, .actions button, .actions .button { margin:0; float:left; }
.actions .button a { color: #555; }
.actions .button a:hover, .actions .button a:active { color: #333; }
#new {
height:17px; margin:0 0 0 1em; z-index:1010; float:left;
#new, #trash {
z-index: 1010;
float: left;
padding: 0 !important; /* override default control bar button padding */
}
#trash {
margin: 0 1em;
float: right;
}
#new>a, #trash>a {
padding: 14px 10px;
position: relative;
top: 7px;
}
#new.active {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
border-bottom: none;
}
#new.active { border-bottom-left-radius:0; border-bottom-right-radius:0; border-bottom:none; }
#new>a { padding:.5em 1.2em .3em; }
#new>ul {
display:none; position:fixed; min-width:7em; z-index:10;
padding:.5em; padding-bottom:0; margin-top:.075em; margin-left:-.5em;
display: none;
position: fixed;
min-width: 7em;
z-index: 10;
padding: .5em;
padding-bottom: 0;
margin-top: 14px;
margin-left: -1px;
text-align:left;
background:#f8f8f8; border:1px solid #ddd; border-radius:10px; border-top-left-radius:0;
background: #f8f8f8;
border: 1px solid #ddd;
border-radius: 5px;
border-top-left-radius: 0;
box-shadow:0 2px 7px rgba(170,170,170,.4);
}
#new>ul>li { height:36px; margin:.3em; padding-left:3em; padding-bottom:0.1em;
background-repeat:no-repeat; cursor:pointer; }
#new>ul>li>p { cursor:pointer; padding-top: 7px; padding-bottom: 7px;}
#new>ul>li>form>input {
padding: 5px;
margin: 2px 0;
}
#trash { margin: 0 1em; z-index:1010; float: right; }
#upload {
height:27px; padding:0; margin-left:0.2em; overflow:hidden;
}
#upload a {
position:relative; display:block; width:100%; height:27px;
cursor:pointer; z-index:10;
background-image:url('%webroot%/core/img/actions/upload.svg');
background-repeat:no-repeat;
background-position:7px 6px;
opacity:0.65;
}
.file_upload_target { display:none; }
.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; }
#file_upload_start {
left:0; top:0; width:28px; height:27px; padding:0;
font-size:1em;
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0;
z-index:20; position:relative; cursor:pointer; overflow:hidden;
}
#uploadprogresswrapper {
position: relative;
display: inline;
}
#uploadprogressbar {
position:relative;
float: left;
margin-left: 12px;
width: 130px;
height: 26px;
display:inline-block;
}
#uploadprogressbar + stop {
font-size: 13px;
}
/* FILE TABLE */
#filestable { position: relative; top:37px; width:100%; }
#filestable {
position: relative;
top: 44px;
width: 100%;
}
#filestable tbody tr { background-color:#fff; height:2.5em; }
#filestable tbody tr:hover, tbody tr:active {
background-color: rgb(240,240,240);
@ -122,9 +108,18 @@ table th#headerDate, table td.date {
/* Multiselect bar */
#filestable.multiselect {
top: 88px;
top: 95px;
}
table.multiselect thead {
position: fixed;
top: 89px;
z-index: 1;
-moz-box-sizing: border-box;
box-sizing: border-box;
left: 0;
padding-left: 80px;
width: 100%;
}
table.multiselect thead { position:fixed; top:82px; z-index:1; -moz-box-sizing: border-box; box-sizing: border-box; left: 0; padding-left: 80px; width:100%; }
table.multiselect thead th {
background-color: rgba(210,210,210,.7);
@ -228,6 +223,12 @@ table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; }
-webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms;
}
#fileList tr td.filename a.name label {
position: absolute;
width: 100%;
height: 50px;
}
#uploadsize-message,#delete-confirm { display:none; }
/* File actions */
@ -319,8 +320,6 @@ a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; }
#scanning-message{ top:40%; left:40%; position:absolute; display:none; }
div.crumb a{ padding:0.9em 0 0.7em 0; color:#555; }
table.dragshadow {
width:auto;
}

View File

@ -1,38 +1,63 @@
#upload {
height:27px; padding:0; margin-left:0.2em; overflow:hidden;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
height: 36px;
width: 39px;
padding: 0 !important; /* override default control bar button padding */
margin-left: .2em;
overflow: hidden;
vertical-align: top;
}
#upload a {
position:relative; display:block; width:100%; height:27px;
cursor:pointer; z-index:10;
background-image:url('%webroot%/core/img/actions/upload.svg');
background-repeat:no-repeat;
background-position:7px 6px;
opacity:0.65;
position: relative;
display: block;
width: 100%;
height: 44px;
width: 44px;
margin: -5px -3px;
cursor: pointer;
z-index: 10;
background-image: url('%webroot%/core/img/actions/upload.svg');
background-repeat: no-repeat;
background-position: center;
opacity: .65;
}
.file_upload_target { display:none; }
.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; }
#file_upload_start {
float: left;
left:0; top:0; width:28px; height:27px; padding:0;
font-size:1em;
position: relative;
left: 0;
top: 0;
width: 44px;
height: 44px;
margin: -5px -3px;
padding: 0;
font-size: 1em;
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0;
z-index:20; position:relative; cursor:pointer; overflow:hidden;
z-index: 20;
cursor: pointer;
overflow: hidden;
}
#uploadprogresswrapper {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
display: inline-block;
vertical-align: top;
margin:0.3em;
height: 29px;
height: 36px;
box-sizing: border-box;
}
#uploadprogresswrapper > input[type='button'] {
height: 36px;
}
#uploadprogressbar {
position:relative;
float: left;
margin-left: 12px;
width: 130px;
height: 26px;
height: 36px;
display:inline-block;
}
#uploadprogressbar + stop {

View File

@ -104,8 +104,12 @@ if ($needUpgrade) {
$storageInfo=OC_Helper::getStorageInfo($dir);
$maxUploadFilesize=OCP\Util::maxUploadFilesize($dir);
$publicUploadEnabled = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes');
// if the encryption app is disabled, than everything is fine (INIT_SUCCESSFUL status code)
$encryptionInitStatus = 2;
if (OC_App::isEnabled('files_encryption')) {
$publicUploadEnabled = 'no';
$session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
$encryptionInitStatus = $session->getInitialized();
}
$trashEnabled = \OCP\App::isEnabled('files_trashbin');
@ -133,7 +137,10 @@ if ($needUpgrade) {
$tmpl->assign('isPublic', false);
$tmpl->assign('publicUploadEnabled', $publicUploadEnabled);
$tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles());
$tmpl->assign("mailNotificationEnabled", \OC_Appconfig::getValue('core', 'shareapi_allow_mail_notification', 'yes'));
$tmpl->assign("encryptionInitStatus", $encryptionInitStatus);
$tmpl->assign('disableSharing', false);
$tmpl->assign('ajaxLoad', $ajaxLoad);
$tmpl->printPage();
}

View File

@ -63,6 +63,15 @@ Files={
}
var encryptedFiles = $('#encryptedFiles').val();
var initStatus = $('#encryptionInitStatus').val();
if (initStatus === '0') { // enc not initialized, but should be
OC.Notification.show(t('files_encryption', 'Encryption App is enabled but your keys are not initialized, please log-out and log-in again'));
return;
}
if (initStatus === '1') { // encryption tried to init but failed
OC.Notification.showHtml(t('files_encryption', 'Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files.'));
return;
}
if (encryptedFiles === '1') {
OC.Notification.show(t('files_encryption', 'Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.'));
return;

View File

@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Vaše úložiště je téměř plné ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifrování bylo vypnuto, vaše soubory jsou však stále zašifrované. Běžte prosím do osobního nastavení, kde soubory odšifrujete.",
"Your download is being prepared. This might take some time if the files are big." => "Vaše soubory ke stažení se připravují. Pokud jsou velké, může to chvíli trvat.",
"Error moving file" => "Chyba při přesunu souboru",
"Name" => "Název",
"Size" => "Velikost",
"Modified" => "Upraveno",

View File

@ -13,11 +13,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manca una cartella temporanea",
"Failed to write to disk" => "Scrittura su disco non riuscita",
"Not enough storage available" => "Spazio di archiviazione insufficiente",
"Upload failed. Could not get file info." => "Upload fallito. Impossibile ottenere informazioni sul file",
"Upload failed. Could not find uploaded file" => "Upload fallit. Impossibile trovare file caricato",
"Upload failed. Could not get file info." => "Caricamento non riuscito. Impossibile ottenere informazioni sul file.",
"Upload failed. Could not find uploaded file" => "Caricamento non riuscito. Impossibile trovare il file caricato.",
"Invalid directory." => "Cartella non valida.",
"Files" => "File",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossibile caricare {filename} poiché è una cartella oppure è di 0 byte",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.",
"Not enough space available" => "Spazio disponibile insufficiente",
"Upload cancelled." => "Invio annullato",
"Could not get result from server." => "Impossibile ottenere il risultato dal server.",

View File

@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "一時保存フォルダが見つかりません",
"Failed to write to disk" => "ディスクへの書き込みに失敗しました",
"Not enough storage available" => "ストレージに十分な空き容量がありません",
"Upload failed. Could not get file info." => "アップロードに失敗。ファイル情報を取得できませんでした。",
"Upload failed. Could not find uploaded file" => "アップロードに失敗。アップロード済みのファイルを見つけることができませんでした。",
"Invalid directory." => "無効なディレクトリです。",
"Files" => "ファイル",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "ディレクトリもしくは0バイトのため {filename} をアップロードできません",
"Not enough space available" => "利用可能なスペースが十分にありません",
"Upload cancelled." => "アップロードはキャンセルされました。",
"Could not get result from server." => "サーバから結果を取得できませんでした。",
"File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。",
"URL cannot be empty." => "URLは空にできません。",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "無効なフォルダ名です。'Shared' の利用はownCloudで予約済みです",
@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "あなたのストレージはほぼ一杯です({usedSpacePercent}%",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "暗号化の機能は無効化されましたが、ファイルはすでに暗号化されています。個人設定からファイルを複合を行ってください。",
"Your download is being prepared. This might take some time if the files are big." => "ダウンロードの準備中です。ファイルサイズが大きい場合は少し時間がかかるかもしれません。",
"Error moving file" => "ファイルの移動エラー",
"Name" => "名前",
"Size" => "サイズ",
"Modified" => "変更",

View File

@ -2,6 +2,8 @@
$TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s 항목을 이동시키지 못하였음 - 파일 이름이 이미 존재함",
"Could not move %s" => "%s 항목을 이딩시키지 못하였음",
"Unable to set upload directory." => "업로드 디렉터리를 정할수 없습니다",
"Invalid Token" => "잘못된 토큰",
"No file was uploaded. Unknown error" => "파일이 업로드되지 않았습니다. 알 수 없는 오류입니다",
"There is no error, the file uploaded with success" => "파일 업로드에 성공하였습니다.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "업로드한 파일이 php.ini의 upload_max_filesize보다 큽니다:",
@ -11,12 +13,17 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "임시 폴더가 없음",
"Failed to write to disk" => "디스크에 쓰지 못했습니다",
"Not enough storage available" => "저장소가 용량이 충분하지 않습니다.",
"Upload failed. Could not get file info." => "업로드에 실패했습니다. 파일 정보를 가져올수 없습니다.",
"Upload failed. Could not find uploaded file" => "업로드에 실패했습니다. 업로드할 파일을 찾을수 없습니다",
"Invalid directory." => "올바르지 않은 디렉터리입니다.",
"Files" => "파일",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "{filename}을 업로드 할수 없습니다. 폴더이거나 0 바이트 파일입니다.",
"Not enough space available" => "여유 공간이 부족합니다",
"Upload cancelled." => "업로드가 취소되었습니다.",
"Could not get result from server." => "서버에서 결과를 가져올수 없습니다.",
"File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.",
"URL cannot be empty." => "URL을 입력해야 합니다.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "유효하지 않은 폴더명입니다. \"Shared\" 이름의 사용은 OwnCloud 가 이미 예약하고 있습니다.",
"Error" => "오류",
"Share" => "공유",
"Delete permanently" => "영원히 삭제",
@ -28,18 +35,22 @@ $TRANSLATIONS = array(
"cancel" => "취소",
"replaced {new_name} with {old_name}" => "{old_name}이(가) {new_name}(으)로 대체됨",
"undo" => "되돌리기",
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"_Uploading %n file_::_Uploading %n files_" => array(""),
"_%n folder_::_%n folders_" => array("폴더 %n"),
"_%n file_::_%n files_" => array("파일 %n 개"),
"{dirs} and {files}" => "{dirs} 그리고 {files}",
"_Uploading %n file_::_Uploading %n files_" => array("%n 개의 파일을 업로드중"),
"'.' is an invalid file name." => "'.' 는 올바르지 않은 파일 이름 입니다.",
"File name cannot be empty." => "파일 이름이 비어 있을 수 없습니다.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "폴더 이름이 올바르지 않습니다. 이름에 문자 '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.",
"Your storage is full, files can not be updated or synced anymore!" => "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
"Your storage is almost full ({usedSpacePercent}%)" => "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "암호화는 해제되어 있지만, 파일은 아직 암호화 되어 있습니다. 개인 설저에 가셔서 암호를 해제하십시오",
"Your download is being prepared. This might take some time if the files are big." => "다운로드가 준비 중입니다. 파일 크기가 크다면 시간이 오래 걸릴 수도 있습니다.",
"Error moving file" => "파일 이동 오류",
"Name" => "이름",
"Size" => "크기",
"Modified" => "수정됨",
"%s could not be renamed" => "%s 의 이름을 변경할수 없습니다",
"Upload" => "업로드",
"File handling" => "파일 처리",
"Maximum upload size" => "최대 업로드 크기",

View File

@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Nėra laikinojo katalogo",
"Failed to write to disk" => "Nepavyko įrašyti į diską",
"Not enough storage available" => "Nepakanka vietos serveryje",
"Upload failed. Could not get file info." => "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.",
"Upload failed. Could not find uploaded file" => "Įkėlimas nepavyko. Nepavyko rasti įkelto failo",
"Invalid directory." => "Neteisingas aplankas",
"Files" => "Failai",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio",
"Not enough space available" => "Nepakanka vietos",
"Upload cancelled." => "Įkėlimas atšauktas.",
"Could not get result from server." => "Nepavyko gauti rezultato iš serverio.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.",
"URL cannot be empty." => "URL negali būti tuščias.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Negalimas aplanko pavadinimas. 'Shared' pavadinimas yra rezervuotas ownCloud",
@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifravimas buvo išjungtas, bet Jūsų failai vis dar užšifruoti. Prašome eiti į asmeninius nustatymus ir iššifruoti savo failus.",
"Your download is being prepared. This might take some time if the files are big." => "Jūsų atsisiuntimas yra paruošiamas. tai gali užtrukti jei atsisiunčiamas didelis failas.",
"Error moving file" => "Klaida perkeliant failą",
"Name" => "Pavadinimas",
"Size" => "Dydis",
"Modified" => "Pakeista",

View File

@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Brak folderu tymczasowego",
"Failed to write to disk" => "Błąd zapisu na dysk",
"Not enough storage available" => "Za mało dostępnego miejsca",
"Upload failed. Could not get file info." => "Nieudane przesłanie. Nie można pobrać informacji o pliku.",
"Upload failed. Could not find uploaded file" => "Nieudane przesłanie. Nie można znaleźć przesyłanego pliku",
"Invalid directory." => "Zła ścieżka.",
"Files" => "Pliki",
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów",
"Not enough space available" => "Za mało miejsca",
"Upload cancelled." => "Wczytywanie anulowane.",
"Could not get result from server." => "Nie można uzyskać wyniku z serwera.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.",
"URL cannot be empty." => "URL nie może być pusty.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nieprawidłowa nazwa folderu. Wykorzystanie 'Shared' jest zarezerwowane przez ownCloud",
@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Twój magazyn jest prawie pełny ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Szyfrowanie zostało wyłączone, ale nadal pliki są zaszyfrowane. Przejdź do ustawień osobistych i tam odszyfruj pliki.",
"Your download is being prepared. This might take some time if the files are big." => "Pobieranie jest przygotowywane. Może to zająć trochę czasu jeśli pliki są duże.",
"Error moving file" => "Błąd prz przenoszeniu pliku",
"Name" => "Nazwa",
"Size" => "Rozmiar",
"Modified" => "Modyfikacja",

View File

@ -84,7 +84,7 @@ class Helper
}
}
$i['directory'] = $dir;
$i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($i['mimetype']);
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
$files[] = $i;
}

View File

@ -9,7 +9,7 @@
data-type='file'><p><?php p($l->t('Text file'));?></p></li>
<li style="background-image:url('<?php p(OCP\mimetype_icon('dir')) ?>')"
data-type='folder'><p><?php p($l->t('Folder'));?></p></li>
<li style="background-image:url('<?php p(OCP\image_path('core', 'filetypes/web.svg')) ?>')"
<li style="background-image:url('<?php p(OCP\image_path('core', 'places/link.svg')) ?>')"
data-type='web'><p><?php p($l->t('From link'));?></p></li>
</ul>
</div>
@ -116,3 +116,5 @@
<input type="hidden" name="allowZipDownload" id="allowZipDownload" value="<?php p($_['allowZipDownload']); ?>" />
<input type="hidden" name="usedSpacePercent" id="usedSpacePercent" value="<?php p($_['usedSpacePercent']); ?>" />
<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']) ?>" />

View File

@ -30,16 +30,15 @@ $totalsize = 0; ?>
<?php endif; ?>
<?php if($file['type'] == 'dir'): ?>
<a class="name" href="<?php p(rtrim($_['baseURL'],'/').'/'.trim($directory,'/').'/'.$name); ?>" title="">
<?php else: ?>
<a class="name" href="<?php p(rtrim($_['downloadURL'],'/').'/'.trim($directory,'/').'/'.$name); ?>" title="">
<?php endif; ?>
<span class="nametext">
<?php if($file['type'] == 'dir'):?>
<?php print_unescaped(htmlspecialchars($file['name']));?>
<?php else:?>
<?php print_unescaped(htmlspecialchars($file['basename']));?><span class='extension'><?php p($file['extension']);?></span>
<?php endif;?>
</span>
<?php else: ?>
<a class="name" href="<?php p(rtrim($_['downloadURL'],'/').'/'.trim($directory,'/').'/'.$name); ?>">
<label class="filetext" title="" for="select-<?php p($file['fileid']); ?>"></label>
<span class="nametext"><?php print_unescaped(htmlspecialchars($file['basename']));?><span class='extension'><?php p($file['extension']);?></span>
</a>
<?php endif; ?>
<?php if($file['type'] == 'dir'):?>
<span class="uploadtext" currentUploads="0">
</span>

View File

@ -48,6 +48,7 @@ if ($decryptedKey) {
// success or failure
if ($return) {
$session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL);
\OCP\JSON::success(array('data' => array('message' => $l->t('Private key password successfully updated.'))));
} else {
\OCP\JSON::error(array('data' => array('message' => $l->t('Could not update the private key password. Maybe the old password was not correct.'))));

View File

@ -43,23 +43,6 @@ if (!OC_Config::getValue('maintenance', false)) {
if($sessionReady) {
$session = new \OCA\Encryption\Session($view);
}
$user = \OCP\USER::getUser();
// check if user has a private key
if ($sessionReady === false
|| (!$view->file_exists('/' . $user . '/files_encryption/' . $user . '.private.key')
&& OCA\Encryption\Crypt::mode() === 'server')
) {
// Force the user to log-in again if the encryption key isn't unlocked
// (happens when a user is logged in before the encryption app is
// enabled)
OCP\User::logout();
header("Location: " . OC::$WEBROOT . '/');
exit();
}
}
} else {
// logout user if we are in maintenance to force re-login

View File

@ -7,6 +7,7 @@
<author>Sam Tuke, Bjoern Schiessle, Florin Peter</author>
<require>4</require>
<shipped>true</shipped>
<rememberlogin>false</rememberlogin>
<types>
<filesystem/>
</types>

View File

@ -1 +1 @@
0.4
0.5

View File

@ -1,23 +1,33 @@
<?php
if (!isset($_)) { //also provide standalone error page
require_once __DIR__ . '/../../../lib/base.php';
$l = OC_L10N::get('files_encryption');
if (isset($_GET['i']) && $_GET['i'] === '0') {
$errorMsg = $l->t('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.');
$init = '0';
} else {
$errorMsg = $l->t('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.');
$init = '1';
}
if(isset($_GET['p']) && $_GET['p'] === '1') {
if (isset($_GET['p']) && $_GET['p'] === '1') {
header('HTTP/1.0 404 ' . $errorMsg);
}
// check if ajax request
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
// check if ajax request
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
\OCP\JSON::error(array('data' => array('message' => $errorMsg)));
} else {
header('HTTP/1.0 404 ' . $errorMsg);
$tmpl = new OC_Template('files_encryption', 'invalid_private_key', 'guest');
$tmpl->assign('message', $errorMsg);
$tmpl->assign('init', $init);
$tmpl->printPage();
}
exit;
}

View File

@ -159,7 +159,6 @@ class Hooks {
* @param array $params keys: uid, password
*/
public static function setPassphrase($params) {
// Only attempt to change passphrase if server-side encryption
// is in use (client-side encryption does not have access to
// the necessary keys)
@ -543,14 +542,18 @@ class Hooks {
}
/**
* set migration status back to '0' so that all new files get encrypted
* set migration status and the init status back to '0' so that all new files get encrypted
* if the app gets enabled again
* @param array $params contains the app ID
*/
public static function preDisable($params) {
if ($params['app'] === 'files_encryption') {
$query = \OC_DB::prepare('UPDATE `*PREFIX*encryption` SET `migration_status`=0');
$query->execute();
$setMigrationStatus = \OC_DB::prepare('UPDATE `*PREFIX*encryption` SET `migration_status`=0');
$setMigrationStatus->execute();
$session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
$session->setInitialized(\OCA\Encryption\Session::NOT_INITIALIZED);
}
}

View File

@ -1,6 +1,8 @@
/**
* Copyright (c) 2013, Sam Tuke <samtuke@owncloud.com>, Robin Appelman
* <icewind1991@gmail.com>
* Copyright (c) 2013
* Sam Tuke <samtuke@owncloud.com>
* Robin Appelman <icewind1991@gmail.com>
* Bjoern Schiessle <schiessle@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file.
*/
@ -31,11 +33,12 @@ $(document).ready(function(){
// Trigger ajax on recoveryAdmin status change
var enabledStatus = $('#adminEnableRecovery').val();
$('input:password[name="recoveryPassword"]').keyup(function(event) {
var recoveryPassword = $( '#recoveryPassword' ).val();
$('input:password[name="encryptionRecoveryPassword"]').keyup(function(event) {
var recoveryPassword = $( '#encryptionRecoveryPassword' ).val();
var recoveryPasswordRepeated = $( '#repeatEncryptionRecoveryPassword' ).val();
var checkedButton = $('input:radio[name="adminEnableRecovery"]:checked').val();
var uncheckedValue = (1+parseInt(checkedButton)) % 2;
if (recoveryPassword != '' ) {
if (recoveryPassword !== '' && recoveryPassword === recoveryPasswordRepeated) {
$('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').removeAttr("disabled");
} else {
$('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').attr("disabled", "true");
@ -46,7 +49,7 @@ $(document).ready(function(){
function() {
var recoveryStatus = $( this ).val();
var oldStatus = (1+parseInt(recoveryStatus)) % 2;
var recoveryPassword = $( '#recoveryPassword' ).val();
var recoveryPassword = $( '#encryptionRecoveryPassword' ).val();
$.post(
OC.filePath( 'files_encryption', 'ajax', 'adminrecovery.php' )
, { adminEnableRecovery: recoveryStatus, recoveryPassword: recoveryPassword }
@ -57,11 +60,10 @@ $(document).ready(function(){
} else {
OC.Notification.hide();
if (recoveryStatus === "0") {
$('button:button[name="submitChangeRecoveryKey"]').attr("disabled", "true");
$('input:password[name="changeRecoveryPassword"]').attr("disabled", "true");
$('input:password[name="changeRecoveryPassword"]').val("");
$('p[name="changeRecoveryPasswordBlock"]').addClass("hidden");
} else {
$('input:password[name="changeRecoveryPassword"]').removeAttr("disabled");
$('input:password[name="changeRecoveryPassword"]').val("");
$('p[name="changeRecoveryPasswordBlock"]').removeClass("hidden");
}
}
}
@ -72,9 +74,11 @@ $(document).ready(function(){
// change recovery password
$('input:password[name="changeRecoveryPassword"]').keyup(function(event) {
var oldRecoveryPassword = $('input:password[id="oldRecoveryPassword"]').val();
var newRecoveryPassword = $('input:password[id="newRecoveryPassword"]').val();
if (newRecoveryPassword != '' && oldRecoveryPassword != '' ) {
var oldRecoveryPassword = $('#oldEncryptionRecoveryPassword').val();
var newRecoveryPassword = $('#newEncryptionRecoveryPassword').val();
var newRecoveryPasswordRepeated = $('#repeatedNewEncryptionRecoveryPassword').val();
if (newRecoveryPassword !== '' && oldRecoveryPassword !== '' && newRecoveryPassword === newRecoveryPasswordRepeated) {
$('button:button[name="submitChangeRecoveryKey"]').removeAttr("disabled");
} else {
$('button:button[name="submitChangeRecoveryKey"]').attr("disabled", "true");
@ -83,8 +87,8 @@ $(document).ready(function(){
$('button:button[name="submitChangeRecoveryKey"]').click(function() {
var oldRecoveryPassword = $('input:password[id="oldRecoveryPassword"]').val();
var newRecoveryPassword = $('input:password[id="newRecoveryPassword"]').val();
var oldRecoveryPassword = $('#oldEncryptionRecoveryPassword').val();
var newRecoveryPassword = $('#newEncryptionRecoveryPassword').val();
OC.msg.startSaving('#encryption .msg');
$.post(
OC.filePath( 'files_encryption', 'ajax', 'changeRecoveryPassword.php' )

View File

@ -235,13 +235,16 @@ class Helper {
/**
* @brief redirect to a error page
*/
public static function redirectToErrorPage() {
public static function redirectToErrorPage($session) {
$init = $session->getInitialized();
$location = \OC_Helper::linkToAbsolute('apps/files_encryption/files', 'error.php');
$post = 0;
if(count($_POST) > 0) {
$post = 1;
}
header('Location: ' . $location . '?p=' . $post);
header('Location: ' . $location . '?p=' . $post . '&i=' . $init);
exit();
}

View File

@ -30,6 +30,11 @@ class Session {
private $view;
const NOT_INITIALIZED = '0';
const INIT_EXECUTED = '1';
const INIT_SUCCESSFUL = '2';
/**
* @brief if session is started, check if ownCloud key pair is set up, if not create it
* @param \OC_FilesystemView $view
@ -112,6 +117,36 @@ class Session {
}
/**
* @brief Sets status of encryption app
* @param string $init INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INOITIALIZED
* @return bool
*
* @note this doesn not indicate of the init was successful, we just remeber the try!
*/
public function setInitialized($init) {
\OC::$session->set('encryptionInitialized', $init);
return true;
}
/**
* @brief Gets status if we already tried to initialize the encryption app
* @returns init status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INOITIALIZED
*
* @note this doesn not indicate of the init was successful, we just remeber the try!
*/
public function getInitialized() {
if (!is_null(\OC::$session->get('encryptionInitialized'))) {
return \OC::$session->get('encryptionInitialized');
} else {
return self::NOT_INITIALIZED;
}
}
/**
* @brief Gets user or public share private key from session
* @returns string $privateKey The user's plaintext private key

View File

@ -131,7 +131,7 @@ class Stream {
if($this->privateKey === false) {
// if private key is not valid redirect user to a error page
\OCA\Encryption\Helper::redirectToErrorPage();
\OCA\Encryption\Helper::redirectToErrorPage($this->session);
}
$this->size = $this->rootView->filesize($this->rawPath, $mode);

View File

@ -37,7 +37,6 @@ class Util {
const MIGRATION_IN_PROGRESS = -1; // migration is running
const MIGRATION_OPEN = 0; // user still needs to be migrated
private $view; // OC_FilesystemView object for filesystem operations
private $userId; // ID of the currently logged-in user
private $client; // Client side encryption mode flag
@ -1752,6 +1751,11 @@ class Util {
*/
public function initEncryption($params) {
$session = new \OCA\Encryption\Session($this->view);
// we tried to initialize the encryption app for this session
$session->setInitialized(\OCA\Encryption\Session::INIT_EXECUTED);
$encryptedKey = Keymanager::getPrivateKey($this->view, $params['uid']);
$privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']);
@ -1762,9 +1766,8 @@ class Util {
return false;
}
$session = new \OCA\Encryption\Session($this->view);
$session->setPrivateKey($privateKey);
$session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL);
return $session;
}

View File

@ -17,6 +17,8 @@ $util = new \OCA\Encryption\Util($view, $user);
$session = new \OCA\Encryption\Session($view);
$privateKeySet = $session->getPrivateKey() !== false;
// did we tried to initialize the keys for this session?
$initialized = $session->getInitialized();
$recoveryAdminEnabled = OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled');
$recoveryEnabledForUser = $util->recoveryEnabledForUser();
@ -31,6 +33,7 @@ if ($recoveryAdminEnabled || !$privateKeySet) {
$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
$tmpl->assign('recoveryEnabledForUser', $recoveryEnabledForUser);
$tmpl->assign('privateKeySet', $privateKeySet);
$tmpl->assign('initialized', $initialized);
$result = $tmpl->fetchPage();
}

View File

@ -2,9 +2,11 @@
<li class='error'>
<?php $location = \OC_Helper::linkToRoute( "settings_personal" ).'#changePKPasswd' ?>
<?php p($l->t('Your private key is not valid! Maybe the your password was changed from outside.')); ?>
<?php p($_['message']); ?>
<br/>
<?php p($l->t('You can unlock your private key in your ')); ?> <a href="<?php echo $location?>"><?php p($l->t('personal settings')); ?>.</a>
<?php if($_['init']): ?>
<?php>p($l->t('Go directly to your ')); ?> <a href="<?php echo $location?>"><?php p($l->t('personal settings')); ?>.</a>
<?php endif; ?>
<br/>
</li>
</ul>

View File

@ -10,14 +10,17 @@
<?php p($l->t("Enable recovery key (allow to recover users files in case of password loss):")); ?>
<br/>
<br/>
<input type="password" name="recoveryPassword" id="recoveryPassword"/>
<input type="password" name="encryptionRecoveryPassword" id="encryptionRecoveryPassword"/>
<label for="recoveryPassword"><?php p($l->t("Recovery key password")); ?></label>
<br/>
<input type="password" name="encryptionRecoveryPassword" id="repeatEncryptionRecoveryPassword"/>
<label for="repeatEncryptionRecoveryPassword"><?php p($l->t("Repeat Recovery key password")); ?></label>
<br/>
<input
type='radio'
name='adminEnableRecovery'
value='1'
<?php echo($_["recoveryEnabled"] == 1 ? 'checked="checked"' : 'disabled'); ?> />
<?php echo($_["recoveryEnabled"] === '1' ? 'checked="checked"' : 'disabled'); ?> />
<?php p($l->t("Enabled")); ?>
<br/>
@ -25,27 +28,32 @@
type='radio'
name='adminEnableRecovery'
value='0'
<?php echo($_["recoveryEnabled"] == 0 ? 'checked="checked"' : 'disabled'); ?> />
<?php echo($_["recoveryEnabled"] === '0' ? 'checked="checked"' : 'disabled'); ?> />
<?php p($l->t("Disabled")); ?>
</p>
<br/><br/>
<p>
<p name="changeRecoveryPasswordBlock" <?php if ($_['recoveryEnabled'] === '0') print_unescaped('class="hidden"');?>>
<strong><?php p($l->t("Change recovery key password:")); ?></strong>
<br/><br/>
<input
type="password"
name="changeRecoveryPassword"
id="oldRecoveryPassword"
<?php echo($_["recoveryEnabled"] == 0 ? 'disabled' : ''); ?> />
<label for="oldRecoveryPassword"><?php p($l->t("Old Recovery key password")); ?></label>
id="oldEncryptionRecoveryPassword"
<label for="oldEncryptionRecoveryPassword"><?php p($l->t("Old Recovery key password")); ?></label>
<br/>
<br/>
<input
type="password"
name="changeRecoveryPassword"
id="newRecoveryPassword"
<?php echo($_["recoveryEnabled"] == 0 ? 'disabled' : ''); ?> />
<label for="newRecoveryPassword"><?php p($l->t("New Recovery key password")); ?></label>
id="newEncryptionRecoveryPassword"
<label for="newEncryptionRecoveryPassword"><?php p($l->t("New Recovery key password")); ?></label>
<br/>
<input
type="password"
name="changeRecoveryPassword"
id="repeatedNewEncryptionRecoveryPassword"
<label for="repeatEncryptionRecoveryPassword"><?php p($l->t("Repeat New Recovery key password")); ?></label>
<br/>
<button
type="button"

View File

@ -4,7 +4,7 @@
<?php p( $l->t( 'Encryption' ) ); ?>
</legend>
<?php if ( ! $_["privateKeySet"] ): ?>
<?php if ( ! $_["privateKeySet"] && $_["initialized"] ): ?>
<p>
<a name="changePKPasswd" />
<label for="changePrivateKeyPasswd">

View File

@ -1,7 +1,14 @@
<?php
$TRANSLATIONS = array(
"The password is wrong. Try again." => "비밀번호가 틀립니다. 다시 입력해주세요.",
"Password" => "암호",
"Submit" => "제출",
"Sorry, this link doesnt seem to work anymore." => "죄송합니다만 이 링크는 더이상 작동되지 않습니다.",
"Reasons might be:" => "이유는 다음과 같을 수 있습니다:",
"the item was removed" => "이 항목은 삭제되었습니다",
"the link expired" => "링크가 만료되었습니다",
"sharing is disabled" => "공유가 비활성되었습니다",
"For more info, please ask the person who sent this link." => "더 자세한 설명은 링크를 보내신 분에게 여쭤보십시오",
"%s shared the folder %s with you" => "%s 님이 폴더 %s을(를) 공유하였습니다",
"%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다",
"Download" => "다운로드",

View File

@ -188,7 +188,7 @@ if (isset($path)) {
} else {
$i['extension'] = '';
}
$i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($i['mimetype']);
}
$i['directory'] = $getPath;
$i['permissions'] = OCP\PERMISSION_READ;

View File

@ -1,11 +1,19 @@
<?php
$TRANSLATIONS = array(
"Couldn't delete %s permanently" => "%s를 영구적으로 삭제할수 없습니다",
"Couldn't restore %s" => "%s를 복원할수 없습니다",
"perform restore operation" => "복원 작업중",
"Error" => "오류",
"delete file permanently" => "영구적으로 파일 삭제하기",
"Delete permanently" => "영원히 삭제",
"Name" => "이름",
"_%n folder_::_%n folders_" => array(""),
"_%n file_::_%n files_" => array(""),
"Deleted" => "삭제됨",
"_%n folder_::_%n folders_" => array("폴더 %n개"),
"_%n file_::_%n files_" => array("파일 %n개 "),
"restored" => "복원됨",
"Nothing in here. Your trash bin is empty!" => "현재 휴지통은 비어있습니다!",
"Restore" => "복원",
"Delete" => "삭제"
"Delete" => "삭제",
"Deleted Files" => "삭제된 파일들"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";

View File

@ -61,7 +61,7 @@ class Helper
$i['directory'] = '';
}
$i['permissions'] = \OCP\PERMISSION_READ;
$i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($r['mime']);
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($r['mime']);
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
$files[] = $i;
}

View File

@ -2,6 +2,9 @@
$TRANSLATIONS = array(
"Could not revert: %s" => "되돌릴 수 없습니다: %s",
"Versions" => "버전",
"Failed to revert {file} to revision {timestamp}." => "{timestamp} 판의 {file}로 돌리는데 실패했습니다.",
"More versions..." => "더 많은 버전들...",
"No other versions available" => "다른 버전을 사용할수 없습니다",
"Restore" => "복원"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";

View File

@ -27,5 +27,6 @@ OCP\JSON::checkAppEnabled('user_ldap');
OCP\JSON::callCheck();
$prefix = $_POST['ldap_serverconfig_chooser'];
$connection = new \OCA\user_ldap\lib\Connection($prefix);
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, $prefix);
OCP\JSON::success(array('configuration' => $connection->getConfiguration()));

View File

@ -27,7 +27,8 @@ OCP\JSON::checkAppEnabled('user_ldap');
OCP\JSON::callCheck();
$prefix = $_POST['ldap_serverconfig_chooser'];
$connection = new \OCA\user_ldap\lib\Connection($prefix);
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, $prefix);
$connection->setConfiguration($_POST);
$connection->saveConfiguration();
OCP\JSON::success();

View File

@ -28,7 +28,8 @@ OCP\JSON::callCheck();
$l=OC_L10N::get('user_ldap');
$connection = new \OCA\user_ldap\lib\Connection('', null);
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, '', null);
if($connection->setConfiguration($_POST)) {
//Configuration is okay
if($connection->bind()) {

View File

@ -24,15 +24,15 @@
OCP\App::registerAdmin('user_ldap', 'settings');
$configPrefixes = OCA\user_ldap\lib\Helper::getServerConfigurationPrefixes(true);
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
if(count($configPrefixes) === 1) {
$connector = new OCA\user_ldap\lib\Connection($configPrefixes[0]);
$userBackend = new OCA\user_ldap\USER_LDAP();
$userBackend->setConnector($connector);
$groupBackend = new OCA\user_ldap\GROUP_LDAP();
$groupBackend->setConnector($connector);
$connector = new OCA\user_ldap\lib\Connection($ldapWrapper, $configPrefixes[0]);
$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 {
$userBackend = new OCA\user_ldap\User_Proxy($configPrefixes);
$groupBackend = new OCA\user_ldap\Group_Proxy($configPrefixes);
$userBackend = new OCA\user_ldap\User_Proxy($configPrefixes, $ldapWrapper);
$groupBackend = new OCA\user_ldap\Group_Proxy($configPrefixes, $ldapWrapper);
}
if(count($configPrefixes) > 0) {

View File

@ -23,13 +23,16 @@
namespace OCA\user_ldap;
class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
use OCA\user_ldap\lib\Access;
use OCA\user_ldap\lib\BackendUtility;
class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
protected $enabled = false;
public function setConnector(lib\Connection &$connection) {
parent::setConnector($connection);
$filter = $this->connection->ldapGroupFilter;
$gassoc = $this->connection->ldapGroupMemberAssocAttr;
public function __construct(Access $access) {
parent::__construct($access);
$filter = $this->access->connection->ldapGroupFilter;
$gassoc = $this->access->connection->ldapGroupMemberAssocAttr;
if(!empty($filter) && !empty($gassoc)) {
$this->enabled = true;
}
@ -47,30 +50,31 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
if(!$this->enabled) {
return false;
}
if($this->connection->isCached('inGroup'.$uid.':'.$gid)) {
return $this->connection->getFromCache('inGroup'.$uid.':'.$gid);
if($this->access->connection->isCached('inGroup'.$uid.':'.$gid)) {
return $this->access->connection->getFromCache('inGroup'.$uid.':'.$gid);
}
$dn_user = $this->username2dn($uid);
$dn_group = $this->groupname2dn($gid);
$dn_user = $this->access->username2dn($uid);
$dn_group = $this->access->groupname2dn($gid);
// just in case
if(!$dn_group || !$dn_user) {
$this->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
$this->access->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
return false;
}
//usually, LDAP attributes are said to be case insensitive. But there are exceptions of course.
$members = $this->readAttribute($dn_group, $this->connection->ldapGroupMemberAssocAttr);
$members = $this->access->readAttribute($dn_group,
$this->access->connection->ldapGroupMemberAssocAttr);
if(!$members) {
$this->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
$this->access->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
return false;
}
//extra work if we don't get back user DNs
//TODO: this can be done with one LDAP query
if(strtolower($this->connection->ldapGroupMemberAssocAttr) === 'memberuid') {
if(strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'memberuid') {
$dns = array();
foreach($members as $mid) {
$filter = str_replace('%uid', $mid, $this->connection->ldapLoginFilter);
$ldap_users = $this->fetchListOfUsers($filter, 'dn');
$filter = str_replace('%uid', $mid, $this->access->connection->ldapLoginFilter);
$ldap_users = $this->access->fetchListOfUsers($filter, 'dn');
if(count($ldap_users) < 1) {
continue;
}
@ -80,7 +84,7 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
}
$isInGroup = in_array($dn_user, $members);
$this->connection->writeToCache('inGroup'.$uid.':'.$gid, $isInGroup);
$this->access->connection->writeToCache('inGroup'.$uid.':'.$gid, $isInGroup);
return $isInGroup;
}
@ -98,35 +102,36 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
return array();
}
$cacheKey = 'getUserGroups'.$uid;
if($this->connection->isCached($cacheKey)) {
return $this->connection->getFromCache($cacheKey);
if($this->access->connection->isCached($cacheKey)) {
return $this->access->connection->getFromCache($cacheKey);
}
$userDN = $this->username2dn($uid);
$userDN = $this->access->username2dn($uid);
if(!$userDN) {
$this->connection->writeToCache($cacheKey, array());
$this->access->connection->writeToCache($cacheKey, array());
return array();
}
//uniqueMember takes DN, memberuid the uid, so we need to distinguish
if((strtolower($this->connection->ldapGroupMemberAssocAttr) === 'uniquemember')
|| (strtolower($this->connection->ldapGroupMemberAssocAttr) === 'member')
if((strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'uniquemember')
|| (strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'member')
) {
$uid = $userDN;
} else if(strtolower($this->connection->ldapGroupMemberAssocAttr) === 'memberuid') {
$result = $this->readAttribute($userDN, 'uid');
} else if(strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'memberuid') {
$result = $this->access->readAttribute($userDN, 'uid');
$uid = $result[0];
} else {
// just in case
$uid = $userDN;
}
$filter = $this->combineFilterWithAnd(array(
$this->connection->ldapGroupFilter,
$this->connection->ldapGroupMemberAssocAttr.'='.$uid
$filter = $this->access->combineFilterWithAnd(array(
$this->access->connection->ldapGroupFilter,
$this->access->connection->ldapGroupMemberAssocAttr.'='.$uid
));
$groups = $this->fetchListOfGroups($filter, array($this->connection->ldapGroupDisplayName, 'dn'));
$groups = array_unique($this->ownCloudGroupNames($groups), SORT_LOCALE_STRING);
$this->connection->writeToCache($cacheKey, $groups);
$groups = $this->access->fetchListOfGroups($filter,
array($this->access->connection->ldapGroupDisplayName, 'dn'));
$groups = array_unique($this->access->ownCloudGroupNames($groups), SORT_LOCALE_STRING);
$this->access->connection->writeToCache($cacheKey, $groups);
return $groups;
}
@ -144,70 +149,71 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
}
$cachekey = 'usersInGroup-'.$gid.'-'.$search.'-'.$limit.'-'.$offset;
// check for cache of the exact query
$groupUsers = $this->connection->getFromCache($cachekey);
$groupUsers = $this->access->connection->getFromCache($cachekey);
if(!is_null($groupUsers)) {
return $groupUsers;
}
// check for cache of the query without limit and offset
$groupUsers = $this->connection->getFromCache('usersInGroup-'.$gid.'-'.$search);
$groupUsers = $this->access->connection->getFromCache('usersInGroup-'.$gid.'-'.$search);
if(!is_null($groupUsers)) {
$groupUsers = array_slice($groupUsers, $offset, $limit);
$this->connection->writeToCache($cachekey, $groupUsers);
$this->access->connection->writeToCache($cachekey, $groupUsers);
return $groupUsers;
}
if($limit === -1) {
$limit = null;
}
$groupDN = $this->groupname2dn($gid);
$groupDN = $this->access->groupname2dn($gid);
if(!$groupDN) {
// group couldn't be found, return empty resultset
$this->connection->writeToCache($cachekey, array());
$this->access->connection->writeToCache($cachekey, array());
return array();
}
$members = $this->readAttribute($groupDN, $this->connection->ldapGroupMemberAssocAttr);
$members = $this->access->readAttribute($groupDN,
$this->access->connection->ldapGroupMemberAssocAttr);
if(!$members) {
//in case users could not be retrieved, return empty resultset
$this->connection->writeToCache($cachekey, array());
$this->access->connection->writeToCache($cachekey, array());
return array();
}
$groupUsers = array();
$isMemberUid = (strtolower($this->connection->ldapGroupMemberAssocAttr) === 'memberuid');
$isMemberUid = (strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'memberuid');
foreach($members as $member) {
if($isMemberUid) {
//we got uids, need to get their DNs to 'tranlsate' them to usernames
$filter = $this->combineFilterWithAnd(array(
$filter = $this->access->combineFilterWithAnd(array(
\OCP\Util::mb_str_replace('%uid', $member,
$this->connection->ldapLoginFilter, 'UTF-8'),
$this->getFilterPartForUserSearch($search)
$this->access->connection->ldapLoginFilter, 'UTF-8'),
$this->access->getFilterPartForUserSearch($search)
));
$ldap_users = $this->fetchListOfUsers($filter, 'dn');
$ldap_users = $this->access->fetchListOfUsers($filter, 'dn');
if(count($ldap_users) < 1) {
continue;
}
$groupUsers[] = $this->dn2username($ldap_users[0]);
$groupUsers[] = $this->access->dn2username($ldap_users[0]);
} else {
//we got DNs, check if we need to filter by search or we can give back all of them
if(!empty($search)) {
if(!$this->readAttribute($member,
$this->connection->ldapUserDisplayName,
$this->getFilterPartForUserSearch($search))) {
if(!$this->access->readAttribute($member,
$this->access->connection->ldapUserDisplayName,
$this->access->getFilterPartForUserSearch($search))) {
continue;
}
}
// dn2username will also check if the users belong to the allowed base
if($ocname = $this->dn2username($member)) {
if($ocname = $this->access->dn2username($member)) {
$groupUsers[] = $ocname;
}
}
}
natsort($groupUsers);
$this->connection->writeToCache('usersInGroup-'.$gid.'-'.$search, $groupUsers);
$this->access->connection->writeToCache('usersInGroup-'.$gid.'-'.$search, $groupUsers);
$groupUsers = array_slice($groupUsers, $offset, $limit);
$this->connection->writeToCache($cachekey, $groupUsers);
$this->access->connection->writeToCache($cachekey, $groupUsers);
return $groupUsers;
}
@ -245,7 +251,7 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
//Check cache before driving unnecessary searches
\OCP\Util::writeLog('user_ldap', 'getGroups '.$cachekey, \OCP\Util::DEBUG);
$ldap_groups = $this->connection->getFromCache($cachekey);
$ldap_groups = $this->access->connection->getFromCache($cachekey);
if(!is_null($ldap_groups)) {
return $ldap_groups;
}
@ -255,16 +261,18 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
if($limit <= 0) {
$limit = null;
}
$filter = $this->combineFilterWithAnd(array(
$this->connection->ldapGroupFilter,
$this->getFilterPartForGroupSearch($search)
$filter = $this->access->combineFilterWithAnd(array(
$this->access->connection->ldapGroupFilter,
$this->access->getFilterPartForGroupSearch($search)
));
\OCP\Util::writeLog('user_ldap', 'getGroups Filter '.$filter, \OCP\Util::DEBUG);
$ldap_groups = $this->fetchListOfGroups($filter, array($this->connection->ldapGroupDisplayName, 'dn'),
$limit, $offset);
$ldap_groups = $this->ownCloudGroupNames($ldap_groups);
$ldap_groups = $this->access->fetchListOfGroups($filter,
array($this->access->connection->ldapGroupDisplayName, 'dn'),
$limit,
$offset);
$ldap_groups = $this->access->ownCloudGroupNames($ldap_groups);
$this->connection->writeToCache($cachekey, $ldap_groups);
$this->access->connection->writeToCache($cachekey, $ldap_groups);
return $ldap_groups;
}
@ -278,25 +286,26 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
* @return bool
*/
public function groupExists($gid) {
if($this->connection->isCached('groupExists'.$gid)) {
return $this->connection->getFromCache('groupExists'.$gid);
if($this->access->connection->isCached('groupExists'.$gid)) {
return $this->access->connection->getFromCache('groupExists'.$gid);
}
//getting dn, if false the group does not exist. If dn, it may be mapped only, requires more checking.
$dn = $this->groupname2dn($gid);
//getting dn, if false the group does not exist. If dn, it may be mapped
//only, requires more checking.
$dn = $this->access->groupname2dn($gid);
if(!$dn) {
$this->connection->writeToCache('groupExists'.$gid, false);
$this->access->connection->writeToCache('groupExists'.$gid, false);
return false;
}
//if group really still exists, we will be able to read its objectclass
$objcs = $this->readAttribute($dn, 'objectclass');
$objcs = $this->access->readAttribute($dn, 'objectclass');
if(!$objcs || empty($objcs)) {
$this->connection->writeToCache('groupExists'.$gid, false);
$this->access->connection->writeToCache('groupExists'.$gid, false);
return false;
}
$this->connection->writeToCache('groupExists'.$gid, true);
$this->access->connection->writeToCache('groupExists'.$gid, true);
return true;
}

View File

@ -23,6 +23,8 @@
namespace OCA\user_ldap;
use OCA\user_ldap\lib\ILDAPWrapper;
class Group_Proxy extends lib\Proxy implements \OCP\GroupInterface {
private $backends = array();
private $refBackend = null;
@ -31,12 +33,11 @@ class Group_Proxy extends lib\Proxy implements \OCP\GroupInterface {
* @brief Constructor
* @param $serverConfigPrefixes array containing the config Prefixes
*/
public function __construct($serverConfigPrefixes) {
parent::__construct();
public function __construct($serverConfigPrefixes, ILDAPWrapper $ldap) {
parent::__construct($ldap);
foreach($serverConfigPrefixes as $configPrefix) {
$this->backends[$configPrefix] = new \OCA\user_ldap\GROUP_LDAP();
$connector = $this->getConnector($configPrefix);
$this->backends[$configPrefix]->setConnector($connector);
$this->backends[$configPrefix] =
new \OCA\user_ldap\GROUP_LDAP($this->getAccess($configPrefix));
if(is_null($this->refBackend)) {
$this->refBackend = &$this->backends[$configPrefix];
}

View File

@ -72,6 +72,7 @@ $TRANSLATIONS = array(
"User Home Folder Naming Rule" => "A home könyvtár elérési útvonala",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Hagyja üresen, ha a felhasználónevet kívánja használni. Ellenkező esetben adjon meg egy LDAP/AD attribútumot!",
"Internal Username" => "Belső felhasználónév",
"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." => "Alapértelmezetten a belső felhasználónév az UUID tulajdonságból jön létre. Ez biztosítja a felhasználónév egyediségét és hogy a nem kell konvertálni a karaktereket benne. A belső felhasználónévnél a megkötés az, hogy csak a következő karakterek engdélyezettek benne: [ a-zA-Z0-9_.@- ]. Ezeken a karaktereken kivül minden karakter le lesz cserélve az adott karakter ASCII kódtáblában használható párjára vagy ha ilyen nincs akkor egyszerűen ki lesz hagyva. Ha így mégis ütköznének a nevek akkor hozzá lesz füzve egy folyamatosan növekvő számláló rész. A belső felhasználónevet lehet használni a felhasználó azonosítására a programon belül. Illetve ez lesz az alapáértelmezett neve a felhasználó kezdő könyvtárának az ownCloud-ban. Illetve...............................",
"Internal Username Attribute:" => "A belső felhasználónév attribútuma:",
"Override UUID detection" => "Az UUID-felismerés felülbírálása",
"UUID Attribute:" => "UUID attribútum:",

View File

@ -23,12 +23,13 @@
namespace OCA\user_ldap\lib;
abstract class Access {
protected $connection;
class Access extends LDAPUtility {
public $connection;
//never ever check this var directly, always use getPagedSearchResultState
protected $pagedSearchedSuccessful;
public function setConnector(Connection &$connection) {
public function __construct(Connection $connection, ILDAPWrapper $ldap) {
parent::__construct($ldap);
$this->connection = $connection;
}
@ -54,14 +55,14 @@ abstract class Access {
return false;
}
$cr = $this->connection->getConnectionResource();
if(!is_resource($cr)) {
if(!$this->ldap->isResource($cr)) {
//LDAP not available
\OCP\Util::writeLog('user_ldap', 'LDAP resource not available.', \OCP\Util::DEBUG);
return false;
}
$dn = $this->DNasBaseParameter($dn);
$rr = @ldap_read($cr, $dn, $filter, array($attr));
if(!is_resource($rr)) {
$rr = @$this->ldap->read($cr, $dn, $filter, array($attr));
if(!$this->ldap->isResource($rr)) {
if(!empty($attr)) {
//do not throw this message on userExists check, irritates
\OCP\Util::writeLog('user_ldap', 'readAttribute failed for DN '.$dn, \OCP\Util::DEBUG);
@ -73,13 +74,14 @@ abstract class Access {
\OCP\Util::writeLog('user_ldap', 'readAttribute: '.$dn.' found', \OCP\Util::DEBUG);
return array();
}
$er = ldap_first_entry($cr, $rr);
if(!is_resource($er)) {
$er = $this->ldap->firstEntry($cr, $rr);
if(!$this->ldap->isResource($er)) {
//did not match the filter, return false
return false;
}
//LDAP attributes are not case sensitive
$result = \OCP\Util::mb_array_change_key_case(ldap_get_attributes($cr, $er), MB_CASE_LOWER, 'UTF-8');
$result = \OCP\Util::mb_array_change_key_case(
$this->ldap->getAttributes($cr, $er), MB_CASE_LOWER, 'UTF-8');
$attr = mb_strtolower($attr, 'UTF-8');
if(isset($result[$attr]) && $result[$attr]['count'] > 0) {
@ -653,7 +655,7 @@ abstract class Access {
// See if we have a resource, in case not cancel with message
$link_resource = $this->connection->getConnectionResource();
if(!is_resource($link_resource)) {
if(!$this->ldap->isResource($link_resource)) {
// Seems like we didn't find any resource.
// Return an empty array just like before.
\OCP\Util::writeLog('user_ldap', 'Could not search, because resource is missing.', \OCP\Util::DEBUG);
@ -664,11 +666,12 @@ abstract class Access {
$pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, $limit, $offset);
$linkResources = array_pad(array(), count($base), $link_resource);
$sr = ldap_search($linkResources, $base, $filter, $attr);
$error = ldap_errno($link_resource);
$sr = $this->ldap->search($linkResources, $base, $filter, $attr);
$error = $this->ldap->errno($link_resource);
if(!is_array($sr) || $error !== 0) {
\OCP\Util::writeLog('user_ldap',
'Error when searching: '.ldap_error($link_resource).' code '.ldap_errno($link_resource),
'Error when searching: '.$this->ldap->error($link_resource).
' code '.$this->ldap->errno($link_resource),
\OCP\Util::ERROR);
\OCP\Util::writeLog('user_ldap', 'Attempt for Paging? '.print_r($pagedSearchOK, true), \OCP\Util::ERROR);
return array();
@ -677,19 +680,19 @@ abstract class Access {
// Do the server-side sorting
foreach(array_reverse($attr) as $sortAttr){
foreach($sr as $searchResource) {
ldap_sort($link_resource, $searchResource, $sortAttr);
$this->ldap->sort($link_resource, $searchResource, $sortAttr);
}
}
$findings = array();
foreach($sr as $key => $res) {
$findings = array_merge($findings, ldap_get_entries($link_resource, $res ));
$findings = array_merge($findings, $this->ldap->getEntries($link_resource, $res ));
}
if($pagedSearchOK) {
\OCP\Util::writeLog('user_ldap', 'Paged search successful', \OCP\Util::INFO);
foreach($sr as $key => $res) {
$cookie = null;
if(ldap_control_paged_result_response($link_resource, $res, $cookie)) {
if($this->ldap->controlPagedResultResponse($link_resource, $res, $cookie)) {
\OCP\Util::writeLog('user_ldap', 'Set paged search cookie', \OCP\Util::INFO);
$this->setPagedResultCookie($base[$key], $filter, $limit, $offset, $cookie);
}
@ -1103,8 +1106,9 @@ abstract class Access {
if($offset > 0) {
\OCP\Util::writeLog('user_ldap', 'Cookie '.$cookie, \OCP\Util::INFO);
}
$pagedSearchOK = ldap_control_paged_result($this->connection->getConnectionResource(),
$limit, false, $cookie);
$pagedSearchOK = $this->ldap->controlPagedResult(
$this->connection->getConnectionResource(), $limit,
false, $cookie);
if(!$pagedSearchOK) {
return false;
}

View File

@ -0,0 +1,38 @@
<?php
/**
* ownCloud LDAP BackendUtility
*
* @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;
use OCA\user_ldap\lib\Access;
abstract class BackendUtility {
protected $access;
/**
* @brief constructor, make sure the subclasses call this one!
* @param $access an instance of Access for LDAP interaction
*/
public function __construct(Access $access) {
$this->access = $access;
}
}

View File

@ -23,7 +23,7 @@
namespace OCA\user_ldap\lib;
class Connection {
class Connection extends LDAPUtility {
private $ldapConnectionRes = null;
private $configPrefix;
private $configID;
@ -60,7 +60,7 @@ class Connection {
'ldapQuotaDefault' => null,
'ldapEmailAttribute' => null,
'ldapCacheTTL' => null,
'ldapUuidAttribute' => null,
'ldapUuidAttribute' => 'auto',
'ldapOverrideUuidAttribute' => null,
'ldapOverrideMainServer' => false,
'ldapConfigurationActive' => false,
@ -77,7 +77,8 @@ class Connection {
* @param $configPrefix a string with the prefix for the configkey column (appconfig table)
* @param $configID a string with the value for the appid column (appconfig table) or null for on-the-fly connections
*/
public function __construct($configPrefix = '', $configID = 'user_ldap') {
public function __construct(ILDAPWrapper $ldap, $configPrefix = '', $configID = 'user_ldap') {
parent::__construct($ldap);
$this->configPrefix = $configPrefix;
$this->configID = $configID;
$memcache = new \OC\Memcache\Factory();
@ -86,13 +87,14 @@ class Connection {
} else {
$this->cache = \OC_Cache::getGlobalCache();
}
$this->config['hasPagedResultSupport'] = (function_exists('ldap_control_paged_result')
&& function_exists('ldap_control_paged_result_response'));
$this->config['hasPagedResultSupport'] =
$this->ldap->hasPagedResultSupport();
}
public function __destruct() {
if(!$this->dontDestruct && is_resource($this->ldapConnectionRes)) {
@ldap_unbind($this->ldapConnectionRes);
if(!$this->dontDestruct &&
$this->ldap->isResource($this->ldapConnectionRes)) {
@$this->ldap->unbind($this->ldapConnectionRes);
};
}
@ -148,7 +150,7 @@ class Connection {
public function getConnectionResource() {
if(!$this->ldapConnectionRes) {
$this->init();
} else if(!is_resource($this->ldapConnectionRes)) {
} else if(!$this->ldap->isResource($this->ldapConnectionRes)) {
$this->ldapConnectionRes = null;
$this->establishConnection();
}
@ -361,6 +363,14 @@ class Connection {
&& $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;
@ -386,7 +396,8 @@ class Connection {
public function saveConfiguration() {
$trans = array_flip($this->getConfigTranslationArray());
foreach($this->config as $key => $value) {
\OCP\Util::writeLog('user_ldap', 'LDAP: storing key '.$key.' value '.$value, \OCP\Util::DEBUG);
\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);
@ -431,8 +442,9 @@ class Connection {
$config[$dbKey] = '';
}
continue;
} else if((strpos($classKey, 'ldapBase') !== false)
|| (strpos($classKey, 'ldapAttributes') !== false)) {
} else if((strpos($classKey, 'ldapBase') !== false
|| strpos($classKey, 'ldapAttributes') !== false)
&& is_array($this->config[$classKey])) {
$config[$dbKey] = implode("\n", $this->config[$classKey]);
continue;
}
@ -551,7 +563,7 @@ class Connection {
* @returns an associative array with the default values. Keys are correspond
* to config-value entries in the database table
*/
public function getDefaults() {
static public function getDefaults() {
return array(
'ldap_host' => '',
'ldap_port' => '389',
@ -603,7 +615,7 @@ class Connection {
return false;
}
if(!$this->ldapConnectionRes) {
if(!function_exists('ldap_connect')) {
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.',
@ -623,7 +635,8 @@ class Connection {
if(!$this->config['ldapOverrideMainServer'] && !$this->getFromCache('overrideMainServer')) {
$this->doConnect($this->config['ldapHost'], $this->config['ldapPort']);
$bindStatus = $this->bind();
$error = is_resource($this->ldapConnectionRes) ? ldap_errno($this->ldapConnectionRes) : -1;
$error = $this->ldap->isResource($this->ldapConnectionRes) ?
$this->ldap->errno($this->ldapConnectionRes) : -1;
} else {
$bindStatus = false;
$error = null;
@ -653,11 +666,11 @@ class Connection {
//ldap_connect ignores port paramater when URLs are passed
$host .= ':' . $port;
}
$this->ldapConnectionRes = ldap_connect($host, $port);
if(ldap_set_option($this->ldapConnectionRes, LDAP_OPT_PROTOCOL_VERSION, 3)) {
if(ldap_set_option($this->ldapConnectionRes, LDAP_OPT_REFERRALS, 0)) {
$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']) {
ldap_start_tls($this->ldapConnectionRes);
$this->ldap->startTls($this->ldapConnectionRes);
}
}
}
@ -678,13 +691,15 @@ class Connection {
$getConnectionResourceAttempt = true;
$cr = $this->getConnectionResource();
$getConnectionResourceAttempt = false;
if(!is_resource($cr)) {
if(!$this->ldap->isResource($cr)) {
return false;
}
$ldapLogin = @ldap_bind($cr, $this->config['ldapAgentName'], $this->config['ldapAgentPassword']);
$ldapLogin = @$this->ldap->bind($cr,
$this->config['ldapAgentName'],
$this->config['ldapAgentPassword']);
if(!$ldapLogin) {
\OCP\Util::writeLog('user_ldap',
'Bind failed: ' . ldap_errno($cr) . ': ' . ldap_error($cr),
'Bind failed: ' . $this->ldap->errno($cr) . ': ' . $this->ldap->error($cr),
\OCP\Util::ERROR);
$this->ldapConnectionRes = null;
return false;

View File

@ -0,0 +1,180 @@
<?php
/**
* ownCloud LDAP Wrapper Interface
*
* @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;
interface ILDAPWrapper {
//LDAP functions in use
/**
* @brief Bind to LDAP directory
* @param $link LDAP link resource
* @param $dn an RDN to log in with
* @param $password the password
* @return true on success, false otherwise
*
* with $dn and $password as null a anonymous bind is attempted.
*/
public function bind($link, $dn, $password);
/**
* @brief connect to an LDAP server
* @param $host The host to connect to
* @param $port The port to connect to
* @return a link resource on success, otherwise false
*/
public function connect($host, $port);
/**
* @brief Send LDAP pagination control
* @param $link LDAP link resource
* @param $pagesize number of results per page
* @param $isCritical Indicates whether the pagination is critical of not.
* @param $cookie structure sent by LDAP server
* @return true on success, false otherwise
*/
public function controlPagedResult($link, $pagesize, $isCritical, $cookie);
/**
* @brief Retrieve the LDAP pagination cookie
* @param $link LDAP link resource
* @param $result LDAP result resource
* @param $cookie structure sent by LDAP server
* @return true on success, false otherwise
*
* Corresponds to ldap_control_paged_result_response
*/
public function controlPagedResultResponse($link, $result, &$cookie);
/**
* @brief Return the LDAP error number of the last LDAP command
* @param $link LDAP link resource
* @return error message as string
*/
public function errno($link);
/**
* @brief Return the LDAP error message of the last LDAP command
* @param $link LDAP link resource
* @return error code as integer
*/
public function error($link);
/**
* @brief Return first result id
* @param $link LDAP link resource
* @param $result LDAP result resource
* @return an LDAP search result resource
* */
public function firstEntry($link, $result);
/**
* @brief Get attributes from a search result entry
* @param $link LDAP link resource
* @param $result LDAP result resource
* @return array containing the results, false on error
* */
public function getAttributes($link, $result);
/**
* @brief Get all result entries
* @param $link LDAP link resource
* @param $result LDAP result resource
* @return array containing the results, false on error
*/
public function getEntries($link, $result);
/**
* @brief Read an entry
* @param $link LDAP link resource
* @param $baseDN The DN of the entry to read from
* @param $filter An LDAP filter
* @param $attr array of the attributes to read
* @return an LDAP search result resource
*/
public function read($link, $baseDN, $filter, $attr);
/**
* @brief Search LDAP tree
* @param $link LDAP link resource
* @param $baseDN The DN of the entry to read from
* @param $filter An LDAP filter
* @param $attr array of the attributes to read
* @return an LDAP search result resource, false on error
*/
public function search($link, $baseDN, $filter, $attr);
/**
* @brief Sets the value of the specified option to be $value
* @param $link LDAP link resource
* @param $option a defined LDAP Server option
* @param $value the new value for the option
* @return true on success, false otherwise
*/
public function setOption($link, $option, $value);
/**
* @brief establish Start TLS
* @param $link LDAP link resource
* @return true on success, false otherwise
*/
public function startTls($link);
/**
* @brief Sort the result of a LDAP search
* @param $link LDAP link resource
* @param $result LDAP result resource
* @param $sortfilter attribute to use a key in sort
*/
public function sort($link, $result, $sortfilter);
/**
* @brief Unbind from LDAP directory
* @param $link LDAP link resource
* @return true on success, false otherwise
*/
public function unbind($link);
//additional required methods in owncloud
/**
* @brief Checks whether the server supports LDAP
* @return true if it the case, false otherwise
* */
public function areLDAPFunctionsAvailable();
/**
* @brief Checks whether PHP supports LDAP Paged Results
* @return true if it the case, false otherwise
* */
public function hasPagedResultSupport();
/**
* @brief Checks whether the submitted parameter is a resource
* @param $resource the resource variable to check
* @return true if it is a resource, false otherwise
*/
public function isResource($resource);
}

View File

@ -139,13 +139,14 @@ class Jobs extends \OC\BackgroundJob\TimedJob {
return self::$groupBE;
}
$configPrefixes = Helper::getServerConfigurationPrefixes(true);
if(count($configPrefixes) == 1) {
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
if(count($configPrefixes) === 1) {
//avoid the proxy when there is only one LDAP server configured
$connector = new Connection($configPrefixes[0]);
self::$groupBE = new \OCA\user_ldap\GROUP_LDAP();
self::$groupBE->setConnector($connector);
$connector = new OCA\user_ldap\lib\Connection($ldapWrapper, $configPrefixes[0]);
$ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper);
self::$groupBE = new OCA\user_ldap\GROUP_LDAP($ldapAccess);
} else {
self::$groupBE = new \OCA\user_ldap\Group_Proxy($configPrefixes);
self::$groupBE = new \OCA\user_ldap\Group_Proxy($configPrefixes, $ldapWrapper);
}
return self::$groupBE;

167
apps/user_ldap/lib/ldap.php Normal file
View File

@ -0,0 +1,167 @@
<?php
/**
* ownCloud LDAP Wrapper
*
* @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 LDAP implements ILDAPWrapper {
protected $curFunc = '';
protected $curArgs = array();
public function bind($link, $dn, $password) {
return $this->invokeLDAPMethod('bind', $link, $dn, $password);
}
public function connect($host, $port) {
return $this->invokeLDAPMethod('connect', $host, $port);
}
public function controlPagedResultResponse($link, $result, &$cookie) {
$this->preFunctionCall('ldap_control_paged_result_response',
array($link, $result, $cookie));
$result = ldap_control_paged_result_response($link, $result, $cookie);
$this->postFunctionCall();
return $result;
}
public function controlPagedResult($link, $pagesize, $isCritical, $cookie) {
return $this->invokeLDAPMethod('control_paged_result', $link, $pagesize,
$isCritical, $cookie);
}
public function errno($link) {
return $this->invokeLDAPMethod('errno', $link);
}
public function error($link) {
return $this->invokeLDAPMethod('error', $link);
}
public function firstEntry($link, $result) {
return $this->invokeLDAPMethod('first_entry', $link, $result);
}
public function getAttributes($link, $result) {
return $this->invokeLDAPMethod('get_attributes', $link, $result);
}
public function getEntries($link, $result) {
return $this->invokeLDAPMethod('get_entries', $link, $result);
}
public function read($link, $baseDN, $filter, $attr) {
return $this->invokeLDAPMethod('read', $link, $baseDN, $filter, $attr);
}
public function search($link, $baseDN, $filter, $attr) {
return $this->invokeLDAPMethod('search', $link, $baseDN,
$filter, $attr);
}
public function setOption($link, $option, $value) {
$this->invokeLDAPMethod('set_option', $link, $option, $value);
}
public function sort($link, $result, $sortfilter) {
return $this->invokeLDAPMethod('sort', $link, $result, $sortfilter);
}
public function startTls($link) {
return $this->invokeLDAPMethod('start_tls', $link);
}
public function unbind($link) {
return $this->invokeLDAPMethod('unbind', $link);
}
/**
* @brief Checks whether the server supports LDAP
* @return true if it the case, false otherwise
* */
public function areLDAPFunctionsAvailable() {
return function_exists('ldap_connect');
}
/**
* @brief Checks whether PHP supports LDAP Paged Results
* @return true if it the case, false otherwise
* */
public function hasPagedResultSupport() {
$hasSupport = function_exists('ldap_control_paged_result')
&& function_exists('ldap_control_paged_result_response');
return $hasSupport;
}
/**
* @brief Checks whether the submitted parameter is a resource
* @param $resource the resource variable to check
* @return true if it is a resource, false otherwise
*/
public function isResource($resource) {
return is_resource($resource);
}
private function invokeLDAPMethod() {
$arguments = func_get_args();
$func = 'ldap_' . array_shift($arguments);
if(function_exists($func)) {
$this->preFunctionCall($func, $arguments);
$result = call_user_func_array($func, $arguments);
$this->postFunctionCall();
return $result;
}
}
private function preFunctionCall($functionName, $args) {
$this->curFunc = $functionName;
$this->curArgs = $args;
}
private function postFunctionCall() {
if($this->isResource($this->curArgs[0])) {
$errorCode = ldap_errno($this->curArgs[0]);
$errorMsg = ldap_error($this->curArgs[0]);
if($errorCode !== 0) {
if($this->curFunc === 'ldap_sort' && $errorCode === -4) {
//You can safely ignore that decoding error.
//… says https://bugs.php.net/bug.php?id=18023
} else if($this->curFunc === 'ldap_get_entries'
&& $errorCode === -4) {
} else if ($errorCode === 32) {
//for now
} else if ($errorCode === 10) {
//referrals, we switch them off, but then there is AD :)
} else {
\OCP\Util::writeLog('user_ldap',
'LDAP error '.$errorMsg.' (' .
$errorCode.') after calling '.
$this->curFunc,
\OCP\Util::DEBUG);
}
}
}
$this->curFunc = '';
$this->curArgs = array();
}
}

View File

@ -0,0 +1,36 @@
<?php
/**
* ownCloud LDAP LDAPUtility
*
* @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;
abstract class LDAPUtility {
protected $ldap;
/**
* @brief constructor, make sure the subclasses call this one!
* @param $ldapWrapper an instance of an ILDAPWrapper
*/
public function __construct(ILDAPWrapper $ldapWrapper) {
$this->ldap = $ldapWrapper;
}
}

View File

@ -23,26 +23,27 @@
namespace OCA\user_ldap\lib;
abstract class Proxy {
static private $connectors = array();
use OCA\user_ldap\lib\Access;
public function __construct() {
abstract class Proxy {
static private $accesses = array();
private $ldap = null;
public function __construct(ILDAPWrapper $ldap) {
$this->ldap = $ldap;
$this->cache = \OC_Cache::getGlobalCache();
}
private function addConnector($configPrefix) {
self::$connectors[$configPrefix] = new \OCA\user_ldap\lib\Connection($configPrefix);
private function addAccess($configPrefix) {
$connector = new Connection($this->ldap, $configPrefix);
self::$accesses[$configPrefix] = new Access($connector, $this->ldap);
}
protected function getConnector($configPrefix) {
if(!isset(self::$connectors[$configPrefix])) {
$this->addConnector($configPrefix);
protected function getAccess($configPrefix) {
if(!isset(self::$accesses[$configPrefix])) {
$this->addAccess($configPrefix);
}
return self::$connectors[$configPrefix];
}
protected function getConnectors() {
return self::$connectors;
return self::$accesses[$configPrefix];
}
protected function getUserCacheKey($uid) {

View File

@ -49,14 +49,9 @@ $tmpl->assign('serverConfigurationPrefixes', $prefixes);
$tmpl->assign('serverConfigurationHosts', $hosts);
// assign default values
if(!isset($ldap)) {
$ldap = new \OCA\user_ldap\lib\Connection();
}
$defaults = $ldap->getDefaults();
$defaults = \OCA\user_ldap\lib\Connection::getDefaults();
foreach($defaults as $key => $default) {
$tmpl->assign($key.'_default', $default);
}
// $tmpl->assign();
return $tmpl->fetchPage();

View File

@ -1,46 +0,0 @@
<?php
/**
* ownCloud
*
* @author Arthur Schiwon
* @copyright 2012 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/>.
*
*/
class Test_Group_Ldap extends PHPUnit_Framework_TestCase {
function setUp() {
OC_Group::clearBackends();
}
function testSingleBackend() {
OC_Group::useBackend(new OCA\user_ldap\GROUP_LDAP());
$group_ldap = new OCA\user_ldap\GROUP_LDAP();
$this->assertIsA(OC_Group::getGroups(), gettype(array()));
$this->assertIsA($group_ldap->getGroups(), gettype(array()));
$this->assertFalse(OC_Group::inGroup('john', 'dosers'), gettype(false));
$this->assertFalse($group_ldap->inGroup('john', 'dosers'), gettype(false));
//TODO: check also for expected true result. This backend won't be able to do any modifications, maybe use a dummy for this.
$this->assertIsA(OC_Group::getUserGroups('john doe'), gettype(array()));
$this->assertIsA($group_ldap->getUserGroups('john doe'), gettype(array()));
$this->assertIsA(OC_Group::usersInGroup('campers'), gettype(array()));
$this->assertIsA($group_ldap->usersInGroup('campers'), gettype(array()));
}
}

View File

@ -0,0 +1,411 @@
<?php
/**
* ownCloud
*
* @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\tests;
use \OCA\user_ldap\USER_LDAP as UserLDAP;
use \OCA\user_ldap\lib\Access;
use \OCA\user_ldap\lib\Connection;
use \OCA\user_ldap\lib\ILDAPWrapper;
class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
protected $backend;
public function setUp() {
\OC_User::clearBackends();
\OC_Group::clearBackends();
}
private function getAccessMock() {
static $conMethods;
static $accMethods;
if(is_null($conMethods) || is_null($accMethods)) {
$conMethods = get_class_methods('\OCA\user_ldap\lib\Connection');
$accMethods = get_class_methods('\OCA\user_ldap\lib\Access');
}
$lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper');
$connector = $this->getMock('\OCA\user_ldap\lib\Connection',
$conMethods,
array($lw, null, null));
$access = $this->getMock('\OCA\user_ldap\lib\Access',
$accMethods,
array($connector, $lw));
return $access;
}
private function prepareMockForUserExists(&$access) {
$access->expects($this->any())
->method('username2dn')
->will($this->returnCallback(function($uid) {
switch ($uid) {
case 'gunslinger':
return 'dnOfRoland';
break;
case 'formerUser':
return 'dnOfFormerUser';
break;
case 'newyorker':
return 'dnOfNewYorker';
break;
case 'ladyofshadows':
return 'dnOfLadyOfShadows';
break;
defautl:
return false;
}
}));
}
/**
* @brief Prepares the Access mock for checkPassword tests
* @param $access mock of \OCA\user_ldap\lib\Access
* @return void
*/
private function prepareAccessForCheckPassword(&$access) {
$access->connection->expects($this->any())
->method('__get')
->will($this->returnCallback(function($name) {
if($name === 'ldapLoginFilter') {
return '%uid';
}
return null;
}));
$access->expects($this->any())
->method('fetchListOfUsers')
->will($this->returnCallback(function($filter) {
if($filter === 'roland') {
return array('dnOfRoland');
}
return array();
}));
$access->expects($this->any())
->method('dn2username')
->with($this->equalTo('dnOfRoland'))
->will($this->returnValue('gunslinger'));
$access->expects($this->any())
->method('areCredentialsValid')
->will($this->returnCallback(function($dn, $pwd) {
if($pwd === 'dt19') {
return true;
}
return false;
}));
}
public function testCheckPassword() {
$access = $this->getAccessMock();
$this->prepareAccessForCheckPassword($access);
$backend = new UserLDAP($access);
\OC_User::useBackend($backend);
$result = $backend->checkPassword('roland', 'dt19');
$this->assertEquals('gunslinger', $result);
$result = $backend->checkPassword('roland', 'wrong');
$this->assertFalse($result);
$result = $backend->checkPassword('mallory', 'evil');
$this->assertFalse($result);
}
public function testCheckPasswordPublicAPI() {
$access = $this->getAccessMock();
$this->prepareAccessForCheckPassword($access);
$backend = new UserLDAP($access);
\OC_User::useBackend($backend);
$result = \OCP\User::checkPassword('roland', 'dt19');
$this->assertEquals('gunslinger', $result);
$result = \OCP\User::checkPassword('roland', 'wrong');
$this->assertFalse($result);
$result = \OCP\User::checkPassword('mallory', 'evil');
$this->assertFalse($result);
}
/**
* @brief Prepares the Access mock for getUsers tests
* @param $access mock of \OCA\user_ldap\lib\Access
* @return void
*/
private function prepareAccessForGetUsers(&$access) {
$access->expects($this->any())
->method('getFilterPartForUserSearch')
->will($this->returnCallback(function($search) {
return $search;
}));
$access->expects($this->any())
->method('combineFilterWithAnd')
->will($this->returnCallback(function($param) {
return $param[1];
}));
$access->expects($this->any())
->method('fetchListOfUsers')
->will($this->returnCallback(function($search, $a, $l, $o) {
$users = array('gunslinger', 'newyorker', 'ladyofshadows');
if(empty($search)) {
$result = $users;
} else {
$result = array();
foreach($users as $user) {
if(stripos($user, $search) !== false) {
$result[] = $user;
}
}
}
if(!is_null($l) || !is_null($o)) {
$result = array_slice($result, $o, $l);
}
return $result;
}));
$access->expects($this->any())
->method('ownCloudUserNames')
->will($this->returnArgument(0));
}
public function testGetUsers() {
$access = $this->getAccessMock();
$this->prepareAccessForGetUsers($access);
$backend = new UserLDAP($access);
$result = $backend->getUsers();
$this->assertEquals(3, count($result));
$result = $backend->getUsers('', 1, 2);
$this->assertEquals(1, count($result));
$result = $backend->getUsers('', 2, 1);
$this->assertEquals(2, count($result));
$result = $backend->getUsers('yo');
$this->assertEquals(2, count($result));
$result = $backend->getUsers('nix');
$this->assertEquals(0, count($result));
}
public function testGetUsersViaAPI() {
$access = $this->getAccessMock();
$this->prepareAccessForGetUsers($access);
$backend = new UserLDAP($access);
\OC_User::useBackend($backend);
$result = \OCP\User::getUsers();
$this->assertEquals(3, count($result));
$result = \OCP\User::getUsers('', 1, 2);
$this->assertEquals(1, count($result));
$result = \OCP\User::getUsers('', 2, 1);
$this->assertEquals(2, count($result));
$result = \OCP\User::getUsers('yo');
$this->assertEquals(2, count($result));
$result = \OCP\User::getUsers('nix');
$this->assertEquals(0, count($result));
}
public function testUserExists() {
$access = $this->getAccessMock();
$backend = new UserLDAP($access);
$this->prepareMockForUserExists($access);
$access->expects($this->any())
->method('readAttribute')
->will($this->returnCallback(function($dn) {
if($dn === 'dnOfRoland') {
return array();
}
return false;
}));
//test for existing user
$result = $backend->userExists('gunslinger');
$this->assertTrue($result);
//test for deleted user
$result = $backend->userExists('formerUser');
$this->assertFalse($result);
//test for never-existing user
$result = $backend->userExists('mallory');
$this->assertFalse($result);
}
public function testUserExistsPublicAPI() {
$access = $this->getAccessMock();
$backend = new UserLDAP($access);
$this->prepareMockForUserExists($access);
\OC_User::useBackend($backend);
$access->expects($this->any())
->method('readAttribute')
->will($this->returnCallback(function($dn) {
if($dn === 'dnOfRoland') {
return array();
}
return false;
}));
//test for existing user
$result = \OCP\User::userExists('gunslinger');
$this->assertTrue($result);
//test for deleted user
$result = \OCP\User::userExists('formerUser');
$this->assertFalse($result);
//test for never-existing user
$result = \OCP\User::userExists('mallory');
$this->assertFalse($result);
}
public function testDeleteUser() {
$access = $this->getAccessMock();
$backend = new UserLDAP($access);
//we do not support deleting users at all
$result = $backend->deleteUser('gunslinger');
$this->assertFalse($result);
}
public function testGetHome() {
$access = $this->getAccessMock();
$backend = new UserLDAP($access);
$this->prepareMockForUserExists($access);
$access->connection->expects($this->any())
->method('__get')
->will($this->returnCallback(function($name) {
if($name === 'homeFolderNamingRule') {
return 'attr:testAttribute';
}
return null;
}));
$access->expects($this->any())
->method('readAttribute')
->will($this->returnCallback(function($dn, $attr) {
switch ($dn) {
case 'dnOfRoland':
if($attr === 'testAttribute') {
return array('/tmp/rolandshome/');
}
return array();
break;
case 'dnOfLadyOfShadows':
if($attr === 'testAttribute') {
return array('susannah/');
}
return array();
break;
default:
return false;
}
}));
//absolut path
$result = $backend->getHome('gunslinger');
$this->assertEquals('/tmp/rolandshome/', $result);
//datadir-relativ path
$result = $backend->getHome('ladyofshadows');
$datadir = \OCP\Config::getSystemValue('datadirectory',
\OC::$SERVERROOT.'/data');
$this->assertEquals($datadir.'/susannah/', $result);
//no path at all triggers OC default behaviour
$result = $backend->getHome('newyorker');
$this->assertFalse($result);
}
private function prepareAccessForGetDisplayName(&$access) {
$access->connection->expects($this->any())
->method('__get')
->will($this->returnCallback(function($name) {
if($name === 'ldapUserDisplayName') {
return 'displayname';
}
return null;
}));
$access->expects($this->any())
->method('readAttribute')
->will($this->returnCallback(function($dn, $attr) {
switch ($dn) {
case 'dnOfRoland':
if($attr === 'displayname') {
return array('Roland Deschain');
}
return array();
break;
default:
return false;
}
}));
}
public function testGetDisplayName() {
$access = $this->getAccessMock();
$this->prepareAccessForGetDisplayName($access);
$backend = new UserLDAP($access);
$this->prepareMockForUserExists($access);
//with displayName
$result = $backend->getDisplayName('gunslinger');
$this->assertEquals('Roland Deschain', $result);
//empty displayname retrieved
$result = $backend->getDisplayName('newyorker');
$this->assertEquals(null, $result);
}
public function testGetDisplayNamePublicAPI() {
$access = $this->getAccessMock();
$this->prepareAccessForGetDisplayName($access);
$backend = new UserLDAP($access);
$this->prepareMockForUserExists($access);
\OC_User::useBackend($backend);
//with displayName
$result = \OCP\User::getDisplayName('gunslinger');
$this->assertEquals('Roland Deschain', $result);
//empty displayname retrieved
$result = \OCP\User::getDisplayName('newyorker');
$this->assertEquals('newyorker', $result);
}
//no test for getDisplayNames, because it just invokes getUsers and
//getDisplayName
}

View File

@ -25,37 +25,46 @@
namespace OCA\user_ldap;
class USER_LDAP extends lib\Access implements \OCP\UserInterface {
use OCA\user_ldap\lib\ILDAPWrapper;
use OCA\user_ldap\lib\BackendUtility;
class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
private function updateQuota($dn) {
$quota = null;
$quotaDefault = $this->connection->ldapQuotaDefault;
$quotaAttribute = $this->connection->ldapQuotaAttribute;
$quotaDefault = $this->access->connection->ldapQuotaDefault;
$quotaAttribute = $this->access->connection->ldapQuotaAttribute;
if(!empty($quotaDefault)) {
$quota = $quotaDefault;
}
if(!empty($quotaAttribute)) {
$aQuota = $this->readAttribute($dn, $quotaAttribute);
$aQuota = $this->access->readAttribute($dn, $quotaAttribute);
if($aQuota && (count($aQuota) > 0)) {
$quota = $aQuota[0];
}
}
if(!is_null($quota)) {
\OCP\Config::setUserValue($this->dn2username($dn), 'files', 'quota', \OCP\Util::computerFileSize($quota));
\OCP\Config::setUserValue( $this->access->dn2username($dn),
'files',
'quota',
\OCP\Util::computerFileSize($quota));
}
}
private function updateEmail($dn) {
$email = null;
$emailAttribute = $this->connection->ldapEmailAttribute;
$emailAttribute = $this->access->connection->ldapEmailAttribute;
if(!empty($emailAttribute)) {
$aEmail = $this->readAttribute($dn, $emailAttribute);
$aEmail = $this->access->readAttribute($dn, $emailAttribute);
if($aEmail && (count($aEmail) > 0)) {
$email = $aEmail[0];
}
if(!is_null($email)) {
\OCP\Config::setUserValue($this->dn2username($dn), 'settings', 'email', $email);
\OCP\Config::setUserValue( $this->access->dn2username($dn),
'settings',
'email',
$email);
}
}
}
@ -70,15 +79,16 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
*/
public function checkPassword($uid, $password) {
//find out dn of the user name
$filter = \OCP\Util::mb_str_replace('%uid', $uid, $this->connection->ldapLoginFilter, 'UTF-8');
$ldap_users = $this->fetchListOfUsers($filter, 'dn');
$filter = \OCP\Util::mb_str_replace(
'%uid', $uid, $this->access->connection->ldapLoginFilter, 'UTF-8');
$ldap_users = $this->access->fetchListOfUsers($filter, 'dn');
if(count($ldap_users) < 1) {
return false;
}
$dn = $ldap_users[0];
//do we have a username for him/her?
$ocname = $this->dn2username($dn);
$ocname = $this->access->dn2username($dn);
if($ocname) {
//update some settings, if necessary
@ -86,7 +96,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
$this->updateEmail($dn);
//are the credentials OK?
if(!$this->areCredentialsValid($dn, $password)) {
if(!$this->access->areCredentialsValid($dn, $password)) {
return false;
}
@ -107,7 +117,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
$cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset;
//check if users are cached, if so return
$ldap_users = $this->connection->getFromCache($cachekey);
$ldap_users = $this->access->connection->getFromCache($cachekey);
if(!is_null($ldap_users)) {
return $ldap_users;
}
@ -117,21 +127,23 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
if($limit <= 0) {
$limit = null;
}
$filter = $this->combineFilterWithAnd(array(
$this->connection->ldapUserFilter,
$this->getFilterPartForUserSearch($search)
$filter = $this->access->combineFilterWithAnd(array(
$this->access->connection->ldapUserFilter,
$this->access->getFilterPartForUserSearch($search)
));
\OCP\Util::writeLog('user_ldap',
'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset.' Filter: '.$filter,
\OCP\Util::DEBUG);
//do the search and translate results to owncloud names
$ldap_users = $this->fetchListOfUsers($filter, array($this->connection->ldapUserDisplayName, 'dn'),
$ldap_users = $this->access->fetchListOfUsers(
$filter,
array($this->access->connection->ldapUserDisplayName, 'dn'),
$limit, $offset);
$ldap_users = $this->ownCloudUserNames($ldap_users);
$ldap_users = $this->access->ownCloudUserNames($ldap_users);
\OCP\Util::writeLog('user_ldap', 'getUsers: '.count($ldap_users). ' Users found', \OCP\Util::DEBUG);
$this->connection->writeToCache($cachekey, $ldap_users);
$this->access->connection->writeToCache($cachekey, $ldap_users);
return $ldap_users;
}
@ -141,24 +153,25 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
* @return boolean
*/
public function userExists($uid) {
if($this->connection->isCached('userExists'.$uid)) {
return $this->connection->getFromCache('userExists'.$uid);
if($this->access->connection->isCached('userExists'.$uid)) {
return $this->access->connection->getFromCache('userExists'.$uid);
}
//getting dn, if false the user does not exist. If dn, he may be mapped only, requires more checking.
$dn = $this->username2dn($uid);
$dn = $this->access->username2dn($uid);
if(!$dn) {
$this->connection->writeToCache('userExists'.$uid, false);
\OCP\Util::writeLog('user_ldap', 'No DN found for '.$uid.' on '.
$this->access->connection->ldapHost, \OCP\Util::DEBUG);
$this->access->connection->writeToCache('userExists'.$uid, false);
return false;
}
//check if user really still exists by reading its entry
if(!is_array($this->readAttribute($dn, ''))) {
$this->connection->writeToCache('userExists'.$uid, false);
if(!is_array($this->access->readAttribute($dn, ''))) {
\OCP\Util::writeLog('user_ldap', 'LDAP says no user '.$dn, \OCP\Util::DEBUG);
$this->access->connection->writeToCache('userExists'.$uid, false);
return false;
}
$this->connection->writeToCache('userExists'.$uid, true);
$this->access->connection->writeToCache('userExists'.$uid, true);
$this->updateQuota($dn);
return true;
}
@ -186,12 +199,13 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
}
$cacheKey = 'getHome'.$uid;
if($this->connection->isCached($cacheKey)) {
return $this->connection->getFromCache($cacheKey);
if($this->access->connection->isCached($cacheKey)) {
return $this->access->connection->getFromCache($cacheKey);
}
if(strpos($this->connection->homeFolderNamingRule, 'attr:') === 0) {
$attr = substr($this->connection->homeFolderNamingRule, strlen('attr:'));
$homedir = $this->readAttribute($this->username2dn($uid), $attr);
if(strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0) {
$attr = substr($this->access->connection->homeFolderNamingRule, strlen('attr:'));
$homedir = $this->access->readAttribute(
$this->access->username2dn($uid), $attr);
if($homedir && isset($homedir[0])) {
$path = $homedir[0];
//if attribute's value is an absolute path take this, otherwise append it to data dir
@ -206,13 +220,13 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
$homedir = \OCP\Config::getSystemValue('datadirectory',
\OC::$SERVERROOT.'/data' ) . '/' . $homedir[0];
}
$this->connection->writeToCache($cacheKey, $homedir);
$this->access->connection->writeToCache($cacheKey, $homedir);
return $homedir;
}
}
//false will apply default behaviour as defined and done by OC_User
$this->connection->writeToCache($cacheKey, false);
$this->access->connection->writeToCache($cacheKey, false);
return false;
}
@ -227,16 +241,16 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
}
$cacheKey = 'getDisplayName'.$uid;
if(!is_null($displayName = $this->connection->getFromCache($cacheKey))) {
if(!is_null($displayName = $this->access->connection->getFromCache($cacheKey))) {
return $displayName;
}
$displayName = $this->readAttribute(
$this->username2dn($uid),
$this->connection->ldapUserDisplayName);
$displayName = $this->access->readAttribute(
$this->access->username2dn($uid),
$this->access->connection->ldapUserDisplayName);
if($displayName && (count($displayName) > 0)) {
$this->connection->writeToCache($cacheKey, $displayName[0]);
$this->access->connection->writeToCache($cacheKey, $displayName[0]);
return $displayName[0];
}
@ -251,7 +265,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
*/
public function getDisplayNames($search = '', $limit = null, $offset = null) {
$cacheKey = 'getDisplayNames-'.$search.'-'.$limit.'-'.$offset;
if(!is_null($displayNames = $this->connection->getFromCache($cacheKey))) {
if(!is_null($displayNames = $this->access->connection->getFromCache($cacheKey))) {
return $displayNames;
}
@ -260,7 +274,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
foreach ($users as $user) {
$displayNames[$user] = $this->getDisplayName($user);
}
$this->connection->writeToCache($cacheKey, $displayNames);
$this->access->connection->writeToCache($cacheKey, $displayNames);
return $displayNames;
}

View File

@ -23,6 +23,8 @@
namespace OCA\user_ldap;
use OCA\user_ldap\lib\ILDAPWrapper;
class User_Proxy extends lib\Proxy implements \OCP\UserInterface {
private $backends = array();
private $refBackend = null;
@ -31,12 +33,11 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface {
* @brief Constructor
* @param $serverConfigPrefixes array containing the config Prefixes
*/
public function __construct($serverConfigPrefixes) {
parent::__construct();
public function __construct($serverConfigPrefixes, ILDAPWrapper $ldap) {
parent::__construct($ldap);
foreach($serverConfigPrefixes as $configPrefix) {
$this->backends[$configPrefix] = new \OCA\user_ldap\USER_LDAP();
$connector = $this->getConnector($configPrefix);
$this->backends[$configPrefix]->setConnector($connector);
$this->backends[$configPrefix] =
new \OCA\user_ldap\USER_LDAP($this->getAccess($configPrefix));
if(is_null($this->refBackend)) {
$this->refBackend = &$this->backends[$configPrefix];
}

View File

@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV hitelesítés"
"WebDAV Authentication" => "WebDAV hitelesítés",
"Address: " => "Címek:",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";

View File

@ -12,6 +12,16 @@ DATABASEUSER=oc_autotest$EXECUTOR_NUMBER
ADMINLOGIN=admin$EXECUTOR_NUMBER
BASEDIR=$PWD
if ! [ -w config -a -w config/config.php ]; then
echo "Please enable write permissions on config and config/config.php" >&2
exit 1
fi
# Back up existing (dev) config if one exists
if [ -f config/config.php ]; then
mv config/config.php config/config-autotest-backup.php
fi
# use tmpfs for datadir - should speedup unit test execution
if [ -d /dev/shm ]; then
DATADIR=/dev/shm/data-autotest$EXECUTOR_NUMBER
@ -158,6 +168,13 @@ else
execute_tests $1 $2 $3
fi
cd $BASEDIR
# Restore existing config
if [ -f config/config-autotest-backup.php ]; then
mv config/config-autotest-backup.php config/config.php
fi
#
# NOTES on mysql:
# - CREATE DATABASE oc_autotest;

View File

@ -23,6 +23,8 @@ OC_JSON::checkLoggedIn();
OCP\JSON::callCheck();
OC_App::loadApps();
$defaults = new \OCP\Defaults();
if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSource'])) {
switch ($_POST['action']) {
case 'share':
@ -81,6 +83,104 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
($return) ? OC_JSON::success() : OC_JSON::error();
}
break;
case 'informRecipients':
$l = OC_L10N::get('core');
$shareType = (int) $_POST['shareType'];
$itemType = $_POST['itemType'];
$itemSource = $_POST['itemSource'];
$recipient = $_POST['recipient'];
$ownerDisplayName = \OCP\User::getDisplayName();
$from = \OCP\Util::getDefaultEmailAddress('sharing-noreply');
$noMail = array();
$recipientList = array();
if($shareType === \OCP\Share::SHARE_TYPE_USER) {
$recipientList[] = $recipient;
} elseif ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
$recipientList = \OC_Group::usersInGroup($recipient);
}
// don't send a mail to the user who shared the file
$recipientList = array_diff($recipientList, [\OCP\User::getUser()]);
// send mail to all recipients with an email address
foreach ($recipientList as $recipient) {
//get correct target folder name
$email = OC_Preferences::getValue($recipient, 'settings', 'email', '');
if ($email !== '') {
$displayName = \OCP\User::getDisplayName($recipient);
$items = \OCP\Share::getItemSharedWithUser($itemType, $itemSource, $recipient);
$filename = trim($items[0]['file_target'], '/');
$subject = (string)$l->t('%s shared »%s« with you', array($ownerDisplayName, $filename));
$expiration = null;
if (isset($items[0]['expiration'])) {
$date = new DateTime($items[0]['expiration']);
$expiration = $date->format('Y-m-d');
}
if ($itemType === 'folder') {
$foldername = "/Shared/" . $filename;
} else {
// if it is a file we can just link to the Shared folder,
// that's the place where the user will find the file
$foldername = "/Shared";
}
$link = \OCP\Util::linkToAbsolute('files', 'index.php', array("dir" => $foldername));
$content = new OC_Template("core", "mail", "");
$content->assign('link', $link);
$content->assign('user_displayname', $ownerDisplayName);
$content->assign('filename', $filename);
$content->assign('expiration', $expiration);
$text = $content->fetchPage();
$content = new OC_Template("core", "altmail", "");
$content->assign('link', $link);
$content->assign('user_displayname', $ownerDisplayName);
$content->assign('filename', $filename);
$content->assign('expiration', $expiration);
$alttext = $content->fetchPage();
$default_from = OCP\Util::getDefaultEmailAddress('sharing-noreply');
$from = OCP\Config::getUserValue(\OCP\User::getUser(), 'settings', 'email', $default_from);
// send it out now
try {
OCP\Util::sendMail($email, $displayName, $subject, $text, $from, $ownerDisplayName, 1, $alttext);
} catch (Exception $exception) {
$noMail[] = \OCP\User::getDisplayName($recipient);
}
}
}
\OCP\Share::setSendMailStatus($itemType, $itemSource, $shareType, true);
if (empty($noMail)) {
OCP\JSON::success();
} else {
OCP\JSON::error(array(
'data' => array(
'message' => $l->t("Couldn't send mail to following users: %s ",
implode(', ', $noMail)
)
)
));
}
break;
case 'informRecipientsDisabled':
$itemSource = $_POST['itemSource'];
$shareType = $_POST['shareType'];
$itemType = $_POST['itemType'];
$recipient = $_POST['recipient'];
\OCP\Share::setSendMailStatus($itemType, $itemSource, $shareType, false);
OCP\JSON::success();
break;
case 'email':
// read post variables
$user = OCP\USER::getUser();

View File

@ -2,66 +2,66 @@
This file is licensed under the Affero General Public License version 3 or later.
See the COPYING-README file. */
#dropdown {
#dropdown {
background:#eee;
border-bottom-left-radius:1em;
border-bottom-right-radius:1em;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
box-shadow:0 1px 1px #777;
display:block;
margin-right:7em;
position:absolute;
right:0;
width:19em;
width:25em;
z-index:500;
padding:1em;
}
}
#shareWithList {
#shareWithList {
list-style-type:none;
padding:.5em;
}
}
#shareWithList li {
#shareWithList li {
padding-top:.1em;
}
}
#shareWithList li:first-child {
#shareWithList li:first-child {
white-space:normal;
}
}
#shareWithList .cruds {
#shareWithList .cruds {
margin-left:-10px;
}
}
#shareWithList .unshare img, #shareWithList .showCruds img {
vertical-align:text-bottom; /* properly align icons */
}
#dropdown label {
#dropdown label {
font-weight:400;
}
}
#dropdown input[type="checkbox"] {
#dropdown input[type="checkbox"] {
margin:0 .2em 0 .5em;
}
}
a.showCruds {
a.showCruds {
display:inline;
opacity:.5;
}
}
a.unshare {
a.unshare {
display:inline;
float:right;
opacity:.5;
padding:.3em 0 0 .3em !important;
margin-top:-5px;
}
}
#link {
#link {
border-top:1px solid #ddd;
padding-top:.5em;
}
}
#dropdown input[type="text"],#dropdown input[type="password"] {
width:90%;
@ -75,22 +75,24 @@
#linkText,#linkPass,#expiration {
display:none;
}
}
#link #showPassword img {
#link #showPassword img {
padding-left:.3em;
width:12px;
}
}
.reshare,#link label,#expiration label {
.reshare,#link label,#expiration label {
padding-left:.5em;
}
}
a.showCruds:hover,a.unshare:hover {
a.showCruds:hover,a.unshare:hover {
opacity:1;
}
}
.reshare { white-space:normal; } /* fix shared by text going out of box */
.reshare { /* fix shared by text going out of box */
white-space:normal;
}
.ui-autocomplete { /* limit dropdown height to 4 1/2 entries */
max-height:103px;

View File

@ -19,9 +19,6 @@ body { background:#fefefe; font:normal .8em/1.6em "Helvetica Neue",Helvetica,Ari
#body-user #header, #body-settings #header {
position:fixed; top:0; left:0; right:0; z-index:100; height:45px; line-height:2.5em;
background:#1d2d44 url('../img/noise.png') repeat;
-moz-box-shadow:0 0 10px rgba(0, 0, 0, .5);
-webkit-box-shadow:0 0 10px rgba(0, 0, 0, .5);
box-shadow:0 0 10px rgba(0, 0, 0, .5);
}
#body-login {
@ -46,6 +43,10 @@ body { background:#fefefe; font:normal .8em/1.6em "Helvetica Neue",Helvetica,Ari
display: inline-block;
}
#header .avatardiv img {
opacity: 1;
}
/* INPUTS */
input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"],
textarea, select,
@ -155,23 +156,37 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b
/* CONTENT ------------------------------------------------------------------ */
#controls {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
position: fixed;
height: 36px;
height: 44px;
width: 100%;
padding: 0 75px 0 6px;
padding-right: 75px;
margin: 0;
background: #eee;
border-bottom: 1px solid #e7e7e7;
z-index: 50;
-moz-box-sizing: border-box; box-sizing: border-box;
-moz-box-shadow: 0 -3px 7px #000; -webkit-box-shadow: 0 -3px 7px #000; box-shadow: 0 -3px 7px #000;
}
#controls .button {
#controls .button,
#controls button,
#controls input[type='submit'],
#controls input[type='text'],
#controls input[type='password'],
#controls select {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
display: inline-block;
height: 36px;
padding: 7px 10px
}
#content { position:relative; height:100%; width:100%; }
#content .hascontrols { position: relative; top: 2.9em; }
#content .hascontrols {
position: relative;
top: 45px;
}
#content-wrapper {
position:absolute; height:100%; width:100%; padding-top:3.5em; padding-left:80px;
-moz-box-sizing:border-box; box-sizing:border-box;
@ -512,7 +527,6 @@ label.infield { cursor:text !important; top:1.05em; left:.85em; }
z-index: 75;
height: 100%;
background:#383c43 url('../img/noise.png') repeat;
-moz-box-shadow:0 0 7px #000; -webkit-box-shadow:0 0 7px #000; box-shadow:0 0 7px #000;
overflow:hidden; box-sizing:border-box; -moz-box-sizing:border-box;
/* prevent ugly selection effect on accidental selection */
-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;
@ -751,15 +765,38 @@ span.ui-icon {float: left; margin: 3px 7px 30px 0;}
.arrow.left { left:-13px; bottom:1.2em; -webkit-transform:rotate(270deg); -moz-transform:rotate(270deg); -o-transform:rotate(270deg); -ms-transform:rotate(270deg); transform:rotate(270deg); }
.arrow.up { top:-8px; right:2em; }
.arrow.down { -webkit-transform:rotate(180deg); -moz-transform:rotate(180deg); -o-transform:rotate(180deg); -ms-transform:rotate(180deg); transform:rotate(180deg); }
.help-includes {overflow: hidden; width: 100%; height: 100%; -moz-box-sizing: border-box; box-sizing: border-box; padding-top: 2.8em; }
.help-includes {
overflow: hidden;
width: 100%;
height: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding-top: 44px;
}
.help-iframe {width: 100%; height: 100%; margin: 0;padding: 0; border: 0; overflow: auto;}
/* ---- BREADCRUMB ---- */
div.crumb { float:left; display:block; background:url('../img/breadcrumb.svg') no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; -moz-box-sizing:border-box; box-sizing:border-box; }
div.crumb:first-child { padding:10px 20px 10px 5px; }
div.crumb.last { font-weight:bold; background:none; padding-right:10px; }
div.crumb a{ padding: 0.9em 0 0.7em 0; }
div.crumb {
float: left;
display: block;
background: url('../img/breadcrumb.svg') no-repeat right center;
height: 44px;
}
div.crumb a {
position: relative;
top: 12px;
padding: 14px 24px 14px 17px;
color: #555;
}
div.crumb:first-child a {
position: relative;
top: 13px;
}
div.crumb.last {
font-weight: bold;
margin-right: 10px;
}
/* some feedback for hover/tap on breadcrumbs */
div.crumb:hover,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 B

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="36" width="11" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1016.4)">
<path d="m0 0 11 18-11 18z" transform="translate(0 1016.4)" fill="#ddd"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 320 B

After

Width:  |  Height:  |  Size: 594 B

View File

@ -1,6 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="36" width="11" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0 -1016.4)">
<path d="m0.5 0 10 18-10 18 10-18z" transform="translate(0 1016.4)" stroke="#ddd" stroke-linecap="round" stroke-miterlimit="31.2" stroke-width="0.9" fill="#ddd"/>
</g>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="44" width="14" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<path d="M0.54879,0.047777,12.744,22,0.54879,43.951,12.744,22z" stroke="#d7d7d7" stroke-linecap="round" stroke-miterlimit="31.20000076000000178" stroke-width="1.09758711000000009" fill="#F00"/>
</svg>

Before

Width:  |  Height:  |  Size: 491 B

After

Width:  |  Height:  |  Size: 638 B

BIN
core/img/places/link.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

12
core/img/places/link.svg Normal file
View File

@ -0,0 +1,12 @@
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<path fill="#333" d="M16,4c-6.6274,0-12,5.3726-12,12,0,6.627,5.3726,12,12,12,6.627,0,12-5.373,12-12,0-6.6274-5.373-12-12-12zm1.375,1.5313c2.059,0.0457,3.879,1.2826,5.719,2.0938l2.9691,4.1093-0.46971,1.7657,0.90686,0.56246-0.01543,2.0937c-0.02074,0.59892,0.0086,1.1986-0.0156,1.7969-0.28517,1.1355-0.94394,2.1713-1.5,3.2031-0.37695,0.18585,0.03437-1.2317-0.20313-1.6719,0.05486-1.0173-0.80743-0.97029-1.3903-0.40526-0.72172,0.42068-2.3074,0.54754-2.3589-0.59383-0.40972-1.3716-0.06-2.833,0.49886-4.1093l-0.921-1.125,0.327-2.891-1.469-1.4839,0.345-1.6252-1.719-0.9687c-0.339-0.2661-0.984-0.3713-1.125-0.7344,0.13954-0.00789,0.28457-0.018686,0.42189-0.0156zm-4.2187,0.015634c0.0539,0.00789,0.11999,0.045309,0.21874,0.125,0.57943,0.31834-0.14143,0.67954-0.31251,1.0157-0.92537,0.62589,0.28457,1.1385,0.68743,1.6406,0.64577-0.18549,1.2917-1.1086,2.2344-0.828,1.2058-0.37629,1.0137,1.0099,1.7031,1.625,0.08948,0.28954,1.5086,1.2317,0.65623,0.92177-0.702-0.54411-1.4827-0.50314-1.9845,0.28131-1.355,0.735-0.552-1.4144-1.202-1.9373-0.982-1.0957-0.57,0.8186-0.687,1.3907-0.639-0.0139-1.831-0.4913-2.485,0.2816l0.64046,1.0467,0.76577-1.1719c0.186-0.42411,0.41949,0.32966,0.62486,0.46886,0.24531,0.47297,1.4109,1.2744,0.53126,1.5-1.3039,0.72326-2.3295,1.8202-3.4375,2.7969-0.37371,0.78857-1.1366,0.6984-1.6094,0.0468-1.1438-0.70372-1.0589,1.1256-0.99994,1.8125l1.0013-0.626v1.0312c-0.028286,0.19509-0.00411,0.39806-0.0156,0.59383-0.70063,0.732-1.4069-1.0277-2.0157-1.422l-0.0468-2.5781c0.022114-0.72429-0.1308-1.4659,0.0156-2.1718,1.3779-1.4789,2.7775-3.0107,3.5935-4.891h1.3437c0.93909,0.45497,0.40406-1.0082,0.7812-0.95314zm-1.984,13.406c0.16303-0.01739,0.34848,0.01984,0.54688,0.12501,1.265,0.18106,2.2109,1.0987,3.2187,1.7969,0.80352,0.79632,2.5419,0.54134,2.7345,1.8907-0.29248,1.4636-1.7323,2.2495-3,2.7657-0.31646,0.17657-0.65657,0.31714-1.0157,0.37543-1.1753,0.29314-1.6834-0.912-1.9219-1.8137-0.53212-1.1143-1.8621-1.9577-1.6718-3.3274,0.0312-0.68057,0.40286-1.7373,1.1093-1.8125z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1,6 +1,6 @@
$(document).ready(function(){
if (OC.currentUser) {
$('#header .avatardiv').avatar(OC.currentUser, 32);
$('#header .avatardiv').avatar(OC.currentUser, 32, undefined, true);
// Personal settings
$('#avatar .avatardiv').avatar(OC.currentUser, 128);
}

View File

@ -15,7 +15,7 @@
* You may use this on any <div></div>
* Here I'm using <div class="avatardiv"></div> as an example.
*
* There are 4 ways to call this:
* There are 5 ways to call this:
*
* 1. $('.avatardiv').avatar('jdoe', 128);
* This will make the div to jdoe's fitting avatar, with a size of 128px.
@ -34,10 +34,15 @@
* 4. $('.avatardiv').avatar('jdoe', 128, true);
* This will behave like the first example, except it will also append random
* hashes to the custom avatar images, to force image reloading in IE8.
*
* 5. $('.avatardiv').avatar('jdoe', 128, undefined, true);
* This will behave like the first example, but it will hide the avatardiv, if
* it will display the default placeholder. undefined is the ie8fix from
* example 4 and can be either true, or false/undefined, to be ignored.
*/
(function ($) {
$.fn.avatar = function(user, size, ie8fix) {
$.fn.avatar = function(user, size, ie8fix, hidedefault) {
if (typeof(size) === 'undefined') {
if (this.height() > 0) {
size = this.height();
@ -69,12 +74,17 @@
var url = OC.Router.generate('core_avatar_get', {user: user, size: size})+'?requesttoken='+oc_requesttoken;
$.get(url, function(result) {
if (typeof(result) === 'object') {
if (!hidedefault) {
if (result.data && result.data.displayname) {
$div.placeholder(user, result.data.displayname);
} else {
$div.placeholder(user);
}
} else {
$div.hide();
}
} else {
$div.show();
if (ie8fix === true) {
$div.html('<img src="'+url+'#'+Math.floor(Math.random()*1000)+'">');
} else {

View File

@ -114,6 +114,7 @@ OC.Share={
data = false;
}
}});
return data;
},
share:function(itemType, itemSource, shareType, shareWith, permissions, callback) {
@ -217,9 +218,9 @@ OC.Share={
OC.Share.showLink(share.token, share.share_with, itemSource);
} else {
if (share.collection) {
OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, share.collection);
OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, share.mail_send, share.collection);
} else {
OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, false);
OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, share.mail_send, false);
}
}
if (share.expiration != null) {
@ -301,7 +302,7 @@ OC.Share={
}
});
},
addShareWith:function(shareType, shareWith, shareWithDisplayName, permissions, possiblePermissions, collection) {
addShareWith:function(shareType, shareWith, shareWithDisplayName, permissions, possiblePermissions, mailSend, collection) {
if (!OC.Share.itemShares[shareType]) {
OC.Share.itemShares[shareType] = [];
}
@ -343,6 +344,14 @@ OC.Share={
}else{
html += escapeHTML(shareWithDisplayName);
}
var mailNotificationEnabled = $('input:hidden[name=mailNotificationEnabled]').val();
if (mailNotificationEnabled === 'yes') {
var checked = '';
if (mailSend === '1') {
checked = 'checked';
}
html += '<input type="checkbox" name="mailNotification" class="mailNotification" ' + checked + ' />'+t('core', 'notify user by email')+'</label>';
}
if (possiblePermissions & OC.PERMISSION_CREATE || possiblePermissions & OC.PERMISSION_UPDATE || possiblePermissions & OC.PERMISSION_DELETE) {
if (editChecked == '') {
html += '<label style="display:none;">';
@ -699,5 +708,27 @@ $(document).ready(function() {
}
});
$(document).on('click', '#dropdown input[name=mailNotification]', function() {
var li = $(this).parent();
var itemType = $('#dropdown').data('item-type');
var itemSource = $('#dropdown').data('item-source');
var action = '';
if (this.checked) {
action = 'informRecipients';
} else {
action = 'informRecipientsDisabled';
}
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') {
OC.dialogs.alert(t('core', result.data.message), t('core', 'Warning'));
}
});
});
});

View File

@ -60,7 +60,9 @@ $TRANSLATIONS = array(
"Error loading message template: {error}" => "Chyba při nahrávání šablony zprávy: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
"One file conflict" => "Jeden konflikt souboru",
"Which files do you want to keep?" => "Které soubory chcete ponechat?",
"Cancel" => "Zrušit",
"Continue" => "Pokračovat",
"The object type is not specified." => "Není určen typ objektu.",
"Error" => "Chyba",
"The app name is not specified." => "Není určen název aplikace.",

View File

@ -2,6 +2,12 @@
$TRANSLATIONS = array(
"%s shared »%s« with you" => "%s megosztotta Önnel ezt: »%s«",
"group" => "csoport",
"Turned on maintenance mode" => "A karbantartási mód bekapcsolva",
"Turned off maintenance mode" => "A karbantartási mód kikapcsolva",
"Updated database" => "Frissítet adatbázis",
"Updating filecache, this may take really long..." => "A filecache frissítése folyamatban, ez a folyamat hosszabb ideig is eltarthat...",
"Updated filecache" => "Filecache frissítve",
"... %d%% done ..." => "... %d%% kész ...",
"Category type not provided." => "Nincs megadva a kategória típusa.",
"No category to add?" => "Nincs hozzáadandó kategória?",
"This category already exists: %s" => "Ez a kategória már létezik: %s",
@ -10,6 +16,11 @@ $TRANSLATIONS = array(
"Error adding %s to favorites." => "Nem sikerült a kedvencekhez adni ezt: %s",
"No categories selected for deletion." => "Nincs törlésre jelölt kategória",
"Error removing %s from favorites." => "Nem sikerült a kedvencekből törölni ezt: %s",
"No image or file provided" => "Nincs kép vagy file megadva",
"Unknown filetype" => "Ismeretlen file tipús",
"Invalid image" => "Hibás kép",
"No temporary profile picture available, try again" => "Az átmeneti profil kép nem elérhető, próbáld újra",
"No crop data provided" => "Vágáshoz nincs adat megadva",
"Sunday" => "vasárnap",
"Monday" => "hétfő",
"Tuesday" => "kedd",
@ -42,11 +53,20 @@ $TRANSLATIONS = array(
"last year" => "tavaly",
"years ago" => "több éve",
"Choose" => "Válasszon",
"Error loading file picker template: {error}" => "Nem sikerült betölteni a fájlkiválasztó sablont: {error}",
"Yes" => "Igen",
"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("",""),
"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.",
"Cancel" => "Mégsem",
"Continue" => "Folytatás",
"(all selected)" => "(all selected)",
"({count} selected)" => "({count} kiválasztva)",
"Error loading file exists template" => "Hiba a létező sablon betöltésekor",
"The object type is not specified." => "Az objektum típusa nincs megadva.",
"Error" => "Hiba",
"The app name is not specified." => "Az alkalmazás neve nincs megadva.",
@ -85,6 +105,7 @@ $TRANSLATIONS = array(
"Email sent" => "Az emailt elküldtük",
"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",
"Use the following link to reset your password: {link}" => "Használja ezt a linket a jelszó ismételt beállításához: {link}",
"The link to reset your password has been sent to your email.<br>If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator ." => "Emailben fog kapni egy linket, amivel új jelszót tud majd beállítani magának. <br>Ha a levél nem jött meg, holott úgy érzi, hogy már meg kellett volna érkeznie, akkor ellenőrizze a spam/levélszemét mappáját. <br>Ha ott sincsen, akkor érdeklődjön a rendszergazdánál.",
"Request failed!<br>Did you make sure your email/username was right?" => "A kérést nem sikerült teljesíteni! <br>Biztos, hogy jó emailcímet/felhasználónevet adott meg?",

View File

@ -20,6 +20,7 @@ $TRANSLATIONS = array(
"Unknown filetype" => "不明なファイルタイプ",
"Invalid image" => "無効な画像",
"No temporary profile picture available, try again" => "一時的なプロファイル用画像が利用できません。もう一度試して下さい",
"No crop data provided" => "クロップデータは提供されません",
"Sunday" => "",
"Monday" => "",
"Tuesday" => "",
@ -57,8 +58,15 @@ $TRANSLATIONS = array(
"No" => "いいえ",
"Ok" => "OK",
"Error loading message template: {error}" => "メッセージテンプレートの読み込みエラー: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array(""),
"_{count} file conflict_::_{count} file conflicts_" => array("{count} ファイルが競合"),
"One file conflict" => "1ファイルが競合",
"Which files do you want to keep?" => "どちらのファイルを保持したいですか?",
"If you select both versions, the copied file will have a number added to its name." => "両方のバージョンを選択した場合は、ファイル名の後ろに数字を追加したファイルのコピーを作成します。",
"Cancel" => "キャンセル",
"Continue" => "続ける",
"(all selected)" => "(全て選択)",
"({count} selected)" => "({count} 選択)",
"Error loading file exists template" => "既存ファイルのテンプレートの読み込みエラー",
"The object type is not specified." => "オブジェクタイプが指定されていません。",
"Error" => "エラー",
"The app name is not specified." => "アプリ名がしていされていません。",

View File

@ -58,8 +58,15 @@ $TRANSLATIONS = array(
"No" => "Ne",
"Ok" => "Gerai",
"Error loading message template: {error}" => "Klaida įkeliant žinutės ruošinį: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
"_{count} file conflict_::_{count} file conflicts_" => array("{count} failas konfliktuoja","{count} failai konfliktuoja","{count} failų konfliktų"),
"One file conflict" => "Vienas failo konfliktas",
"Which files do you want to keep?" => "Kuriuos failus norite laikyti?",
"If you select both versions, the copied file will have a number added to its name." => "Jei pasirenkate abi versijas, nukopijuotas failas turės pridėtą numerį pavadinime.",
"Cancel" => "Atšaukti",
"Continue" => "Tęsti",
"(all selected)" => "(visi pažymėti)",
"({count} selected)" => "({count} pažymėtų)",
"Error loading file exists template" => "Klaida įkeliant esančių failų ruošinį",
"The object type is not specified." => "Objekto tipas nenurodytas.",
"Error" => "Klaida",
"The app name is not specified." => "Nenurodytas programos pavadinimas.",

View File

@ -16,6 +16,8 @@ $TRANSLATIONS = array(
"Error adding %s to favorites." => "Błąd podczas dodawania %s do ulubionych.",
"No categories selected for deletion." => "Nie zaznaczono kategorii do usunięcia.",
"Error removing %s from favorites." => "Błąd podczas usuwania %s z ulubionych.",
"Unknown filetype" => "Nieznany typ pliku",
"Invalid image" => "Nieprawidłowe zdjęcie",
"Sunday" => "Niedziela",
"Monday" => "Poniedziałek",
"Tuesday" => "Wtorek",
@ -51,8 +53,12 @@ $TRANSLATIONS = array(
"Yes" => "Tak",
"No" => "Nie",
"Ok" => "OK",
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
"_{count} file conflict_::_{count} file conflicts_" => array("{count} konfliktów plików","{count} konfliktów plików","{count} konfliktów plików"),
"One file conflict" => "Konflikt pliku",
"Cancel" => "Anuluj",
"Continue" => "Kontynuuj ",
"(all selected)" => "(wszystkie zaznaczone)",
"({count} selected)" => "({count} zaznaczonych)",
"The object type is not specified." => "Nie określono typu obiektu.",
"Error" => "Błąd",
"The app name is not specified." => "Nie określono nazwy aplikacji.",

View File

@ -0,0 +1,5 @@
Welcome to your ownCloud account!
This is just an example file for developers and git users.
The packaged and released versions will come with better examples.

View File

@ -1,5 +1,9 @@
<?php
print_unescaped($l->t("Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\nCheers!", array($_['user_displayname'], $_['filename'], $_['link'])));
print_unescaped($l->t("Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n", array($_['user_displayname'], $_['filename'], $_['link'])));
if ( isset($_['expiration']) ) {
print_unescaped($l->t("The share will expire on %s.\n\n", array($_['expiration'])));
}
p($l->t("Cheers!"));
?>
--

View File

@ -32,9 +32,10 @@
<?php p($l->t('Lost your password?')); ?>
</a>
<?php endif; ?>
<?php if ($_['rememberLoginAllowed'] === true) : ?>
<input type="checkbox" name="remember_login" value="1" id="remember_login" checked />
<label for="remember_login"><?php p($l->t('remember')); ?></label>
<?php endif; ?>
<input type="hidden" name="timezone-offset" id="timezone-offset"/>
<input type="submit" id="submit" class="login primary" value="<?php p($l->t('Log in')); ?>"/>
</fieldset>

View File

@ -12,7 +12,11 @@
<td bgcolor="#f8f8f8" width="20px">&nbsp;</td>
<td bgcolor="#f8f8f8" style="font-weight:normal; font-size:0.8em; line-height:1.2em; font-family:verdana,'arial',sans;">
<?php
print_unescaped($l->t('Hey there,<br><br>just letting you know that %s shared »%s« with you.<br><a href="%s">View it!</a><br><br>Cheers!', array($_['user_displayname'], $_['filename'], $_['link'])));
print_unescaped($l->t('Hey there,<br><br>just letting you know that %s shared »%s« with you.<br><a href="%s">View it!</a><br><br>', array($_['user_displayname'], $_['filename'], $_['link'])));
if ( isset($_['expiration']) ) {
print_unescaped($l->t("The share will expire on %s.<br><br>", array($_['expiration'])));
}
p($l->t('Cheers!'));
?>
</td>
</tr>
@ -22,7 +26,8 @@ print_unescaped($l->t('Hey there,<br><br>just letting you know that %s shared »
<td bgcolor="#f8f8f8" style="font-weight:normal; font-size:0.8em; line-height:1.2em; font-family:verdana,'arial',sans;">--<br>
<?php p($theme->getName()); ?> -
<?php p($theme->getSlogan()); ?>
<br><a href="<?php print_unescaped($theme->getBaseUrl()); ?>"><?php print_unescaped($theme->getBaseUrl());?></a></td>
<br><a href="<?php print_unescaped($theme->getBaseUrl()); ?>"><?php print_unescaped($theme->getBaseUrl());?></a>
</td>
</tr>
<tr>
<td bgcolor="#f8f8f8" colspan="2">&nbsp;</td>

View File

@ -844,6 +844,14 @@
<length>32</length>
</field>
<field>
<name>mail_send</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<length>1</length>
</field>
<index>
<name>token_index</name>
<field>

View File

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

View File

@ -4,6 +4,7 @@
#
# Translators:
# janinko <janinko.g@gmail.com>, 2013
# dibalaj <dibalaj@dibalaj.cz>, 2013
# Honza K. <honza889@gmail.com>, 2013
# Martin <fireball@atlas.cz>, 2013
# pstast <petr@stastny.eu>, 2013
@ -12,9 +13,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-27 00:01-0400\n"
"PO-Revision-Date: 2013-09-25 10:50+0000\n"
"Last-Translator: pstast <petr@stastny.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-29 16:57+0000\n"
"Last-Translator: dibalaj <dibalaj@dibalaj.cz>\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"
@ -288,7 +289,7 @@ msgstr "Jeden konflikt souboru"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
msgstr ""
msgstr "Které soubory chcete ponechat?"
#: js/oc-dialogs.js:368
msgid ""
@ -302,7 +303,7 @@ msgstr "Zrušit"
#: js/oc-dialogs.js:386
msgid "Continue"
msgstr ""
msgstr "Pokračovat"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"

View File

@ -3,6 +3,7 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# dibalaj <dibalaj@dibalaj.cz>, 2013
# Honza K. <honza889@gmail.com>, 2013
# cvanca <mrs.jenkins.oh.yeah@gmail.com>, 2013
# pstast <petr@stastny.eu>, 2013
@ -11,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:44-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
"PO-Revision-Date: 2013-09-29 16:54+0000\n"
"Last-Translator: dibalaj <dibalaj@dibalaj.cz>\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"
@ -90,7 +91,7 @@ msgstr ""
msgid "Invalid directory."
msgstr "Neplatný adresář"
#: appinfo/app.php:12
#: appinfo/app.php:11
msgid "Files"
msgstr "Soubory"
@ -228,7 +229,7 @@ msgstr "Vaše soubory ke stažení se připravují. Pokud jsou velké, může to
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
msgstr ""
msgstr "Chyba při přesunu souboru"
#: js/files.js:558 templates/index.php:61
msgid "Name"

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-09-22 12:55-0400\n"
"PO-Revision-Date: 2013-09-20 15:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-30 00:42+0000\n"
"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -30,28 +30,28 @@ msgstr "csoport"
#: ajax/update.php:11
msgid "Turned on maintenance mode"
msgstr ""
msgstr "A karbantartási mód bekapcsolva"
#: ajax/update.php:14
msgid "Turned off maintenance mode"
msgstr ""
msgstr "A karbantartási mód kikapcsolva"
#: ajax/update.php:17
msgid "Updated database"
msgstr ""
msgstr "Frissítet adatbázis"
#: ajax/update.php:20
msgid "Updating filecache, this may take really long..."
msgstr ""
msgstr "A filecache frissítése folyamatban, ez a folyamat hosszabb ideig is eltarthat..."
#: ajax/update.php:23
msgid "Updated filecache"
msgstr ""
msgstr "Filecache frissítve"
#: ajax/update.php:26
#, php-format
msgid "... %d%% done ..."
msgstr ""
msgstr "... %d%% kész ..."
#: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25
msgid "Category type not provided."
@ -94,23 +94,23 @@ msgstr "Nem sikerült a kedvencekből törölni ezt: %s"
#: avatar/controller.php:62
msgid "No image or file provided"
msgstr ""
msgstr "Nincs kép vagy file megadva"
#: avatar/controller.php:81
msgid "Unknown filetype"
msgstr ""
msgstr "Ismeretlen file tipús"
#: avatar/controller.php:85
msgid "Invalid image"
msgstr ""
msgstr "Hibás kép"
#: avatar/controller.php:115 avatar/controller.php:142
msgid "No temporary profile picture available, try again"
msgstr ""
msgstr "Az átmeneti profil kép nem elérhető, próbáld újra"
#: avatar/controller.php:135
msgid "No crop data provided"
msgstr ""
msgstr "Vágáshoz nincs adat megadva"
#: js/config.php:32
msgid "Sunday"
@ -250,7 +250,7 @@ msgstr "Válasszon"
#: js/oc-dialogs.js:146
msgid "Error loading file picker template: {error}"
msgstr ""
msgstr "Nem sikerült betölteni a fájlkiválasztó sablont: {error}"
#: js/oc-dialogs.js:172
msgid "Yes"
@ -266,7 +266,7 @@ msgstr "Ok"
#: js/oc-dialogs.js:219
msgid "Error loading message template: {error}"
msgstr ""
msgstr "Nem sikerült betölteni az üzenet sablont: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
@ -276,17 +276,17 @@ msgstr[1] ""
#: js/oc-dialogs.js:361
msgid "One file conflict"
msgstr ""
msgstr "Egy file ütközik"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
msgstr ""
msgstr "Melyik file-okat akarod megtartani?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
msgstr ""
msgstr "Ha kiválasztod mindazokaz a verziókat, a másolt fileok neve sorszámozva lesz."
#: js/oc-dialogs.js:376
msgid "Cancel"
@ -294,19 +294,19 @@ msgstr "Mégsem"
#: js/oc-dialogs.js:386
msgid "Continue"
msgstr ""
msgstr "Folytatás"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
msgstr ""
msgstr "(all selected)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
msgstr ""
msgstr "({count} kiválasztva)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
msgstr ""
msgstr "Hiba a létező sablon betöltésekor"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@ -317,7 +317,7 @@ msgstr "Az objektum típusa nincs megadva."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
#: js/share.js:645 js/share.js:657
#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Hiba"
@ -337,7 +337,7 @@ msgstr "Megosztott"
msgid "Share"
msgstr "Megosztás"
#: js/share.js:131 js/share.js:685
#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Nem sikerült létrehozni a megosztást"
@ -437,23 +437,23 @@ msgstr "töröl"
msgid "share"
msgstr "megoszt"
#: js/share.js:400 js/share.js:632
#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Jelszóval van védve"
#: js/share.js:645
#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Nem sikerült a lejárati időt törölni"
#: js/share.js:657
#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Nem sikerült a lejárati időt beállítani"
#: js/share.js:672
#: js/share.js:683
msgid "Sending ..."
msgstr "Küldés ..."
#: js/share.js:683
#: js/share.js:694
msgid "Email sent"
msgstr "Az emailt elküldtük"
@ -471,7 +471,7 @@ msgstr "A frissítés sikeres volt. Visszairányítjuk az ownCloud szolgáltatá
#: lostpassword/controller.php:62
#, php-format
msgid "%s password reset"
msgstr ""
msgstr "%s jelszó visszaállítás"
#: lostpassword/templates/email.php:2
msgid "Use the following link to reset your password: {link}"

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-09-16 11:33-0400\n"
"PO-Revision-Date: 2013-09-16 15:34+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-30 00:50+0000\n"
"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -19,38 +19,38 @@ msgstr ""
"Language: hu_HU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: app.php:239
#: app.php:237
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: app.php:250
#: app.php:248
msgid "No app name specified"
msgstr ""
msgstr "Nincs az alkalmazás név megadva."
#: app.php:361
#: app.php:352
msgid "Help"
msgstr "Súgó"
#: app.php:374
#: app.php:365
msgid "Personal"
msgstr "Személyes"
#: app.php:385
#: app.php:376
msgid "Settings"
msgstr "Beállítások"
#: app.php:397
#: app.php:388
msgid "Users"
msgstr "Felhasználók"
#: app.php:410
#: app.php:401
msgid "Admin"
msgstr "Adminsztráció"
#: app.php:839
#: app.php:832
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr "Sikertelen Frissítés \"%s\"."
@ -61,11 +61,11 @@ msgstr ""
#: avatar.php:64
msgid "Unknown filetype"
msgstr ""
msgstr "Ismeretlen file tipús"
#: avatar.php:69
msgid "Invalid image"
msgstr ""
msgstr "Hibás kép"
#: defaults.php:35
msgid "web services under your control"
@ -121,7 +121,7 @@ msgstr ""
#: installer.php:125
msgid "App does not provide an info.xml file"
msgstr ""
msgstr "Az alkalmazás nem szolgáltatott info.xml file-t"
#: installer.php:131
msgid "App can't be installed because of not allowed code in the App"
@ -131,7 +131,7 @@ msgstr ""
msgid ""
"App can't be installed because it is not compatible with this version of "
"ownCloud"
msgstr ""
msgstr "Az alalmazás nem telepíthető, mert nem kompatibilis az ownClod ezzel a verziójával."
#: installer.php:146
msgid ""
@ -147,12 +147,12 @@ msgstr ""
#: installer.php:162
msgid "App directory already exists"
msgstr ""
msgstr "Az alkalmazás mappája már létezik"
#: installer.php:175
#, php-format
msgid "Can't create app folder. Please fix permissions. %s"
msgstr ""
msgstr "Nem lehetett létrehozni az alkalmzás mappáját. Kérlek ellenőrizd a jogosultásgokat. %s"
#: json.php:28
msgid "Application is not enabled"
@ -166,15 +166,15 @@ msgstr "Azonosítási hiba"
msgid "Token expired. Please reload page."
msgstr "A token lejárt. Frissítse az oldalt."
#: search/provider/file.php:17 search/provider/file.php:35
#: search/provider/file.php:18 search/provider/file.php:36
msgid "Files"
msgstr "Fájlok"
#: search/provider/file.php:26 search/provider/file.php:33
#: search/provider/file.php:27 search/provider/file.php:34
msgid "Text"
msgstr "Szöveg"
#: search/provider/file.php:29
#: search/provider/file.php:30
msgid "Images"
msgstr "Képek"
@ -278,6 +278,11 @@ msgstr "Az Ön webkiszolgálója nincs megfelelően beállítva az állományok
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr "Kérjük tüzetesen tanulmányozza át a <a href='%s'>telepítési útmutatót</a>."
#: tags.php:194
#, php-format
msgid "Could not find category \"%s\""
msgstr "Ez a kategória nem található: \"%s\""
#: template/functions.php:96
msgid "seconds ago"
msgstr "pár másodperce"
@ -329,8 +334,3 @@ msgstr "több éve"
#: template.php:297
msgid "Caused by:"
msgstr "Okozta:"
#: vcategories.php:188 vcategories.php:249
#, php-format
msgid "Could not find category \"%s\""
msgstr "Ez a kategória nem található: \"%s\""

View File

@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:45-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:17-0400\n"
"PO-Revision-Date: 2013-09-30 00:21+0000\n"
"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -89,42 +89,42 @@ msgstr "A program frissítése nem sikerült."
#: changepassword/controller.php:20
msgid "Wrong password"
msgstr ""
msgstr "Hibás jelszó"
#: changepassword/controller.php:42
msgid "No user supplied"
msgstr ""
msgstr "Nincs felhasználó által mellékelve"
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
msgstr ""
msgstr "Add meg az admin helyreállító jelszót, máskülönben az összes felhasználói adat elveszik."
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
msgstr ""
msgstr "Hibás admin helyreállítási jelszó. Ellenörizd a jelszót és próbáld újra."
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
msgstr ""
msgstr "A back-end nem támogatja a jelszó módosítást, de felhasználó titkosítási kulcsa sikeresen frissítve lett."
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
msgstr ""
msgstr "Nem sikerült megváltoztatni a jelszót"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "Frissítés erre a verzióra: {appversion}"
#: js/apps.js:49 js/apps.js:82 js/apps.js:108
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Letiltás"
#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "engedélyezve"
@ -132,43 +132,43 @@ msgstr "engedélyezve"
msgid "Please wait...."
msgstr "Kérem várjon..."
#: js/apps.js:79 js/apps.js:80 js/apps.js:100
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr ""
msgstr "Hiba az alkalmazás kikapcsolása közben"
#: js/apps.js:99 js/apps.js:112 js/apps.js:113
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr ""
msgstr "Hiba az alalmazás engedélyezése közben"
#: js/apps.js:123
#: js/apps.js:125
msgid "Updating...."
msgstr "Frissítés folyamatban..."
#: js/apps.js:126
#: js/apps.js:128
msgid "Error while updating app"
msgstr "Hiba történt a programfrissítés közben"
#: js/apps.js:126
#: js/apps.js:128
msgid "Error"
msgstr "Hiba"
#: js/apps.js:127 templates/apps.php:43
#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Frissítés"
#: js/apps.js:130
#: js/apps.js:132
msgid "Updated"
msgstr "Frissítve"
#: js/personal.js:220
#: js/personal.js:221
msgid "Select a profile picture"
msgstr ""
msgstr "Válassz profil képet"
#: js/personal.js:265
#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr ""
msgstr "File-ok kititkosítása folyamatban... Kérlek várj, ez hosszabb ideig is eltarthat ..."
#: js/personal.js:287
#: js/personal.js:288
msgid "Saving..."
msgstr "Mentés..."
@ -496,27 +496,27 @@ msgstr "Profilkép"
#: templates/personal.php:90
msgid "Upload new"
msgstr ""
msgstr "Új feltöltése"
#: templates/personal.php:92
msgid "Select new from Files"
msgstr ""
msgstr "Új kiválasztása Fileokból"
#: templates/personal.php:93
msgid "Remove image"
msgstr ""
msgstr "Kép eltávolítása"
#: templates/personal.php:94
msgid "Either png or jpg. Ideally square but you will be able to crop it."
msgstr ""
msgstr "Egyaránt png vagy jpg. Az ideális ha négyzet alaku, de késöbb még átszabható"
#: templates/personal.php:97
msgid "Abort"
msgstr ""
msgstr "Megszakítás"
#: templates/personal.php:98
msgid "Choose as profile image"
msgstr ""
msgstr "Válassz profil képet"
#: templates/personal.php:106 templates/personal.php:107
msgid "Language"
@ -543,15 +543,15 @@ msgstr "Titkosítás"
#: templates/personal.php:140
msgid "The encryption app is no longer enabled, decrypt all your file"
msgstr ""
msgstr "A titkosító alkalmzás a továbbiakban nincs engedélyezve, kititkosítja az összes fileodat"
#: templates/personal.php:146
msgid "Log-in password"
msgstr ""
msgstr "Bejelentkezési jelszó"
#: templates/personal.php:151
msgid "Decrypt all Files"
msgstr ""
msgstr "Kititkosítja az összes file-t"
#: templates/users.php:21
msgid "Login Name"

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-09-27 00:01-0400\n"
"PO-Revision-Date: 2013-09-24 19:00+0000\n"
"Last-Translator: Laszlo Tornoci <torlasz@gmail.com>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-30 00:22+0000\n"
"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -348,7 +348,7 @@ msgid ""
"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."
msgstr ""
msgstr "Alapértelmezetten a belső felhasználónév az UUID tulajdonságból jön létre. Ez biztosítja a felhasználónév egyediségét és hogy a nem kell konvertálni a karaktereket benne. A belső felhasználónévnél a megkötés az, hogy csak a következő karakterek engdélyezettek benne: [ a-zA-Z0-9_.@- ]. Ezeken a karaktereken kivül minden karakter le lesz cserélve az adott karakter ASCII kódtáblában használható párjára vagy ha ilyen nincs akkor egyszerűen ki lesz hagyva. Ha így mégis ütköznének a nevek akkor hozzá lesz füzve egy folyamatosan növekvő számláló rész. A belső felhasználónevet lehet használni a felhasználó azonosítására a programon belül. Illetve ez lesz az alapáértelmezett neve a felhasználó kezdő könyvtárának az ownCloud-ban. Illetve..............................."
#: templates/settings.php:100
msgid "Internal Username Attribute:"

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-07-27 01:56-0400\n"
"PO-Revision-Date: 2013-07-27 05:57+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-30 00:32+0000\n"
"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -25,11 +25,11 @@ msgstr "WebDAV hitelesítés"
#: templates/settings.php:4
msgid "Address: "
msgstr ""
msgstr "Címek:"
#: templates/settings.php:7
msgid ""
"The user credentials will be sent to this address. This plugin checks the "
"response and will interpret the HTTP statuscodes 401 and 403 as invalid "
"credentials, and all other responses as valid credentials."
msgstr ""
msgstr "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz."

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-09-22 12:51-0400\n"
"PO-Revision-Date: 2013-09-21 17:50+0000\n"
"Last-Translator: polxmod <paolo.velati@gmail.com>\n"
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
"PO-Revision-Date: 2013-09-30 12:15+0000\n"
"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -78,11 +78,11 @@ msgstr "Spazio di archiviazione insufficiente"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
msgstr "Upload fallito. Impossibile ottenere informazioni sul file"
msgstr "Caricamento non riuscito. Impossibile ottenere informazioni sul file."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
msgstr "Upload fallit. Impossibile trovare file caricato"
msgstr "Caricamento non riuscito. Impossibile trovare il file caricato."
#: ajax/upload.php:160
msgid "Invalid directory."
@ -94,7 +94,7 @@ msgstr "File"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
msgstr "Impossibile caricare {filename} poiché è una cartella oppure è di 0 byte"
msgstr "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte."
#: js/file-upload.js:255
msgid "Not enough space available"

View File

@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:45-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:17-0400\n"
"PO-Revision-Date: 2013-09-30 12:15+0000\n"
"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -121,11 +121,11 @@ msgstr "Impossibile cambiare la password"
msgid "Update to {appversion}"
msgstr "Aggiorna a {appversion}"
#: js/apps.js:49 js/apps.js:82 js/apps.js:108
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Disabilita"
#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Abilita"
@ -133,43 +133,43 @@ msgstr "Abilita"
msgid "Please wait...."
msgstr "Attendere..."
#: js/apps.js:79 js/apps.js:80 js/apps.js:100
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "Errore durante la disattivazione"
#: js/apps.js:99 js/apps.js:112 js/apps.js:113
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "Errore durante l'attivazione"
#: js/apps.js:123
#: js/apps.js:125
msgid "Updating...."
msgstr "Aggiornamento in corso..."
#: js/apps.js:126
#: js/apps.js:128
msgid "Error while updating app"
msgstr "Errore durante l'aggiornamento"
#: js/apps.js:126
#: js/apps.js:128
msgid "Error"
msgstr "Errore"
#: js/apps.js:127 templates/apps.php:43
#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Aggiorna"
#: js/apps.js:130
#: js/apps.js:132
msgid "Updated"
msgstr "Aggiornato"
#: js/personal.js:220
#: js/personal.js:221
msgid "Select a profile picture"
msgstr "Seleziona un'immagine del profilo"
#: js/personal.js:265
#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr "Decifratura dei file in corso... Attendi, potrebbe richiedere del tempo."
#: js/personal.js:287
#: js/personal.js:288
msgid "Saving..."
msgstr "Salvataggio in corso..."

View File

@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-22 12:55-0400\n"
"PO-Revision-Date: 2013-09-20 15:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-30 06:25+0000\n"
"Last-Translator: Daisuke Deguchi <ddeguchi@nagoya-u.jp>\n"
"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -112,7 +112,7 @@ msgstr "一時的なプロファイル用画像が利用できません。もう
#: avatar/controller.php:135
msgid "No crop data provided"
msgstr ""
msgstr "クロップデータは提供されません"
#: js/config.php:32
msgid "Sunday"
@ -269,21 +269,21 @@ msgstr "メッセージテンプレートの読み込みエラー: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
msgstr[0] ""
msgstr[0] "{count} ファイルが競合"
#: js/oc-dialogs.js:361
msgid "One file conflict"
msgstr ""
msgstr "1ファイルが競合"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
msgstr ""
msgstr "どちらのファイルを保持したいですか?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
msgstr ""
msgstr "両方のバージョンを選択した場合は、ファイル名の後ろに数字を追加したファイルのコピーを作成します。"
#: js/oc-dialogs.js:376
msgid "Cancel"
@ -291,19 +291,19 @@ msgstr "キャンセル"
#: js/oc-dialogs.js:386
msgid "Continue"
msgstr ""
msgstr "続ける"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
msgstr ""
msgstr "(全て選択)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
msgstr ""
msgstr "({count} 選択)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
msgstr ""
msgstr "既存ファイルのテンプレートの読み込みエラー"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@ -314,7 +314,7 @@ msgstr "オブジェクタイプが指定されていません。"
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
#: js/share.js:645 js/share.js:657
#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "エラー"
@ -334,7 +334,7 @@ msgstr "共有中"
msgid "Share"
msgstr "共有"
#: js/share.js:131 js/share.js:685
#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "共有でエラー発生"
@ -434,23 +434,23 @@ msgstr "削除"
msgid "share"
msgstr "共有"
#: js/share.js:400 js/share.js:632
#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "パスワード保護"
#: js/share.js:645
#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "有効期限の未設定エラー"
#: js/share.js:657
#: js/share.js:668
msgid "Error setting expiration date"
msgstr "有効期限の設定でエラー発生"
#: js/share.js:672
#: js/share.js:683
msgid "Sending ..."
msgstr "送信中..."
#: js/share.js:683
#: js/share.js:694
msgid "Email sent"
msgstr "メールを送信しました"

View File

@ -12,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:44-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
"PO-Revision-Date: 2013-09-30 06:27+0000\n"
"Last-Translator: Daisuke Deguchi <ddeguchi@nagoya-u.jp>\n"
"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -81,23 +81,23 @@ msgstr "ストレージに十分な空き容量がありません"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
msgstr ""
msgstr "アップロードに失敗。ファイル情報を取得できませんでした。"
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
msgstr ""
msgstr "アップロードに失敗。アップロード済みのファイルを見つけることができませんでした。"
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "無効なディレクトリです。"
#: appinfo/app.php:12
#: appinfo/app.php:11
msgid "Files"
msgstr "ファイル"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
msgstr ""
msgstr "ディレクトリもしくは0バイトのため {filename} をアップロードできません"
#: js/file-upload.js:255
msgid "Not enough space available"
@ -109,7 +109,7 @@ msgstr "アップロードはキャンセルされました。"
#: js/file-upload.js:356
msgid "Could not get result from server."
msgstr ""
msgstr "サーバから結果を取得できませんでした。"
#: js/file-upload.js:446
msgid ""
@ -223,7 +223,7 @@ msgstr "ダウンロードの準備中です。ファイルサイズが大きい
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
msgstr ""
msgstr "ファイルの移動エラー"
#: js/files.js:558 templates/index.php:61
msgid "Name"

View File

@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:45-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:17-0400\n"
"PO-Revision-Date: 2013-09-30 06:33+0000\n"
"Last-Translator: Daisuke Deguchi <ddeguchi@nagoya-u.jp>\n"
"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -89,42 +89,42 @@ msgstr "アプリを更新出来ませんでした。"
#: changepassword/controller.php:20
msgid "Wrong password"
msgstr ""
msgstr "無効なパスワード"
#: changepassword/controller.php:42
msgid "No user supplied"
msgstr ""
msgstr "ユーザが指定されていません"
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
msgstr ""
msgstr "復元用の管理者パスワードを入力してください。そうでない場合は、全ユーザのデータが失われます。"
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
msgstr ""
msgstr "無効な復元用の管理者パスワード。パスワードを確認して再度実行してください。"
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
msgstr ""
msgstr "バックエンドはパスワード変更をサポートしていませんが、ユーザの暗号化キーは正常に更新されました。"
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
msgstr ""
msgstr "パスワードを変更できません"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "{appversion} に更新"
#: js/apps.js:49 js/apps.js:82 js/apps.js:108
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "無効"
#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "有効化"
@ -132,43 +132,43 @@ msgstr "有効化"
msgid "Please wait...."
msgstr "しばらくお待ちください。"
#: js/apps.js:79 js/apps.js:80 js/apps.js:100
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "アプリ無効化中にエラーが発生"
#: js/apps.js:99 js/apps.js:112 js/apps.js:113
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "アプリ有効化中にエラーが発生"
#: js/apps.js:123
#: js/apps.js:125
msgid "Updating...."
msgstr "更新中...."
#: js/apps.js:126
#: js/apps.js:128
msgid "Error while updating app"
msgstr "アプリの更新中にエラーが発生"
#: js/apps.js:126
#: js/apps.js:128
msgid "Error"
msgstr "エラー"
#: js/apps.js:127 templates/apps.php:43
#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "更新"
#: js/apps.js:130
#: js/apps.js:132
msgid "Updated"
msgstr "更新済み"
#: js/personal.js:220
#: js/personal.js:221
msgid "Select a profile picture"
msgstr "プロファイル画像を選択"
#: js/personal.js:265
#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr "ファイルを複合中... しばらくお待ちください、この処理には少し時間がかかるかもしれません。"
#: js/personal.js:287
#: js/personal.js:288
msgid "Saving..."
msgstr "保存中..."
@ -496,11 +496,11 @@ msgstr "プロフィール写真"
#: templates/personal.php:90
msgid "Upload new"
msgstr ""
msgstr "新規にアップロード"
#: templates/personal.php:92
msgid "Select new from Files"
msgstr ""
msgstr "ファイルから新規に選択"
#: templates/personal.php:93
msgid "Remove image"
@ -508,7 +508,7 @@ msgstr "画像を削除"
#: templates/personal.php:94
msgid "Either png or jpg. Ideally square but you will be able to crop it."
msgstr ""
msgstr "png と jpg のいずれか。正方形が理想ですが、切り取って加工することも可能です。"
#: templates/personal.php:97
msgid "Abort"

View File

@ -5,13 +5,14 @@
# Translators:
# ujuc Gang <potopro@gmail.com>, 2013
# ujuc Gang <potopro@gmail.com>, 2013
# smallsnail <bjh13579@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:44-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
"PO-Revision-Date: 2013-09-29 10:06+0000\n"
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -31,11 +32,11 @@ msgstr "%s 항목을 이딩시키지 못하였음"
#: ajax/upload.php:16 ajax/upload.php:45
msgid "Unable to set upload directory."
msgstr ""
msgstr "업로드 디렉터리를 정할수 없습니다"
#: ajax/upload.php:22
msgid "Invalid Token"
msgstr ""
msgstr "잘못된 토큰"
#: ajax/upload.php:59
msgid "No file was uploaded. Unknown error"
@ -78,23 +79,23 @@ msgstr "저장소가 용량이 충분하지 않습니다."
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
msgstr ""
msgstr "업로드에 실패했습니다. 파일 정보를 가져올수 없습니다."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
msgstr ""
msgstr "업로드에 실패했습니다. 업로드할 파일을 찾을수 없습니다"
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "올바르지 않은 디렉터리입니다."
#: appinfo/app.php:12
#: appinfo/app.php:11
msgid "Files"
msgstr "파일"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
msgstr ""
msgstr "{filename}을 업로드 할수 없습니다. 폴더이거나 0 바이트 파일입니다."
#: js/file-upload.js:255
msgid "Not enough space available"
@ -106,7 +107,7 @@ msgstr "업로드가 취소되었습니다."
#: js/file-upload.js:356
msgid "Could not get result from server."
msgstr ""
msgstr "서버에서 결과를 가져올수 없습니다."
#: js/file-upload.js:446
msgid ""
@ -119,7 +120,7 @@ msgstr "URL을 입력해야 합니다."
#: js/file-upload.js:525 lib/app.php:53
msgid "Invalid folder name. Usage of 'Shared' is reserved by ownCloud"
msgstr ""
msgstr "유효하지 않은 폴더명입니다. \"Shared\" 이름의 사용은 OwnCloud 가 이미 예약하고 있습니다."
#: js/file-upload.js:557 js/file-upload.js:573 js/files.js:507 js/files.js:545
msgid "Error"
@ -168,21 +169,21 @@ msgstr "되돌리기"
#: js/filelist.js:533 js/filelist.js:599 js/files.js:576
msgid "%n folder"
msgid_plural "%n folders"
msgstr[0] ""
msgstr[0] "폴더 %n"
#: js/filelist.js:534 js/filelist.js:600 js/files.js:582
msgid "%n file"
msgid_plural "%n files"
msgstr[0] ""
msgstr[0] "파일 %n 개"
#: js/filelist.js:541
msgid "{dirs} and {files}"
msgstr ""
msgstr "{dirs} 그리고 {files}"
#: js/filelist.js:731 js/filelist.js:769
msgid "Uploading %n file"
msgid_plural "Uploading %n files"
msgstr[0] ""
msgstr[0] "%n 개의 파일을 업로드중"
#: js/files.js:25
msgid "'.' is an invalid file name."
@ -210,7 +211,7 @@ msgstr "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)"
msgid ""
"Encryption was disabled but your files are still encrypted. Please go to "
"your personal settings to decrypt your files."
msgstr ""
msgstr "암호화는 해제되어 있지만, 파일은 아직 암호화 되어 있습니다. 개인 설저에 가셔서 암호를 해제하십시오"
#: js/files.js:296
msgid ""
@ -220,7 +221,7 @@ msgstr "다운로드가 준비 중입니다. 파일 크기가 크다면 시간
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
msgstr ""
msgstr "파일 이동 오류"
#: js/files.js:558 templates/index.php:61
msgid "Name"
@ -237,7 +238,7 @@ msgstr "수정됨"
#: lib/app.php:73
#, php-format
msgid "%s could not be renamed"
msgstr ""
msgstr "%s 의 이름을 변경할수 없습니다"
#: lib/helper.php:11 templates/index.php:17
msgid "Upload"

View File

@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# smallsnail <bjh13579@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-13 21:46-0400\n"
"PO-Revision-Date: 2013-09-14 00:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-29 10:14+0000\n"
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -19,7 +20,7 @@ msgstr ""
#: templates/authenticate.php:4
msgid "The password is wrong. Try again."
msgstr ""
msgstr "비밀번호가 틀립니다. 다시 입력해주세요."
#: templates/authenticate.php:7
msgid "Password"
@ -31,27 +32,27 @@ msgstr "제출"
#: templates/part.404.php:3
msgid "Sorry, this link doesnt seem to work anymore."
msgstr ""
msgstr "죄송합니다만 이 링크는 더이상 작동되지 않습니다."
#: templates/part.404.php:4
msgid "Reasons might be:"
msgstr ""
msgstr "이유는 다음과 같을 수 있습니다:"
#: templates/part.404.php:6
msgid "the item was removed"
msgstr ""
msgstr "이 항목은 삭제되었습니다"
#: templates/part.404.php:7
msgid "the link expired"
msgstr ""
msgstr "링크가 만료되었습니다"
#: templates/part.404.php:8
msgid "sharing is disabled"
msgstr ""
msgstr "공유가 비활성되었습니다"
#: templates/part.404.php:10
msgid "For more info, please ask the person who sent this link."
msgstr ""
msgstr "더 자세한 설명은 링크를 보내신 분에게 여쭤보십시오"
#: templates/public.php:15
#, php-format

View File

@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# smallsnail <bjh13579@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-08-15 04:47-0400\n"
"PO-Revision-Date: 2013-08-15 08:48+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-29 07:38+0000\n"
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -20,63 +21,63 @@ msgstr ""
#: ajax/delete.php:42
#, php-format
msgid "Couldn't delete %s permanently"
msgstr ""
msgstr "%s를 영구적으로 삭제할수 없습니다"
#: ajax/undelete.php:42
#, php-format
msgid "Couldn't restore %s"
msgstr ""
msgstr "%s를 복원할수 없습니다"
#: js/trash.js:7 js/trash.js:100
#: js/trash.js:7 js/trash.js:102
msgid "perform restore operation"
msgstr ""
msgstr "복원 작업중"
#: js/trash.js:20 js/trash.js:48 js/trash.js:118 js/trash.js:146
#: js/trash.js:20 js/trash.js:49 js/trash.js:120 js/trash.js:148
msgid "Error"
msgstr "오류"
#: js/trash.js:36
#: js/trash.js:37
msgid "delete file permanently"
msgstr ""
msgstr "영구적으로 파일 삭제하기"
#: js/trash.js:127
#: js/trash.js:129
msgid "Delete permanently"
msgstr "영원히 삭제"
#: js/trash.js:182 templates/index.php:17
#: js/trash.js:190 templates/index.php:21
msgid "Name"
msgstr "이름"
#: js/trash.js:183 templates/index.php:27
#: js/trash.js:191 templates/index.php:31
msgid "Deleted"
msgstr ""
msgstr "삭제됨"
#: js/trash.js:191
#: js/trash.js:199
msgid "%n folder"
msgid_plural "%n folders"
msgstr[0] ""
msgstr[0] "폴더 %n개"
#: js/trash.js:197
#: js/trash.js:205
msgid "%n file"
msgid_plural "%n files"
msgstr[0] ""
msgstr[0] "파일 %n개 "
#: lib/trash.php:819 lib/trash.php:821
#: lib/trashbin.php:814 lib/trashbin.php:816
msgid "restored"
msgstr ""
msgstr "복원됨"
#: templates/index.php:9
msgid "Nothing in here. Your trash bin is empty!"
msgstr ""
msgstr "현재 휴지통은 비어있습니다!"
#: templates/index.php:20 templates/index.php:22
#: templates/index.php:24 templates/index.php:26
msgid "Restore"
msgstr "복원"
#: templates/index.php:30 templates/index.php:31
#: templates/index.php:34 templates/index.php:35
msgid "Delete"
msgstr "삭제"
#: templates/part.breadcrumb.php:9
msgid "Deleted Files"
msgstr ""
msgstr "삭제된 파일들"

View File

@ -4,13 +4,14 @@
#
# Translators:
# Shinjo Park <kde@peremen.name>, 2013
# smallsnail <bjh13579@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-07-28 01:56-0400\n"
"PO-Revision-Date: 2013-07-27 06:10+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-29 10:18+0000\n"
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -29,16 +30,16 @@ msgstr "버전"
#: js/versions.js:53
msgid "Failed to revert {file} to revision {timestamp}."
msgstr ""
msgstr "{timestamp} 판의 {file}로 돌리는데 실패했습니다."
#: js/versions.js:79
msgid "More versions..."
msgstr ""
msgstr "더 많은 버전들..."
#: js/versions.js:116
msgid "No other versions available"
msgstr ""
msgstr "다른 버전을 사용할수 없습니다"
#: js/versions.js:149
#: js/versions.js:145
msgid "Restore"
msgstr "복원"

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-09-16 11:33-0400\n"
"PO-Revision-Date: 2013-09-16 15:34+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-29 07:46+0000\n"
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -19,53 +19,53 @@ msgstr ""
"Language: ko\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: app.php:239
#: app.php:237
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr "현재 ownCloud 버전과 호환되지 않기 때문에 \"%s\" 앱을 설치할 수 없습니다."
#: app.php:250
#: app.php:248
msgid "No app name specified"
msgstr "앱 이름이 지정되지 않았습니다."
#: app.php:361
#: app.php:352
msgid "Help"
msgstr "도움말"
#: app.php:374
#: app.php:365
msgid "Personal"
msgstr "개인"
#: app.php:385
#: app.php:376
msgid "Settings"
msgstr "설정"
#: app.php:397
#: app.php:388
msgid "Users"
msgstr "사용자"
#: app.php:410
#: app.php:401
msgid "Admin"
msgstr "관리자"
#: app.php:839
#: app.php:832
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr "\"%s\" 업그레이드에 실패했습니다."
#: avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
msgstr ""
msgstr "개개인의 프로필 사진은 아직은 암호화 되지 않습니다"
#: avatar.php:64
msgid "Unknown filetype"
msgstr ""
msgstr "알수없는 파일형식"
#: avatar.php:69
msgid "Invalid image"
msgstr ""
msgstr "잘못된 그림"
#: defaults.php:35
msgid "web services under your control"
@ -96,7 +96,7 @@ msgstr "선택한 파일들은 ZIP 파일을 생성하기에 너무 큽니다."
msgid ""
"Download the files in smaller chunks, seperately or kindly ask your "
"administrator."
msgstr ""
msgstr "작은 조각들 안에 들어있는 파일들을 받고자 하신다면, 나누어서 받으시거나 혹은 시스템 관리자에게 정중하게 물어보십시오"
#: installer.php:63
msgid "No source specified when installing app"
@ -166,15 +166,15 @@ msgstr "인증 오류"
msgid "Token expired. Please reload page."
msgstr "토큰이 만료되었습니다. 페이지를 새로 고치십시오."
#: search/provider/file.php:17 search/provider/file.php:35
#: search/provider/file.php:18 search/provider/file.php:36
msgid "Files"
msgstr "파일"
#: search/provider/file.php:26 search/provider/file.php:33
#: search/provider/file.php:27 search/provider/file.php:34
msgid "Text"
msgstr "텍스트"
#: search/provider/file.php:29
#: search/provider/file.php:30
msgid "Images"
msgstr "그림"
@ -278,6 +278,11 @@ msgstr "WebDAV 인터페이스가 제대로 작동하지 않습니다. 웹 서
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr "<a href='%s'>설치 가이드</a>를 다시 한 번 확인하십시오."
#: tags.php:194
#, php-format
msgid "Could not find category \"%s\""
msgstr "분류 \"%s\"을(를) 찾을 수 없습니다."
#: template/functions.php:96
msgid "seconds ago"
msgstr "초 전"
@ -325,8 +330,3 @@ msgstr "년 전"
#: template.php:297
msgid "Caused by:"
msgstr "원인: "
#: vcategories.php:188 vcategories.php:249
#, php-format
msgid "Could not find category \"%s\""
msgstr "분류 \"%s\"을(를) 찾을 수 없습니다."

View File

@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-22 12:55-0400\n"
"PO-Revision-Date: 2013-09-20 15:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-29 07:58+0000\n"
"Last-Translator: Liudas Ališauskas <liudas.alisauskas@gmail.com>\n"
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -277,23 +277,23 @@ msgstr "Klaida įkeliant žinutės ruošinį: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "{count} failas konfliktuoja"
msgstr[1] "{count} failai konfliktuoja"
msgstr[2] "{count} failų konfliktų"
#: js/oc-dialogs.js:361
msgid "One file conflict"
msgstr ""
msgstr "Vienas failo konfliktas"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
msgstr ""
msgstr "Kuriuos failus norite laikyti?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
msgstr ""
msgstr "Jei pasirenkate abi versijas, nukopijuotas failas turės pridėtą numerį pavadinime."
#: js/oc-dialogs.js:376
msgid "Cancel"
@ -301,19 +301,19 @@ msgstr "Atšaukti"
#: js/oc-dialogs.js:386
msgid "Continue"
msgstr ""
msgstr "Tęsti"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
msgstr ""
msgstr "(visi pažymėti)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
msgstr ""
msgstr "({count} pažymėtų)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
msgstr ""
msgstr "Klaida įkeliant esančių failų ruošinį"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@ -324,7 +324,7 @@ msgstr "Objekto tipas nenurodytas."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
#: js/share.js:645 js/share.js:657
#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Klaida"
@ -344,7 +344,7 @@ msgstr "Dalinamasi"
msgid "Share"
msgstr "Dalintis"
#: js/share.js:131 js/share.js:685
#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Klaida, dalijimosi metu"
@ -444,23 +444,23 @@ msgstr "ištrinti"
msgid "share"
msgstr "dalintis"
#: js/share.js:400 js/share.js:632
#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Apsaugota slaptažodžiu"
#: js/share.js:645
#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Klaida nuimant galiojimo laiką"
#: js/share.js:657
#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Klaida nustatant galiojimo laiką"
#: js/share.js:672
#: js/share.js:683
msgid "Sending ..."
msgstr "Siunčiama..."
#: js/share.js:683
#: js/share.js:694
msgid "Email sent"
msgstr "Laiškas išsiųstas"

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-09-20 10:44-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
"PO-Revision-Date: 2013-09-29 08:46+0000\n"
"Last-Translator: Liudas Ališauskas <liudas.alisauskas@gmail.com>\n"
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -78,23 +78,23 @@ msgstr "Nepakanka vietos serveryje"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
msgstr ""
msgstr "Įkėlimas nepavyko. Nepavyko gauti failo informacijos."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
msgstr ""
msgstr "Įkėlimas nepavyko. Nepavyko rasti įkelto failo"
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "Neteisingas aplankas"
#: appinfo/app.php:12
#: appinfo/app.php:11
msgid "Files"
msgstr "Failai"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
msgstr ""
msgstr "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio"
#: js/file-upload.js:255
msgid "Not enough space available"
@ -106,7 +106,7 @@ msgstr "Įkėlimas atšauktas."
#: js/file-upload.js:356
msgid "Could not get result from server."
msgstr ""
msgstr "Nepavyko gauti rezultato iš serverio."
#: js/file-upload.js:446
msgid ""
@ -226,7 +226,7 @@ msgstr "Jūsų atsisiuntimas yra paruošiamas. tai gali užtrukti jei atsisiunč
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
msgstr ""
msgstr "Klaida perkeliant failą"
#: js/files.js:558 templates/index.php:61
msgid "Name"

View File

@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:45-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:17-0400\n"
"PO-Revision-Date: 2013-09-29 08:49+0000\n"
"Last-Translator: Liudas Ališauskas <liudas.alisauskas@gmail.com>\n"
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -90,42 +90,42 @@ msgstr "Nepavyko atnaujinti programos."
#: changepassword/controller.php:20
msgid "Wrong password"
msgstr ""
msgstr "Neteisingas slaptažodis"
#: changepassword/controller.php:42
msgid "No user supplied"
msgstr ""
msgstr "Nepateiktas naudotojas"
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
msgstr ""
msgstr "Prašome įvesti administratoriaus atkūrimo slaptažodį, kitaip visi naudotojo suomenys bus prarasti"
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
msgstr ""
msgstr "Netinkamas administratoriau atkūrimo slaptažodis. Prašome pasitikrinti ir bandyti vėl."
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
msgstr ""
msgstr "Sistema nepalaiko slaptažodžio keitimo, bet naudotojo šifravimo raktas buvo sėkmingai atnaujintas."
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
msgstr ""
msgstr "Nepavyksta pakeisti slaptažodžio"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "Atnaujinti iki {appversion}"
#: js/apps.js:49 js/apps.js:82 js/apps.js:108
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Išjungti"
#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Įjungti"
@ -133,43 +133,43 @@ msgstr "Įjungti"
msgid "Please wait...."
msgstr "Prašome palaukti..."
#: js/apps.js:79 js/apps.js:80 js/apps.js:100
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "Klaida išjungiant programą"
#: js/apps.js:99 js/apps.js:112 js/apps.js:113
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "Klaida įjungiant programą"
#: js/apps.js:123
#: js/apps.js:125
msgid "Updating...."
msgstr "Atnaujinama..."
#: js/apps.js:126
#: js/apps.js:128
msgid "Error while updating app"
msgstr "Įvyko klaida atnaujinant programą"
#: js/apps.js:126
#: js/apps.js:128
msgid "Error"
msgstr "Klaida"
#: js/apps.js:127 templates/apps.php:43
#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Atnaujinti"
#: js/apps.js:130
#: js/apps.js:132
msgid "Updated"
msgstr "Atnaujinta"
#: js/personal.js:220
#: js/personal.js:221
msgid "Select a profile picture"
msgstr "Pažymėkite profilio paveikslėlį"
#: js/personal.js:265
#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr "Iššifruojami failai... Prašome palaukti, tai gali užtrukti."
#: js/personal.js:287
#: js/personal.js:288
msgid "Saving..."
msgstr "Saugoma..."

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-09-22 12:55-0400\n"
"PO-Revision-Date: 2013-09-20 15:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-30 12:27+0000\n"
"Last-Translator: Cyryl Sochacki <cyrylsochacki@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -98,11 +98,11 @@ msgstr ""
#: avatar/controller.php:81
msgid "Unknown filetype"
msgstr ""
msgstr "Nieznany typ pliku"
#: avatar/controller.php:85
msgid "Invalid image"
msgstr ""
msgstr "Nieprawidłowe zdjęcie"
#: avatar/controller.php:115 avatar/controller.php:142
msgid "No temporary profile picture available, try again"
@ -275,13 +275,13 @@ msgstr ""
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "{count} konfliktów plików"
msgstr[1] "{count} konfliktów plików"
msgstr[2] "{count} konfliktów plików"
#: js/oc-dialogs.js:361
msgid "One file conflict"
msgstr ""
msgstr "Konflikt pliku"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
@ -299,15 +299,15 @@ msgstr "Anuluj"
#: js/oc-dialogs.js:386
msgid "Continue"
msgstr ""
msgstr "Kontynuuj "
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
msgstr ""
msgstr "(wszystkie zaznaczone)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
msgstr ""
msgstr "({count} zaznaczonych)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
@ -322,7 +322,7 @@ msgstr "Nie określono typu obiektu."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
#: js/share.js:645 js/share.js:657
#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Błąd"
@ -342,7 +342,7 @@ msgstr "Udostępniono"
msgid "Share"
msgstr "Udostępnij"
#: js/share.js:131 js/share.js:685
#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Błąd podczas współdzielenia"
@ -442,23 +442,23 @@ msgstr "usuń"
msgid "share"
msgstr "współdziel"
#: js/share.js:400 js/share.js:632
#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Zabezpieczone hasłem"
#: js/share.js:645
#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Błąd podczas usuwania daty wygaśnięcia"
#: js/share.js:657
#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Błąd podczas ustawiania daty wygaśnięcia"
#: js/share.js:672
#: js/share.js:683
msgid "Sending ..."
msgstr "Wysyłanie..."
#: js/share.js:683
#: js/share.js:694
msgid "Email sent"
msgstr "E-mail wysłany"

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