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

View File

@ -7,68 +7,54 @@
.actions input, .actions button, .actions .button { margin:0; float:left; } .actions input, .actions button, .actions .button { margin:0; float:left; }
.actions .button a { color: #555; } .actions .button a { color: #555; }
.actions .button a:hover, .actions .button a:active { color: #333; } .actions .button a:hover, .actions .button a:active { color: #333; }
#new { #new, #trash {
height:17px; margin:0 0 0 1em; z-index:1010; float:left; 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 { #new>ul {
display:none; position:fixed; min-width:7em; z-index:10; display: none;
padding:.5em; padding-bottom:0; margin-top:.075em; margin-left:-.5em; position: fixed;
min-width: 7em;
z-index: 10;
padding: .5em;
padding-bottom: 0;
margin-top: 14px;
margin-left: -1px;
text-align:left; 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); box-shadow:0 2px 7px rgba(170,170,170,.4);
} }
#new>ul>li { height:36px; margin:.3em; padding-left:3em; padding-bottom:0.1em; #new>ul>li { height:36px; margin:.3em; padding-left:3em; padding-bottom:0.1em;
background-repeat:no-repeat; cursor:pointer; } background-repeat:no-repeat; cursor:pointer; }
#new>ul>li>p { cursor:pointer; padding-top: 7px; padding-bottom: 7px;} #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 */ /* 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 { background-color:#fff; height:2.5em; }
#filestable tbody tr:hover, tbody tr:active { #filestable tbody tr:hover, tbody tr:active {
background-color: rgb(240,240,240); background-color: rgb(240,240,240);
@ -122,9 +108,18 @@ table th#headerDate, table td.date {
/* Multiselect bar */ /* Multiselect bar */
#filestable.multiselect { #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 { table.multiselect thead th {
background-color: rgba(210,210,210,.7); 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; -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; } #uploadsize-message,#delete-confirm { display:none; }
/* File actions */ /* 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; } #scanning-message{ top:40%; left:40%; position:absolute; display:none; }
div.crumb a{ padding:0.9em 0 0.7em 0; color:#555; }
table.dragshadow { table.dragshadow {
width:auto; width:auto;
} }

View File

@ -1,38 +1,63 @@
#upload { #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; vertical-align: top;
} }
#upload a { #upload a {
position:relative; display:block; width:100%; height:27px; position: relative;
cursor:pointer; z-index:10; display: block;
background-image:url('%webroot%/core/img/actions/upload.svg'); width: 100%;
background-repeat:no-repeat; height: 44px;
background-position:7px 6px; width: 44px;
opacity:0.65; 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_target { display:none; }
.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; } .file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; }
#file_upload_start { #file_upload_start {
float: left; position: relative;
left:0; top:0; width:28px; height:27px; padding:0; left: 0;
font-size:1em; 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; -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 { #uploadprogresswrapper {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
display: inline-block; display: inline-block;
vertical-align: top; vertical-align: top;
margin:0.3em; height: 36px;
height: 29px; box-sizing: border-box;
}
#uploadprogresswrapper > input[type='button'] {
height: 36px;
} }
#uploadprogressbar { #uploadprogressbar {
position:relative; position:relative;
float: left; float: left;
margin-left: 12px; margin-left: 12px;
width: 130px; width: 130px;
height: 26px; height: 36px;
display:inline-block; display:inline-block;
} }
#uploadprogressbar + stop { #uploadprogressbar + stop {

View File

@ -104,8 +104,12 @@ if ($needUpgrade) {
$storageInfo=OC_Helper::getStorageInfo($dir); $storageInfo=OC_Helper::getStorageInfo($dir);
$maxUploadFilesize=OCP\Util::maxUploadFilesize($dir); $maxUploadFilesize=OCP\Util::maxUploadFilesize($dir);
$publicUploadEnabled = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes'); $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')) { if (OC_App::isEnabled('files_encryption')) {
$publicUploadEnabled = 'no'; $publicUploadEnabled = 'no';
$session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
$encryptionInitStatus = $session->getInitialized();
} }
$trashEnabled = \OCP\App::isEnabled('files_trashbin'); $trashEnabled = \OCP\App::isEnabled('files_trashbin');
@ -133,7 +137,10 @@ if ($needUpgrade) {
$tmpl->assign('isPublic', false); $tmpl->assign('isPublic', false);
$tmpl->assign('publicUploadEnabled', $publicUploadEnabled); $tmpl->assign('publicUploadEnabled', $publicUploadEnabled);
$tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles()); $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('disableSharing', false);
$tmpl->assign('ajaxLoad', $ajaxLoad); $tmpl->assign('ajaxLoad', $ajaxLoad);
$tmpl->printPage(); $tmpl->printPage();
} }

View File

@ -63,6 +63,15 @@ Files={
} }
var encryptedFiles = $('#encryptedFiles').val(); 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') { 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.')); 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; 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}%)", "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.", "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.", "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", "Name" => "Název",
"Size" => "Velikost", "Size" => "Velikost",
"Modified" => "Upraveno", "Modified" => "Upraveno",

View File

@ -13,11 +13,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manca una cartella temporanea", "Missing a temporary folder" => "Manca una cartella temporanea",
"Failed to write to disk" => "Scrittura su disco non riuscita", "Failed to write to disk" => "Scrittura su disco non riuscita",
"Not enough storage available" => "Spazio di archiviazione insufficiente", "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 get file info." => "Caricamento non riuscito. Impossibile ottenere informazioni sul file.",
"Upload failed. Could not find uploaded file" => "Upload fallit. Impossibile trovare file caricato", "Upload failed. Could not find uploaded file" => "Caricamento non riuscito. Impossibile trovare il file caricato.",
"Invalid directory." => "Cartella non valida.", "Invalid directory." => "Cartella non valida.",
"Files" => "File", "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", "Not enough space available" => "Spazio disponibile insufficiente",
"Upload cancelled." => "Invio annullato", "Upload cancelled." => "Invio annullato",
"Could not get result from server." => "Impossibile ottenere il risultato dal server.", "Could not get result from server." => "Impossibile ottenere il risultato dal server.",

View File

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

View File

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

View File

@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Nėra laikinojo katalogo", "Missing a temporary folder" => "Nėra laikinojo katalogo",
"Failed to write to disk" => "Nepavyko įrašyti į diską", "Failed to write to disk" => "Nepavyko įrašyti į diską",
"Not enough storage available" => "Nepakanka vietos serveryje", "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", "Invalid directory." => "Neteisingas aplankas",
"Files" => "Failai", "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", "Not enough space available" => "Nepakanka vietos",
"Upload cancelled." => "Įkėlimas atšauktas.", "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.", "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.", "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", "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}%)", "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.", "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.", "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", "Name" => "Pavadinimas",
"Size" => "Dydis", "Size" => "Dydis",
"Modified" => "Pakeista", "Modified" => "Pakeista",

View File

@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Brak folderu tymczasowego", "Missing a temporary folder" => "Brak folderu tymczasowego",
"Failed to write to disk" => "Błąd zapisu na dysk", "Failed to write to disk" => "Błąd zapisu na dysk",
"Not enough storage available" => "Za mało dostępnego miejsca", "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.", "Invalid directory." => "Zła ścieżka.",
"Files" => "Pliki", "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", "Not enough space available" => "Za mało miejsca",
"Upload cancelled." => "Wczytywanie anulowane.", "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.", "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.", "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", "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}%)", "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.", "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.", "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", "Name" => "Nazwa",
"Size" => "Rozmiar", "Size" => "Rozmiar",
"Modified" => "Modyfikacja", "Modified" => "Modyfikacja",

View File

@ -84,7 +84,7 @@ class Helper
} }
} }
$i['directory'] = $dir; $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); $i['icon'] = \OCA\Files\Helper::determineIcon($i);
$files[] = $i; $files[] = $i;
} }

View File

@ -9,7 +9,7 @@
data-type='file'><p><?php p($l->t('Text file'));?></p></li> data-type='file'><p><?php p($l->t('Text file'));?></p></li>
<li style="background-image:url('<?php p(OCP\mimetype_icon('dir')) ?>')" <li style="background-image:url('<?php p(OCP\mimetype_icon('dir')) ?>')"
data-type='folder'><p><?php p($l->t('Folder'));?></p></li> 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> data-type='web'><p><?php p($l->t('From link'));?></p></li>
</ul> </ul>
</div> </div>
@ -116,3 +116,5 @@
<input type="hidden" name="allowZipDownload" id="allowZipDownload" value="<?php p($_['allowZipDownload']); ?>" /> <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="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="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 endif; ?>
<?php if($file['type'] == 'dir'): ?> <?php if($file['type'] == 'dir'): ?>
<a class="name" href="<?php p(rtrim($_['baseURL'],'/').'/'.trim($directory,'/').'/'.$name); ?>" title=""> <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"> <span class="nametext">
<?php if($file['type'] == 'dir'):?>
<?php print_unescaped(htmlspecialchars($file['name']));?> <?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> </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'):?> <?php if($file['type'] == 'dir'):?>
<span class="uploadtext" currentUploads="0"> <span class="uploadtext" currentUploads="0">
</span> </span>

View File

@ -48,6 +48,7 @@ if ($decryptedKey) {
// success or failure // success or failure
if ($return) { if ($return) {
$session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL);
\OCP\JSON::success(array('data' => array('message' => $l->t('Private key password successfully updated.')))); \OCP\JSON::success(array('data' => array('message' => $l->t('Private key password successfully updated.'))));
} else { } else {
\OCP\JSON::error(array('data' => array('message' => $l->t('Could not update the private key password. Maybe the old password was not correct.')))); \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) { if($sessionReady) {
$session = new \OCA\Encryption\Session($view); $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 { } else {
// logout user if we are in maintenance to force re-login // 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> <author>Sam Tuke, Bjoern Schiessle, Florin Peter</author>
<require>4</require> <require>4</require>
<shipped>true</shipped> <shipped>true</shipped>
<rememberlogin>false</rememberlogin>
<types> <types>
<filesystem/> <filesystem/>
</types> </types>

View File

@ -1 +1 @@
0.4 0.5

View File

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

View File

@ -159,7 +159,6 @@ class Hooks {
* @param array $params keys: uid, password * @param array $params keys: uid, password
*/ */
public static function setPassphrase($params) { public static function setPassphrase($params) {
// Only attempt to change passphrase if server-side encryption // Only attempt to change passphrase if server-side encryption
// is in use (client-side encryption does not have access to // is in use (client-side encryption does not have access to
// the necessary keys) // 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 * if the app gets enabled again
* @param array $params contains the app ID * @param array $params contains the app ID
*/ */
public static function preDisable($params) { public static function preDisable($params) {
if ($params['app'] === 'files_encryption') { 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 * Copyright (c) 2013
* <icewind1991@gmail.com> * 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. * This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file. * See the COPYING-README file.
*/ */
@ -31,11 +33,12 @@ $(document).ready(function(){
// Trigger ajax on recoveryAdmin status change // Trigger ajax on recoveryAdmin status change
var enabledStatus = $('#adminEnableRecovery').val(); var enabledStatus = $('#adminEnableRecovery').val();
$('input:password[name="recoveryPassword"]').keyup(function(event) { $('input:password[name="encryptionRecoveryPassword"]').keyup(function(event) {
var recoveryPassword = $( '#recoveryPassword' ).val(); var recoveryPassword = $( '#encryptionRecoveryPassword' ).val();
var recoveryPasswordRepeated = $( '#repeatEncryptionRecoveryPassword' ).val();
var checkedButton = $('input:radio[name="adminEnableRecovery"]:checked').val(); var checkedButton = $('input:radio[name="adminEnableRecovery"]:checked').val();
var uncheckedValue = (1+parseInt(checkedButton)) % 2; var uncheckedValue = (1+parseInt(checkedButton)) % 2;
if (recoveryPassword != '' ) { if (recoveryPassword !== '' && recoveryPassword === recoveryPasswordRepeated) {
$('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').removeAttr("disabled"); $('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').removeAttr("disabled");
} else { } else {
$('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').attr("disabled", "true"); $('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').attr("disabled", "true");
@ -46,7 +49,7 @@ $(document).ready(function(){
function() { function() {
var recoveryStatus = $( this ).val(); var recoveryStatus = $( this ).val();
var oldStatus = (1+parseInt(recoveryStatus)) % 2; var oldStatus = (1+parseInt(recoveryStatus)) % 2;
var recoveryPassword = $( '#recoveryPassword' ).val(); var recoveryPassword = $( '#encryptionRecoveryPassword' ).val();
$.post( $.post(
OC.filePath( 'files_encryption', 'ajax', 'adminrecovery.php' ) OC.filePath( 'files_encryption', 'ajax', 'adminrecovery.php' )
, { adminEnableRecovery: recoveryStatus, recoveryPassword: recoveryPassword } , { adminEnableRecovery: recoveryStatus, recoveryPassword: recoveryPassword }
@ -57,11 +60,10 @@ $(document).ready(function(){
} else { } else {
OC.Notification.hide(); OC.Notification.hide();
if (recoveryStatus === "0") { if (recoveryStatus === "0") {
$('button:button[name="submitChangeRecoveryKey"]').attr("disabled", "true"); $('p[name="changeRecoveryPasswordBlock"]').addClass("hidden");
$('input:password[name="changeRecoveryPassword"]').attr("disabled", "true");
$('input:password[name="changeRecoveryPassword"]').val("");
} else { } 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 // change recovery password
$('input:password[name="changeRecoveryPassword"]').keyup(function(event) { $('input:password[name="changeRecoveryPassword"]').keyup(function(event) {
var oldRecoveryPassword = $('input:password[id="oldRecoveryPassword"]').val(); var oldRecoveryPassword = $('#oldEncryptionRecoveryPassword').val();
var newRecoveryPassword = $('input:password[id="newRecoveryPassword"]').val(); var newRecoveryPassword = $('#newEncryptionRecoveryPassword').val();
if (newRecoveryPassword != '' && oldRecoveryPassword != '' ) { var newRecoveryPasswordRepeated = $('#repeatedNewEncryptionRecoveryPassword').val();
if (newRecoveryPassword !== '' && oldRecoveryPassword !== '' && newRecoveryPassword === newRecoveryPasswordRepeated) {
$('button:button[name="submitChangeRecoveryKey"]').removeAttr("disabled"); $('button:button[name="submitChangeRecoveryKey"]').removeAttr("disabled");
} else { } else {
$('button:button[name="submitChangeRecoveryKey"]').attr("disabled", "true"); $('button:button[name="submitChangeRecoveryKey"]').attr("disabled", "true");
@ -83,8 +87,8 @@ $(document).ready(function(){
$('button:button[name="submitChangeRecoveryKey"]').click(function() { $('button:button[name="submitChangeRecoveryKey"]').click(function() {
var oldRecoveryPassword = $('input:password[id="oldRecoveryPassword"]').val(); var oldRecoveryPassword = $('#oldEncryptionRecoveryPassword').val();
var newRecoveryPassword = $('input:password[id="newRecoveryPassword"]').val(); var newRecoveryPassword = $('#newEncryptionRecoveryPassword').val();
OC.msg.startSaving('#encryption .msg'); OC.msg.startSaving('#encryption .msg');
$.post( $.post(
OC.filePath( 'files_encryption', 'ajax', 'changeRecoveryPassword.php' ) OC.filePath( 'files_encryption', 'ajax', 'changeRecoveryPassword.php' )

View File

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

View File

@ -30,6 +30,11 @@ class Session {
private $view; 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 * @brief if session is started, check if ownCloud key pair is set up, if not create it
* @param \OC_FilesystemView $view * @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 * @brief Gets user or public share private key from session
* @returns string $privateKey The user's plaintext private key * @returns string $privateKey The user's plaintext private key

View File

@ -131,7 +131,7 @@ class Stream {
if($this->privateKey === false) { if($this->privateKey === false) {
// if private key is not valid redirect user to a error page // 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); $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_IN_PROGRESS = -1; // migration is running
const MIGRATION_OPEN = 0; // user still needs to be migrated const MIGRATION_OPEN = 0; // user still needs to be migrated
private $view; // OC_FilesystemView object for filesystem operations private $view; // OC_FilesystemView object for filesystem operations
private $userId; // ID of the currently logged-in user private $userId; // ID of the currently logged-in user
private $client; // Client side encryption mode flag private $client; // Client side encryption mode flag
@ -1752,6 +1751,11 @@ class Util {
*/ */
public function initEncryption($params) { 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']); $encryptedKey = Keymanager::getPrivateKey($this->view, $params['uid']);
$privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']); $privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']);
@ -1762,9 +1766,8 @@ class Util {
return false; return false;
} }
$session = new \OCA\Encryption\Session($this->view);
$session->setPrivateKey($privateKey); $session->setPrivateKey($privateKey);
$session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL);
return $session; return $session;
} }

View File

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

View File

@ -2,9 +2,11 @@
<li class='error'> <li class='error'>
<?php $location = \OC_Helper::linkToRoute( "settings_personal" ).'#changePKPasswd' ?> <?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/> <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/> <br/>
</li> </li>
</ul> </ul>

View File

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

View File

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

View File

@ -1,7 +1,14 @@
<?php <?php
$TRANSLATIONS = array( $TRANSLATIONS = array(
"The password is wrong. Try again." => "비밀번호가 틀립니다. 다시 입력해주세요.",
"Password" => "암호", "Password" => "암호",
"Submit" => "제출", "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 folder %s with you" => "%s 님이 폴더 %s을(를) 공유하였습니다",
"%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다", "%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다",
"Download" => "다운로드", "Download" => "다운로드",

View File

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

View File

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

View File

@ -61,7 +61,7 @@ class Helper
$i['directory'] = ''; $i['directory'] = '';
} }
$i['permissions'] = \OCP\PERMISSION_READ; $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); $i['icon'] = \OCA\Files\Helper::determineIcon($i);
$files[] = $i; $files[] = $i;
} }

View File

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

View File

@ -27,5 +27,6 @@ OCP\JSON::checkAppEnabled('user_ldap');
OCP\JSON::callCheck(); OCP\JSON::callCheck();
$prefix = $_POST['ldap_serverconfig_chooser']; $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())); OCP\JSON::success(array('configuration' => $connection->getConfiguration()));

View File

@ -27,7 +27,8 @@ OCP\JSON::checkAppEnabled('user_ldap');
OCP\JSON::callCheck(); OCP\JSON::callCheck();
$prefix = $_POST['ldap_serverconfig_chooser']; $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->setConfiguration($_POST);
$connection->saveConfiguration(); $connection->saveConfiguration();
OCP\JSON::success(); OCP\JSON::success();

View File

@ -28,7 +28,8 @@ OCP\JSON::callCheck();
$l=OC_L10N::get('user_ldap'); $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)) { if($connection->setConfiguration($_POST)) {
//Configuration is okay //Configuration is okay
if($connection->bind()) { if($connection->bind()) {

View File

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

View File

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

View File

@ -23,6 +23,8 @@
namespace OCA\user_ldap; namespace OCA\user_ldap;
use OCA\user_ldap\lib\ILDAPWrapper;
class Group_Proxy extends lib\Proxy implements \OCP\GroupInterface { class Group_Proxy extends lib\Proxy implements \OCP\GroupInterface {
private $backends = array(); private $backends = array();
private $refBackend = null; private $refBackend = null;
@ -31,12 +33,11 @@ class Group_Proxy extends lib\Proxy implements \OCP\GroupInterface {
* @brief Constructor * @brief Constructor
* @param $serverConfigPrefixes array containing the config Prefixes * @param $serverConfigPrefixes array containing the config Prefixes
*/ */
public function __construct($serverConfigPrefixes) { public function __construct($serverConfigPrefixes, ILDAPWrapper $ldap) {
parent::__construct(); parent::__construct($ldap);
foreach($serverConfigPrefixes as $configPrefix) { foreach($serverConfigPrefixes as $configPrefix) {
$this->backends[$configPrefix] = new \OCA\user_ldap\GROUP_LDAP(); $this->backends[$configPrefix] =
$connector = $this->getConnector($configPrefix); new \OCA\user_ldap\GROUP_LDAP($this->getAccess($configPrefix));
$this->backends[$configPrefix]->setConnector($connector);
if(is_null($this->refBackend)) { if(is_null($this->refBackend)) {
$this->refBackend = &$this->backends[$configPrefix]; $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", "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!", "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", "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:", "Internal Username Attribute:" => "A belső felhasználónév attribútuma:",
"Override UUID detection" => "Az UUID-felismerés felülbírálása", "Override UUID detection" => "Az UUID-felismerés felülbírálása",
"UUID Attribute:" => "UUID attribútum:", "UUID Attribute:" => "UUID attribútum:",

View File

@ -23,12 +23,13 @@
namespace OCA\user_ldap\lib; namespace OCA\user_ldap\lib;
abstract class Access { class Access extends LDAPUtility {
protected $connection; public $connection;
//never ever check this var directly, always use getPagedSearchResultState //never ever check this var directly, always use getPagedSearchResultState
protected $pagedSearchedSuccessful; protected $pagedSearchedSuccessful;
public function setConnector(Connection &$connection) { public function __construct(Connection $connection, ILDAPWrapper $ldap) {
parent::__construct($ldap);
$this->connection = $connection; $this->connection = $connection;
} }
@ -54,14 +55,14 @@ abstract class Access {
return false; return false;
} }
$cr = $this->connection->getConnectionResource(); $cr = $this->connection->getConnectionResource();
if(!is_resource($cr)) { if(!$this->ldap->isResource($cr)) {
//LDAP not available //LDAP not available
\OCP\Util::writeLog('user_ldap', 'LDAP resource not available.', \OCP\Util::DEBUG); \OCP\Util::writeLog('user_ldap', 'LDAP resource not available.', \OCP\Util::DEBUG);
return false; return false;
} }
$dn = $this->DNasBaseParameter($dn); $dn = $this->DNasBaseParameter($dn);
$rr = @ldap_read($cr, $dn, $filter, array($attr)); $rr = @$this->ldap->read($cr, $dn, $filter, array($attr));
if(!is_resource($rr)) { if(!$this->ldap->isResource($rr)) {
if(!empty($attr)) { if(!empty($attr)) {
//do not throw this message on userExists check, irritates //do not throw this message on userExists check, irritates
\OCP\Util::writeLog('user_ldap', 'readAttribute failed for DN '.$dn, \OCP\Util::DEBUG); \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); \OCP\Util::writeLog('user_ldap', 'readAttribute: '.$dn.' found', \OCP\Util::DEBUG);
return array(); return array();
} }
$er = ldap_first_entry($cr, $rr); $er = $this->ldap->firstEntry($cr, $rr);
if(!is_resource($er)) { if(!$this->ldap->isResource($er)) {
//did not match the filter, return false //did not match the filter, return false
return false; return false;
} }
//LDAP attributes are not case sensitive //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'); $attr = mb_strtolower($attr, 'UTF-8');
if(isset($result[$attr]) && $result[$attr]['count'] > 0) { 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 // See if we have a resource, in case not cancel with message
$link_resource = $this->connection->getConnectionResource(); $link_resource = $this->connection->getConnectionResource();
if(!is_resource($link_resource)) { if(!$this->ldap->isResource($link_resource)) {
// Seems like we didn't find any resource. // Seems like we didn't find any resource.
// Return an empty array just like before. // Return an empty array just like before.
\OCP\Util::writeLog('user_ldap', 'Could not search, because resource is missing.', \OCP\Util::DEBUG); \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); $pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, $limit, $offset);
$linkResources = array_pad(array(), count($base), $link_resource); $linkResources = array_pad(array(), count($base), $link_resource);
$sr = ldap_search($linkResources, $base, $filter, $attr); $sr = $this->ldap->search($linkResources, $base, $filter, $attr);
$error = ldap_errno($link_resource); $error = $this->ldap->errno($link_resource);
if(!is_array($sr) || $error !== 0) { if(!is_array($sr) || $error !== 0) {
\OCP\Util::writeLog('user_ldap', \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::ERROR);
\OCP\Util::writeLog('user_ldap', 'Attempt for Paging? '.print_r($pagedSearchOK, true), \OCP\Util::ERROR); \OCP\Util::writeLog('user_ldap', 'Attempt for Paging? '.print_r($pagedSearchOK, true), \OCP\Util::ERROR);
return array(); return array();
@ -677,19 +680,19 @@ abstract class Access {
// Do the server-side sorting // Do the server-side sorting
foreach(array_reverse($attr) as $sortAttr){ foreach(array_reverse($attr) as $sortAttr){
foreach($sr as $searchResource) { foreach($sr as $searchResource) {
ldap_sort($link_resource, $searchResource, $sortAttr); $this->ldap->sort($link_resource, $searchResource, $sortAttr);
} }
} }
$findings = array(); $findings = array();
foreach($sr as $key => $res) { 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) { if($pagedSearchOK) {
\OCP\Util::writeLog('user_ldap', 'Paged search successful', \OCP\Util::INFO); \OCP\Util::writeLog('user_ldap', 'Paged search successful', \OCP\Util::INFO);
foreach($sr as $key => $res) { foreach($sr as $key => $res) {
$cookie = null; $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); \OCP\Util::writeLog('user_ldap', 'Set paged search cookie', \OCP\Util::INFO);
$this->setPagedResultCookie($base[$key], $filter, $limit, $offset, $cookie); $this->setPagedResultCookie($base[$key], $filter, $limit, $offset, $cookie);
} }
@ -1103,8 +1106,9 @@ abstract class Access {
if($offset > 0) { if($offset > 0) {
\OCP\Util::writeLog('user_ldap', 'Cookie '.$cookie, \OCP\Util::INFO); \OCP\Util::writeLog('user_ldap', 'Cookie '.$cookie, \OCP\Util::INFO);
} }
$pagedSearchOK = ldap_control_paged_result($this->connection->getConnectionResource(), $pagedSearchOK = $this->ldap->controlPagedResult(
$limit, false, $cookie); $this->connection->getConnectionResource(), $limit,
false, $cookie);
if(!$pagedSearchOK) { if(!$pagedSearchOK) {
return false; 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; namespace OCA\user_ldap\lib;
class Connection { class Connection extends LDAPUtility {
private $ldapConnectionRes = null; private $ldapConnectionRes = null;
private $configPrefix; private $configPrefix;
private $configID; private $configID;
@ -60,7 +60,7 @@ class Connection {
'ldapQuotaDefault' => null, 'ldapQuotaDefault' => null,
'ldapEmailAttribute' => null, 'ldapEmailAttribute' => null,
'ldapCacheTTL' => null, 'ldapCacheTTL' => null,
'ldapUuidAttribute' => null, 'ldapUuidAttribute' => 'auto',
'ldapOverrideUuidAttribute' => null, 'ldapOverrideUuidAttribute' => null,
'ldapOverrideMainServer' => false, 'ldapOverrideMainServer' => false,
'ldapConfigurationActive' => false, 'ldapConfigurationActive' => false,
@ -77,7 +77,8 @@ class Connection {
* @param $configPrefix a string with the prefix for the configkey column (appconfig table) * @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 * @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->configPrefix = $configPrefix;
$this->configID = $configID; $this->configID = $configID;
$memcache = new \OC\Memcache\Factory(); $memcache = new \OC\Memcache\Factory();
@ -86,13 +87,14 @@ class Connection {
} else { } else {
$this->cache = \OC_Cache::getGlobalCache(); $this->cache = \OC_Cache::getGlobalCache();
} }
$this->config['hasPagedResultSupport'] = (function_exists('ldap_control_paged_result') $this->config['hasPagedResultSupport'] =
&& function_exists('ldap_control_paged_result_response')); $this->ldap->hasPagedResultSupport();
} }
public function __destruct() { public function __destruct() {
if(!$this->dontDestruct && is_resource($this->ldapConnectionRes)) { if(!$this->dontDestruct &&
@ldap_unbind($this->ldapConnectionRes); $this->ldap->isResource($this->ldapConnectionRes)) {
@$this->ldap->unbind($this->ldapConnectionRes);
}; };
} }
@ -148,7 +150,7 @@ class Connection {
public function getConnectionResource() { public function getConnectionResource() {
if(!$this->ldapConnectionRes) { if(!$this->ldapConnectionRes) {
$this->init(); $this->init();
} else if(!is_resource($this->ldapConnectionRes)) { } else if(!$this->ldap->isResource($this->ldapConnectionRes)) {
$this->ldapConnectionRes = null; $this->ldapConnectionRes = null;
$this->establishConnection(); $this->establishConnection();
} }
@ -361,6 +363,14 @@ class Connection {
&& $params[$parameter] === 'homeFolderNamingRule')) && $params[$parameter] === 'homeFolderNamingRule'))
&& !empty($value)) { && !empty($value)) {
$value = 'attr:'.$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])) { if(isset($this->config[$parameter])) {
$this->config[$parameter] = $value; $this->config[$parameter] = $value;
@ -386,7 +396,8 @@ class Connection {
public function saveConfiguration() { public function saveConfiguration() {
$trans = array_flip($this->getConfigTranslationArray()); $trans = array_flip($this->getConfigTranslationArray());
foreach($this->config as $key => $value) { 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) { switch ($key) {
case 'ldapAgentPassword': case 'ldapAgentPassword':
$value = base64_encode($value); $value = base64_encode($value);
@ -431,8 +442,9 @@ class Connection {
$config[$dbKey] = ''; $config[$dbKey] = '';
} }
continue; continue;
} else if((strpos($classKey, 'ldapBase') !== false) } else if((strpos($classKey, 'ldapBase') !== false
|| (strpos($classKey, 'ldapAttributes') !== false)) { || strpos($classKey, 'ldapAttributes') !== false)
&& is_array($this->config[$classKey])) {
$config[$dbKey] = implode("\n", $this->config[$classKey]); $config[$dbKey] = implode("\n", $this->config[$classKey]);
continue; continue;
} }
@ -551,7 +563,7 @@ class Connection {
* @returns an associative array with the default values. Keys are correspond * @returns an associative array with the default values. Keys are correspond
* to config-value entries in the database table * to config-value entries in the database table
*/ */
public function getDefaults() { static public function getDefaults() {
return array( return array(
'ldap_host' => '', 'ldap_host' => '',
'ldap_port' => '389', 'ldap_port' => '389',
@ -603,7 +615,7 @@ class Connection {
return false; return false;
} }
if(!$this->ldapConnectionRes) { if(!$this->ldapConnectionRes) {
if(!function_exists('ldap_connect')) { if(!$this->ldap->areLDAPFunctionsAvailable()) {
$phpLDAPinstalled = false; $phpLDAPinstalled = false;
\OCP\Util::writeLog('user_ldap', \OCP\Util::writeLog('user_ldap',
'function ldap_connect is not available. Make sure that the PHP ldap module is installed.', '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')) { if(!$this->config['ldapOverrideMainServer'] && !$this->getFromCache('overrideMainServer')) {
$this->doConnect($this->config['ldapHost'], $this->config['ldapPort']); $this->doConnect($this->config['ldapHost'], $this->config['ldapPort']);
$bindStatus = $this->bind(); $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 { } else {
$bindStatus = false; $bindStatus = false;
$error = null; $error = null;
@ -653,11 +666,11 @@ class Connection {
//ldap_connect ignores port paramater when URLs are passed //ldap_connect ignores port paramater when URLs are passed
$host .= ':' . $port; $host .= ':' . $port;
} }
$this->ldapConnectionRes = ldap_connect($host, $port); $this->ldapConnectionRes = $this->ldap->connect($host, $port);
if(ldap_set_option($this->ldapConnectionRes, LDAP_OPT_PROTOCOL_VERSION, 3)) { if($this->ldap->setOption($this->ldapConnectionRes, LDAP_OPT_PROTOCOL_VERSION, 3)) {
if(ldap_set_option($this->ldapConnectionRes, LDAP_OPT_REFERRALS, 0)) { if($this->ldap->setOption($this->ldapConnectionRes, LDAP_OPT_REFERRALS, 0)) {
if($this->config['ldapTLS']) { if($this->config['ldapTLS']) {
ldap_start_tls($this->ldapConnectionRes); $this->ldap->startTls($this->ldapConnectionRes);
} }
} }
} }
@ -678,13 +691,15 @@ class Connection {
$getConnectionResourceAttempt = true; $getConnectionResourceAttempt = true;
$cr = $this->getConnectionResource(); $cr = $this->getConnectionResource();
$getConnectionResourceAttempt = false; $getConnectionResourceAttempt = false;
if(!is_resource($cr)) { if(!$this->ldap->isResource($cr)) {
return false; 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) { if(!$ldapLogin) {
\OCP\Util::writeLog('user_ldap', \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); \OCP\Util::ERROR);
$this->ldapConnectionRes = null; $this->ldapConnectionRes = null;
return false; 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; return self::$groupBE;
} }
$configPrefixes = Helper::getServerConfigurationPrefixes(true); $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 //avoid the proxy when there is only one LDAP server configured
$connector = new Connection($configPrefixes[0]); $connector = new OCA\user_ldap\lib\Connection($ldapWrapper, $configPrefixes[0]);
self::$groupBE = new \OCA\user_ldap\GROUP_LDAP(); $ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper);
self::$groupBE->setConnector($connector); self::$groupBE = new OCA\user_ldap\GROUP_LDAP($ldapAccess);
} else { } else {
self::$groupBE = new \OCA\user_ldap\Group_Proxy($configPrefixes); self::$groupBE = new \OCA\user_ldap\Group_Proxy($configPrefixes, $ldapWrapper);
} }
return self::$groupBE; 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; namespace OCA\user_ldap\lib;
abstract class Proxy { use OCA\user_ldap\lib\Access;
static private $connectors = array();
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(); $this->cache = \OC_Cache::getGlobalCache();
} }
private function addConnector($configPrefix) { private function addAccess($configPrefix) {
self::$connectors[$configPrefix] = new \OCA\user_ldap\lib\Connection($configPrefix); $connector = new Connection($this->ldap, $configPrefix);
self::$accesses[$configPrefix] = new Access($connector, $this->ldap);
} }
protected function getConnector($configPrefix) { protected function getAccess($configPrefix) {
if(!isset(self::$connectors[$configPrefix])) { if(!isset(self::$accesses[$configPrefix])) {
$this->addConnector($configPrefix); $this->addAccess($configPrefix);
} }
return self::$connectors[$configPrefix]; return self::$accesses[$configPrefix];
}
protected function getConnectors() {
return self::$connectors;
} }
protected function getUserCacheKey($uid) { protected function getUserCacheKey($uid) {

View File

@ -49,14 +49,9 @@ $tmpl->assign('serverConfigurationPrefixes', $prefixes);
$tmpl->assign('serverConfigurationHosts', $hosts); $tmpl->assign('serverConfigurationHosts', $hosts);
// assign default values // assign default values
if(!isset($ldap)) { $defaults = \OCA\user_ldap\lib\Connection::getDefaults();
$ldap = new \OCA\user_ldap\lib\Connection();
}
$defaults = $ldap->getDefaults();
foreach($defaults as $key => $default) { foreach($defaults as $key => $default) {
$tmpl->assign($key.'_default', $default); $tmpl->assign($key.'_default', $default);
} }
// $tmpl->assign();
return $tmpl->fetchPage(); 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; 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) { private function updateQuota($dn) {
$quota = null; $quota = null;
$quotaDefault = $this->connection->ldapQuotaDefault; $quotaDefault = $this->access->connection->ldapQuotaDefault;
$quotaAttribute = $this->connection->ldapQuotaAttribute; $quotaAttribute = $this->access->connection->ldapQuotaAttribute;
if(!empty($quotaDefault)) { if(!empty($quotaDefault)) {
$quota = $quotaDefault; $quota = $quotaDefault;
} }
if(!empty($quotaAttribute)) { if(!empty($quotaAttribute)) {
$aQuota = $this->readAttribute($dn, $quotaAttribute); $aQuota = $this->access->readAttribute($dn, $quotaAttribute);
if($aQuota && (count($aQuota) > 0)) { if($aQuota && (count($aQuota) > 0)) {
$quota = $aQuota[0]; $quota = $aQuota[0];
} }
} }
if(!is_null($quota)) { 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) { private function updateEmail($dn) {
$email = null; $email = null;
$emailAttribute = $this->connection->ldapEmailAttribute; $emailAttribute = $this->access->connection->ldapEmailAttribute;
if(!empty($emailAttribute)) { if(!empty($emailAttribute)) {
$aEmail = $this->readAttribute($dn, $emailAttribute); $aEmail = $this->access->readAttribute($dn, $emailAttribute);
if($aEmail && (count($aEmail) > 0)) { if($aEmail && (count($aEmail) > 0)) {
$email = $aEmail[0]; $email = $aEmail[0];
} }
if(!is_null($email)) { 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) { public function checkPassword($uid, $password) {
//find out dn of the user name //find out dn of the user name
$filter = \OCP\Util::mb_str_replace('%uid', $uid, $this->connection->ldapLoginFilter, 'UTF-8'); $filter = \OCP\Util::mb_str_replace(
$ldap_users = $this->fetchListOfUsers($filter, 'dn'); '%uid', $uid, $this->access->connection->ldapLoginFilter, 'UTF-8');
$ldap_users = $this->access->fetchListOfUsers($filter, 'dn');
if(count($ldap_users) < 1) { if(count($ldap_users) < 1) {
return false; return false;
} }
$dn = $ldap_users[0]; $dn = $ldap_users[0];
//do we have a username for him/her? //do we have a username for him/her?
$ocname = $this->dn2username($dn); $ocname = $this->access->dn2username($dn);
if($ocname) { if($ocname) {
//update some settings, if necessary //update some settings, if necessary
@ -86,7 +96,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
$this->updateEmail($dn); $this->updateEmail($dn);
//are the credentials OK? //are the credentials OK?
if(!$this->areCredentialsValid($dn, $password)) { if(!$this->access->areCredentialsValid($dn, $password)) {
return false; return false;
} }
@ -107,7 +117,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
$cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset; $cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset;
//check if users are cached, if so return //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)) { if(!is_null($ldap_users)) {
return $ldap_users; return $ldap_users;
} }
@ -117,21 +127,23 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
if($limit <= 0) { if($limit <= 0) {
$limit = null; $limit = null;
} }
$filter = $this->combineFilterWithAnd(array( $filter = $this->access->combineFilterWithAnd(array(
$this->connection->ldapUserFilter, $this->access->connection->ldapUserFilter,
$this->getFilterPartForUserSearch($search) $this->access->getFilterPartForUserSearch($search)
)); ));
\OCP\Util::writeLog('user_ldap', \OCP\Util::writeLog('user_ldap',
'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset.' Filter: '.$filter, 'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset.' Filter: '.$filter,
\OCP\Util::DEBUG); \OCP\Util::DEBUG);
//do the search and translate results to owncloud names //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); $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); \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; return $ldap_users;
} }
@ -141,24 +153,25 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
* @return boolean * @return boolean
*/ */
public function userExists($uid) { public function userExists($uid) {
if($this->connection->isCached('userExists'.$uid)) { if($this->access->connection->isCached('userExists'.$uid)) {
return $this->connection->getFromCache('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. //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) { 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; return false;
} }
//check if user really still exists by reading its entry //check if user really still exists by reading its entry
if(!is_array($this->readAttribute($dn, ''))) { if(!is_array($this->access->readAttribute($dn, ''))) {
$this->connection->writeToCache('userExists'.$uid, false); \OCP\Util::writeLog('user_ldap', 'LDAP says no user '.$dn, \OCP\Util::DEBUG);
$this->access->connection->writeToCache('userExists'.$uid, false);
return false; return false;
} }
$this->connection->writeToCache('userExists'.$uid, true); $this->access->connection->writeToCache('userExists'.$uid, true);
$this->updateQuota($dn); $this->updateQuota($dn);
return true; return true;
} }
@ -186,12 +199,13 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
} }
$cacheKey = 'getHome'.$uid; $cacheKey = 'getHome'.$uid;
if($this->connection->isCached($cacheKey)) { if($this->access->connection->isCached($cacheKey)) {
return $this->connection->getFromCache($cacheKey); return $this->access->connection->getFromCache($cacheKey);
} }
if(strpos($this->connection->homeFolderNamingRule, 'attr:') === 0) { if(strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0) {
$attr = substr($this->connection->homeFolderNamingRule, strlen('attr:')); $attr = substr($this->access->connection->homeFolderNamingRule, strlen('attr:'));
$homedir = $this->readAttribute($this->username2dn($uid), $attr); $homedir = $this->access->readAttribute(
$this->access->username2dn($uid), $attr);
if($homedir && isset($homedir[0])) { if($homedir && isset($homedir[0])) {
$path = $homedir[0]; $path = $homedir[0];
//if attribute's value is an absolute path take this, otherwise append it to data dir //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', $homedir = \OCP\Config::getSystemValue('datadirectory',
\OC::$SERVERROOT.'/data' ) . '/' . $homedir[0]; \OC::$SERVERROOT.'/data' ) . '/' . $homedir[0];
} }
$this->connection->writeToCache($cacheKey, $homedir); $this->access->connection->writeToCache($cacheKey, $homedir);
return $homedir; return $homedir;
} }
} }
//false will apply default behaviour as defined and done by OC_User //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; return false;
} }
@ -227,16 +241,16 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
} }
$cacheKey = 'getDisplayName'.$uid; $cacheKey = 'getDisplayName'.$uid;
if(!is_null($displayName = $this->connection->getFromCache($cacheKey))) { if(!is_null($displayName = $this->access->connection->getFromCache($cacheKey))) {
return $displayName; return $displayName;
} }
$displayName = $this->readAttribute( $displayName = $this->access->readAttribute(
$this->username2dn($uid), $this->access->username2dn($uid),
$this->connection->ldapUserDisplayName); $this->access->connection->ldapUserDisplayName);
if($displayName && (count($displayName) > 0)) { if($displayName && (count($displayName) > 0)) {
$this->connection->writeToCache($cacheKey, $displayName[0]); $this->access->connection->writeToCache($cacheKey, $displayName[0]);
return $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) { public function getDisplayNames($search = '', $limit = null, $offset = null) {
$cacheKey = 'getDisplayNames-'.$search.'-'.$limit.'-'.$offset; $cacheKey = 'getDisplayNames-'.$search.'-'.$limit.'-'.$offset;
if(!is_null($displayNames = $this->connection->getFromCache($cacheKey))) { if(!is_null($displayNames = $this->access->connection->getFromCache($cacheKey))) {
return $displayNames; return $displayNames;
} }
@ -260,7 +274,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
foreach ($users as $user) { foreach ($users as $user) {
$displayNames[$user] = $this->getDisplayName($user); $displayNames[$user] = $this->getDisplayName($user);
} }
$this->connection->writeToCache($cacheKey, $displayNames); $this->access->connection->writeToCache($cacheKey, $displayNames);
return $displayNames; return $displayNames;
} }

View File

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

View File

@ -1,5 +1,7 @@
<?php <?php
$TRANSLATIONS = array( $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);"; $PLURAL_FORMS = "nplurals=2; plural=(n != 1);";

View File

@ -12,6 +12,16 @@ DATABASEUSER=oc_autotest$EXECUTOR_NUMBER
ADMINLOGIN=admin$EXECUTOR_NUMBER ADMINLOGIN=admin$EXECUTOR_NUMBER
BASEDIR=$PWD 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 # use tmpfs for datadir - should speedup unit test execution
if [ -d /dev/shm ]; then if [ -d /dev/shm ]; then
DATADIR=/dev/shm/data-autotest$EXECUTOR_NUMBER DATADIR=/dev/shm/data-autotest$EXECUTOR_NUMBER
@ -158,6 +168,13 @@ else
execute_tests $1 $2 $3 execute_tests $1 $2 $3
fi 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: # NOTES on mysql:
# - CREATE DATABASE oc_autotest; # - CREATE DATABASE oc_autotest;

View File

@ -23,6 +23,8 @@ OC_JSON::checkLoggedIn();
OCP\JSON::callCheck(); OCP\JSON::callCheck();
OC_App::loadApps(); OC_App::loadApps();
$defaults = new \OCP\Defaults();
if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSource'])) { if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSource'])) {
switch ($_POST['action']) { switch ($_POST['action']) {
case 'share': case 'share':
@ -81,6 +83,104 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
($return) ? OC_JSON::success() : OC_JSON::error(); ($return) ? OC_JSON::success() : OC_JSON::error();
} }
break; 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': case 'email':
// read post variables // read post variables
$user = OCP\USER::getUser(); $user = OCP\USER::getUser();

View File

@ -2,66 +2,66 @@
This file is licensed under the Affero General Public License version 3 or later. This file is licensed under the Affero General Public License version 3 or later.
See the COPYING-README file. */ See the COPYING-README file. */
#dropdown { #dropdown {
background:#eee; background:#eee;
border-bottom-left-radius:1em; border-bottom-left-radius: 5px;
border-bottom-right-radius:1em; border-bottom-right-radius: 5px;
box-shadow:0 1px 1px #777; box-shadow:0 1px 1px #777;
display:block; display:block;
margin-right:7em; margin-right:7em;
position:absolute; position:absolute;
right:0; right:0;
width:19em; width:25em;
z-index:500; z-index:500;
padding:1em; padding:1em;
} }
#shareWithList { #shareWithList {
list-style-type:none; list-style-type:none;
padding:.5em; padding:.5em;
} }
#shareWithList li { #shareWithList li {
padding-top:.1em; padding-top:.1em;
} }
#shareWithList li:first-child { #shareWithList li:first-child {
white-space:normal; white-space:normal;
} }
#shareWithList .cruds { #shareWithList .cruds {
margin-left:-10px; margin-left:-10px;
} }
#shareWithList .unshare img, #shareWithList .showCruds img { #shareWithList .unshare img, #shareWithList .showCruds img {
vertical-align:text-bottom; /* properly align icons */ vertical-align:text-bottom; /* properly align icons */
} }
#dropdown label { #dropdown label {
font-weight:400; font-weight:400;
} }
#dropdown input[type="checkbox"] { #dropdown input[type="checkbox"] {
margin:0 .2em 0 .5em; margin:0 .2em 0 .5em;
} }
a.showCruds { a.showCruds {
display:inline; display:inline;
opacity:.5; opacity:.5;
} }
a.unshare { a.unshare {
display:inline; display:inline;
float:right; float:right;
opacity:.5; opacity:.5;
padding:.3em 0 0 .3em !important; padding:.3em 0 0 .3em !important;
margin-top:-5px; margin-top:-5px;
} }
#link { #link {
border-top:1px solid #ddd; border-top:1px solid #ddd;
padding-top:.5em; padding-top:.5em;
} }
#dropdown input[type="text"],#dropdown input[type="password"] { #dropdown input[type="text"],#dropdown input[type="password"] {
width:90%; width:90%;
@ -75,22 +75,24 @@
#linkText,#linkPass,#expiration { #linkText,#linkPass,#expiration {
display:none; display:none;
} }
#link #showPassword img { #link #showPassword img {
padding-left:.3em; padding-left:.3em;
width:12px; width:12px;
} }
.reshare,#link label,#expiration label { .reshare,#link label,#expiration label {
padding-left:.5em; padding-left:.5em;
} }
a.showCruds:hover,a.unshare:hover { a.showCruds:hover,a.unshare:hover {
opacity:1; 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 */ .ui-autocomplete { /* limit dropdown height to 4 1/2 entries */
max-height:103px; 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 { #body-user #header, #body-settings #header {
position:fixed; top:0; left:0; right:0; z-index:100; height:45px; line-height:2.5em; position:fixed; top:0; left:0; right:0; z-index:100; height:45px; line-height:2.5em;
background:#1d2d44 url('../img/noise.png') repeat; 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 { #body-login {
@ -46,6 +43,10 @@ body { background:#fefefe; font:normal .8em/1.6em "Helvetica Neue",Helvetica,Ari
display: inline-block; display: inline-block;
} }
#header .avatardiv img {
opacity: 1;
}
/* INPUTS */ /* INPUTS */
input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"], input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"],
textarea, select, textarea, select,
@ -155,23 +156,37 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b
/* CONTENT ------------------------------------------------------------------ */ /* CONTENT ------------------------------------------------------------------ */
#controls { #controls {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
position: fixed; position: fixed;
height: 36px; height: 44px;
width: 100%; width: 100%;
padding: 0 75px 0 6px; padding-right: 75px;
margin: 0; margin: 0;
background: #eee; background: #eee;
border-bottom: 1px solid #e7e7e7; border-bottom: 1px solid #e7e7e7;
z-index: 50; 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; display: inline-block;
height: 36px;
padding: 7px 10px
} }
#content { position:relative; height:100%; width:100%; } #content { position:relative; height:100%; width:100%; }
#content .hascontrols { position: relative; top: 2.9em; } #content .hascontrols {
position: relative;
top: 45px;
}
#content-wrapper { #content-wrapper {
position:absolute; height:100%; width:100%; padding-top:3.5em; padding-left:80px; position:absolute; height:100%; width:100%; padding-top:3.5em; padding-left:80px;
-moz-box-sizing:border-box; box-sizing:border-box; -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; z-index: 75;
height: 100%; height: 100%;
background:#383c43 url('../img/noise.png') repeat; 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; overflow:hidden; box-sizing:border-box; -moz-box-sizing:border-box;
/* prevent ugly selection effect on accidental selection */ /* prevent ugly selection effect on accidental selection */
-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -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.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.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); } .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;} .help-iframe {width: 100%; height: 100%; margin: 0;padding: 0; border: 0; overflow: auto;}
/* ---- BREADCRUMB ---- */ /* ---- 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 {
div.crumb:first-child { padding:10px 20px 10px 5px; } float: left;
div.crumb.last { font-weight:bold; background:none; padding-right:10px; } display: block;
div.crumb a{ padding: 0.9em 0 0.7em 0; } 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 */ /* some feedback for hover/tap on breadcrumbs */
div.crumb:hover, 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="44" width="14" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<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/"> <metadata>
<g transform="translate(0 -1016.4)"> <rdf:RDF>
<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"/> <cc:Work rdf:about="">
</g> <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> </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(){ $(document).ready(function(){
if (OC.currentUser) { if (OC.currentUser) {
$('#header .avatardiv').avatar(OC.currentUser, 32); $('#header .avatardiv').avatar(OC.currentUser, 32, undefined, true);
// Personal settings // Personal settings
$('#avatar .avatardiv').avatar(OC.currentUser, 128); $('#avatar .avatardiv').avatar(OC.currentUser, 128);
} }

View File

@ -15,7 +15,7 @@
* You may use this on any <div></div> * You may use this on any <div></div>
* Here I'm using <div class="avatardiv"></div> as an example. * 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); * 1. $('.avatardiv').avatar('jdoe', 128);
* This will make the div to jdoe's fitting avatar, with a size of 128px. * 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); * 4. $('.avatardiv').avatar('jdoe', 128, true);
* This will behave like the first example, except it will also append random * 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. * 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 ($) { (function ($) {
$.fn.avatar = function(user, size, ie8fix) { $.fn.avatar = function(user, size, ie8fix, hidedefault) {
if (typeof(size) === 'undefined') { if (typeof(size) === 'undefined') {
if (this.height() > 0) { if (this.height() > 0) {
size = this.height(); size = this.height();
@ -69,12 +74,17 @@
var url = OC.Router.generate('core_avatar_get', {user: user, size: size})+'?requesttoken='+oc_requesttoken; var url = OC.Router.generate('core_avatar_get', {user: user, size: size})+'?requesttoken='+oc_requesttoken;
$.get(url, function(result) { $.get(url, function(result) {
if (typeof(result) === 'object') { if (typeof(result) === 'object') {
if (!hidedefault) {
if (result.data && result.data.displayname) { if (result.data && result.data.displayname) {
$div.placeholder(user, result.data.displayname); $div.placeholder(user, result.data.displayname);
} else { } else {
$div.placeholder(user); $div.placeholder(user);
} }
} else { } else {
$div.hide();
}
} else {
$div.show();
if (ie8fix === true) { if (ie8fix === true) {
$div.html('<img src="'+url+'#'+Math.floor(Math.random()*1000)+'">'); $div.html('<img src="'+url+'#'+Math.floor(Math.random()*1000)+'">');
} else { } else {

View File

@ -114,6 +114,7 @@ OC.Share={
data = false; data = false;
} }
}}); }});
return data; return data;
}, },
share:function(itemType, itemSource, shareType, shareWith, permissions, callback) { share:function(itemType, itemSource, shareType, shareWith, permissions, callback) {
@ -217,9 +218,9 @@ OC.Share={
OC.Share.showLink(share.token, share.share_with, itemSource); OC.Share.showLink(share.token, share.share_with, itemSource);
} else { } else {
if (share.collection) { 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 { } 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) { 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]) { if (!OC.Share.itemShares[shareType]) {
OC.Share.itemShares[shareType] = []; OC.Share.itemShares[shareType] = [];
} }
@ -343,6 +344,14 @@ OC.Share={
}else{ }else{
html += escapeHTML(shareWithDisplayName); 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 (possiblePermissions & OC.PERMISSION_CREATE || possiblePermissions & OC.PERMISSION_UPDATE || possiblePermissions & OC.PERMISSION_DELETE) {
if (editChecked == '') { if (editChecked == '') {
html += '<label style="display:none;">'; 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}", "Error loading message template: {error}" => "Chyba při nahrávání šablony zprávy: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("","",""), "_{count} file conflict_::_{count} file conflicts_" => array("","",""),
"One file conflict" => "Jeden konflikt souboru", "One file conflict" => "Jeden konflikt souboru",
"Which files do you want to keep?" => "Které soubory chcete ponechat?",
"Cancel" => "Zrušit", "Cancel" => "Zrušit",
"Continue" => "Pokračovat",
"The object type is not specified." => "Není určen typ objektu.", "The object type is not specified." => "Není určen typ objektu.",
"Error" => "Chyba", "Error" => "Chyba",
"The app name is not specified." => "Není určen název aplikace.", "The app name is not specified." => "Není určen název aplikace.",

View File

@ -2,6 +2,12 @@
$TRANSLATIONS = array( $TRANSLATIONS = array(
"%s shared »%s« with you" => "%s megosztotta Önnel ezt: »%s«", "%s shared »%s« with you" => "%s megosztotta Önnel ezt: »%s«",
"group" => "csoport", "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.", "Category type not provided." => "Nincs megadva a kategória típusa.",
"No category to add?" => "Nincs hozzáadandó kategória?", "No category to add?" => "Nincs hozzáadandó kategória?",
"This category already exists: %s" => "Ez a kategória már létezik: %s", "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", "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", "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", "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", "Sunday" => "vasárnap",
"Monday" => "hétfő", "Monday" => "hétfő",
"Tuesday" => "kedd", "Tuesday" => "kedd",
@ -42,11 +53,20 @@ $TRANSLATIONS = array(
"last year" => "tavaly", "last year" => "tavaly",
"years ago" => "több éve", "years ago" => "több éve",
"Choose" => "Válasszon", "Choose" => "Válasszon",
"Error loading file picker template: {error}" => "Nem sikerült betölteni a fájlkiválasztó sablont: {error}",
"Yes" => "Igen", "Yes" => "Igen",
"No" => "Nem", "No" => "Nem",
"Ok" => "Ok", "Ok" => "Ok",
"Error loading message template: {error}" => "Nem sikerült betölteni az üzenet sablont: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("",""), "_{count} file conflict_::_{count} file conflicts_" => array("",""),
"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", "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.", "The object type is not specified." => "Az objektum típusa nincs megadva.",
"Error" => "Hiba", "Error" => "Hiba",
"The app name is not specified." => "Az alkalmazás neve nincs megadva.", "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", "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 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.", "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}", "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.", "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?", "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" => "不明なファイルタイプ", "Unknown filetype" => "不明なファイルタイプ",
"Invalid image" => "無効な画像", "Invalid image" => "無効な画像",
"No temporary profile picture available, try again" => "一時的なプロファイル用画像が利用できません。もう一度試して下さい", "No temporary profile picture available, try again" => "一時的なプロファイル用画像が利用できません。もう一度試して下さい",
"No crop data provided" => "クロップデータは提供されません",
"Sunday" => "", "Sunday" => "",
"Monday" => "", "Monday" => "",
"Tuesday" => "", "Tuesday" => "",
@ -57,8 +58,15 @@ $TRANSLATIONS = array(
"No" => "いいえ", "No" => "いいえ",
"Ok" => "OK", "Ok" => "OK",
"Error loading message template: {error}" => "メッセージテンプレートの読み込みエラー: {error}", "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" => "キャンセル", "Cancel" => "キャンセル",
"Continue" => "続ける",
"(all selected)" => "(全て選択)",
"({count} selected)" => "({count} 選択)",
"Error loading file exists template" => "既存ファイルのテンプレートの読み込みエラー",
"The object type is not specified." => "オブジェクタイプが指定されていません。", "The object type is not specified." => "オブジェクタイプが指定されていません。",
"Error" => "エラー", "Error" => "エラー",
"The app name is not specified." => "アプリ名がしていされていません。", "The app name is not specified." => "アプリ名がしていされていません。",

View File

@ -58,8 +58,15 @@ $TRANSLATIONS = array(
"No" => "Ne", "No" => "Ne",
"Ok" => "Gerai", "Ok" => "Gerai",
"Error loading message template: {error}" => "Klaida įkeliant žinutės ruošinį: {error}", "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", "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.", "The object type is not specified." => "Objekto tipas nenurodytas.",
"Error" => "Klaida", "Error" => "Klaida",
"The app name is not specified." => "Nenurodytas programos pavadinimas.", "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.", "Error adding %s to favorites." => "Błąd podczas dodawania %s do ulubionych.",
"No categories selected for deletion." => "Nie zaznaczono kategorii do usunięcia.", "No categories selected for deletion." => "Nie zaznaczono kategorii do usunięcia.",
"Error removing %s from favorites." => "Błąd podczas usuwania %s z ulubionych.", "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", "Sunday" => "Niedziela",
"Monday" => "Poniedziałek", "Monday" => "Poniedziałek",
"Tuesday" => "Wtorek", "Tuesday" => "Wtorek",
@ -51,8 +53,12 @@ $TRANSLATIONS = array(
"Yes" => "Tak", "Yes" => "Tak",
"No" => "Nie", "No" => "Nie",
"Ok" => "OK", "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", "Cancel" => "Anuluj",
"Continue" => "Kontynuuj ",
"(all selected)" => "(wszystkie zaznaczone)",
"({count} selected)" => "({count} zaznaczonych)",
"The object type is not specified." => "Nie określono typu obiektu.", "The object type is not specified." => "Nie określono typu obiektu.",
"Error" => "Błąd", "Error" => "Błąd",
"The app name is not specified." => "Nie określono nazwy aplikacji.", "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 <?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?')); ?> <?php p($l->t('Lost your password?')); ?>
</a> </a>
<?php endif; ?> <?php endif; ?>
<?php if ($_['rememberLoginAllowed'] === true) : ?>
<input type="checkbox" name="remember_login" value="1" id="remember_login" checked /> <input type="checkbox" name="remember_login" value="1" id="remember_login" checked />
<label for="remember_login"><?php p($l->t('remember')); ?></label> <label for="remember_login"><?php p($l->t('remember')); ?></label>
<?php endif; ?>
<input type="hidden" name="timezone-offset" id="timezone-offset"/> <input type="hidden" name="timezone-offset" id="timezone-offset"/>
<input type="submit" id="submit" class="login primary" value="<?php p($l->t('Log in')); ?>"/> <input type="submit" id="submit" class="login primary" value="<?php p($l->t('Log in')); ?>"/>
</fieldset> </fieldset>

View File

@ -12,7 +12,11 @@
<td bgcolor="#f8f8f8" width="20px">&nbsp;</td> <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;"> <td bgcolor="#f8f8f8" style="font-weight:normal; font-size:0.8em; line-height:1.2em; font-family:verdana,'arial',sans;">
<?php <?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> </td>
</tr> </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> <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->getName()); ?> -
<?php p($theme->getSlogan()); ?> <?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>
<tr> <tr>
<td bgcolor="#f8f8f8" colspan="2">&nbsp;</td> <td bgcolor="#f8f8f8" colspan="2">&nbsp;</td>

View File

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

View File

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

View File

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

View File

@ -3,6 +3,7 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# #
# Translators: # Translators:
# dibalaj <dibalaj@dibalaj.cz>, 2013
# Honza K. <honza889@gmail.com>, 2013 # Honza K. <honza889@gmail.com>, 2013
# cvanca <mrs.jenkins.oh.yeah@gmail.com>, 2013 # cvanca <mrs.jenkins.oh.yeah@gmail.com>, 2013
# pstast <petr@stastny.eu>, 2013 # pstast <petr@stastny.eu>, 2013
@ -11,9 +12,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ownCloud\n" "Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:44-0400\n" "POT-Creation-Date: 2013-09-30 10:14-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n" "PO-Revision-Date: 2013-09-29 16:54+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n" "Last-Translator: dibalaj <dibalaj@dibalaj.cz>\n"
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -90,7 +91,7 @@ msgstr ""
msgid "Invalid directory." msgid "Invalid directory."
msgstr "Neplatný adresář" msgstr "Neplatný adresář"
#: appinfo/app.php:12 #: appinfo/app.php:11
msgid "Files" msgid "Files"
msgstr "Soubory" 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 #: js/files.js:507 js/files.js:545
msgid "Error moving file" msgid "Error moving file"
msgstr "" msgstr "Chyba při přesunu souboru"
#: js/files.js:558 templates/index.php:61 #: js/files.js:558 templates/index.php:61
msgid "Name" msgid "Name"

View File

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

View File

@ -9,9 +9,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ownCloud\n" "Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-16 11:33-0400\n" "POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-16 15:34+0000\n" "PO-Revision-Date: 2013-09-30 00:50+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n" "Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -19,38 +19,38 @@ msgstr ""
"Language: hu_HU\n" "Language: hu_HU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: app.php:239 #: app.php:237
#, php-format #, php-format
msgid "" msgid ""
"App \"%s\" can't be installed because it is not compatible with this version" "App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud." " of ownCloud."
msgstr "" msgstr ""
#: app.php:250 #: app.php:248
msgid "No app name specified" msgid "No app name specified"
msgstr "" msgstr "Nincs az alkalmazás név megadva."
#: app.php:361 #: app.php:352
msgid "Help" msgid "Help"
msgstr "Súgó" msgstr "Súgó"
#: app.php:374 #: app.php:365
msgid "Personal" msgid "Personal"
msgstr "Személyes" msgstr "Személyes"
#: app.php:385 #: app.php:376
msgid "Settings" msgid "Settings"
msgstr "Beállítások" msgstr "Beállítások"
#: app.php:397 #: app.php:388
msgid "Users" msgid "Users"
msgstr "Felhasználók" msgstr "Felhasználók"
#: app.php:410 #: app.php:401
msgid "Admin" msgid "Admin"
msgstr "Adminsztráció" msgstr "Adminsztráció"
#: app.php:839 #: app.php:832
#, php-format #, php-format
msgid "Failed to upgrade \"%s\"." msgid "Failed to upgrade \"%s\"."
msgstr "Sikertelen Frissítés \"%s\"." msgstr "Sikertelen Frissítés \"%s\"."
@ -61,11 +61,11 @@ msgstr ""
#: avatar.php:64 #: avatar.php:64
msgid "Unknown filetype" msgid "Unknown filetype"
msgstr "" msgstr "Ismeretlen file tipús"
#: avatar.php:69 #: avatar.php:69
msgid "Invalid image" msgid "Invalid image"
msgstr "" msgstr "Hibás kép"
#: defaults.php:35 #: defaults.php:35
msgid "web services under your control" msgid "web services under your control"
@ -121,7 +121,7 @@ msgstr ""
#: installer.php:125 #: installer.php:125
msgid "App does not provide an info.xml file" msgid "App does not provide an info.xml file"
msgstr "" msgstr "Az alkalmazás nem szolgáltatott info.xml file-t"
#: installer.php:131 #: installer.php:131
msgid "App can't be installed because of not allowed code in the App" msgid "App can't be installed because of not allowed code in the App"
@ -131,7 +131,7 @@ msgstr ""
msgid "" msgid ""
"App can't be installed because it is not compatible with this version of " "App can't be installed because it is not compatible with this version of "
"ownCloud" "ownCloud"
msgstr "" msgstr "Az alalmazás nem telepíthető, mert nem kompatibilis az ownClod ezzel a verziójával."
#: installer.php:146 #: installer.php:146
msgid "" msgid ""
@ -147,12 +147,12 @@ msgstr ""
#: installer.php:162 #: installer.php:162
msgid "App directory already exists" msgid "App directory already exists"
msgstr "" msgstr "Az alkalmazás mappája már létezik"
#: installer.php:175 #: installer.php:175
#, php-format #, php-format
msgid "Can't create app folder. Please fix permissions. %s" 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 #: json.php:28
msgid "Application is not enabled" msgid "Application is not enabled"
@ -166,15 +166,15 @@ msgstr "Azonosítási hiba"
msgid "Token expired. Please reload page." msgid "Token expired. Please reload page."
msgstr "A token lejárt. Frissítse az oldalt." 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" msgid "Files"
msgstr "Fájlok" 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" msgid "Text"
msgstr "Szöveg" msgstr "Szöveg"
#: search/provider/file.php:29 #: search/provider/file.php:30
msgid "Images" msgid "Images"
msgstr "Képek" 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>." 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>." 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 #: template/functions.php:96
msgid "seconds ago" msgid "seconds ago"
msgstr "pár másodperce" msgstr "pár másodperce"
@ -329,8 +334,3 @@ msgstr "több éve"
#: template.php:297 #: template.php:297
msgid "Caused by:" msgid "Caused by:"
msgstr "Okozta:" 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 "" msgstr ""
"Project-Id-Version: ownCloud\n" "Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:45-0400\n" "POT-Creation-Date: 2013-09-30 10:17-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n" "PO-Revision-Date: 2013-09-30 00:21+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n" "Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\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 #: changepassword/controller.php:20
msgid "Wrong password" msgid "Wrong password"
msgstr "" msgstr "Hibás jelszó"
#: changepassword/controller.php:42 #: changepassword/controller.php:42
msgid "No user supplied" msgid "No user supplied"
msgstr "" msgstr "Nincs felhasználó által mellékelve"
#: changepassword/controller.php:74 #: changepassword/controller.php:74
msgid "" msgid ""
"Please provide an admin recovery password, otherwise all user data will be " "Please provide an admin recovery password, otherwise all user data will be "
"lost" "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 #: changepassword/controller.php:79
msgid "" msgid ""
"Wrong admin recovery password. Please check the password and try again." "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 #: changepassword/controller.php:87
msgid "" msgid ""
"Back-end doesn't support password change, but the users encryption key was " "Back-end doesn't support password change, but the users encryption key was "
"successfully updated." "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 #: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password" msgid "Unable to change password"
msgstr "" msgstr "Nem sikerült megváltoztatni a jelszót"
#: js/apps.js:43 #: js/apps.js:43
msgid "Update to {appversion}" msgid "Update to {appversion}"
msgstr "Frissítés erre a verzióra: {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" msgid "Disable"
msgstr "Letiltás" 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" msgid "Enable"
msgstr "engedélyezve" msgstr "engedélyezve"
@ -132,43 +132,43 @@ msgstr "engedélyezve"
msgid "Please wait...." msgid "Please wait...."
msgstr "Kérem várjon..." 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" 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" 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...." msgid "Updating...."
msgstr "Frissítés folyamatban..." msgstr "Frissítés folyamatban..."
#: js/apps.js:126 #: js/apps.js:128
msgid "Error while updating app" msgid "Error while updating app"
msgstr "Hiba történt a programfrissítés közben" msgstr "Hiba történt a programfrissítés közben"
#: js/apps.js:126 #: js/apps.js:128
msgid "Error" msgid "Error"
msgstr "Hiba" msgstr "Hiba"
#: js/apps.js:127 templates/apps.php:43 #: js/apps.js:129 templates/apps.php:43
msgid "Update" msgid "Update"
msgstr "Frissítés" msgstr "Frissítés"
#: js/apps.js:130 #: js/apps.js:132
msgid "Updated" msgid "Updated"
msgstr "Frissítve" msgstr "Frissítve"
#: js/personal.js:220 #: js/personal.js:221
msgid "Select a profile picture" 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." 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..." msgid "Saving..."
msgstr "Mentés..." msgstr "Mentés..."
@ -496,27 +496,27 @@ msgstr "Profilkép"
#: templates/personal.php:90 #: templates/personal.php:90
msgid "Upload new" msgid "Upload new"
msgstr "" msgstr "Új feltöltése"
#: templates/personal.php:92 #: templates/personal.php:92
msgid "Select new from Files" msgid "Select new from Files"
msgstr "" msgstr "Új kiválasztása Fileokból"
#: templates/personal.php:93 #: templates/personal.php:93
msgid "Remove image" msgid "Remove image"
msgstr "" msgstr "Kép eltávolítása"
#: templates/personal.php:94 #: templates/personal.php:94
msgid "Either png or jpg. Ideally square but you will be able to crop it." 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 #: templates/personal.php:97
msgid "Abort" msgid "Abort"
msgstr "" msgstr "Megszakítás"
#: templates/personal.php:98 #: templates/personal.php:98
msgid "Choose as profile image" msgid "Choose as profile image"
msgstr "" msgstr "Válassz profil képet"
#: templates/personal.php:106 templates/personal.php:107 #: templates/personal.php:106 templates/personal.php:107
msgid "Language" msgid "Language"
@ -543,15 +543,15 @@ msgstr "Titkosítás"
#: templates/personal.php:140 #: templates/personal.php:140
msgid "The encryption app is no longer enabled, decrypt all your file" 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 #: templates/personal.php:146
msgid "Log-in password" msgid "Log-in password"
msgstr "" msgstr "Bejelentkezési jelszó"
#: templates/personal.php:151 #: templates/personal.php:151
msgid "Decrypt all Files" msgid "Decrypt all Files"
msgstr "" msgstr "Kititkosítja az összes file-t"
#: templates/users.php:21 #: templates/users.php:21
msgid "Login Name" msgid "Login Name"

View File

@ -9,9 +9,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ownCloud\n" "Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-27 00:01-0400\n" "POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-24 19:00+0000\n" "PO-Revision-Date: 2013-09-30 00:22+0000\n"
"Last-Translator: Laszlo Tornoci <torlasz@gmail.com>\n" "Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\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 " "behavior as before ownCloud 5 enter the user display name attribute in the "
"following field. Leave it empty for default behavior. Changes will have " "following field. Leave it empty for default behavior. Changes will have "
"effect only on newly mapped (added) LDAP users." "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 #: templates/settings.php:100
msgid "Internal Username Attribute:" msgid "Internal Username Attribute:"

View File

@ -9,9 +9,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ownCloud\n" "Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-07-27 01:56-0400\n" "POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-07-27 05:57+0000\n" "PO-Revision-Date: 2013-09-30 00:32+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n" "Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -25,11 +25,11 @@ msgstr "WebDAV hitelesítés"
#: templates/settings.php:4 #: templates/settings.php:4
msgid "Address: " msgid "Address: "
msgstr "" msgstr "Címek:"
#: templates/settings.php:7 #: templates/settings.php:7
msgid "" msgid ""
"The user credentials will be sent to this address. This plugin checks the " "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 " "response and will interpret the HTTP statuscodes 401 and 403 as invalid "
"credentials, and all other responses as valid credentials." "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 "" msgstr ""
"Project-Id-Version: ownCloud\n" "Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-22 12:51-0400\n" "POT-Creation-Date: 2013-09-30 10:14-0400\n"
"PO-Revision-Date: 2013-09-21 17:50+0000\n" "PO-Revision-Date: 2013-09-30 12:15+0000\n"
"Last-Translator: polxmod <paolo.velati@gmail.com>\n" "Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\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 #: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info." 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 #: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file" 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 #: ajax/upload.php:160
msgid "Invalid directory." msgid "Invalid directory."
@ -94,7 +94,7 @@ msgstr "File"
#: js/file-upload.js:244 #: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes" 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 #: js/file-upload.js:255
msgid "Not enough space available" msgid "Not enough space available"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,9 +9,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ownCloud\n" "Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-16 11:33-0400\n" "POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-16 15:34+0000\n" "PO-Revision-Date: 2013-09-29 07:46+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n" "Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -19,53 +19,53 @@ msgstr ""
"Language: ko\n" "Language: ko\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: app.php:239 #: app.php:237
#, php-format #, php-format
msgid "" msgid ""
"App \"%s\" can't be installed because it is not compatible with this version" "App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud." " of ownCloud."
msgstr "현재 ownCloud 버전과 호환되지 않기 때문에 \"%s\" 앱을 설치할 수 없습니다." msgstr "현재 ownCloud 버전과 호환되지 않기 때문에 \"%s\" 앱을 설치할 수 없습니다."
#: app.php:250 #: app.php:248
msgid "No app name specified" msgid "No app name specified"
msgstr "앱 이름이 지정되지 않았습니다." msgstr "앱 이름이 지정되지 않았습니다."
#: app.php:361 #: app.php:352
msgid "Help" msgid "Help"
msgstr "도움말" msgstr "도움말"
#: app.php:374 #: app.php:365
msgid "Personal" msgid "Personal"
msgstr "개인" msgstr "개인"
#: app.php:385 #: app.php:376
msgid "Settings" msgid "Settings"
msgstr "설정" msgstr "설정"
#: app.php:397 #: app.php:388
msgid "Users" msgid "Users"
msgstr "사용자" msgstr "사용자"
#: app.php:410 #: app.php:401
msgid "Admin" msgid "Admin"
msgstr "관리자" msgstr "관리자"
#: app.php:839 #: app.php:832
#, php-format #, php-format
msgid "Failed to upgrade \"%s\"." msgid "Failed to upgrade \"%s\"."
msgstr "\"%s\" 업그레이드에 실패했습니다." msgstr "\"%s\" 업그레이드에 실패했습니다."
#: avatar.php:56 #: avatar.php:56
msgid "Custom profile pictures don't work with encryption yet" msgid "Custom profile pictures don't work with encryption yet"
msgstr "" msgstr "개개인의 프로필 사진은 아직은 암호화 되지 않습니다"
#: avatar.php:64 #: avatar.php:64
msgid "Unknown filetype" msgid "Unknown filetype"
msgstr "" msgstr "알수없는 파일형식"
#: avatar.php:69 #: avatar.php:69
msgid "Invalid image" msgid "Invalid image"
msgstr "" msgstr "잘못된 그림"
#: defaults.php:35 #: defaults.php:35
msgid "web services under your control" msgid "web services under your control"
@ -96,7 +96,7 @@ msgstr "선택한 파일들은 ZIP 파일을 생성하기에 너무 큽니다."
msgid "" msgid ""
"Download the files in smaller chunks, seperately or kindly ask your " "Download the files in smaller chunks, seperately or kindly ask your "
"administrator." "administrator."
msgstr "" msgstr "작은 조각들 안에 들어있는 파일들을 받고자 하신다면, 나누어서 받으시거나 혹은 시스템 관리자에게 정중하게 물어보십시오"
#: installer.php:63 #: installer.php:63
msgid "No source specified when installing app" msgid "No source specified when installing app"
@ -166,15 +166,15 @@ msgstr "인증 오류"
msgid "Token expired. Please reload page." msgid "Token expired. Please reload page."
msgstr "토큰이 만료되었습니다. 페이지를 새로 고치십시오." msgstr "토큰이 만료되었습니다. 페이지를 새로 고치십시오."
#: search/provider/file.php:17 search/provider/file.php:35 #: search/provider/file.php:18 search/provider/file.php:36
msgid "Files" msgid "Files"
msgstr "파일" msgstr "파일"
#: search/provider/file.php:26 search/provider/file.php:33 #: search/provider/file.php:27 search/provider/file.php:34
msgid "Text" msgid "Text"
msgstr "텍스트" msgstr "텍스트"
#: search/provider/file.php:29 #: search/provider/file.php:30
msgid "Images" msgid "Images"
msgstr "그림" msgstr "그림"
@ -278,6 +278,11 @@ msgstr "WebDAV 인터페이스가 제대로 작동하지 않습니다. 웹 서
msgid "Please double check the <a href='%s'>installation guides</a>." msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr "<a href='%s'>설치 가이드</a>를 다시 한 번 확인하십시오." msgstr "<a href='%s'>설치 가이드</a>를 다시 한 번 확인하십시오."
#: tags.php:194
#, php-format
msgid "Could not find category \"%s\""
msgstr "분류 \"%s\"을(를) 찾을 수 없습니다."
#: template/functions.php:96 #: template/functions.php:96
msgid "seconds ago" msgid "seconds ago"
msgstr "초 전" msgstr "초 전"
@ -325,8 +330,3 @@ msgstr "년 전"
#: template.php:297 #: template.php:297
msgid "Caused by:" msgid "Caused by:"
msgstr "원인: " 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 "" msgstr ""
"Project-Id-Version: ownCloud\n" "Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-22 12:55-0400\n" "POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: 2013-09-20 15:01+0000\n" "PO-Revision-Date: 2013-09-29 07:58+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\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" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\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 #: js/oc-dialogs.js:347
msgid "{count} file conflict" msgid "{count} file conflict"
msgid_plural "{count} file conflicts" msgid_plural "{count} file conflicts"
msgstr[0] "" msgstr[0] "{count} failas konfliktuoja"
msgstr[1] "" msgstr[1] "{count} failai konfliktuoja"
msgstr[2] "" msgstr[2] "{count} failų konfliktų"
#: js/oc-dialogs.js:361 #: js/oc-dialogs.js:361
msgid "One file conflict" msgid "One file conflict"
msgstr "" msgstr "Vienas failo konfliktas"
#: js/oc-dialogs.js:367 #: js/oc-dialogs.js:367
msgid "Which files do you want to keep?" msgid "Which files do you want to keep?"
msgstr "" msgstr "Kuriuos failus norite laikyti?"
#: js/oc-dialogs.js:368 #: js/oc-dialogs.js:368
msgid "" msgid ""
"If you select both versions, the copied file will have a number added to its" "If you select both versions, the copied file will have a number added to its"
" name." " name."
msgstr "" msgstr "Jei pasirenkate abi versijas, nukopijuotas failas turės pridėtą numerį pavadinime."
#: js/oc-dialogs.js:376 #: js/oc-dialogs.js:376
msgid "Cancel" msgid "Cancel"
@ -301,19 +301,19 @@ msgstr "Atšaukti"
#: js/oc-dialogs.js:386 #: js/oc-dialogs.js:386
msgid "Continue" msgid "Continue"
msgstr "" msgstr "Tęsti"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446 #: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)" msgid "(all selected)"
msgstr "" msgstr "(visi pažymėti)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449 #: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)" msgid "({count} selected)"
msgstr "" msgstr "({count} pažymėtų)"
#: js/oc-dialogs.js:457 #: js/oc-dialogs.js:457
msgid "Error loading file exists template" 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: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 #: 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: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: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/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" msgid "Error"
msgstr "Klaida" msgstr "Klaida"
@ -344,7 +344,7 @@ msgstr "Dalinamasi"
msgid "Share" msgid "Share"
msgstr "Dalintis" msgstr "Dalintis"
#: js/share.js:131 js/share.js:685 #: js/share.js:131 js/share.js:696
msgid "Error while sharing" msgid "Error while sharing"
msgstr "Klaida, dalijimosi metu" msgstr "Klaida, dalijimosi metu"
@ -444,23 +444,23 @@ msgstr "ištrinti"
msgid "share" msgid "share"
msgstr "dalintis" msgstr "dalintis"
#: js/share.js:400 js/share.js:632 #: js/share.js:400 js/share.js:643
msgid "Password protected" msgid "Password protected"
msgstr "Apsaugota slaptažodžiu" msgstr "Apsaugota slaptažodžiu"
#: js/share.js:645 #: js/share.js:656
msgid "Error unsetting expiration date" msgid "Error unsetting expiration date"
msgstr "Klaida nuimant galiojimo laiką" msgstr "Klaida nuimant galiojimo laiką"
#: js/share.js:657 #: js/share.js:668
msgid "Error setting expiration date" msgid "Error setting expiration date"
msgstr "Klaida nustatant galiojimo laiką" msgstr "Klaida nustatant galiojimo laiką"
#: js/share.js:672 #: js/share.js:683
msgid "Sending ..." msgid "Sending ..."
msgstr "Siunčiama..." msgstr "Siunčiama..."
#: js/share.js:683 #: js/share.js:694
msgid "Email sent" msgid "Email sent"
msgstr "Laiškas išsiųstas" msgstr "Laiškas išsiųstas"

View File

@ -9,9 +9,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ownCloud\n" "Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-09-20 10:44-0400\n" "POT-Creation-Date: 2013-09-30 10:14-0400\n"
"PO-Revision-Date: 2013-09-20 14:45+0000\n" "PO-Revision-Date: 2013-09-29 08:46+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\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" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\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 #: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info." msgid "Upload failed. Could not get file info."
msgstr "" msgstr "Įkėlimas nepavyko. Nepavyko gauti failo informacijos."
#: ajax/upload.php:136 #: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file" msgid "Upload failed. Could not find uploaded file"
msgstr "" msgstr "Įkėlimas nepavyko. Nepavyko rasti įkelto failo"
#: ajax/upload.php:160 #: ajax/upload.php:160
msgid "Invalid directory." msgid "Invalid directory."
msgstr "Neteisingas aplankas" msgstr "Neteisingas aplankas"
#: appinfo/app.php:12 #: appinfo/app.php:11
msgid "Files" msgid "Files"
msgstr "Failai" msgstr "Failai"
#: js/file-upload.js:244 #: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes" 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 #: js/file-upload.js:255
msgid "Not enough space available" msgid "Not enough space available"
@ -106,7 +106,7 @@ msgstr "Įkėlimas atšauktas."
#: js/file-upload.js:356 #: js/file-upload.js:356
msgid "Could not get result from server." msgid "Could not get result from server."
msgstr "" msgstr "Nepavyko gauti rezultato iš serverio."
#: js/file-upload.js:446 #: js/file-upload.js:446
msgid "" 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 #: js/files.js:507 js/files.js:545
msgid "Error moving file" msgid "Error moving file"
msgstr "" msgstr "Klaida perkeliant failą"
#: js/files.js:558 templates/index.php:61 #: js/files.js:558 templates/index.php:61
msgid "Name" msgid "Name"

View File

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

View File

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

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