Merge branch 'master' into fixing-4011-master
|
@ -3,10 +3,6 @@
|
|||
// only need filesystem apps
|
||||
$RUNTIME_APPTYPES=array('filesystem');
|
||||
|
||||
// Init owncloud
|
||||
|
||||
require_once 'lib/template.php';
|
||||
|
||||
OCP\JSON::checkLoggedIn();
|
||||
|
||||
// Load the files
|
||||
|
@ -26,7 +22,7 @@ $files = array();
|
|||
if($mimetypes && !in_array('httpd/unix-directory', $mimetypes)) {
|
||||
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, 'httpd/unix-directory' ) as $file ) {
|
||||
$file['directory'] = $dir;
|
||||
$file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
|
||||
$file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
|
||||
$file["date"] = OCP\Util::formatDate($file["mtime"]);
|
||||
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
|
||||
$files[] = $file;
|
||||
|
@ -37,7 +33,7 @@ if (is_array($mimetypes) && count($mimetypes)) {
|
|||
foreach ($mimetypes as $mimetype) {
|
||||
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $file ) {
|
||||
$file['directory'] = $dir;
|
||||
$file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
|
||||
$file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
|
||||
$file["date"] = OCP\Util::formatDate($file["mtime"]);
|
||||
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
|
||||
$files[] = $file;
|
||||
|
@ -46,7 +42,7 @@ if (is_array($mimetypes) && count($mimetypes)) {
|
|||
} else {
|
||||
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $file ) {
|
||||
$file['directory'] = $dir;
|
||||
$file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
|
||||
$file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
|
||||
$file["date"] = OCP\Util::formatDate($file["mtime"]);
|
||||
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
|
||||
$files[] = $file;
|
||||
|
|
|
@ -7,68 +7,54 @@
|
|||
.actions input, .actions button, .actions .button { margin:0; float:left; }
|
||||
.actions .button a { color: #555; }
|
||||
.actions .button a:hover, .actions .button a:active { color: #333; }
|
||||
#new {
|
||||
height:17px; margin:0 0 0 1em; z-index:1010; float:left;
|
||||
#new, #trash {
|
||||
z-index: 1010;
|
||||
float: left;
|
||||
padding: 0 !important; /* override default control bar button padding */
|
||||
}
|
||||
#trash {
|
||||
margin: 0 1em;
|
||||
float: right;
|
||||
}
|
||||
#new>a, #trash>a {
|
||||
padding: 14px 10px;
|
||||
position: relative;
|
||||
top: 7px;
|
||||
}
|
||||
#new.active {
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
border-bottom: none;
|
||||
}
|
||||
#new.active { border-bottom-left-radius:0; border-bottom-right-radius:0; border-bottom:none; }
|
||||
#new>a { padding:.5em 1.2em .3em; }
|
||||
#new>ul {
|
||||
display:none; position:fixed; min-width:7em; z-index:10;
|
||||
padding:.5em; padding-bottom:0; margin-top:.075em; margin-left:-.5em;
|
||||
display: none;
|
||||
position: fixed;
|
||||
min-width: 7em;
|
||||
z-index: 10;
|
||||
padding: .5em;
|
||||
padding-bottom: 0;
|
||||
margin-top: 14px;
|
||||
margin-left: -1px;
|
||||
text-align:left;
|
||||
background:#f8f8f8; border:1px solid #ddd; border-radius:10px; border-top-left-radius:0;
|
||||
background: #f8f8f8;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 5px;
|
||||
border-top-left-radius: 0;
|
||||
box-shadow:0 2px 7px rgba(170,170,170,.4);
|
||||
}
|
||||
#new>ul>li { height:36px; margin:.3em; padding-left:3em; padding-bottom:0.1em;
|
||||
background-repeat:no-repeat; cursor:pointer; }
|
||||
#new>ul>li>p { cursor:pointer; padding-top: 7px; padding-bottom: 7px;}
|
||||
#new>ul>li>form>input {
|
||||
padding: 5px;
|
||||
margin: 2px 0;
|
||||
}
|
||||
|
||||
#trash { margin: 0 1em; z-index:1010; float: right; }
|
||||
|
||||
#upload {
|
||||
height:27px; padding:0; margin-left:0.2em; overflow:hidden;
|
||||
}
|
||||
#upload a {
|
||||
position:relative; display:block; width:100%; height:27px;
|
||||
cursor:pointer; z-index:10;
|
||||
background-image:url('%webroot%/core/img/actions/upload.svg');
|
||||
background-repeat:no-repeat;
|
||||
background-position:7px 6px;
|
||||
opacity:0.65;
|
||||
}
|
||||
.file_upload_target { display:none; }
|
||||
.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; }
|
||||
#file_upload_start {
|
||||
left:0; top:0; width:28px; height:27px; padding:0;
|
||||
font-size:1em;
|
||||
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0;
|
||||
z-index:20; position:relative; cursor:pointer; overflow:hidden;
|
||||
}
|
||||
|
||||
#uploadprogresswrapper {
|
||||
position: relative;
|
||||
display: inline;
|
||||
}
|
||||
#uploadprogressbar {
|
||||
position:relative;
|
||||
float: left;
|
||||
margin-left: 12px;
|
||||
width: 130px;
|
||||
height: 26px;
|
||||
display:inline-block;
|
||||
}
|
||||
#uploadprogressbar + stop {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
|
||||
/* FILE TABLE */
|
||||
|
||||
#filestable { position: relative; top:37px; width:100%; }
|
||||
#filestable {
|
||||
position: relative;
|
||||
top: 44px;
|
||||
width: 100%;
|
||||
}
|
||||
#filestable tbody tr { background-color:#fff; height:2.5em; }
|
||||
#filestable tbody tr:hover, tbody tr:active {
|
||||
background-color: rgb(240,240,240);
|
||||
|
@ -122,9 +108,18 @@ table th#headerDate, table td.date {
|
|||
|
||||
/* Multiselect bar */
|
||||
#filestable.multiselect {
|
||||
top: 88px;
|
||||
top: 95px;
|
||||
}
|
||||
table.multiselect thead {
|
||||
position: fixed;
|
||||
top: 89px;
|
||||
z-index: 1;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
left: 0;
|
||||
padding-left: 80px;
|
||||
width: 100%;
|
||||
}
|
||||
table.multiselect thead { position:fixed; top:82px; z-index:1; -moz-box-sizing: border-box; box-sizing: border-box; left: 0; padding-left: 80px; width:100%; }
|
||||
|
||||
table.multiselect thead th {
|
||||
background-color: rgba(210,210,210,.7);
|
||||
|
@ -228,6 +223,12 @@ table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; }
|
|||
-webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms;
|
||||
}
|
||||
|
||||
#fileList tr td.filename a.name label {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
#uploadsize-message,#delete-confirm { display:none; }
|
||||
|
||||
/* File actions */
|
||||
|
@ -319,8 +320,6 @@ a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; }
|
|||
|
||||
#scanning-message{ top:40%; left:40%; position:absolute; display:none; }
|
||||
|
||||
div.crumb a{ padding:0.9em 0 0.7em 0; color:#555; }
|
||||
|
||||
table.dragshadow {
|
||||
width:auto;
|
||||
}
|
||||
|
|
|
@ -1,38 +1,63 @@
|
|||
|
||||
#upload {
|
||||
height:27px; padding:0; margin-left:0.2em; overflow:hidden;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
height: 36px;
|
||||
width: 39px;
|
||||
padding: 0 !important; /* override default control bar button padding */
|
||||
margin-left: .2em;
|
||||
overflow: hidden;
|
||||
vertical-align: top;
|
||||
}
|
||||
#upload a {
|
||||
position:relative; display:block; width:100%; height:27px;
|
||||
cursor:pointer; z-index:10;
|
||||
background-image:url('%webroot%/core/img/actions/upload.svg');
|
||||
background-repeat:no-repeat;
|
||||
background-position:7px 6px;
|
||||
opacity:0.65;
|
||||
position: relative;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 44px;
|
||||
width: 44px;
|
||||
margin: -5px -3px;
|
||||
cursor: pointer;
|
||||
z-index: 10;
|
||||
background-image: url('%webroot%/core/img/actions/upload.svg');
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
opacity: .65;
|
||||
}
|
||||
.file_upload_target { display:none; }
|
||||
.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; }
|
||||
#file_upload_start {
|
||||
float: left;
|
||||
left:0; top:0; width:28px; height:27px; padding:0;
|
||||
font-size:1em;
|
||||
position: relative;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
margin: -5px -3px;
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0;
|
||||
z-index:20; position:relative; cursor:pointer; overflow:hidden;
|
||||
z-index: 20;
|
||||
cursor: pointer;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#uploadprogresswrapper {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin:0.3em;
|
||||
height: 29px;
|
||||
height: 36px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#uploadprogresswrapper > input[type='button'] {
|
||||
height: 36px;
|
||||
}
|
||||
#uploadprogressbar {
|
||||
position:relative;
|
||||
float: left;
|
||||
margin-left: 12px;
|
||||
width: 130px;
|
||||
height: 26px;
|
||||
height: 36px;
|
||||
display:inline-block;
|
||||
}
|
||||
#uploadprogressbar + stop {
|
||||
|
|
|
@ -104,8 +104,12 @@ if ($needUpgrade) {
|
|||
$storageInfo=OC_Helper::getStorageInfo($dir);
|
||||
$maxUploadFilesize=OCP\Util::maxUploadFilesize($dir);
|
||||
$publicUploadEnabled = \OC_Appconfig::getValue('core', 'shareapi_allow_public_upload', 'yes');
|
||||
// if the encryption app is disabled, than everything is fine (INIT_SUCCESSFUL status code)
|
||||
$encryptionInitStatus = 2;
|
||||
if (OC_App::isEnabled('files_encryption')) {
|
||||
$publicUploadEnabled = 'no';
|
||||
$session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
|
||||
$encryptionInitStatus = $session->getInitialized();
|
||||
}
|
||||
|
||||
$trashEnabled = \OCP\App::isEnabled('files_trashbin');
|
||||
|
@ -113,7 +117,7 @@ if ($needUpgrade) {
|
|||
if ($trashEnabled) {
|
||||
$trashEmpty = \OCA\Files_Trashbin\Trashbin::isEmpty($user);
|
||||
}
|
||||
|
||||
|
||||
OCP\Util::addscript('files', 'fileactions');
|
||||
OCP\Util::addscript('files', 'files');
|
||||
OCP\Util::addscript('files', 'keyboardshortcuts');
|
||||
|
@ -133,7 +137,10 @@ if ($needUpgrade) {
|
|||
$tmpl->assign('isPublic', false);
|
||||
$tmpl->assign('publicUploadEnabled', $publicUploadEnabled);
|
||||
$tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles());
|
||||
$tmpl->assign("mailNotificationEnabled", \OC_Appconfig::getValue('core', 'shareapi_allow_mail_notification', 'yes'));
|
||||
$tmpl->assign("encryptionInitStatus", $encryptionInitStatus);
|
||||
$tmpl->assign('disableSharing', false);
|
||||
$tmpl->assign('ajaxLoad', $ajaxLoad);
|
||||
|
||||
$tmpl->printPage();
|
||||
}
|
||||
|
|
|
@ -63,6 +63,15 @@ Files={
|
|||
}
|
||||
|
||||
var encryptedFiles = $('#encryptedFiles').val();
|
||||
var initStatus = $('#encryptionInitStatus').val();
|
||||
if (initStatus === '0') { // enc not initialized, but should be
|
||||
OC.Notification.show(t('files_encryption', 'Encryption App is enabled but your keys are not initialized, please log-out and log-in again'));
|
||||
return;
|
||||
}
|
||||
if (initStatus === '1') { // encryption tried to init but failed
|
||||
OC.Notification.showHtml(t('files_encryption', 'Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files.'));
|
||||
return;
|
||||
}
|
||||
if (encryptedFiles === '1') {
|
||||
OC.Notification.show(t('files_encryption', 'Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.'));
|
||||
return;
|
||||
|
|
|
@ -42,6 +42,7 @@ $TRANSLATIONS = array(
|
|||
"Your storage is almost full ({usedSpacePercent}%)" => "Vaše úložiště je téměř plné ({usedSpacePercent}%)",
|
||||
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifrování bylo vypnuto, vaše soubory jsou však stále zašifrované. Běžte prosím do osobního nastavení, kde soubory odšifrujete.",
|
||||
"Your download is being prepared. This might take some time if the files are big." => "Vaše soubory ke stažení se připravují. Pokud jsou velké, může to chvíli trvat.",
|
||||
"Error moving file" => "Chyba při přesunu souboru",
|
||||
"Name" => "Název",
|
||||
"Size" => "Velikost",
|
||||
"Modified" => "Upraveno",
|
||||
|
|
|
@ -13,11 +13,11 @@ $TRANSLATIONS = array(
|
|||
"Missing a temporary folder" => "Manca una cartella temporanea",
|
||||
"Failed to write to disk" => "Scrittura su disco non riuscita",
|
||||
"Not enough storage available" => "Spazio di archiviazione insufficiente",
|
||||
"Upload failed. Could not get file info." => "Upload fallito. Impossibile ottenere informazioni sul file",
|
||||
"Upload failed. Could not find uploaded file" => "Upload fallit. Impossibile trovare file caricato",
|
||||
"Upload failed. Could not get file info." => "Caricamento non riuscito. Impossibile ottenere informazioni sul file.",
|
||||
"Upload failed. Could not find uploaded file" => "Caricamento non riuscito. Impossibile trovare il file caricato.",
|
||||
"Invalid directory." => "Cartella non valida.",
|
||||
"Files" => "File",
|
||||
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossibile caricare {filename} poiché è una cartella oppure è di 0 byte",
|
||||
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.",
|
||||
"Not enough space available" => "Spazio disponibile insufficiente",
|
||||
"Upload cancelled." => "Invio annullato",
|
||||
"Could not get result from server." => "Impossibile ottenere il risultato dal server.",
|
||||
|
|
|
@ -13,10 +13,14 @@ $TRANSLATIONS = array(
|
|||
"Missing a temporary folder" => "一時保存フォルダが見つかりません",
|
||||
"Failed to write to disk" => "ディスクへの書き込みに失敗しました",
|
||||
"Not enough storage available" => "ストレージに十分な空き容量がありません",
|
||||
"Upload failed. Could not get file info." => "アップロードに失敗。ファイル情報を取得できませんでした。",
|
||||
"Upload failed. Could not find uploaded file" => "アップロードに失敗。アップロード済みのファイルを見つけることができませんでした。",
|
||||
"Invalid directory." => "無効なディレクトリです。",
|
||||
"Files" => "ファイル",
|
||||
"Unable to upload {filename} as it is a directory or has 0 bytes" => "ディレクトリもしくは0バイトのため {filename} をアップロードできません",
|
||||
"Not enough space available" => "利用可能なスペースが十分にありません",
|
||||
"Upload cancelled." => "アップロードはキャンセルされました。",
|
||||
"Could not get result from server." => "サーバから結果を取得できませんでした。",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。",
|
||||
"URL cannot be empty." => "URLは空にできません。",
|
||||
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "無効なフォルダ名です。'Shared' の利用はownCloudで予約済みです",
|
||||
|
@ -42,6 +46,7 @@ $TRANSLATIONS = array(
|
|||
"Your storage is almost full ({usedSpacePercent}%)" => "あなたのストレージはほぼ一杯です({usedSpacePercent}%)",
|
||||
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "暗号化の機能は無効化されましたが、ファイルはすでに暗号化されています。個人設定からファイルを複合を行ってください。",
|
||||
"Your download is being prepared. This might take some time if the files are big." => "ダウンロードの準備中です。ファイルサイズが大きい場合は少し時間がかかるかもしれません。",
|
||||
"Error moving file" => "ファイルの移動エラー",
|
||||
"Name" => "名前",
|
||||
"Size" => "サイズ",
|
||||
"Modified" => "変更",
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
$TRANSLATIONS = array(
|
||||
"Could not move %s - File with this name already exists" => "%s 항목을 이동시키지 못하였음 - 파일 이름이 이미 존재함",
|
||||
"Could not move %s" => "%s 항목을 이딩시키지 못하였음",
|
||||
"Unable to set upload directory." => "업로드 디렉터리를 정할수 없습니다",
|
||||
"Invalid Token" => "잘못된 토큰",
|
||||
"No file was uploaded. Unknown error" => "파일이 업로드되지 않았습니다. 알 수 없는 오류입니다",
|
||||
"There is no error, the file uploaded with success" => "파일 업로드에 성공하였습니다.",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "업로드한 파일이 php.ini의 upload_max_filesize보다 큽니다:",
|
||||
|
@ -11,12 +13,17 @@ $TRANSLATIONS = array(
|
|||
"Missing a temporary folder" => "임시 폴더가 없음",
|
||||
"Failed to write to disk" => "디스크에 쓰지 못했습니다",
|
||||
"Not enough storage available" => "저장소가 용량이 충분하지 않습니다.",
|
||||
"Upload failed. Could not get file info." => "업로드에 실패했습니다. 파일 정보를 가져올수 없습니다.",
|
||||
"Upload failed. Could not find uploaded file" => "업로드에 실패했습니다. 업로드할 파일을 찾을수 없습니다",
|
||||
"Invalid directory." => "올바르지 않은 디렉터리입니다.",
|
||||
"Files" => "파일",
|
||||
"Unable to upload {filename} as it is a directory or has 0 bytes" => "{filename}을 업로드 할수 없습니다. 폴더이거나 0 바이트 파일입니다.",
|
||||
"Not enough space available" => "여유 공간이 부족합니다",
|
||||
"Upload cancelled." => "업로드가 취소되었습니다.",
|
||||
"Could not get result from server." => "서버에서 결과를 가져올수 없습니다.",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.",
|
||||
"URL cannot be empty." => "URL을 입력해야 합니다.",
|
||||
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "유효하지 않은 폴더명입니다. \"Shared\" 이름의 사용은 OwnCloud 가 이미 예약하고 있습니다.",
|
||||
"Error" => "오류",
|
||||
"Share" => "공유",
|
||||
"Delete permanently" => "영원히 삭제",
|
||||
|
@ -28,18 +35,22 @@ $TRANSLATIONS = array(
|
|||
"cancel" => "취소",
|
||||
"replaced {new_name} with {old_name}" => "{old_name}이(가) {new_name}(으)로 대체됨",
|
||||
"undo" => "되돌리기",
|
||||
"_%n folder_::_%n folders_" => array(""),
|
||||
"_%n file_::_%n files_" => array(""),
|
||||
"_Uploading %n file_::_Uploading %n files_" => array(""),
|
||||
"_%n folder_::_%n folders_" => array("폴더 %n"),
|
||||
"_%n file_::_%n files_" => array("파일 %n 개"),
|
||||
"{dirs} and {files}" => "{dirs} 그리고 {files}",
|
||||
"_Uploading %n file_::_Uploading %n files_" => array("%n 개의 파일을 업로드중"),
|
||||
"'.' is an invalid file name." => "'.' 는 올바르지 않은 파일 이름 입니다.",
|
||||
"File name cannot be empty." => "파일 이름이 비어 있을 수 없습니다.",
|
||||
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "폴더 이름이 올바르지 않습니다. 이름에 문자 '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.",
|
||||
"Your storage is full, files can not be updated or synced anymore!" => "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
|
||||
"Your storage is almost full ({usedSpacePercent}%)" => "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)",
|
||||
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "암호화는 해제되어 있지만, 파일은 아직 암호화 되어 있습니다. 개인 설저에 가셔서 암호를 해제하십시오",
|
||||
"Your download is being prepared. This might take some time if the files are big." => "다운로드가 준비 중입니다. 파일 크기가 크다면 시간이 오래 걸릴 수도 있습니다.",
|
||||
"Error moving file" => "파일 이동 오류",
|
||||
"Name" => "이름",
|
||||
"Size" => "크기",
|
||||
"Modified" => "수정됨",
|
||||
"%s could not be renamed" => "%s 의 이름을 변경할수 없습니다",
|
||||
"Upload" => "업로드",
|
||||
"File handling" => "파일 처리",
|
||||
"Maximum upload size" => "최대 업로드 크기",
|
||||
|
|
|
@ -13,10 +13,14 @@ $TRANSLATIONS = array(
|
|||
"Missing a temporary folder" => "Nėra laikinojo katalogo",
|
||||
"Failed to write to disk" => "Nepavyko įrašyti į diską",
|
||||
"Not enough storage available" => "Nepakanka vietos serveryje",
|
||||
"Upload failed. Could not get file info." => "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.",
|
||||
"Upload failed. Could not find uploaded file" => "Įkėlimas nepavyko. Nepavyko rasti įkelto failo",
|
||||
"Invalid directory." => "Neteisingas aplankas",
|
||||
"Files" => "Failai",
|
||||
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio",
|
||||
"Not enough space available" => "Nepakanka vietos",
|
||||
"Upload cancelled." => "Įkėlimas atšauktas.",
|
||||
"Could not get result from server." => "Nepavyko gauti rezultato iš serverio.",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." => "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.",
|
||||
"URL cannot be empty." => "URL negali būti tuščias.",
|
||||
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Negalimas aplanko pavadinimas. 'Shared' pavadinimas yra rezervuotas ownCloud",
|
||||
|
@ -42,6 +46,7 @@ $TRANSLATIONS = array(
|
|||
"Your storage is almost full ({usedSpacePercent}%)" => "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)",
|
||||
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifravimas buvo išjungtas, bet Jūsų failai vis dar užšifruoti. Prašome eiti į asmeninius nustatymus ir iššifruoti savo failus.",
|
||||
"Your download is being prepared. This might take some time if the files are big." => "Jūsų atsisiuntimas yra paruošiamas. tai gali užtrukti jei atsisiunčiamas didelis failas.",
|
||||
"Error moving file" => "Klaida perkeliant failą",
|
||||
"Name" => "Pavadinimas",
|
||||
"Size" => "Dydis",
|
||||
"Modified" => "Pakeista",
|
||||
|
|
|
@ -13,10 +13,14 @@ $TRANSLATIONS = array(
|
|||
"Missing a temporary folder" => "Brak folderu tymczasowego",
|
||||
"Failed to write to disk" => "Błąd zapisu na dysk",
|
||||
"Not enough storage available" => "Za mało dostępnego miejsca",
|
||||
"Upload failed. Could not get file info." => "Nieudane przesłanie. Nie można pobrać informacji o pliku.",
|
||||
"Upload failed. Could not find uploaded file" => "Nieudane przesłanie. Nie można znaleźć przesyłanego pliku",
|
||||
"Invalid directory." => "Zła ścieżka.",
|
||||
"Files" => "Pliki",
|
||||
"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów",
|
||||
"Not enough space available" => "Za mało miejsca",
|
||||
"Upload cancelled." => "Wczytywanie anulowane.",
|
||||
"Could not get result from server." => "Nie można uzyskać wyniku z serwera.",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." => "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.",
|
||||
"URL cannot be empty." => "URL nie może być pusty.",
|
||||
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nieprawidłowa nazwa folderu. Wykorzystanie 'Shared' jest zarezerwowane przez ownCloud",
|
||||
|
@ -42,6 +46,7 @@ $TRANSLATIONS = array(
|
|||
"Your storage is almost full ({usedSpacePercent}%)" => "Twój magazyn jest prawie pełny ({usedSpacePercent}%)",
|
||||
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Szyfrowanie zostało wyłączone, ale nadal pliki są zaszyfrowane. Przejdź do ustawień osobistych i tam odszyfruj pliki.",
|
||||
"Your download is being prepared. This might take some time if the files are big." => "Pobieranie jest przygotowywane. Może to zająć trochę czasu jeśli pliki są duże.",
|
||||
"Error moving file" => "Błąd prz przenoszeniu pliku",
|
||||
"Name" => "Nazwa",
|
||||
"Size" => "Rozmiar",
|
||||
"Modified" => "Modyfikacja",
|
||||
|
|
|
@ -84,7 +84,7 @@ class Helper
|
|||
}
|
||||
}
|
||||
$i['directory'] = $dir;
|
||||
$i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
|
||||
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($i['mimetype']);
|
||||
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
|
||||
$files[] = $i;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
data-type='file'><p><?php p($l->t('Text file'));?></p></li>
|
||||
<li style="background-image:url('<?php p(OCP\mimetype_icon('dir')) ?>')"
|
||||
data-type='folder'><p><?php p($l->t('Folder'));?></p></li>
|
||||
<li style="background-image:url('<?php p(OCP\image_path('core', 'filetypes/web.svg')) ?>')"
|
||||
<li style="background-image:url('<?php p(OCP\image_path('core', 'places/link.svg')) ?>')"
|
||||
data-type='web'><p><?php p($l->t('From link'));?></p></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -116,3 +116,5 @@
|
|||
<input type="hidden" name="allowZipDownload" id="allowZipDownload" value="<?php p($_['allowZipDownload']); ?>" />
|
||||
<input type="hidden" name="usedSpacePercent" id="usedSpacePercent" value="<?php p($_['usedSpacePercent']); ?>" />
|
||||
<input type="hidden" name="encryptedFiles" id="encryptedFiles" value="<?php $_['encryptedFiles'] ? p('1') : p('0'); ?>" />
|
||||
<input type="hidden" name="encryptedInitStatus" id="encryptionInitStatus" value="<?php p($_['encryptionInitStatus']) ?>" />
|
||||
<input type="hidden" name="mailNotificationEnabled" id="mailNotificationEnabled" value="<?php p($_['mailNotificationEnabled']) ?>" />
|
||||
|
|
|
@ -30,16 +30,15 @@ $totalsize = 0; ?>
|
|||
<?php endif; ?>
|
||||
<?php if($file['type'] == 'dir'): ?>
|
||||
<a class="name" href="<?php p(rtrim($_['baseURL'],'/').'/'.trim($directory,'/').'/'.$name); ?>" title="">
|
||||
<?php else: ?>
|
||||
<a class="name" href="<?php p(rtrim($_['downloadURL'],'/').'/'.trim($directory,'/').'/'.$name); ?>" title="">
|
||||
<?php endif; ?>
|
||||
<span class="nametext">
|
||||
<?php if($file['type'] == 'dir'):?>
|
||||
<span class="nametext">
|
||||
<?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'):?>
|
||||
<span class="uploadtext" currentUploads="0">
|
||||
</span>
|
||||
|
|
|
@ -48,6 +48,7 @@ if ($decryptedKey) {
|
|||
|
||||
// success or failure
|
||||
if ($return) {
|
||||
$session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL);
|
||||
\OCP\JSON::success(array('data' => array('message' => $l->t('Private key password successfully updated.'))));
|
||||
} else {
|
||||
\OCP\JSON::error(array('data' => array('message' => $l->t('Could not update the private key password. Maybe the old password was not correct.'))));
|
||||
|
|
|
@ -43,23 +43,6 @@ if (!OC_Config::getValue('maintenance', false)) {
|
|||
if($sessionReady) {
|
||||
$session = new \OCA\Encryption\Session($view);
|
||||
}
|
||||
|
||||
$user = \OCP\USER::getUser();
|
||||
// check if user has a private key
|
||||
if ($sessionReady === false
|
||||
|| (!$view->file_exists('/' . $user . '/files_encryption/' . $user . '.private.key')
|
||||
&& OCA\Encryption\Crypt::mode() === 'server')
|
||||
) {
|
||||
|
||||
// Force the user to log-in again if the encryption key isn't unlocked
|
||||
// (happens when a user is logged in before the encryption app is
|
||||
// enabled)
|
||||
OCP\User::logout();
|
||||
|
||||
header("Location: " . OC::$WEBROOT . '/');
|
||||
|
||||
exit();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// logout user if we are in maintenance to force re-login
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
<author>Sam Tuke, Bjoern Schiessle, Florin Peter</author>
|
||||
<require>4</require>
|
||||
<shipped>true</shipped>
|
||||
<rememberlogin>false</rememberlogin>
|
||||
<types>
|
||||
<filesystem/>
|
||||
</types>
|
||||
|
|
|
@ -1 +1 @@
|
|||
0.4
|
||||
0.5
|
||||
|
|
|
@ -1,23 +1,33 @@
|
|||
<?php
|
||||
|
||||
if (!isset($_)) { //also provide standalone error page
|
||||
require_once __DIR__ . '/../../../lib/base.php';
|
||||
|
||||
$l = OC_L10N::get('files_encryption');
|
||||
|
||||
$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.');
|
||||
if (isset($_GET['i']) && $_GET['i'] === '0') {
|
||||
$errorMsg = $l->t('Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app.');
|
||||
$init = '0';
|
||||
} else {
|
||||
$errorMsg = $l->t('Your private key is not valid! Likely your password was changed outside the ownCloud system (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.');
|
||||
$init = '1';
|
||||
}
|
||||
|
||||
if(isset($_GET['p']) && $_GET['p'] === '1') {
|
||||
if (isset($_GET['p']) && $_GET['p'] === '1') {
|
||||
header('HTTP/1.0 404 ' . $errorMsg);
|
||||
}
|
||||
|
||||
// check if ajax request
|
||||
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
|
||||
// check if ajax request
|
||||
if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
|
||||
\OCP\JSON::error(array('data' => array('message' => $errorMsg)));
|
||||
} else {
|
||||
header('HTTP/1.0 404 ' . $errorMsg);
|
||||
$tmpl = new OC_Template('files_encryption', 'invalid_private_key', 'guest');
|
||||
$tmpl->assign('message', $errorMsg);
|
||||
$tmpl->assign('init', $init);
|
||||
$tmpl->printPage();
|
||||
}
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
|
|
|
@ -159,7 +159,6 @@ class Hooks {
|
|||
* @param array $params keys: uid, password
|
||||
*/
|
||||
public static function setPassphrase($params) {
|
||||
|
||||
// Only attempt to change passphrase if server-side encryption
|
||||
// is in use (client-side encryption does not have access to
|
||||
// the necessary keys)
|
||||
|
@ -543,14 +542,18 @@ class Hooks {
|
|||
}
|
||||
|
||||
/**
|
||||
* set migration status back to '0' so that all new files get encrypted
|
||||
* set migration status and the init status back to '0' so that all new files get encrypted
|
||||
* if the app gets enabled again
|
||||
* @param array $params contains the app ID
|
||||
*/
|
||||
public static function preDisable($params) {
|
||||
if ($params['app'] === 'files_encryption') {
|
||||
$query = \OC_DB::prepare('UPDATE `*PREFIX*encryption` SET `migration_status`=0');
|
||||
$query->execute();
|
||||
|
||||
$setMigrationStatus = \OC_DB::prepare('UPDATE `*PREFIX*encryption` SET `migration_status`=0');
|
||||
$setMigrationStatus->execute();
|
||||
|
||||
$session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
|
||||
$session->setInitialized(\OCA\Encryption\Session::NOT_INITIALIZED);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
/**
|
||||
* Copyright (c) 2013, Sam Tuke <samtuke@owncloud.com>, Robin Appelman
|
||||
* <icewind1991@gmail.com>
|
||||
* Copyright (c) 2013
|
||||
* Sam Tuke <samtuke@owncloud.com>
|
||||
* Robin Appelman <icewind1991@gmail.com>
|
||||
* Bjoern Schiessle <schiessle@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
@ -31,22 +33,23 @@ $(document).ready(function(){
|
|||
// Trigger ajax on recoveryAdmin status change
|
||||
var enabledStatus = $('#adminEnableRecovery').val();
|
||||
|
||||
$('input:password[name="recoveryPassword"]').keyup(function(event) {
|
||||
var recoveryPassword = $( '#recoveryPassword' ).val();
|
||||
$('input:password[name="encryptionRecoveryPassword"]').keyup(function(event) {
|
||||
var recoveryPassword = $( '#encryptionRecoveryPassword' ).val();
|
||||
var recoveryPasswordRepeated = $( '#repeatEncryptionRecoveryPassword' ).val();
|
||||
var checkedButton = $('input:radio[name="adminEnableRecovery"]:checked').val();
|
||||
var uncheckedValue = (1+parseInt(checkedButton)) % 2;
|
||||
if (recoveryPassword != '' ) {
|
||||
if (recoveryPassword !== '' && recoveryPassword === recoveryPasswordRepeated) {
|
||||
$('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').removeAttr("disabled");
|
||||
} else {
|
||||
$('input:radio[name="adminEnableRecovery"][value="'+uncheckedValue.toString()+'"]').attr("disabled", "true");
|
||||
}
|
||||
});
|
||||
|
||||
$( 'input:radio[name="adminEnableRecovery"]' ).change(
|
||||
$( 'input:radio[name="adminEnableRecovery"]' ).change(
|
||||
function() {
|
||||
var recoveryStatus = $( this ).val();
|
||||
var oldStatus = (1+parseInt(recoveryStatus)) % 2;
|
||||
var recoveryPassword = $( '#recoveryPassword' ).val();
|
||||
var recoveryPassword = $( '#encryptionRecoveryPassword' ).val();
|
||||
$.post(
|
||||
OC.filePath( 'files_encryption', 'ajax', 'adminrecovery.php' )
|
||||
, { adminEnableRecovery: recoveryStatus, recoveryPassword: recoveryPassword }
|
||||
|
@ -57,11 +60,10 @@ $(document).ready(function(){
|
|||
} else {
|
||||
OC.Notification.hide();
|
||||
if (recoveryStatus === "0") {
|
||||
$('button:button[name="submitChangeRecoveryKey"]').attr("disabled", "true");
|
||||
$('input:password[name="changeRecoveryPassword"]').attr("disabled", "true");
|
||||
$('input:password[name="changeRecoveryPassword"]').val("");
|
||||
$('p[name="changeRecoveryPasswordBlock"]').addClass("hidden");
|
||||
} else {
|
||||
$('input:password[name="changeRecoveryPassword"]').removeAttr("disabled");
|
||||
$('input:password[name="changeRecoveryPassword"]').val("");
|
||||
$('p[name="changeRecoveryPasswordBlock"]').removeClass("hidden");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -72,9 +74,11 @@ $(document).ready(function(){
|
|||
// change recovery password
|
||||
|
||||
$('input:password[name="changeRecoveryPassword"]').keyup(function(event) {
|
||||
var oldRecoveryPassword = $('input:password[id="oldRecoveryPassword"]').val();
|
||||
var newRecoveryPassword = $('input:password[id="newRecoveryPassword"]').val();
|
||||
if (newRecoveryPassword != '' && oldRecoveryPassword != '' ) {
|
||||
var oldRecoveryPassword = $('#oldEncryptionRecoveryPassword').val();
|
||||
var newRecoveryPassword = $('#newEncryptionRecoveryPassword').val();
|
||||
var newRecoveryPasswordRepeated = $('#repeatedNewEncryptionRecoveryPassword').val();
|
||||
|
||||
if (newRecoveryPassword !== '' && oldRecoveryPassword !== '' && newRecoveryPassword === newRecoveryPasswordRepeated) {
|
||||
$('button:button[name="submitChangeRecoveryKey"]').removeAttr("disabled");
|
||||
} else {
|
||||
$('button:button[name="submitChangeRecoveryKey"]').attr("disabled", "true");
|
||||
|
@ -83,8 +87,8 @@ $(document).ready(function(){
|
|||
|
||||
|
||||
$('button:button[name="submitChangeRecoveryKey"]').click(function() {
|
||||
var oldRecoveryPassword = $('input:password[id="oldRecoveryPassword"]').val();
|
||||
var newRecoveryPassword = $('input:password[id="newRecoveryPassword"]').val();
|
||||
var oldRecoveryPassword = $('#oldEncryptionRecoveryPassword').val();
|
||||
var newRecoveryPassword = $('#newEncryptionRecoveryPassword').val();
|
||||
OC.msg.startSaving('#encryption .msg');
|
||||
$.post(
|
||||
OC.filePath( 'files_encryption', 'ajax', 'changeRecoveryPassword.php' )
|
||||
|
@ -98,5 +102,5 @@ $(document).ready(function(){
|
|||
}
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
|
|
@ -199,12 +199,12 @@ class Helper {
|
|||
public static function stripUserFilesPath($path) {
|
||||
$trimmed = ltrim($path, '/');
|
||||
$split = explode('/', $trimmed);
|
||||
|
||||
|
||||
// it is not a file relative to data/user/files
|
||||
if (count($split) < 3 || $split[1] !== 'files') {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
$sliced = array_slice($split, 2);
|
||||
$relPath = implode('/', $sliced);
|
||||
|
||||
|
@ -219,30 +219,33 @@ class Helper {
|
|||
public static function getPathToRealFile($path) {
|
||||
$trimmed = ltrim($path, '/');
|
||||
$split = explode('/', $trimmed);
|
||||
|
||||
|
||||
if (count($split) < 3 || $split[1] !== "files_versions") {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
$sliced = array_slice($split, 2);
|
||||
$realPath = implode('/', $sliced);
|
||||
//remove the last .v
|
||||
$realPath = substr($realPath, 0, strrpos($realPath, '.v'));
|
||||
|
||||
return $realPath;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief redirect to a error page
|
||||
*/
|
||||
public static function redirectToErrorPage() {
|
||||
public static function redirectToErrorPage($session) {
|
||||
|
||||
$init = $session->getInitialized();
|
||||
|
||||
$location = \OC_Helper::linkToAbsolute('apps/files_encryption/files', 'error.php');
|
||||
$post = 0;
|
||||
if(count($_POST) > 0) {
|
||||
$post = 1;
|
||||
}
|
||||
header('Location: ' . $location . '?p=' . $post);
|
||||
exit();
|
||||
}
|
||||
header('Location: ' . $location . '?p=' . $post . '&i=' . $init);
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -259,7 +262,7 @@ class Helper {
|
|||
|
||||
return (bool) $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* check some common errors if the server isn't configured properly for encryption
|
||||
* @return bool true if configuration seems to be OK
|
||||
|
|
|
@ -30,6 +30,11 @@ class Session {
|
|||
|
||||
private $view;
|
||||
|
||||
const NOT_INITIALIZED = '0';
|
||||
const INIT_EXECUTED = '1';
|
||||
const INIT_SUCCESSFUL = '2';
|
||||
|
||||
|
||||
/**
|
||||
* @brief if session is started, check if ownCloud key pair is set up, if not create it
|
||||
* @param \OC_FilesystemView $view
|
||||
|
@ -112,6 +117,36 @@ class Session {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets status of encryption app
|
||||
* @param string $init INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INOITIALIZED
|
||||
* @return bool
|
||||
*
|
||||
* @note this doesn not indicate of the init was successful, we just remeber the try!
|
||||
*/
|
||||
public function setInitialized($init) {
|
||||
|
||||
\OC::$session->set('encryptionInitialized', $init);
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Gets status if we already tried to initialize the encryption app
|
||||
* @returns init status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INOITIALIZED
|
||||
*
|
||||
* @note this doesn not indicate of the init was successful, we just remeber the try!
|
||||
*/
|
||||
public function getInitialized() {
|
||||
if (!is_null(\OC::$session->get('encryptionInitialized'))) {
|
||||
return \OC::$session->get('encryptionInitialized');
|
||||
} else {
|
||||
return self::NOT_INITIALIZED;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets user or public share private key from session
|
||||
* @returns string $privateKey The user's plaintext private key
|
||||
|
|
|
@ -131,7 +131,7 @@ class Stream {
|
|||
|
||||
if($this->privateKey === false) {
|
||||
// if private key is not valid redirect user to a error page
|
||||
\OCA\Encryption\Helper::redirectToErrorPage();
|
||||
\OCA\Encryption\Helper::redirectToErrorPage($this->session);
|
||||
}
|
||||
|
||||
$this->size = $this->rootView->filesize($this->rawPath, $mode);
|
||||
|
|
|
@ -37,7 +37,6 @@ class Util {
|
|||
const MIGRATION_IN_PROGRESS = -1; // migration is running
|
||||
const MIGRATION_OPEN = 0; // user still needs to be migrated
|
||||
|
||||
|
||||
private $view; // OC_FilesystemView object for filesystem operations
|
||||
private $userId; // ID of the currently logged-in user
|
||||
private $client; // Client side encryption mode flag
|
||||
|
@ -1752,6 +1751,11 @@ class Util {
|
|||
*/
|
||||
public function initEncryption($params) {
|
||||
|
||||
$session = new \OCA\Encryption\Session($this->view);
|
||||
|
||||
// we tried to initialize the encryption app for this session
|
||||
$session->setInitialized(\OCA\Encryption\Session::INIT_EXECUTED);
|
||||
|
||||
$encryptedKey = Keymanager::getPrivateKey($this->view, $params['uid']);
|
||||
|
||||
$privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']);
|
||||
|
@ -1762,9 +1766,8 @@ class Util {
|
|||
return false;
|
||||
}
|
||||
|
||||
$session = new \OCA\Encryption\Session($this->view);
|
||||
|
||||
$session->setPrivateKey($privateKey);
|
||||
$session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL);
|
||||
|
||||
return $session;
|
||||
}
|
||||
|
|
|
@ -16,7 +16,9 @@ $view = new \OC_FilesystemView('/');
|
|||
$util = new \OCA\Encryption\Util($view, $user);
|
||||
$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');
|
||||
$recoveryEnabledForUser = $util->recoveryEnabledForUser();
|
||||
|
@ -31,6 +33,7 @@ if ($recoveryAdminEnabled || !$privateKeySet) {
|
|||
$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
|
||||
$tmpl->assign('recoveryEnabledForUser', $recoveryEnabledForUser);
|
||||
$tmpl->assign('privateKeySet', $privateKeySet);
|
||||
$tmpl->assign('initialized', $initialized);
|
||||
|
||||
$result = $tmpl->fetchPage();
|
||||
}
|
||||
|
|
|
@ -2,9 +2,11 @@
|
|||
<li class='error'>
|
||||
<?php $location = \OC_Helper::linkToRoute( "settings_personal" ).'#changePKPasswd' ?>
|
||||
|
||||
<?php p($l->t('Your private key is not valid! Maybe the your password was changed from outside.')); ?>
|
||||
<?php p($_['message']); ?>
|
||||
<br/>
|
||||
<?php p($l->t('You can unlock your private key in your ')); ?> <a href="<?php echo $location?>"><?php p($l->t('personal settings')); ?>.</a>
|
||||
<?php if($_['init']): ?>
|
||||
<?php>p($l->t('Go directly to your ')); ?> <a href="<?php echo $location?>"><?php p($l->t('personal settings')); ?>.</a>
|
||||
<?php endif; ?>
|
||||
<br/>
|
||||
</li>
|
||||
</ul>
|
||||
|
|
|
@ -10,14 +10,17 @@
|
|||
<?php p($l->t("Enable recovery key (allow to recover users files in case of password loss):")); ?>
|
||||
<br/>
|
||||
<br/>
|
||||
<input type="password" name="recoveryPassword" id="recoveryPassword"/>
|
||||
<input type="password" name="encryptionRecoveryPassword" id="encryptionRecoveryPassword"/>
|
||||
<label for="recoveryPassword"><?php p($l->t("Recovery key password")); ?></label>
|
||||
<br/>
|
||||
<input type="password" name="encryptionRecoveryPassword" id="repeatEncryptionRecoveryPassword"/>
|
||||
<label for="repeatEncryptionRecoveryPassword"><?php p($l->t("Repeat Recovery key password")); ?></label>
|
||||
<br/>
|
||||
<input
|
||||
type='radio'
|
||||
name='adminEnableRecovery'
|
||||
value='1'
|
||||
<?php echo($_["recoveryEnabled"] == 1 ? 'checked="checked"' : 'disabled'); ?> />
|
||||
<?php echo($_["recoveryEnabled"] === '1' ? 'checked="checked"' : 'disabled'); ?> />
|
||||
<?php p($l->t("Enabled")); ?>
|
||||
<br/>
|
||||
|
||||
|
@ -25,27 +28,32 @@
|
|||
type='radio'
|
||||
name='adminEnableRecovery'
|
||||
value='0'
|
||||
<?php echo($_["recoveryEnabled"] == 0 ? 'checked="checked"' : 'disabled'); ?> />
|
||||
<?php echo($_["recoveryEnabled"] === '0' ? 'checked="checked"' : 'disabled'); ?> />
|
||||
<?php p($l->t("Disabled")); ?>
|
||||
</p>
|
||||
<br/><br/>
|
||||
|
||||
<p>
|
||||
<p name="changeRecoveryPasswordBlock" <?php if ($_['recoveryEnabled'] === '0') print_unescaped('class="hidden"');?>>
|
||||
<strong><?php p($l->t("Change recovery key password:")); ?></strong>
|
||||
<br/><br/>
|
||||
<input
|
||||
type="password"
|
||||
name="changeRecoveryPassword"
|
||||
id="oldRecoveryPassword"
|
||||
<?php echo($_["recoveryEnabled"] == 0 ? 'disabled' : ''); ?> />
|
||||
<label for="oldRecoveryPassword"><?php p($l->t("Old Recovery key password")); ?></label>
|
||||
id="oldEncryptionRecoveryPassword"
|
||||
<label for="oldEncryptionRecoveryPassword"><?php p($l->t("Old Recovery key password")); ?></label>
|
||||
<br/>
|
||||
<br/>
|
||||
<input
|
||||
type="password"
|
||||
name="changeRecoveryPassword"
|
||||
id="newRecoveryPassword"
|
||||
<?php echo($_["recoveryEnabled"] == 0 ? 'disabled' : ''); ?> />
|
||||
<label for="newRecoveryPassword"><?php p($l->t("New Recovery key password")); ?></label>
|
||||
id="newEncryptionRecoveryPassword"
|
||||
<label for="newEncryptionRecoveryPassword"><?php p($l->t("New Recovery key password")); ?></label>
|
||||
<br/>
|
||||
<input
|
||||
type="password"
|
||||
name="changeRecoveryPassword"
|
||||
id="repeatedNewEncryptionRecoveryPassword"
|
||||
<label for="repeatEncryptionRecoveryPassword"><?php p($l->t("Repeat New Recovery key password")); ?></label>
|
||||
<br/>
|
||||
<button
|
||||
type="button"
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<?php p( $l->t( 'Encryption' ) ); ?>
|
||||
</legend>
|
||||
|
||||
<?php if ( ! $_["privateKeySet"] ): ?>
|
||||
<?php if ( ! $_["privateKeySet"] && $_["initialized"] ): ?>
|
||||
<p>
|
||||
<a name="changePKPasswd" />
|
||||
<label for="changePrivateKeyPasswd">
|
||||
|
@ -39,22 +39,22 @@
|
|||
<?php endif; ?>
|
||||
|
||||
<br />
|
||||
|
||||
|
||||
<?php if ( $_["recoveryEnabled"] && $_["privateKeySet"] ): ?>
|
||||
<p>
|
||||
<label for="userEnableRecovery"><?php p( $l->t( "Enable password recovery:" ) ); ?></label>
|
||||
<br />
|
||||
<em><?php p( $l->t( "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" ) ); ?></em>
|
||||
<br />
|
||||
<input
|
||||
<input
|
||||
type='radio'
|
||||
name='userEnableRecovery'
|
||||
value='1'
|
||||
<?php echo ( $_["recoveryEnabledForUser"] == 1 ? 'checked="checked"' : '' ); ?> />
|
||||
<?php p( $l->t( "Enabled" ) ); ?>
|
||||
<br />
|
||||
|
||||
<input
|
||||
|
||||
<input
|
||||
type='radio'
|
||||
name='userEnableRecovery'
|
||||
value='0'
|
||||
|
|
|
@ -1,7 +1,14 @@
|
|||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"The password is wrong. Try again." => "비밀번호가 틀립니다. 다시 입력해주세요.",
|
||||
"Password" => "암호",
|
||||
"Submit" => "제출",
|
||||
"Sorry, this link doesn’t seem to work anymore." => "죄송합니다만 이 링크는 더이상 작동되지 않습니다.",
|
||||
"Reasons might be:" => "이유는 다음과 같을 수 있습니다:",
|
||||
"the item was removed" => "이 항목은 삭제되었습니다",
|
||||
"the link expired" => "링크가 만료되었습니다",
|
||||
"sharing is disabled" => "공유가 비활성되었습니다",
|
||||
"For more info, please ask the person who sent this link." => "더 자세한 설명은 링크를 보내신 분에게 여쭤보십시오",
|
||||
"%s shared the folder %s with you" => "%s 님이 폴더 %s을(를) 공유하였습니다",
|
||||
"%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다",
|
||||
"Download" => "다운로드",
|
||||
|
|
|
@ -188,7 +188,7 @@ if (isset($path)) {
|
|||
} else {
|
||||
$i['extension'] = '';
|
||||
}
|
||||
$i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
|
||||
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($i['mimetype']);
|
||||
}
|
||||
$i['directory'] = $getPath;
|
||||
$i['permissions'] = OCP\PERMISSION_READ;
|
||||
|
|
|
@ -1,11 +1,19 @@
|
|||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"Couldn't delete %s permanently" => "%s를 영구적으로 삭제할수 없습니다",
|
||||
"Couldn't restore %s" => "%s를 복원할수 없습니다",
|
||||
"perform restore operation" => "복원 작업중",
|
||||
"Error" => "오류",
|
||||
"delete file permanently" => "영구적으로 파일 삭제하기",
|
||||
"Delete permanently" => "영원히 삭제",
|
||||
"Name" => "이름",
|
||||
"_%n folder_::_%n folders_" => array(""),
|
||||
"_%n file_::_%n files_" => array(""),
|
||||
"Deleted" => "삭제됨",
|
||||
"_%n folder_::_%n folders_" => array("폴더 %n개"),
|
||||
"_%n file_::_%n files_" => array("파일 %n개 "),
|
||||
"restored" => "복원됨",
|
||||
"Nothing in here. Your trash bin is empty!" => "현재 휴지통은 비어있습니다!",
|
||||
"Restore" => "복원",
|
||||
"Delete" => "삭제"
|
||||
"Delete" => "삭제",
|
||||
"Deleted Files" => "삭제된 파일들"
|
||||
);
|
||||
$PLURAL_FORMS = "nplurals=1; plural=0;";
|
||||
|
|
|
@ -61,7 +61,7 @@ class Helper
|
|||
$i['directory'] = '';
|
||||
}
|
||||
$i['permissions'] = \OCP\PERMISSION_READ;
|
||||
$i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($r['mime']);
|
||||
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($r['mime']);
|
||||
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
|
||||
$files[] = $i;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
$TRANSLATIONS = array(
|
||||
"Could not revert: %s" => "되돌릴 수 없습니다: %s",
|
||||
"Versions" => "버전",
|
||||
"Failed to revert {file} to revision {timestamp}." => "{timestamp} 판의 {file}로 돌리는데 실패했습니다.",
|
||||
"More versions..." => "더 많은 버전들...",
|
||||
"No other versions available" => "다른 버전을 사용할수 없습니다",
|
||||
"Restore" => "복원"
|
||||
);
|
||||
$PLURAL_FORMS = "nplurals=1; plural=0;";
|
||||
|
|
|
@ -27,5 +27,6 @@ OCP\JSON::checkAppEnabled('user_ldap');
|
|||
OCP\JSON::callCheck();
|
||||
|
||||
$prefix = $_POST['ldap_serverconfig_chooser'];
|
||||
$connection = new \OCA\user_ldap\lib\Connection($prefix);
|
||||
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
|
||||
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, $prefix);
|
||||
OCP\JSON::success(array('configuration' => $connection->getConfiguration()));
|
||||
|
|
|
@ -27,7 +27,8 @@ OCP\JSON::checkAppEnabled('user_ldap');
|
|||
OCP\JSON::callCheck();
|
||||
|
||||
$prefix = $_POST['ldap_serverconfig_chooser'];
|
||||
$connection = new \OCA\user_ldap\lib\Connection($prefix);
|
||||
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
|
||||
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, $prefix);
|
||||
$connection->setConfiguration($_POST);
|
||||
$connection->saveConfiguration();
|
||||
OCP\JSON::success();
|
||||
|
|
|
@ -28,7 +28,8 @@ OCP\JSON::callCheck();
|
|||
|
||||
$l=OC_L10N::get('user_ldap');
|
||||
|
||||
$connection = new \OCA\user_ldap\lib\Connection('', null);
|
||||
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
|
||||
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, '', null);
|
||||
if($connection->setConfiguration($_POST)) {
|
||||
//Configuration is okay
|
||||
if($connection->bind()) {
|
||||
|
|
|
@ -24,15 +24,15 @@
|
|||
OCP\App::registerAdmin('user_ldap', 'settings');
|
||||
|
||||
$configPrefixes = OCA\user_ldap\lib\Helper::getServerConfigurationPrefixes(true);
|
||||
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
|
||||
if(count($configPrefixes) === 1) {
|
||||
$connector = new OCA\user_ldap\lib\Connection($configPrefixes[0]);
|
||||
$userBackend = new OCA\user_ldap\USER_LDAP();
|
||||
$userBackend->setConnector($connector);
|
||||
$groupBackend = new OCA\user_ldap\GROUP_LDAP();
|
||||
$groupBackend->setConnector($connector);
|
||||
$connector = new OCA\user_ldap\lib\Connection($ldapWrapper, $configPrefixes[0]);
|
||||
$ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper);
|
||||
$userBackend = new OCA\user_ldap\USER_LDAP($ldapAccess);
|
||||
$groupBackend = new OCA\user_ldap\GROUP_LDAP($ldapAccess);
|
||||
} else {
|
||||
$userBackend = new OCA\user_ldap\User_Proxy($configPrefixes);
|
||||
$groupBackend = new OCA\user_ldap\Group_Proxy($configPrefixes);
|
||||
$userBackend = new OCA\user_ldap\User_Proxy($configPrefixes, $ldapWrapper);
|
||||
$groupBackend = new OCA\user_ldap\Group_Proxy($configPrefixes, $ldapWrapper);
|
||||
}
|
||||
|
||||
if(count($configPrefixes) > 0) {
|
||||
|
|
|
@ -23,13 +23,16 @@
|
|||
|
||||
namespace OCA\user_ldap;
|
||||
|
||||
class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
||||
use OCA\user_ldap\lib\Access;
|
||||
use OCA\user_ldap\lib\BackendUtility;
|
||||
|
||||
class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
|
||||
protected $enabled = false;
|
||||
|
||||
public function setConnector(lib\Connection &$connection) {
|
||||
parent::setConnector($connection);
|
||||
$filter = $this->connection->ldapGroupFilter;
|
||||
$gassoc = $this->connection->ldapGroupMemberAssocAttr;
|
||||
public function __construct(Access $access) {
|
||||
parent::__construct($access);
|
||||
$filter = $this->access->connection->ldapGroupFilter;
|
||||
$gassoc = $this->access->connection->ldapGroupMemberAssocAttr;
|
||||
if(!empty($filter) && !empty($gassoc)) {
|
||||
$this->enabled = true;
|
||||
}
|
||||
|
@ -47,30 +50,31 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
|||
if(!$this->enabled) {
|
||||
return false;
|
||||
}
|
||||
if($this->connection->isCached('inGroup'.$uid.':'.$gid)) {
|
||||
return $this->connection->getFromCache('inGroup'.$uid.':'.$gid);
|
||||
if($this->access->connection->isCached('inGroup'.$uid.':'.$gid)) {
|
||||
return $this->access->connection->getFromCache('inGroup'.$uid.':'.$gid);
|
||||
}
|
||||
$dn_user = $this->username2dn($uid);
|
||||
$dn_group = $this->groupname2dn($gid);
|
||||
$dn_user = $this->access->username2dn($uid);
|
||||
$dn_group = $this->access->groupname2dn($gid);
|
||||
// just in case
|
||||
if(!$dn_group || !$dn_user) {
|
||||
$this->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
|
||||
$this->access->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
|
||||
return false;
|
||||
}
|
||||
//usually, LDAP attributes are said to be case insensitive. But there are exceptions of course.
|
||||
$members = $this->readAttribute($dn_group, $this->connection->ldapGroupMemberAssocAttr);
|
||||
$members = $this->access->readAttribute($dn_group,
|
||||
$this->access->connection->ldapGroupMemberAssocAttr);
|
||||
if(!$members) {
|
||||
$this->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
|
||||
$this->access->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
//extra work if we don't get back user DNs
|
||||
//TODO: this can be done with one LDAP query
|
||||
if(strtolower($this->connection->ldapGroupMemberAssocAttr) === 'memberuid') {
|
||||
if(strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'memberuid') {
|
||||
$dns = array();
|
||||
foreach($members as $mid) {
|
||||
$filter = str_replace('%uid', $mid, $this->connection->ldapLoginFilter);
|
||||
$ldap_users = $this->fetchListOfUsers($filter, 'dn');
|
||||
$filter = str_replace('%uid', $mid, $this->access->connection->ldapLoginFilter);
|
||||
$ldap_users = $this->access->fetchListOfUsers($filter, 'dn');
|
||||
if(count($ldap_users) < 1) {
|
||||
continue;
|
||||
}
|
||||
|
@ -80,7 +84,7 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
|||
}
|
||||
|
||||
$isInGroup = in_array($dn_user, $members);
|
||||
$this->connection->writeToCache('inGroup'.$uid.':'.$gid, $isInGroup);
|
||||
$this->access->connection->writeToCache('inGroup'.$uid.':'.$gid, $isInGroup);
|
||||
|
||||
return $isInGroup;
|
||||
}
|
||||
|
@ -98,35 +102,36 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
|||
return array();
|
||||
}
|
||||
$cacheKey = 'getUserGroups'.$uid;
|
||||
if($this->connection->isCached($cacheKey)) {
|
||||
return $this->connection->getFromCache($cacheKey);
|
||||
if($this->access->connection->isCached($cacheKey)) {
|
||||
return $this->access->connection->getFromCache($cacheKey);
|
||||
}
|
||||
$userDN = $this->username2dn($uid);
|
||||
$userDN = $this->access->username2dn($uid);
|
||||
if(!$userDN) {
|
||||
$this->connection->writeToCache($cacheKey, array());
|
||||
$this->access->connection->writeToCache($cacheKey, array());
|
||||
return array();
|
||||
}
|
||||
|
||||
//uniqueMember takes DN, memberuid the uid, so we need to distinguish
|
||||
if((strtolower($this->connection->ldapGroupMemberAssocAttr) === 'uniquemember')
|
||||
|| (strtolower($this->connection->ldapGroupMemberAssocAttr) === 'member')
|
||||
if((strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'uniquemember')
|
||||
|| (strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'member')
|
||||
) {
|
||||
$uid = $userDN;
|
||||
} else if(strtolower($this->connection->ldapGroupMemberAssocAttr) === 'memberuid') {
|
||||
$result = $this->readAttribute($userDN, 'uid');
|
||||
} else if(strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'memberuid') {
|
||||
$result = $this->access->readAttribute($userDN, 'uid');
|
||||
$uid = $result[0];
|
||||
} else {
|
||||
// just in case
|
||||
$uid = $userDN;
|
||||
}
|
||||
|
||||
$filter = $this->combineFilterWithAnd(array(
|
||||
$this->connection->ldapGroupFilter,
|
||||
$this->connection->ldapGroupMemberAssocAttr.'='.$uid
|
||||
$filter = $this->access->combineFilterWithAnd(array(
|
||||
$this->access->connection->ldapGroupFilter,
|
||||
$this->access->connection->ldapGroupMemberAssocAttr.'='.$uid
|
||||
));
|
||||
$groups = $this->fetchListOfGroups($filter, array($this->connection->ldapGroupDisplayName, 'dn'));
|
||||
$groups = array_unique($this->ownCloudGroupNames($groups), SORT_LOCALE_STRING);
|
||||
$this->connection->writeToCache($cacheKey, $groups);
|
||||
$groups = $this->access->fetchListOfGroups($filter,
|
||||
array($this->access->connection->ldapGroupDisplayName, 'dn'));
|
||||
$groups = array_unique($this->access->ownCloudGroupNames($groups), SORT_LOCALE_STRING);
|
||||
$this->access->connection->writeToCache($cacheKey, $groups);
|
||||
|
||||
return $groups;
|
||||
}
|
||||
|
@ -144,70 +149,71 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
|||
}
|
||||
$cachekey = 'usersInGroup-'.$gid.'-'.$search.'-'.$limit.'-'.$offset;
|
||||
// check for cache of the exact query
|
||||
$groupUsers = $this->connection->getFromCache($cachekey);
|
||||
$groupUsers = $this->access->connection->getFromCache($cachekey);
|
||||
if(!is_null($groupUsers)) {
|
||||
return $groupUsers;
|
||||
}
|
||||
|
||||
// check for cache of the query without limit and offset
|
||||
$groupUsers = $this->connection->getFromCache('usersInGroup-'.$gid.'-'.$search);
|
||||
$groupUsers = $this->access->connection->getFromCache('usersInGroup-'.$gid.'-'.$search);
|
||||
if(!is_null($groupUsers)) {
|
||||
$groupUsers = array_slice($groupUsers, $offset, $limit);
|
||||
$this->connection->writeToCache($cachekey, $groupUsers);
|
||||
$this->access->connection->writeToCache($cachekey, $groupUsers);
|
||||
return $groupUsers;
|
||||
}
|
||||
|
||||
if($limit === -1) {
|
||||
$limit = null;
|
||||
}
|
||||
$groupDN = $this->groupname2dn($gid);
|
||||
$groupDN = $this->access->groupname2dn($gid);
|
||||
if(!$groupDN) {
|
||||
// group couldn't be found, return empty resultset
|
||||
$this->connection->writeToCache($cachekey, array());
|
||||
$this->access->connection->writeToCache($cachekey, array());
|
||||
return array();
|
||||
}
|
||||
|
||||
$members = $this->readAttribute($groupDN, $this->connection->ldapGroupMemberAssocAttr);
|
||||
$members = $this->access->readAttribute($groupDN,
|
||||
$this->access->connection->ldapGroupMemberAssocAttr);
|
||||
if(!$members) {
|
||||
//in case users could not be retrieved, return empty resultset
|
||||
$this->connection->writeToCache($cachekey, array());
|
||||
$this->access->connection->writeToCache($cachekey, array());
|
||||
return array();
|
||||
}
|
||||
|
||||
$groupUsers = array();
|
||||
$isMemberUid = (strtolower($this->connection->ldapGroupMemberAssocAttr) === 'memberuid');
|
||||
$isMemberUid = (strtolower($this->access->connection->ldapGroupMemberAssocAttr) === 'memberuid');
|
||||
foreach($members as $member) {
|
||||
if($isMemberUid) {
|
||||
//we got uids, need to get their DNs to 'tranlsate' them to usernames
|
||||
$filter = $this->combineFilterWithAnd(array(
|
||||
$filter = $this->access->combineFilterWithAnd(array(
|
||||
\OCP\Util::mb_str_replace('%uid', $member,
|
||||
$this->connection->ldapLoginFilter, 'UTF-8'),
|
||||
$this->getFilterPartForUserSearch($search)
|
||||
$this->access->connection->ldapLoginFilter, 'UTF-8'),
|
||||
$this->access->getFilterPartForUserSearch($search)
|
||||
));
|
||||
$ldap_users = $this->fetchListOfUsers($filter, 'dn');
|
||||
$ldap_users = $this->access->fetchListOfUsers($filter, 'dn');
|
||||
if(count($ldap_users) < 1) {
|
||||
continue;
|
||||
}
|
||||
$groupUsers[] = $this->dn2username($ldap_users[0]);
|
||||
$groupUsers[] = $this->access->dn2username($ldap_users[0]);
|
||||
} else {
|
||||
//we got DNs, check if we need to filter by search or we can give back all of them
|
||||
if(!empty($search)) {
|
||||
if(!$this->readAttribute($member,
|
||||
$this->connection->ldapUserDisplayName,
|
||||
$this->getFilterPartForUserSearch($search))) {
|
||||
if(!$this->access->readAttribute($member,
|
||||
$this->access->connection->ldapUserDisplayName,
|
||||
$this->access->getFilterPartForUserSearch($search))) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// dn2username will also check if the users belong to the allowed base
|
||||
if($ocname = $this->dn2username($member)) {
|
||||
if($ocname = $this->access->dn2username($member)) {
|
||||
$groupUsers[] = $ocname;
|
||||
}
|
||||
}
|
||||
}
|
||||
natsort($groupUsers);
|
||||
$this->connection->writeToCache('usersInGroup-'.$gid.'-'.$search, $groupUsers);
|
||||
$this->access->connection->writeToCache('usersInGroup-'.$gid.'-'.$search, $groupUsers);
|
||||
$groupUsers = array_slice($groupUsers, $offset, $limit);
|
||||
$this->connection->writeToCache($cachekey, $groupUsers);
|
||||
$this->access->connection->writeToCache($cachekey, $groupUsers);
|
||||
|
||||
return $groupUsers;
|
||||
}
|
||||
|
@ -245,7 +251,7 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
|||
|
||||
//Check cache before driving unnecessary searches
|
||||
\OCP\Util::writeLog('user_ldap', 'getGroups '.$cachekey, \OCP\Util::DEBUG);
|
||||
$ldap_groups = $this->connection->getFromCache($cachekey);
|
||||
$ldap_groups = $this->access->connection->getFromCache($cachekey);
|
||||
if(!is_null($ldap_groups)) {
|
||||
return $ldap_groups;
|
||||
}
|
||||
|
@ -255,16 +261,18 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
|||
if($limit <= 0) {
|
||||
$limit = null;
|
||||
}
|
||||
$filter = $this->combineFilterWithAnd(array(
|
||||
$this->connection->ldapGroupFilter,
|
||||
$this->getFilterPartForGroupSearch($search)
|
||||
$filter = $this->access->combineFilterWithAnd(array(
|
||||
$this->access->connection->ldapGroupFilter,
|
||||
$this->access->getFilterPartForGroupSearch($search)
|
||||
));
|
||||
\OCP\Util::writeLog('user_ldap', 'getGroups Filter '.$filter, \OCP\Util::DEBUG);
|
||||
$ldap_groups = $this->fetchListOfGroups($filter, array($this->connection->ldapGroupDisplayName, 'dn'),
|
||||
$limit, $offset);
|
||||
$ldap_groups = $this->ownCloudGroupNames($ldap_groups);
|
||||
$ldap_groups = $this->access->fetchListOfGroups($filter,
|
||||
array($this->access->connection->ldapGroupDisplayName, 'dn'),
|
||||
$limit,
|
||||
$offset);
|
||||
$ldap_groups = $this->access->ownCloudGroupNames($ldap_groups);
|
||||
|
||||
$this->connection->writeToCache($cachekey, $ldap_groups);
|
||||
$this->access->connection->writeToCache($cachekey, $ldap_groups);
|
||||
return $ldap_groups;
|
||||
}
|
||||
|
||||
|
@ -278,25 +286,26 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
|
|||
* @return bool
|
||||
*/
|
||||
public function groupExists($gid) {
|
||||
if($this->connection->isCached('groupExists'.$gid)) {
|
||||
return $this->connection->getFromCache('groupExists'.$gid);
|
||||
if($this->access->connection->isCached('groupExists'.$gid)) {
|
||||
return $this->access->connection->getFromCache('groupExists'.$gid);
|
||||
}
|
||||
|
||||
//getting dn, if false the group does not exist. If dn, it may be mapped only, requires more checking.
|
||||
$dn = $this->groupname2dn($gid);
|
||||
//getting dn, if false the group does not exist. If dn, it may be mapped
|
||||
//only, requires more checking.
|
||||
$dn = $this->access->groupname2dn($gid);
|
||||
if(!$dn) {
|
||||
$this->connection->writeToCache('groupExists'.$gid, false);
|
||||
$this->access->connection->writeToCache('groupExists'.$gid, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
//if group really still exists, we will be able to read its objectclass
|
||||
$objcs = $this->readAttribute($dn, 'objectclass');
|
||||
$objcs = $this->access->readAttribute($dn, 'objectclass');
|
||||
if(!$objcs || empty($objcs)) {
|
||||
$this->connection->writeToCache('groupExists'.$gid, false);
|
||||
$this->access->connection->writeToCache('groupExists'.$gid, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->connection->writeToCache('groupExists'.$gid, true);
|
||||
$this->access->connection->writeToCache('groupExists'.$gid, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace OCA\user_ldap;
|
||||
|
||||
use OCA\user_ldap\lib\ILDAPWrapper;
|
||||
|
||||
class Group_Proxy extends lib\Proxy implements \OCP\GroupInterface {
|
||||
private $backends = array();
|
||||
private $refBackend = null;
|
||||
|
@ -31,12 +33,11 @@ class Group_Proxy extends lib\Proxy implements \OCP\GroupInterface {
|
|||
* @brief Constructor
|
||||
* @param $serverConfigPrefixes array containing the config Prefixes
|
||||
*/
|
||||
public function __construct($serverConfigPrefixes) {
|
||||
parent::__construct();
|
||||
public function __construct($serverConfigPrefixes, ILDAPWrapper $ldap) {
|
||||
parent::__construct($ldap);
|
||||
foreach($serverConfigPrefixes as $configPrefix) {
|
||||
$this->backends[$configPrefix] = new \OCA\user_ldap\GROUP_LDAP();
|
||||
$connector = $this->getConnector($configPrefix);
|
||||
$this->backends[$configPrefix]->setConnector($connector);
|
||||
$this->backends[$configPrefix] =
|
||||
new \OCA\user_ldap\GROUP_LDAP($this->getAccess($configPrefix));
|
||||
if(is_null($this->refBackend)) {
|
||||
$this->refBackend = &$this->backends[$configPrefix];
|
||||
}
|
||||
|
|
|
@ -72,6 +72,7 @@ $TRANSLATIONS = array(
|
|||
"User Home Folder Naming Rule" => "A home könyvtár elérési útvonala",
|
||||
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Hagyja üresen, ha a felhasználónevet kívánja használni. Ellenkező esetben adjon meg egy LDAP/AD attribútumot!",
|
||||
"Internal Username" => "Belső felhasználónév",
|
||||
"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "Alapértelmezetten a belső felhasználónév az UUID tulajdonságból jön létre. Ez biztosítja a felhasználónév egyediségét és hogy a nem kell konvertálni a karaktereket benne. A belső felhasználónévnél a megkötés az, hogy csak a következő karakterek engdélyezettek benne: [ a-zA-Z0-9_.@- ]. Ezeken a karaktereken kivül minden karakter le lesz cserélve az adott karakter ASCII kódtáblában használható párjára vagy ha ilyen nincs akkor egyszerűen ki lesz hagyva. Ha így mégis ütköznének a nevek akkor hozzá lesz füzve egy folyamatosan növekvő számláló rész. A belső felhasználónevet lehet használni a felhasználó azonosítására a programon belül. Illetve ez lesz az alapáértelmezett neve a felhasználó kezdő könyvtárának az ownCloud-ban. Illetve...............................",
|
||||
"Internal Username Attribute:" => "A belső felhasználónév attribútuma:",
|
||||
"Override UUID detection" => "Az UUID-felismerés felülbírálása",
|
||||
"UUID Attribute:" => "UUID attribútum:",
|
||||
|
|
|
@ -23,12 +23,13 @@
|
|||
|
||||
namespace OCA\user_ldap\lib;
|
||||
|
||||
abstract class Access {
|
||||
protected $connection;
|
||||
class Access extends LDAPUtility {
|
||||
public $connection;
|
||||
//never ever check this var directly, always use getPagedSearchResultState
|
||||
protected $pagedSearchedSuccessful;
|
||||
|
||||
public function setConnector(Connection &$connection) {
|
||||
public function __construct(Connection $connection, ILDAPWrapper $ldap) {
|
||||
parent::__construct($ldap);
|
||||
$this->connection = $connection;
|
||||
}
|
||||
|
||||
|
@ -54,14 +55,14 @@ abstract class Access {
|
|||
return false;
|
||||
}
|
||||
$cr = $this->connection->getConnectionResource();
|
||||
if(!is_resource($cr)) {
|
||||
if(!$this->ldap->isResource($cr)) {
|
||||
//LDAP not available
|
||||
\OCP\Util::writeLog('user_ldap', 'LDAP resource not available.', \OCP\Util::DEBUG);
|
||||
return false;
|
||||
}
|
||||
$dn = $this->DNasBaseParameter($dn);
|
||||
$rr = @ldap_read($cr, $dn, $filter, array($attr));
|
||||
if(!is_resource($rr)) {
|
||||
$rr = @$this->ldap->read($cr, $dn, $filter, array($attr));
|
||||
if(!$this->ldap->isResource($rr)) {
|
||||
if(!empty($attr)) {
|
||||
//do not throw this message on userExists check, irritates
|
||||
\OCP\Util::writeLog('user_ldap', 'readAttribute failed for DN '.$dn, \OCP\Util::DEBUG);
|
||||
|
@ -73,13 +74,14 @@ abstract class Access {
|
|||
\OCP\Util::writeLog('user_ldap', 'readAttribute: '.$dn.' found', \OCP\Util::DEBUG);
|
||||
return array();
|
||||
}
|
||||
$er = ldap_first_entry($cr, $rr);
|
||||
if(!is_resource($er)) {
|
||||
$er = $this->ldap->firstEntry($cr, $rr);
|
||||
if(!$this->ldap->isResource($er)) {
|
||||
//did not match the filter, return false
|
||||
return false;
|
||||
}
|
||||
//LDAP attributes are not case sensitive
|
||||
$result = \OCP\Util::mb_array_change_key_case(ldap_get_attributes($cr, $er), MB_CASE_LOWER, 'UTF-8');
|
||||
$result = \OCP\Util::mb_array_change_key_case(
|
||||
$this->ldap->getAttributes($cr, $er), MB_CASE_LOWER, 'UTF-8');
|
||||
$attr = mb_strtolower($attr, 'UTF-8');
|
||||
|
||||
if(isset($result[$attr]) && $result[$attr]['count'] > 0) {
|
||||
|
@ -653,7 +655,7 @@ abstract class Access {
|
|||
|
||||
// See if we have a resource, in case not cancel with message
|
||||
$link_resource = $this->connection->getConnectionResource();
|
||||
if(!is_resource($link_resource)) {
|
||||
if(!$this->ldap->isResource($link_resource)) {
|
||||
// Seems like we didn't find any resource.
|
||||
// Return an empty array just like before.
|
||||
\OCP\Util::writeLog('user_ldap', 'Could not search, because resource is missing.', \OCP\Util::DEBUG);
|
||||
|
@ -664,11 +666,12 @@ abstract class Access {
|
|||
$pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, $limit, $offset);
|
||||
|
||||
$linkResources = array_pad(array(), count($base), $link_resource);
|
||||
$sr = ldap_search($linkResources, $base, $filter, $attr);
|
||||
$error = ldap_errno($link_resource);
|
||||
$sr = $this->ldap->search($linkResources, $base, $filter, $attr);
|
||||
$error = $this->ldap->errno($link_resource);
|
||||
if(!is_array($sr) || $error !== 0) {
|
||||
\OCP\Util::writeLog('user_ldap',
|
||||
'Error when searching: '.ldap_error($link_resource).' code '.ldap_errno($link_resource),
|
||||
'Error when searching: '.$this->ldap->error($link_resource).
|
||||
' code '.$this->ldap->errno($link_resource),
|
||||
\OCP\Util::ERROR);
|
||||
\OCP\Util::writeLog('user_ldap', 'Attempt for Paging? '.print_r($pagedSearchOK, true), \OCP\Util::ERROR);
|
||||
return array();
|
||||
|
@ -677,19 +680,19 @@ abstract class Access {
|
|||
// Do the server-side sorting
|
||||
foreach(array_reverse($attr) as $sortAttr){
|
||||
foreach($sr as $searchResource) {
|
||||
ldap_sort($link_resource, $searchResource, $sortAttr);
|
||||
$this->ldap->sort($link_resource, $searchResource, $sortAttr);
|
||||
}
|
||||
}
|
||||
|
||||
$findings = array();
|
||||
foreach($sr as $key => $res) {
|
||||
$findings = array_merge($findings, ldap_get_entries($link_resource, $res ));
|
||||
$findings = array_merge($findings, $this->ldap->getEntries($link_resource, $res ));
|
||||
}
|
||||
if($pagedSearchOK) {
|
||||
\OCP\Util::writeLog('user_ldap', 'Paged search successful', \OCP\Util::INFO);
|
||||
foreach($sr as $key => $res) {
|
||||
$cookie = null;
|
||||
if(ldap_control_paged_result_response($link_resource, $res, $cookie)) {
|
||||
if($this->ldap->controlPagedResultResponse($link_resource, $res, $cookie)) {
|
||||
\OCP\Util::writeLog('user_ldap', 'Set paged search cookie', \OCP\Util::INFO);
|
||||
$this->setPagedResultCookie($base[$key], $filter, $limit, $offset, $cookie);
|
||||
}
|
||||
|
@ -1103,8 +1106,9 @@ abstract class Access {
|
|||
if($offset > 0) {
|
||||
\OCP\Util::writeLog('user_ldap', 'Cookie '.$cookie, \OCP\Util::INFO);
|
||||
}
|
||||
$pagedSearchOK = ldap_control_paged_result($this->connection->getConnectionResource(),
|
||||
$limit, false, $cookie);
|
||||
$pagedSearchOK = $this->ldap->controlPagedResult(
|
||||
$this->connection->getConnectionResource(), $limit,
|
||||
false, $cookie);
|
||||
if(!$pagedSearchOK) {
|
||||
return false;
|
||||
}
|
||||
|
|
38
apps/user_ldap/lib/backendutility.php
Normal 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;
|
||||
}
|
||||
}
|
|
@ -23,7 +23,7 @@
|
|||
|
||||
namespace OCA\user_ldap\lib;
|
||||
|
||||
class Connection {
|
||||
class Connection extends LDAPUtility {
|
||||
private $ldapConnectionRes = null;
|
||||
private $configPrefix;
|
||||
private $configID;
|
||||
|
@ -60,7 +60,7 @@ class Connection {
|
|||
'ldapQuotaDefault' => null,
|
||||
'ldapEmailAttribute' => null,
|
||||
'ldapCacheTTL' => null,
|
||||
'ldapUuidAttribute' => null,
|
||||
'ldapUuidAttribute' => 'auto',
|
||||
'ldapOverrideUuidAttribute' => null,
|
||||
'ldapOverrideMainServer' => false,
|
||||
'ldapConfigurationActive' => false,
|
||||
|
@ -77,7 +77,8 @@ class Connection {
|
|||
* @param $configPrefix a string with the prefix for the configkey column (appconfig table)
|
||||
* @param $configID a string with the value for the appid column (appconfig table) or null for on-the-fly connections
|
||||
*/
|
||||
public function __construct($configPrefix = '', $configID = 'user_ldap') {
|
||||
public function __construct(ILDAPWrapper $ldap, $configPrefix = '', $configID = 'user_ldap') {
|
||||
parent::__construct($ldap);
|
||||
$this->configPrefix = $configPrefix;
|
||||
$this->configID = $configID;
|
||||
$memcache = new \OC\Memcache\Factory();
|
||||
|
@ -86,13 +87,14 @@ class Connection {
|
|||
} else {
|
||||
$this->cache = \OC_Cache::getGlobalCache();
|
||||
}
|
||||
$this->config['hasPagedResultSupport'] = (function_exists('ldap_control_paged_result')
|
||||
&& function_exists('ldap_control_paged_result_response'));
|
||||
$this->config['hasPagedResultSupport'] =
|
||||
$this->ldap->hasPagedResultSupport();
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
if(!$this->dontDestruct && is_resource($this->ldapConnectionRes)) {
|
||||
@ldap_unbind($this->ldapConnectionRes);
|
||||
if(!$this->dontDestruct &&
|
||||
$this->ldap->isResource($this->ldapConnectionRes)) {
|
||||
@$this->ldap->unbind($this->ldapConnectionRes);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -148,7 +150,7 @@ class Connection {
|
|||
public function getConnectionResource() {
|
||||
if(!$this->ldapConnectionRes) {
|
||||
$this->init();
|
||||
} else if(!is_resource($this->ldapConnectionRes)) {
|
||||
} else if(!$this->ldap->isResource($this->ldapConnectionRes)) {
|
||||
$this->ldapConnectionRes = null;
|
||||
$this->establishConnection();
|
||||
}
|
||||
|
@ -361,6 +363,14 @@ class Connection {
|
|||
&& $params[$parameter] === 'homeFolderNamingRule'))
|
||||
&& !empty($value)) {
|
||||
$value = 'attr:'.$value;
|
||||
} else if (strpos($parameter, 'ldapBase') !== false
|
||||
|| (isset($params[$parameter])
|
||||
&& strpos($params[$parameter], 'ldapBase') !== false)) {
|
||||
$this->readBase($params[$parameter], $value);
|
||||
if(is_array($setParameters)) {
|
||||
$setParameters[] = $parameter;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if(isset($this->config[$parameter])) {
|
||||
$this->config[$parameter] = $value;
|
||||
|
@ -386,7 +396,8 @@ class Connection {
|
|||
public function saveConfiguration() {
|
||||
$trans = array_flip($this->getConfigTranslationArray());
|
||||
foreach($this->config as $key => $value) {
|
||||
\OCP\Util::writeLog('user_ldap', 'LDAP: storing key '.$key.' value '.$value, \OCP\Util::DEBUG);
|
||||
\OCP\Util::writeLog('user_ldap', 'LDAP: storing key '.$key.
|
||||
' value '.print_r($value, true), \OCP\Util::DEBUG);
|
||||
switch ($key) {
|
||||
case 'ldapAgentPassword':
|
||||
$value = base64_encode($value);
|
||||
|
@ -431,8 +442,9 @@ class Connection {
|
|||
$config[$dbKey] = '';
|
||||
}
|
||||
continue;
|
||||
} else if((strpos($classKey, 'ldapBase') !== false)
|
||||
|| (strpos($classKey, 'ldapAttributes') !== false)) {
|
||||
} else if((strpos($classKey, 'ldapBase') !== false
|
||||
|| strpos($classKey, 'ldapAttributes') !== false)
|
||||
&& is_array($this->config[$classKey])) {
|
||||
$config[$dbKey] = implode("\n", $this->config[$classKey]);
|
||||
continue;
|
||||
}
|
||||
|
@ -551,7 +563,7 @@ class Connection {
|
|||
* @returns an associative array with the default values. Keys are correspond
|
||||
* to config-value entries in the database table
|
||||
*/
|
||||
public function getDefaults() {
|
||||
static public function getDefaults() {
|
||||
return array(
|
||||
'ldap_host' => '',
|
||||
'ldap_port' => '389',
|
||||
|
@ -603,7 +615,7 @@ class Connection {
|
|||
return false;
|
||||
}
|
||||
if(!$this->ldapConnectionRes) {
|
||||
if(!function_exists('ldap_connect')) {
|
||||
if(!$this->ldap->areLDAPFunctionsAvailable()) {
|
||||
$phpLDAPinstalled = false;
|
||||
\OCP\Util::writeLog('user_ldap',
|
||||
'function ldap_connect is not available. Make sure that the PHP ldap module is installed.',
|
||||
|
@ -623,7 +635,8 @@ class Connection {
|
|||
if(!$this->config['ldapOverrideMainServer'] && !$this->getFromCache('overrideMainServer')) {
|
||||
$this->doConnect($this->config['ldapHost'], $this->config['ldapPort']);
|
||||
$bindStatus = $this->bind();
|
||||
$error = is_resource($this->ldapConnectionRes) ? ldap_errno($this->ldapConnectionRes) : -1;
|
||||
$error = $this->ldap->isResource($this->ldapConnectionRes) ?
|
||||
$this->ldap->errno($this->ldapConnectionRes) : -1;
|
||||
} else {
|
||||
$bindStatus = false;
|
||||
$error = null;
|
||||
|
@ -653,11 +666,11 @@ class Connection {
|
|||
//ldap_connect ignores port paramater when URLs are passed
|
||||
$host .= ':' . $port;
|
||||
}
|
||||
$this->ldapConnectionRes = ldap_connect($host, $port);
|
||||
if(ldap_set_option($this->ldapConnectionRes, LDAP_OPT_PROTOCOL_VERSION, 3)) {
|
||||
if(ldap_set_option($this->ldapConnectionRes, LDAP_OPT_REFERRALS, 0)) {
|
||||
$this->ldapConnectionRes = $this->ldap->connect($host, $port);
|
||||
if($this->ldap->setOption($this->ldapConnectionRes, LDAP_OPT_PROTOCOL_VERSION, 3)) {
|
||||
if($this->ldap->setOption($this->ldapConnectionRes, LDAP_OPT_REFERRALS, 0)) {
|
||||
if($this->config['ldapTLS']) {
|
||||
ldap_start_tls($this->ldapConnectionRes);
|
||||
$this->ldap->startTls($this->ldapConnectionRes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -678,13 +691,15 @@ class Connection {
|
|||
$getConnectionResourceAttempt = true;
|
||||
$cr = $this->getConnectionResource();
|
||||
$getConnectionResourceAttempt = false;
|
||||
if(!is_resource($cr)) {
|
||||
if(!$this->ldap->isResource($cr)) {
|
||||
return false;
|
||||
}
|
||||
$ldapLogin = @ldap_bind($cr, $this->config['ldapAgentName'], $this->config['ldapAgentPassword']);
|
||||
$ldapLogin = @$this->ldap->bind($cr,
|
||||
$this->config['ldapAgentName'],
|
||||
$this->config['ldapAgentPassword']);
|
||||
if(!$ldapLogin) {
|
||||
\OCP\Util::writeLog('user_ldap',
|
||||
'Bind failed: ' . ldap_errno($cr) . ': ' . ldap_error($cr),
|
||||
'Bind failed: ' . $this->ldap->errno($cr) . ': ' . $this->ldap->error($cr),
|
||||
\OCP\Util::ERROR);
|
||||
$this->ldapConnectionRes = null;
|
||||
return false;
|
||||
|
|
180
apps/user_ldap/lib/ildapwrapper.php
Normal 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);
|
||||
|
||||
}
|
|
@ -139,13 +139,14 @@ class Jobs extends \OC\BackgroundJob\TimedJob {
|
|||
return self::$groupBE;
|
||||
}
|
||||
$configPrefixes = Helper::getServerConfigurationPrefixes(true);
|
||||
if(count($configPrefixes) == 1) {
|
||||
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
|
||||
if(count($configPrefixes) === 1) {
|
||||
//avoid the proxy when there is only one LDAP server configured
|
||||
$connector = new Connection($configPrefixes[0]);
|
||||
self::$groupBE = new \OCA\user_ldap\GROUP_LDAP();
|
||||
self::$groupBE->setConnector($connector);
|
||||
$connector = new OCA\user_ldap\lib\Connection($ldapWrapper, $configPrefixes[0]);
|
||||
$ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper);
|
||||
self::$groupBE = new OCA\user_ldap\GROUP_LDAP($ldapAccess);
|
||||
} else {
|
||||
self::$groupBE = new \OCA\user_ldap\Group_Proxy($configPrefixes);
|
||||
self::$groupBE = new \OCA\user_ldap\Group_Proxy($configPrefixes, $ldapWrapper);
|
||||
}
|
||||
|
||||
return self::$groupBE;
|
||||
|
|
167
apps/user_ldap/lib/ldap.php
Normal file
|
@ -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();
|
||||
}
|
||||
}
|
36
apps/user_ldap/lib/ldaputility.php
Normal 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;
|
||||
}
|
||||
}
|
|
@ -23,26 +23,27 @@
|
|||
|
||||
namespace OCA\user_ldap\lib;
|
||||
|
||||
abstract class Proxy {
|
||||
static private $connectors = array();
|
||||
use OCA\user_ldap\lib\Access;
|
||||
|
||||
public function __construct() {
|
||||
abstract class Proxy {
|
||||
static private $accesses = array();
|
||||
private $ldap = null;
|
||||
|
||||
public function __construct(ILDAPWrapper $ldap) {
|
||||
$this->ldap = $ldap;
|
||||
$this->cache = \OC_Cache::getGlobalCache();
|
||||
}
|
||||
|
||||
private function addConnector($configPrefix) {
|
||||
self::$connectors[$configPrefix] = new \OCA\user_ldap\lib\Connection($configPrefix);
|
||||
private function addAccess($configPrefix) {
|
||||
$connector = new Connection($this->ldap, $configPrefix);
|
||||
self::$accesses[$configPrefix] = new Access($connector, $this->ldap);
|
||||
}
|
||||
|
||||
protected function getConnector($configPrefix) {
|
||||
if(!isset(self::$connectors[$configPrefix])) {
|
||||
$this->addConnector($configPrefix);
|
||||
protected function getAccess($configPrefix) {
|
||||
if(!isset(self::$accesses[$configPrefix])) {
|
||||
$this->addAccess($configPrefix);
|
||||
}
|
||||
return self::$connectors[$configPrefix];
|
||||
}
|
||||
|
||||
protected function getConnectors() {
|
||||
return self::$connectors;
|
||||
return self::$accesses[$configPrefix];
|
||||
}
|
||||
|
||||
protected function getUserCacheKey($uid) {
|
||||
|
|
|
@ -49,14 +49,9 @@ $tmpl->assign('serverConfigurationPrefixes', $prefixes);
|
|||
$tmpl->assign('serverConfigurationHosts', $hosts);
|
||||
|
||||
// assign default values
|
||||
if(!isset($ldap)) {
|
||||
$ldap = new \OCA\user_ldap\lib\Connection();
|
||||
}
|
||||
$defaults = $ldap->getDefaults();
|
||||
$defaults = \OCA\user_ldap\lib\Connection::getDefaults();
|
||||
foreach($defaults as $key => $default) {
|
||||
$tmpl->assign($key.'_default', $default);
|
||||
}
|
||||
|
||||
// $tmpl->assign();
|
||||
|
||||
return $tmpl->fetchPage();
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
||||
}
|
411
apps/user_ldap/tests/user_ldap.php
Normal 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
|
||||
}
|
|
@ -25,37 +25,46 @@
|
|||
|
||||
namespace OCA\user_ldap;
|
||||
|
||||
class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
||||
use OCA\user_ldap\lib\ILDAPWrapper;
|
||||
use OCA\user_ldap\lib\BackendUtility;
|
||||
|
||||
class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
|
||||
|
||||
private function updateQuota($dn) {
|
||||
$quota = null;
|
||||
$quotaDefault = $this->connection->ldapQuotaDefault;
|
||||
$quotaAttribute = $this->connection->ldapQuotaAttribute;
|
||||
$quotaDefault = $this->access->connection->ldapQuotaDefault;
|
||||
$quotaAttribute = $this->access->connection->ldapQuotaAttribute;
|
||||
if(!empty($quotaDefault)) {
|
||||
$quota = $quotaDefault;
|
||||
}
|
||||
if(!empty($quotaAttribute)) {
|
||||
$aQuota = $this->readAttribute($dn, $quotaAttribute);
|
||||
$aQuota = $this->access->readAttribute($dn, $quotaAttribute);
|
||||
|
||||
if($aQuota && (count($aQuota) > 0)) {
|
||||
$quota = $aQuota[0];
|
||||
}
|
||||
}
|
||||
if(!is_null($quota)) {
|
||||
\OCP\Config::setUserValue($this->dn2username($dn), 'files', 'quota', \OCP\Util::computerFileSize($quota));
|
||||
\OCP\Config::setUserValue( $this->access->dn2username($dn),
|
||||
'files',
|
||||
'quota',
|
||||
\OCP\Util::computerFileSize($quota));
|
||||
}
|
||||
}
|
||||
|
||||
private function updateEmail($dn) {
|
||||
$email = null;
|
||||
$emailAttribute = $this->connection->ldapEmailAttribute;
|
||||
$emailAttribute = $this->access->connection->ldapEmailAttribute;
|
||||
if(!empty($emailAttribute)) {
|
||||
$aEmail = $this->readAttribute($dn, $emailAttribute);
|
||||
$aEmail = $this->access->readAttribute($dn, $emailAttribute);
|
||||
if($aEmail && (count($aEmail) > 0)) {
|
||||
$email = $aEmail[0];
|
||||
}
|
||||
if(!is_null($email)) {
|
||||
\OCP\Config::setUserValue($this->dn2username($dn), 'settings', 'email', $email);
|
||||
\OCP\Config::setUserValue( $this->access->dn2username($dn),
|
||||
'settings',
|
||||
'email',
|
||||
$email);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -70,15 +79,16 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
*/
|
||||
public function checkPassword($uid, $password) {
|
||||
//find out dn of the user name
|
||||
$filter = \OCP\Util::mb_str_replace('%uid', $uid, $this->connection->ldapLoginFilter, 'UTF-8');
|
||||
$ldap_users = $this->fetchListOfUsers($filter, 'dn');
|
||||
$filter = \OCP\Util::mb_str_replace(
|
||||
'%uid', $uid, $this->access->connection->ldapLoginFilter, 'UTF-8');
|
||||
$ldap_users = $this->access->fetchListOfUsers($filter, 'dn');
|
||||
if(count($ldap_users) < 1) {
|
||||
return false;
|
||||
}
|
||||
$dn = $ldap_users[0];
|
||||
|
||||
//do we have a username for him/her?
|
||||
$ocname = $this->dn2username($dn);
|
||||
$ocname = $this->access->dn2username($dn);
|
||||
|
||||
if($ocname) {
|
||||
//update some settings, if necessary
|
||||
|
@ -86,7 +96,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
$this->updateEmail($dn);
|
||||
|
||||
//are the credentials OK?
|
||||
if(!$this->areCredentialsValid($dn, $password)) {
|
||||
if(!$this->access->areCredentialsValid($dn, $password)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -107,7 +117,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
$cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset;
|
||||
|
||||
//check if users are cached, if so return
|
||||
$ldap_users = $this->connection->getFromCache($cachekey);
|
||||
$ldap_users = $this->access->connection->getFromCache($cachekey);
|
||||
if(!is_null($ldap_users)) {
|
||||
return $ldap_users;
|
||||
}
|
||||
|
@ -117,21 +127,23 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
if($limit <= 0) {
|
||||
$limit = null;
|
||||
}
|
||||
$filter = $this->combineFilterWithAnd(array(
|
||||
$this->connection->ldapUserFilter,
|
||||
$this->getFilterPartForUserSearch($search)
|
||||
$filter = $this->access->combineFilterWithAnd(array(
|
||||
$this->access->connection->ldapUserFilter,
|
||||
$this->access->getFilterPartForUserSearch($search)
|
||||
));
|
||||
|
||||
\OCP\Util::writeLog('user_ldap',
|
||||
'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset.' Filter: '.$filter,
|
||||
\OCP\Util::DEBUG);
|
||||
//do the search and translate results to owncloud names
|
||||
$ldap_users = $this->fetchListOfUsers($filter, array($this->connection->ldapUserDisplayName, 'dn'),
|
||||
$ldap_users = $this->access->fetchListOfUsers(
|
||||
$filter,
|
||||
array($this->access->connection->ldapUserDisplayName, 'dn'),
|
||||
$limit, $offset);
|
||||
$ldap_users = $this->ownCloudUserNames($ldap_users);
|
||||
$ldap_users = $this->access->ownCloudUserNames($ldap_users);
|
||||
\OCP\Util::writeLog('user_ldap', 'getUsers: '.count($ldap_users). ' Users found', \OCP\Util::DEBUG);
|
||||
|
||||
$this->connection->writeToCache($cachekey, $ldap_users);
|
||||
$this->access->connection->writeToCache($cachekey, $ldap_users);
|
||||
return $ldap_users;
|
||||
}
|
||||
|
||||
|
@ -141,24 +153,25 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
* @return boolean
|
||||
*/
|
||||
public function userExists($uid) {
|
||||
if($this->connection->isCached('userExists'.$uid)) {
|
||||
return $this->connection->getFromCache('userExists'.$uid);
|
||||
if($this->access->connection->isCached('userExists'.$uid)) {
|
||||
return $this->access->connection->getFromCache('userExists'.$uid);
|
||||
}
|
||||
|
||||
//getting dn, if false the user does not exist. If dn, he may be mapped only, requires more checking.
|
||||
$dn = $this->username2dn($uid);
|
||||
$dn = $this->access->username2dn($uid);
|
||||
if(!$dn) {
|
||||
$this->connection->writeToCache('userExists'.$uid, false);
|
||||
\OCP\Util::writeLog('user_ldap', 'No DN found for '.$uid.' on '.
|
||||
$this->access->connection->ldapHost, \OCP\Util::DEBUG);
|
||||
$this->access->connection->writeToCache('userExists'.$uid, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
//check if user really still exists by reading its entry
|
||||
if(!is_array($this->readAttribute($dn, ''))) {
|
||||
$this->connection->writeToCache('userExists'.$uid, false);
|
||||
if(!is_array($this->access->readAttribute($dn, ''))) {
|
||||
\OCP\Util::writeLog('user_ldap', 'LDAP says no user '.$dn, \OCP\Util::DEBUG);
|
||||
$this->access->connection->writeToCache('userExists'.$uid, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->connection->writeToCache('userExists'.$uid, true);
|
||||
$this->access->connection->writeToCache('userExists'.$uid, true);
|
||||
$this->updateQuota($dn);
|
||||
return true;
|
||||
}
|
||||
|
@ -186,12 +199,13 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
}
|
||||
|
||||
$cacheKey = 'getHome'.$uid;
|
||||
if($this->connection->isCached($cacheKey)) {
|
||||
return $this->connection->getFromCache($cacheKey);
|
||||
if($this->access->connection->isCached($cacheKey)) {
|
||||
return $this->access->connection->getFromCache($cacheKey);
|
||||
}
|
||||
if(strpos($this->connection->homeFolderNamingRule, 'attr:') === 0) {
|
||||
$attr = substr($this->connection->homeFolderNamingRule, strlen('attr:'));
|
||||
$homedir = $this->readAttribute($this->username2dn($uid), $attr);
|
||||
if(strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0) {
|
||||
$attr = substr($this->access->connection->homeFolderNamingRule, strlen('attr:'));
|
||||
$homedir = $this->access->readAttribute(
|
||||
$this->access->username2dn($uid), $attr);
|
||||
if($homedir && isset($homedir[0])) {
|
||||
$path = $homedir[0];
|
||||
//if attribute's value is an absolute path take this, otherwise append it to data dir
|
||||
|
@ -206,13 +220,13 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
$homedir = \OCP\Config::getSystemValue('datadirectory',
|
||||
\OC::$SERVERROOT.'/data' ) . '/' . $homedir[0];
|
||||
}
|
||||
$this->connection->writeToCache($cacheKey, $homedir);
|
||||
$this->access->connection->writeToCache($cacheKey, $homedir);
|
||||
return $homedir;
|
||||
}
|
||||
}
|
||||
|
||||
//false will apply default behaviour as defined and done by OC_User
|
||||
$this->connection->writeToCache($cacheKey, false);
|
||||
$this->access->connection->writeToCache($cacheKey, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -227,16 +241,16 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
}
|
||||
|
||||
$cacheKey = 'getDisplayName'.$uid;
|
||||
if(!is_null($displayName = $this->connection->getFromCache($cacheKey))) {
|
||||
if(!is_null($displayName = $this->access->connection->getFromCache($cacheKey))) {
|
||||
return $displayName;
|
||||
}
|
||||
|
||||
$displayName = $this->readAttribute(
|
||||
$this->username2dn($uid),
|
||||
$this->connection->ldapUserDisplayName);
|
||||
$displayName = $this->access->readAttribute(
|
||||
$this->access->username2dn($uid),
|
||||
$this->access->connection->ldapUserDisplayName);
|
||||
|
||||
if($displayName && (count($displayName) > 0)) {
|
||||
$this->connection->writeToCache($cacheKey, $displayName[0]);
|
||||
$this->access->connection->writeToCache($cacheKey, $displayName[0]);
|
||||
return $displayName[0];
|
||||
}
|
||||
|
||||
|
@ -251,7 +265,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
*/
|
||||
public function getDisplayNames($search = '', $limit = null, $offset = null) {
|
||||
$cacheKey = 'getDisplayNames-'.$search.'-'.$limit.'-'.$offset;
|
||||
if(!is_null($displayNames = $this->connection->getFromCache($cacheKey))) {
|
||||
if(!is_null($displayNames = $this->access->connection->getFromCache($cacheKey))) {
|
||||
return $displayNames;
|
||||
}
|
||||
|
||||
|
@ -260,7 +274,7 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
|
|||
foreach ($users as $user) {
|
||||
$displayNames[$user] = $this->getDisplayName($user);
|
||||
}
|
||||
$this->connection->writeToCache($cacheKey, $displayNames);
|
||||
$this->access->connection->writeToCache($cacheKey, $displayNames);
|
||||
return $displayNames;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
namespace OCA\user_ldap;
|
||||
|
||||
use OCA\user_ldap\lib\ILDAPWrapper;
|
||||
|
||||
class User_Proxy extends lib\Proxy implements \OCP\UserInterface {
|
||||
private $backends = array();
|
||||
private $refBackend = null;
|
||||
|
@ -31,12 +33,11 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface {
|
|||
* @brief Constructor
|
||||
* @param $serverConfigPrefixes array containing the config Prefixes
|
||||
*/
|
||||
public function __construct($serverConfigPrefixes) {
|
||||
parent::__construct();
|
||||
public function __construct($serverConfigPrefixes, ILDAPWrapper $ldap) {
|
||||
parent::__construct($ldap);
|
||||
foreach($serverConfigPrefixes as $configPrefix) {
|
||||
$this->backends[$configPrefix] = new \OCA\user_ldap\USER_LDAP();
|
||||
$connector = $this->getConnector($configPrefix);
|
||||
$this->backends[$configPrefix]->setConnector($connector);
|
||||
$this->backends[$configPrefix] =
|
||||
new \OCA\user_ldap\USER_LDAP($this->getAccess($configPrefix));
|
||||
if(is_null($this->refBackend)) {
|
||||
$this->refBackend = &$this->backends[$configPrefix];
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
$TRANSLATIONS = array(
|
||||
"WebDAV Authentication" => "WebDAV hitelesítés"
|
||||
"WebDAV Authentication" => "WebDAV hitelesítés",
|
||||
"Address: " => "Címek:",
|
||||
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz."
|
||||
);
|
||||
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
|
||||
|
|
17
autotest.sh
|
@ -12,6 +12,16 @@ DATABASEUSER=oc_autotest$EXECUTOR_NUMBER
|
|||
ADMINLOGIN=admin$EXECUTOR_NUMBER
|
||||
BASEDIR=$PWD
|
||||
|
||||
if ! [ -w config -a -w config/config.php ]; then
|
||||
echo "Please enable write permissions on config and config/config.php" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Back up existing (dev) config if one exists
|
||||
if [ -f config/config.php ]; then
|
||||
mv config/config.php config/config-autotest-backup.php
|
||||
fi
|
||||
|
||||
# use tmpfs for datadir - should speedup unit test execution
|
||||
if [ -d /dev/shm ]; then
|
||||
DATADIR=/dev/shm/data-autotest$EXECUTOR_NUMBER
|
||||
|
@ -158,6 +168,13 @@ else
|
|||
execute_tests $1 $2 $3
|
||||
fi
|
||||
|
||||
cd $BASEDIR
|
||||
|
||||
# Restore existing config
|
||||
if [ -f config/config-autotest-backup.php ]; then
|
||||
mv config/config-autotest-backup.php config/config.php
|
||||
fi
|
||||
|
||||
#
|
||||
# NOTES on mysql:
|
||||
# - CREATE DATABASE oc_autotest;
|
||||
|
|
|
@ -23,6 +23,8 @@ OC_JSON::checkLoggedIn();
|
|||
OCP\JSON::callCheck();
|
||||
OC_App::loadApps();
|
||||
|
||||
$defaults = new \OCP\Defaults();
|
||||
|
||||
if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSource'])) {
|
||||
switch ($_POST['action']) {
|
||||
case 'share':
|
||||
|
@ -33,7 +35,7 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
|
|||
if ($shareType === OCP\Share::SHARE_TYPE_LINK && $shareWith == '') {
|
||||
$shareWith = null;
|
||||
}
|
||||
|
||||
|
||||
$token = OCP\Share::shareItem(
|
||||
$_POST['itemType'],
|
||||
$_POST['itemSource'],
|
||||
|
@ -41,7 +43,7 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
|
|||
$shareWith,
|
||||
$_POST['permissions']
|
||||
);
|
||||
|
||||
|
||||
if (is_string($token)) {
|
||||
OC_JSON::success(array('data' => array('token' => $token)));
|
||||
} else {
|
||||
|
@ -81,6 +83,104 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
|
|||
($return) ? OC_JSON::success() : OC_JSON::error();
|
||||
}
|
||||
break;
|
||||
case 'informRecipients':
|
||||
|
||||
$l = OC_L10N::get('core');
|
||||
|
||||
$shareType = (int) $_POST['shareType'];
|
||||
$itemType = $_POST['itemType'];
|
||||
$itemSource = $_POST['itemSource'];
|
||||
$recipient = $_POST['recipient'];
|
||||
$ownerDisplayName = \OCP\User::getDisplayName();
|
||||
$from = \OCP\Util::getDefaultEmailAddress('sharing-noreply');
|
||||
|
||||
$noMail = array();
|
||||
$recipientList = array();
|
||||
|
||||
if($shareType === \OCP\Share::SHARE_TYPE_USER) {
|
||||
$recipientList[] = $recipient;
|
||||
} elseif ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
|
||||
$recipientList = \OC_Group::usersInGroup($recipient);
|
||||
}
|
||||
|
||||
// don't send a mail to the user who shared the file
|
||||
$recipientList = array_diff($recipientList, [\OCP\User::getUser()]);
|
||||
|
||||
// send mail to all recipients with an email address
|
||||
foreach ($recipientList as $recipient) {
|
||||
//get correct target folder name
|
||||
$email = OC_Preferences::getValue($recipient, 'settings', 'email', '');
|
||||
|
||||
if ($email !== '') {
|
||||
$displayName = \OCP\User::getDisplayName($recipient);
|
||||
$items = \OCP\Share::getItemSharedWithUser($itemType, $itemSource, $recipient);
|
||||
$filename = trim($items[0]['file_target'], '/');
|
||||
$subject = (string)$l->t('%s shared »%s« with you', array($ownerDisplayName, $filename));
|
||||
$expiration = null;
|
||||
if (isset($items[0]['expiration'])) {
|
||||
$date = new DateTime($items[0]['expiration']);
|
||||
$expiration = $date->format('Y-m-d');
|
||||
}
|
||||
|
||||
if ($itemType === 'folder') {
|
||||
$foldername = "/Shared/" . $filename;
|
||||
} else {
|
||||
// if it is a file we can just link to the Shared folder,
|
||||
// that's the place where the user will find the file
|
||||
$foldername = "/Shared";
|
||||
}
|
||||
|
||||
$link = \OCP\Util::linkToAbsolute('files', 'index.php', array("dir" => $foldername));
|
||||
|
||||
$content = new OC_Template("core", "mail", "");
|
||||
$content->assign('link', $link);
|
||||
$content->assign('user_displayname', $ownerDisplayName);
|
||||
$content->assign('filename', $filename);
|
||||
$content->assign('expiration', $expiration);
|
||||
$text = $content->fetchPage();
|
||||
|
||||
$content = new OC_Template("core", "altmail", "");
|
||||
$content->assign('link', $link);
|
||||
$content->assign('user_displayname', $ownerDisplayName);
|
||||
$content->assign('filename', $filename);
|
||||
$content->assign('expiration', $expiration);
|
||||
$alttext = $content->fetchPage();
|
||||
|
||||
$default_from = OCP\Util::getDefaultEmailAddress('sharing-noreply');
|
||||
$from = OCP\Config::getUserValue(\OCP\User::getUser(), 'settings', 'email', $default_from);
|
||||
|
||||
// send it out now
|
||||
try {
|
||||
OCP\Util::sendMail($email, $displayName, $subject, $text, $from, $ownerDisplayName, 1, $alttext);
|
||||
} catch (Exception $exception) {
|
||||
$noMail[] = \OCP\User::getDisplayName($recipient);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
\OCP\Share::setSendMailStatus($itemType, $itemSource, $shareType, true);
|
||||
|
||||
if (empty($noMail)) {
|
||||
OCP\JSON::success();
|
||||
} else {
|
||||
OCP\JSON::error(array(
|
||||
'data' => array(
|
||||
'message' => $l->t("Couldn't send mail to following users: %s ",
|
||||
implode(', ', $noMail)
|
||||
)
|
||||
)
|
||||
));
|
||||
}
|
||||
break;
|
||||
case 'informRecipientsDisabled':
|
||||
$itemSource = $_POST['itemSource'];
|
||||
$shareType = $_POST['shareType'];
|
||||
$itemType = $_POST['itemType'];
|
||||
$recipient = $_POST['recipient'];
|
||||
\OCP\Share::setSendMailStatus($itemType, $itemSource, $shareType, false);
|
||||
OCP\JSON::success();
|
||||
break;
|
||||
|
||||
case 'email':
|
||||
// read post variables
|
||||
$user = OCP\USER::getUser();
|
||||
|
@ -213,10 +313,10 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
|
|||
}
|
||||
}
|
||||
$count = 0;
|
||||
|
||||
|
||||
// enable l10n support
|
||||
$l = OC_L10N::get('core');
|
||||
|
||||
|
||||
foreach ($groups as $group) {
|
||||
if ($count < 15) {
|
||||
if (!isset($_GET['itemShares'])
|
||||
|
|
|
@ -2,95 +2,97 @@
|
|||
This file is licensed under the Affero General Public License version 3 or later.
|
||||
See the COPYING-README file. */
|
||||
|
||||
#dropdown {
|
||||
background:#eee;
|
||||
border-bottom-left-radius:1em;
|
||||
border-bottom-right-radius:1em;
|
||||
box-shadow:0 1px 1px #777;
|
||||
display:block;
|
||||
margin-right:7em;
|
||||
position:absolute;
|
||||
right:0;
|
||||
width:19em;
|
||||
z-index:500;
|
||||
padding:1em;
|
||||
}
|
||||
#dropdown {
|
||||
background:#eee;
|
||||
border-bottom-left-radius: 5px;
|
||||
border-bottom-right-radius: 5px;
|
||||
box-shadow:0 1px 1px #777;
|
||||
display:block;
|
||||
margin-right:7em;
|
||||
position:absolute;
|
||||
right:0;
|
||||
width:25em;
|
||||
z-index:500;
|
||||
padding:1em;
|
||||
}
|
||||
|
||||
#shareWithList {
|
||||
list-style-type:none;
|
||||
padding:.5em;
|
||||
}
|
||||
#shareWithList {
|
||||
list-style-type:none;
|
||||
padding:.5em;
|
||||
}
|
||||
|
||||
#shareWithList li {
|
||||
padding-top:.1em;
|
||||
}
|
||||
|
||||
#shareWithList li:first-child {
|
||||
white-space:normal;
|
||||
}
|
||||
#shareWithList li {
|
||||
padding-top:.1em;
|
||||
}
|
||||
|
||||
#shareWithList .cruds {
|
||||
margin-left:-10px;
|
||||
}
|
||||
#shareWithList li:first-child {
|
||||
white-space:normal;
|
||||
}
|
||||
|
||||
#shareWithList .cruds {
|
||||
margin-left:-10px;
|
||||
}
|
||||
|
||||
#shareWithList .unshare img, #shareWithList .showCruds img {
|
||||
vertical-align:text-bottom; /* properly align icons */
|
||||
}
|
||||
|
||||
#dropdown label {
|
||||
font-weight:400;
|
||||
}
|
||||
#dropdown label {
|
||||
font-weight:400;
|
||||
}
|
||||
|
||||
#dropdown input[type="checkbox"] {
|
||||
margin:0 .2em 0 .5em;
|
||||
}
|
||||
#dropdown input[type="checkbox"] {
|
||||
margin:0 .2em 0 .5em;
|
||||
}
|
||||
|
||||
a.showCruds {
|
||||
display:inline;
|
||||
opacity:.5;
|
||||
}
|
||||
a.showCruds {
|
||||
display:inline;
|
||||
opacity:.5;
|
||||
}
|
||||
|
||||
a.unshare {
|
||||
display:inline;
|
||||
float:right;
|
||||
opacity:.5;
|
||||
padding:.3em 0 0 .3em !important;
|
||||
a.unshare {
|
||||
display:inline;
|
||||
float:right;
|
||||
opacity:.5;
|
||||
padding:.3em 0 0 .3em !important;
|
||||
margin-top:-5px;
|
||||
}
|
||||
}
|
||||
|
||||
#link {
|
||||
border-top:1px solid #ddd;
|
||||
padding-top:.5em;
|
||||
}
|
||||
#link {
|
||||
border-top:1px solid #ddd;
|
||||
padding-top:.5em;
|
||||
}
|
||||
|
||||
#dropdown input[type="text"],#dropdown input[type="password"] {
|
||||
width:90%;
|
||||
width:90%;
|
||||
}
|
||||
|
||||
#dropdown form {
|
||||
font-size: 100%;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
font-size: 100%;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
#linkText,#linkPass,#expiration {
|
||||
display:none;
|
||||
}
|
||||
display:none;
|
||||
}
|
||||
|
||||
#link #showPassword img {
|
||||
padding-left:.3em;
|
||||
width:12px;
|
||||
}
|
||||
#link #showPassword img {
|
||||
padding-left:.3em;
|
||||
width:12px;
|
||||
}
|
||||
|
||||
.reshare,#link label,#expiration label {
|
||||
padding-left:.5em;
|
||||
}
|
||||
.reshare,#link label,#expiration label {
|
||||
padding-left:.5em;
|
||||
}
|
||||
|
||||
a.showCruds:hover,a.unshare:hover {
|
||||
opacity:1;
|
||||
}
|
||||
a.showCruds:hover,a.unshare:hover {
|
||||
opacity:1;
|
||||
}
|
||||
|
||||
.reshare { white-space:normal; } /* fix shared by text going out of box */
|
||||
.reshare { /* fix shared by text going out of box */
|
||||
white-space:normal;
|
||||
}
|
||||
|
||||
.ui-autocomplete { /* limit dropdown height to 4 1/2 entries */
|
||||
max-height:103px;
|
||||
|
|
|
@ -19,9 +19,6 @@ body { background:#fefefe; font:normal .8em/1.6em "Helvetica Neue",Helvetica,Ari
|
|||
#body-user #header, #body-settings #header {
|
||||
position:fixed; top:0; left:0; right:0; z-index:100; height:45px; line-height:2.5em;
|
||||
background:#1d2d44 url('../img/noise.png') repeat;
|
||||
-moz-box-shadow:0 0 10px rgba(0, 0, 0, .5);
|
||||
-webkit-box-shadow:0 0 10px rgba(0, 0, 0, .5);
|
||||
box-shadow:0 0 10px rgba(0, 0, 0, .5);
|
||||
}
|
||||
|
||||
#body-login {
|
||||
|
@ -46,6 +43,10 @@ body { background:#fefefe; font:normal .8em/1.6em "Helvetica Neue",Helvetica,Ari
|
|||
display: inline-block;
|
||||
}
|
||||
|
||||
#header .avatardiv img {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* INPUTS */
|
||||
input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"],
|
||||
textarea, select,
|
||||
|
@ -155,23 +156,37 @@ input[type="submit"].enabled { background:#66f866; border:1px solid #5e5; -moz-b
|
|||
|
||||
/* CONTENT ------------------------------------------------------------------ */
|
||||
#controls {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
position: fixed;
|
||||
height: 36px;
|
||||
height: 44px;
|
||||
width: 100%;
|
||||
padding: 0 75px 0 6px;
|
||||
padding-right: 75px;
|
||||
margin: 0;
|
||||
background: #eee;
|
||||
border-bottom: 1px solid #e7e7e7;
|
||||
z-index: 50;
|
||||
-moz-box-sizing: border-box; box-sizing: border-box;
|
||||
-moz-box-shadow: 0 -3px 7px #000; -webkit-box-shadow: 0 -3px 7px #000; box-shadow: 0 -3px 7px #000;
|
||||
}
|
||||
#controls .button {
|
||||
#controls .button,
|
||||
#controls button,
|
||||
#controls input[type='submit'],
|
||||
#controls input[type='text'],
|
||||
#controls input[type='password'],
|
||||
#controls select {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
height: 36px;
|
||||
padding: 7px 10px
|
||||
}
|
||||
|
||||
#content { position:relative; height:100%; width:100%; }
|
||||
#content .hascontrols { position: relative; top: 2.9em; }
|
||||
#content .hascontrols {
|
||||
position: relative;
|
||||
top: 45px;
|
||||
}
|
||||
#content-wrapper {
|
||||
position:absolute; height:100%; width:100%; padding-top:3.5em; padding-left:80px;
|
||||
-moz-box-sizing:border-box; box-sizing:border-box;
|
||||
|
@ -512,7 +527,6 @@ label.infield { cursor:text !important; top:1.05em; left:.85em; }
|
|||
z-index: 75;
|
||||
height: 100%;
|
||||
background:#383c43 url('../img/noise.png') repeat;
|
||||
-moz-box-shadow:0 0 7px #000; -webkit-box-shadow:0 0 7px #000; box-shadow:0 0 7px #000;
|
||||
overflow:hidden; box-sizing:border-box; -moz-box-sizing:border-box;
|
||||
/* prevent ugly selection effect on accidental selection */
|
||||
-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;
|
||||
|
@ -751,15 +765,38 @@ span.ui-icon {float: left; margin: 3px 7px 30px 0;}
|
|||
.arrow.left { left:-13px; bottom:1.2em; -webkit-transform:rotate(270deg); -moz-transform:rotate(270deg); -o-transform:rotate(270deg); -ms-transform:rotate(270deg); transform:rotate(270deg); }
|
||||
.arrow.up { top:-8px; right:2em; }
|
||||
.arrow.down { -webkit-transform:rotate(180deg); -moz-transform:rotate(180deg); -o-transform:rotate(180deg); -ms-transform:rotate(180deg); transform:rotate(180deg); }
|
||||
.help-includes {overflow: hidden; width: 100%; height: 100%; -moz-box-sizing: border-box; box-sizing: border-box; padding-top: 2.8em; }
|
||||
.help-includes {
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
padding-top: 44px;
|
||||
}
|
||||
.help-iframe {width: 100%; height: 100%; margin: 0;padding: 0; border: 0; overflow: auto;}
|
||||
|
||||
|
||||
/* ---- BREADCRUMB ---- */
|
||||
div.crumb { float:left; display:block; background:url('../img/breadcrumb.svg') no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; -moz-box-sizing:border-box; box-sizing:border-box; }
|
||||
div.crumb:first-child { padding:10px 20px 10px 5px; }
|
||||
div.crumb.last { font-weight:bold; background:none; padding-right:10px; }
|
||||
div.crumb a{ padding: 0.9em 0 0.7em 0; }
|
||||
div.crumb {
|
||||
float: left;
|
||||
display: block;
|
||||
background: url('../img/breadcrumb.svg') no-repeat right center;
|
||||
height: 44px;
|
||||
}
|
||||
div.crumb a {
|
||||
position: relative;
|
||||
top: 12px;
|
||||
padding: 14px 24px 14px 17px;
|
||||
color: #555;
|
||||
}
|
||||
div.crumb:first-child a {
|
||||
position: relative;
|
||||
top: 13px;
|
||||
}
|
||||
div.crumb.last {
|
||||
font-weight: bold;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
/* some feedback for hover/tap on breadcrumbs */
|
||||
div.crumb:hover,
|
||||
|
|
Before Width: | Height: | Size: 311 B |
|
@ -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 |
Before Width: | Height: | Size: 320 B After Width: | Height: | Size: 594 B |
|
@ -1,6 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="36" width="11" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<g transform="translate(0 -1016.4)">
|
||||
<path d="m0.5 0 10 18-10 18 10-18z" transform="translate(0 1016.4)" stroke="#ddd" stroke-linecap="round" stroke-miterlimit="31.2" stroke-width="0.9" fill="#ddd"/>
|
||||
</g>
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="44" width="14" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata>
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<path d="M0.54879,0.047777,12.744,22,0.54879,43.951,12.744,22z" stroke="#d7d7d7" stroke-linecap="round" stroke-miterlimit="31.20000076000000178" stroke-width="1.09758711000000009" fill="#F00"/>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 491 B After Width: | Height: | Size: 638 B |
BIN
core/img/places/link.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
12
core/img/places/link.svg
Normal 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 |
|
@ -1,6 +1,6 @@
|
|||
$(document).ready(function(){
|
||||
if (OC.currentUser) {
|
||||
$('#header .avatardiv').avatar(OC.currentUser, 32);
|
||||
$('#header .avatardiv').avatar(OC.currentUser, 32, undefined, true);
|
||||
// Personal settings
|
||||
$('#avatar .avatardiv').avatar(OC.currentUser, 128);
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
* You may use this on any <div></div>
|
||||
* Here I'm using <div class="avatardiv"></div> as an example.
|
||||
*
|
||||
* There are 4 ways to call this:
|
||||
* There are 5 ways to call this:
|
||||
*
|
||||
* 1. $('.avatardiv').avatar('jdoe', 128);
|
||||
* This will make the div to jdoe's fitting avatar, with a size of 128px.
|
||||
|
@ -34,10 +34,15 @@
|
|||
* 4. $('.avatardiv').avatar('jdoe', 128, true);
|
||||
* This will behave like the first example, except it will also append random
|
||||
* hashes to the custom avatar images, to force image reloading in IE8.
|
||||
*
|
||||
* 5. $('.avatardiv').avatar('jdoe', 128, undefined, true);
|
||||
* This will behave like the first example, but it will hide the avatardiv, if
|
||||
* it will display the default placeholder. undefined is the ie8fix from
|
||||
* example 4 and can be either true, or false/undefined, to be ignored.
|
||||
*/
|
||||
|
||||
(function ($) {
|
||||
$.fn.avatar = function(user, size, ie8fix) {
|
||||
$.fn.avatar = function(user, size, ie8fix, hidedefault) {
|
||||
if (typeof(size) === 'undefined') {
|
||||
if (this.height() > 0) {
|
||||
size = this.height();
|
||||
|
@ -69,12 +74,17 @@
|
|||
var url = OC.Router.generate('core_avatar_get', {user: user, size: size})+'?requesttoken='+oc_requesttoken;
|
||||
$.get(url, function(result) {
|
||||
if (typeof(result) === 'object') {
|
||||
if (result.data && result.data.displayname) {
|
||||
$div.placeholder(user, result.data.displayname);
|
||||
if (!hidedefault) {
|
||||
if (result.data && result.data.displayname) {
|
||||
$div.placeholder(user, result.data.displayname);
|
||||
} else {
|
||||
$div.placeholder(user);
|
||||
}
|
||||
} else {
|
||||
$div.placeholder(user);
|
||||
$div.hide();
|
||||
}
|
||||
} else {
|
||||
$div.show();
|
||||
if (ie8fix === true) {
|
||||
$div.html('<img src="'+url+'#'+Math.floor(Math.random()*1000)+'">');
|
||||
} else {
|
||||
|
|
|
@ -114,6 +114,7 @@ OC.Share={
|
|||
data = false;
|
||||
}
|
||||
}});
|
||||
|
||||
return data;
|
||||
},
|
||||
share:function(itemType, itemSource, shareType, shareWith, permissions, callback) {
|
||||
|
@ -217,9 +218,9 @@ OC.Share={
|
|||
OC.Share.showLink(share.token, share.share_with, itemSource);
|
||||
} else {
|
||||
if (share.collection) {
|
||||
OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, share.collection);
|
||||
OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, share.mail_send, share.collection);
|
||||
} else {
|
||||
OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, false);
|
||||
OC.Share.addShareWith(share.share_type, share.share_with, share.share_with_displayname, share.permissions, possiblePermissions, share.mail_send, false);
|
||||
}
|
||||
}
|
||||
if (share.expiration != null) {
|
||||
|
@ -301,7 +302,7 @@ OC.Share={
|
|||
}
|
||||
});
|
||||
},
|
||||
addShareWith:function(shareType, shareWith, shareWithDisplayName, permissions, possiblePermissions, collection) {
|
||||
addShareWith:function(shareType, shareWith, shareWithDisplayName, permissions, possiblePermissions, mailSend, collection) {
|
||||
if (!OC.Share.itemShares[shareType]) {
|
||||
OC.Share.itemShares[shareType] = [];
|
||||
}
|
||||
|
@ -343,6 +344,14 @@ OC.Share={
|
|||
}else{
|
||||
html += escapeHTML(shareWithDisplayName);
|
||||
}
|
||||
var mailNotificationEnabled = $('input:hidden[name=mailNotificationEnabled]').val();
|
||||
if (mailNotificationEnabled === 'yes') {
|
||||
var checked = '';
|
||||
if (mailSend === '1') {
|
||||
checked = 'checked';
|
||||
}
|
||||
html += '<input type="checkbox" name="mailNotification" class="mailNotification" ' + checked + ' />'+t('core', 'notify user by email')+'</label>';
|
||||
}
|
||||
if (possiblePermissions & OC.PERMISSION_CREATE || possiblePermissions & OC.PERMISSION_UPDATE || possiblePermissions & OC.PERMISSION_DELETE) {
|
||||
if (editChecked == '') {
|
||||
html += '<label style="display:none;">';
|
||||
|
@ -699,5 +708,27 @@ $(document).ready(function() {
|
|||
}
|
||||
});
|
||||
|
||||
$(document).on('click', '#dropdown input[name=mailNotification]', function() {
|
||||
var li = $(this).parent();
|
||||
var itemType = $('#dropdown').data('item-type');
|
||||
var itemSource = $('#dropdown').data('item-source');
|
||||
var action = '';
|
||||
if (this.checked) {
|
||||
action = 'informRecipients';
|
||||
} else {
|
||||
action = 'informRecipientsDisabled';
|
||||
}
|
||||
|
||||
var shareType = $(li).data('share-type');
|
||||
var shareWith = $(li).data('share-with');
|
||||
|
||||
$.post(OC.filePath('core', 'ajax', 'share.php'), {action: action, recipient: shareWith, shareType: shareType, itemSource: itemSource, itemType: itemType}, function(result) {
|
||||
if (result.status !== 'success') {
|
||||
OC.dialogs.alert(t('core', result.data.message), t('core', 'Warning'));
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
|
|
@ -60,7 +60,9 @@ $TRANSLATIONS = array(
|
|||
"Error loading message template: {error}" => "Chyba při nahrávání šablony zprávy: {error}",
|
||||
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
|
||||
"One file conflict" => "Jeden konflikt souboru",
|
||||
"Which files do you want to keep?" => "Které soubory chcete ponechat?",
|
||||
"Cancel" => "Zrušit",
|
||||
"Continue" => "Pokračovat",
|
||||
"The object type is not specified." => "Není určen typ objektu.",
|
||||
"Error" => "Chyba",
|
||||
"The app name is not specified." => "Není určen název aplikace.",
|
||||
|
|
|
@ -2,6 +2,12 @@
|
|||
$TRANSLATIONS = array(
|
||||
"%s shared »%s« with you" => "%s megosztotta Önnel ezt: »%s«",
|
||||
"group" => "csoport",
|
||||
"Turned on maintenance mode" => "A karbantartási mód bekapcsolva",
|
||||
"Turned off maintenance mode" => "A karbantartási mód kikapcsolva",
|
||||
"Updated database" => "Frissítet adatbázis",
|
||||
"Updating filecache, this may take really long..." => "A filecache frissítése folyamatban, ez a folyamat hosszabb ideig is eltarthat...",
|
||||
"Updated filecache" => "Filecache frissítve",
|
||||
"... %d%% done ..." => "... %d%% kész ...",
|
||||
"Category type not provided." => "Nincs megadva a kategória típusa.",
|
||||
"No category to add?" => "Nincs hozzáadandó kategória?",
|
||||
"This category already exists: %s" => "Ez a kategória már létezik: %s",
|
||||
|
@ -10,6 +16,11 @@ $TRANSLATIONS = array(
|
|||
"Error adding %s to favorites." => "Nem sikerült a kedvencekhez adni ezt: %s",
|
||||
"No categories selected for deletion." => "Nincs törlésre jelölt kategória",
|
||||
"Error removing %s from favorites." => "Nem sikerült a kedvencekből törölni ezt: %s",
|
||||
"No image or file provided" => "Nincs kép vagy file megadva",
|
||||
"Unknown filetype" => "Ismeretlen file tipús",
|
||||
"Invalid image" => "Hibás kép",
|
||||
"No temporary profile picture available, try again" => "Az átmeneti profil kép nem elérhető, próbáld újra",
|
||||
"No crop data provided" => "Vágáshoz nincs adat megadva",
|
||||
"Sunday" => "vasárnap",
|
||||
"Monday" => "hétfő",
|
||||
"Tuesday" => "kedd",
|
||||
|
@ -42,11 +53,20 @@ $TRANSLATIONS = array(
|
|||
"last year" => "tavaly",
|
||||
"years ago" => "több éve",
|
||||
"Choose" => "Válasszon",
|
||||
"Error loading file picker template: {error}" => "Nem sikerült betölteni a fájlkiválasztó sablont: {error}",
|
||||
"Yes" => "Igen",
|
||||
"No" => "Nem",
|
||||
"Ok" => "Ok",
|
||||
"Error loading message template: {error}" => "Nem sikerült betölteni az üzenet sablont: {error}",
|
||||
"_{count} file conflict_::_{count} file conflicts_" => array("",""),
|
||||
"One file conflict" => "Egy file ütközik",
|
||||
"Which files do you want to keep?" => "Melyik file-okat akarod megtartani?",
|
||||
"If you select both versions, the copied file will have a number added to its name." => "Ha kiválasztod mindazokaz a verziókat, a másolt fileok neve sorszámozva lesz.",
|
||||
"Cancel" => "Mégsem",
|
||||
"Continue" => "Folytatás",
|
||||
"(all selected)" => "(all selected)",
|
||||
"({count} selected)" => "({count} kiválasztva)",
|
||||
"Error loading file exists template" => "Hiba a létező sablon betöltésekor",
|
||||
"The object type is not specified." => "Az objektum típusa nincs megadva.",
|
||||
"Error" => "Hiba",
|
||||
"The app name is not specified." => "Az alkalmazás neve nincs megadva.",
|
||||
|
@ -85,6 +105,7 @@ $TRANSLATIONS = array(
|
|||
"Email sent" => "Az emailt elküldtük",
|
||||
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." => "A frissítés nem sikerült. Kérem értesítse erről a problémáról az <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud közösséget</a>.",
|
||||
"The update was successful. Redirecting you to ownCloud now." => "A frissítés sikeres volt. Visszairányítjuk az ownCloud szolgáltatáshoz.",
|
||||
"%s password reset" => "%s jelszó visszaállítás",
|
||||
"Use the following link to reset your password: {link}" => "Használja ezt a linket a jelszó ismételt beállításához: {link}",
|
||||
"The link to reset your password has been sent to your email.<br>If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator ." => "Emailben fog kapni egy linket, amivel új jelszót tud majd beállítani magának. <br>Ha a levél nem jött meg, holott úgy érzi, hogy már meg kellett volna érkeznie, akkor ellenőrizze a spam/levélszemét mappáját. <br>Ha ott sincsen, akkor érdeklődjön a rendszergazdánál.",
|
||||
"Request failed!<br>Did you make sure your email/username was right?" => "A kérést nem sikerült teljesíteni! <br>Biztos, hogy jó emailcímet/felhasználónevet adott meg?",
|
||||
|
|
|
@ -20,6 +20,7 @@ $TRANSLATIONS = array(
|
|||
"Unknown filetype" => "不明なファイルタイプ",
|
||||
"Invalid image" => "無効な画像",
|
||||
"No temporary profile picture available, try again" => "一時的なプロファイル用画像が利用できません。もう一度試して下さい",
|
||||
"No crop data provided" => "クロップデータは提供されません",
|
||||
"Sunday" => "日",
|
||||
"Monday" => "月",
|
||||
"Tuesday" => "火",
|
||||
|
@ -57,8 +58,15 @@ $TRANSLATIONS = array(
|
|||
"No" => "いいえ",
|
||||
"Ok" => "OK",
|
||||
"Error loading message template: {error}" => "メッセージテンプレートの読み込みエラー: {error}",
|
||||
"_{count} file conflict_::_{count} file conflicts_" => array(""),
|
||||
"_{count} file conflict_::_{count} file conflicts_" => array("{count} ファイルが競合"),
|
||||
"One file conflict" => "1ファイルが競合",
|
||||
"Which files do you want to keep?" => "どちらのファイルを保持したいですか?",
|
||||
"If you select both versions, the copied file will have a number added to its name." => "両方のバージョンを選択した場合は、ファイル名の後ろに数字を追加したファイルのコピーを作成します。",
|
||||
"Cancel" => "キャンセル",
|
||||
"Continue" => "続ける",
|
||||
"(all selected)" => "(全て選択)",
|
||||
"({count} selected)" => "({count} 選択)",
|
||||
"Error loading file exists template" => "既存ファイルのテンプレートの読み込みエラー",
|
||||
"The object type is not specified." => "オブジェクタイプが指定されていません。",
|
||||
"Error" => "エラー",
|
||||
"The app name is not specified." => "アプリ名がしていされていません。",
|
||||
|
|
|
@ -58,8 +58,15 @@ $TRANSLATIONS = array(
|
|||
"No" => "Ne",
|
||||
"Ok" => "Gerai",
|
||||
"Error loading message template: {error}" => "Klaida įkeliant žinutės ruošinį: {error}",
|
||||
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
|
||||
"_{count} file conflict_::_{count} file conflicts_" => array("{count} failas konfliktuoja","{count} failai konfliktuoja","{count} failų konfliktų"),
|
||||
"One file conflict" => "Vienas failo konfliktas",
|
||||
"Which files do you want to keep?" => "Kuriuos failus norite laikyti?",
|
||||
"If you select both versions, the copied file will have a number added to its name." => "Jei pasirenkate abi versijas, nukopijuotas failas turės pridėtą numerį pavadinime.",
|
||||
"Cancel" => "Atšaukti",
|
||||
"Continue" => "Tęsti",
|
||||
"(all selected)" => "(visi pažymėti)",
|
||||
"({count} selected)" => "({count} pažymėtų)",
|
||||
"Error loading file exists template" => "Klaida įkeliant esančių failų ruošinį",
|
||||
"The object type is not specified." => "Objekto tipas nenurodytas.",
|
||||
"Error" => "Klaida",
|
||||
"The app name is not specified." => "Nenurodytas programos pavadinimas.",
|
||||
|
|
|
@ -16,6 +16,8 @@ $TRANSLATIONS = array(
|
|||
"Error adding %s to favorites." => "Błąd podczas dodawania %s do ulubionych.",
|
||||
"No categories selected for deletion." => "Nie zaznaczono kategorii do usunięcia.",
|
||||
"Error removing %s from favorites." => "Błąd podczas usuwania %s z ulubionych.",
|
||||
"Unknown filetype" => "Nieznany typ pliku",
|
||||
"Invalid image" => "Nieprawidłowe zdjęcie",
|
||||
"Sunday" => "Niedziela",
|
||||
"Monday" => "Poniedziałek",
|
||||
"Tuesday" => "Wtorek",
|
||||
|
@ -51,8 +53,12 @@ $TRANSLATIONS = array(
|
|||
"Yes" => "Tak",
|
||||
"No" => "Nie",
|
||||
"Ok" => "OK",
|
||||
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
|
||||
"_{count} file conflict_::_{count} file conflicts_" => array("{count} konfliktów plików","{count} konfliktów plików","{count} konfliktów plików"),
|
||||
"One file conflict" => "Konflikt pliku",
|
||||
"Cancel" => "Anuluj",
|
||||
"Continue" => "Kontynuuj ",
|
||||
"(all selected)" => "(wszystkie zaznaczone)",
|
||||
"({count} selected)" => "({count} zaznaczonych)",
|
||||
"The object type is not specified." => "Nie określono typu obiektu.",
|
||||
"Error" => "Błąd",
|
||||
"The app name is not specified." => "Nie określono nazwy aplikacji.",
|
||||
|
|
5
core/skeleton/welcome.txt
Normal 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.
|
||||
|
|
@ -1,5 +1,9 @@
|
|||
<?php
|
||||
print_unescaped($l->t("Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\nCheers!", array($_['user_displayname'], $_['filename'], $_['link'])));
|
||||
print_unescaped($l->t("Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n", array($_['user_displayname'], $_['filename'], $_['link'])));
|
||||
if ( isset($_['expiration']) ) {
|
||||
print_unescaped($l->t("The share will expire on %s.\n\n", array($_['expiration'])));
|
||||
}
|
||||
p($l->t("Cheers!"));
|
||||
?>
|
||||
|
||||
--
|
||||
|
|
|
@ -32,9 +32,10 @@
|
|||
<?php p($l->t('Lost your password?')); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($_['rememberLoginAllowed'] === true) : ?>
|
||||
<input type="checkbox" name="remember_login" value="1" id="remember_login" checked />
|
||||
<label for="remember_login"><?php p($l->t('remember')); ?></label>
|
||||
<?php endif; ?>
|
||||
<input type="hidden" name="timezone-offset" id="timezone-offset"/>
|
||||
<input type="submit" id="submit" class="login primary" value="<?php p($l->t('Log in')); ?>"/>
|
||||
</fieldset>
|
||||
|
|
|
@ -12,7 +12,11 @@
|
|||
<td bgcolor="#f8f8f8" width="20px"> </td>
|
||||
<td bgcolor="#f8f8f8" style="font-weight:normal; font-size:0.8em; line-height:1.2em; font-family:verdana,'arial',sans;">
|
||||
<?php
|
||||
print_unescaped($l->t('Hey there,<br><br>just letting you know that %s shared »%s« with you.<br><a href="%s">View it!</a><br><br>Cheers!', array($_['user_displayname'], $_['filename'], $_['link'])));
|
||||
print_unescaped($l->t('Hey there,<br><br>just letting you know that %s shared »%s« with you.<br><a href="%s">View it!</a><br><br>', array($_['user_displayname'], $_['filename'], $_['link'])));
|
||||
if ( isset($_['expiration']) ) {
|
||||
print_unescaped($l->t("The share will expire on %s.<br><br>", array($_['expiration'])));
|
||||
}
|
||||
p($l->t('Cheers!'));
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -22,7 +26,8 @@ print_unescaped($l->t('Hey there,<br><br>just letting you know that %s shared »
|
|||
<td bgcolor="#f8f8f8" style="font-weight:normal; font-size:0.8em; line-height:1.2em; font-family:verdana,'arial',sans;">--<br>
|
||||
<?php p($theme->getName()); ?> -
|
||||
<?php p($theme->getSlogan()); ?>
|
||||
<br><a href="<?php print_unescaped($theme->getBaseUrl()); ?>"><?php print_unescaped($theme->getBaseUrl());?></a></td>
|
||||
<br><a href="<?php print_unescaped($theme->getBaseUrl()); ?>"><?php print_unescaped($theme->getBaseUrl());?></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td bgcolor="#f8f8f8" colspan="2"> </td>
|
||||
|
|
|
@ -844,6 +844,14 @@
|
|||
<length>32</length>
|
||||
</field>
|
||||
|
||||
<field>
|
||||
<name>mail_send</name>
|
||||
<type>integer</type>
|
||||
<default>0</default>
|
||||
<notnull>true</notnull>
|
||||
<length>1</length>
|
||||
</field>
|
||||
|
||||
<index>
|
||||
<name>token_index</name>
|
||||
<field>
|
||||
|
|
|
@ -31,7 +31,7 @@ try {
|
|||
|
||||
} catch (Exception $ex) {
|
||||
//show the user a detailed error page
|
||||
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
|
||||
\OCP\Util::writeLog('index', $ex->getMessage(), \OCP\Util::FATAL);
|
||||
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
|
||||
OC_Template::printExceptionErrorPage($ex);
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#
|
||||
# Translators:
|
||||
# janinko <janinko.g@gmail.com>, 2013
|
||||
# dibalaj <dibalaj@dibalaj.cz>, 2013
|
||||
# Honza K. <honza889@gmail.com>, 2013
|
||||
# Martin <fireball@atlas.cz>, 2013
|
||||
# pstast <petr@stastny.eu>, 2013
|
||||
|
@ -12,9 +13,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-27 00:01-0400\n"
|
||||
"PO-Revision-Date: 2013-09-25 10:50+0000\n"
|
||||
"Last-Translator: pstast <petr@stastny.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 16:57+0000\n"
|
||||
"Last-Translator: dibalaj <dibalaj@dibalaj.cz>\n"
|
||||
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -288,7 +289,7 @@ msgstr "Jeden konflikt souboru"
|
|||
|
||||
#: js/oc-dialogs.js:367
|
||||
msgid "Which files do you want to keep?"
|
||||
msgstr ""
|
||||
msgstr "Které soubory chcete ponechat?"
|
||||
|
||||
#: js/oc-dialogs.js:368
|
||||
msgid ""
|
||||
|
@ -302,7 +303,7 @@ msgstr "Zrušit"
|
|||
|
||||
#: js/oc-dialogs.js:386
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
msgstr "Pokračovat"
|
||||
|
||||
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
|
||||
msgid "(all selected)"
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# dibalaj <dibalaj@dibalaj.cz>, 2013
|
||||
# Honza K. <honza889@gmail.com>, 2013
|
||||
# cvanca <mrs.jenkins.oh.yeah@gmail.com>, 2013
|
||||
# pstast <petr@stastny.eu>, 2013
|
||||
|
@ -11,9 +12,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-20 10:44-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 16:54+0000\n"
|
||||
"Last-Translator: dibalaj <dibalaj@dibalaj.cz>\n"
|
||||
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -90,7 +91,7 @@ msgstr ""
|
|||
msgid "Invalid directory."
|
||||
msgstr "Neplatný adresář"
|
||||
|
||||
#: appinfo/app.php:12
|
||||
#: appinfo/app.php:11
|
||||
msgid "Files"
|
||||
msgstr "Soubory"
|
||||
|
||||
|
@ -228,7 +229,7 @@ msgstr "Vaše soubory ke stažení se připravují. Pokud jsou velké, může to
|
|||
|
||||
#: js/files.js:507 js/files.js:545
|
||||
msgid "Error moving file"
|
||||
msgstr ""
|
||||
msgstr "Chyba při přesunu souboru"
|
||||
|
||||
#: js/files.js:558 templates/index.php:61
|
||||
msgid "Name"
|
||||
|
|
|
@ -9,9 +9,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-22 12:55-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 15:01+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 00:42+0000\n"
|
||||
"Last-Translator: ebela <bela@dandre.hu>\n"
|
||||
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -30,28 +30,28 @@ msgstr "csoport"
|
|||
|
||||
#: ajax/update.php:11
|
||||
msgid "Turned on maintenance mode"
|
||||
msgstr ""
|
||||
msgstr "A karbantartási mód bekapcsolva"
|
||||
|
||||
#: ajax/update.php:14
|
||||
msgid "Turned off maintenance mode"
|
||||
msgstr ""
|
||||
msgstr "A karbantartási mód kikapcsolva"
|
||||
|
||||
#: ajax/update.php:17
|
||||
msgid "Updated database"
|
||||
msgstr ""
|
||||
msgstr "Frissítet adatbázis"
|
||||
|
||||
#: ajax/update.php:20
|
||||
msgid "Updating filecache, this may take really long..."
|
||||
msgstr ""
|
||||
msgstr "A filecache frissítése folyamatban, ez a folyamat hosszabb ideig is eltarthat..."
|
||||
|
||||
#: ajax/update.php:23
|
||||
msgid "Updated filecache"
|
||||
msgstr ""
|
||||
msgstr "Filecache frissítve"
|
||||
|
||||
#: ajax/update.php:26
|
||||
#, php-format
|
||||
msgid "... %d%% done ..."
|
||||
msgstr ""
|
||||
msgstr "... %d%% kész ..."
|
||||
|
||||
#: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25
|
||||
msgid "Category type not provided."
|
||||
|
@ -94,23 +94,23 @@ msgstr "Nem sikerült a kedvencekből törölni ezt: %s"
|
|||
|
||||
#: avatar/controller.php:62
|
||||
msgid "No image or file provided"
|
||||
msgstr ""
|
||||
msgstr "Nincs kép vagy file megadva"
|
||||
|
||||
#: avatar/controller.php:81
|
||||
msgid "Unknown filetype"
|
||||
msgstr ""
|
||||
msgstr "Ismeretlen file tipús"
|
||||
|
||||
#: avatar/controller.php:85
|
||||
msgid "Invalid image"
|
||||
msgstr ""
|
||||
msgstr "Hibás kép"
|
||||
|
||||
#: avatar/controller.php:115 avatar/controller.php:142
|
||||
msgid "No temporary profile picture available, try again"
|
||||
msgstr ""
|
||||
msgstr "Az átmeneti profil kép nem elérhető, próbáld újra"
|
||||
|
||||
#: avatar/controller.php:135
|
||||
msgid "No crop data provided"
|
||||
msgstr ""
|
||||
msgstr "Vágáshoz nincs adat megadva"
|
||||
|
||||
#: js/config.php:32
|
||||
msgid "Sunday"
|
||||
|
@ -250,7 +250,7 @@ msgstr "Válasszon"
|
|||
|
||||
#: js/oc-dialogs.js:146
|
||||
msgid "Error loading file picker template: {error}"
|
||||
msgstr ""
|
||||
msgstr "Nem sikerült betölteni a fájlkiválasztó sablont: {error}"
|
||||
|
||||
#: js/oc-dialogs.js:172
|
||||
msgid "Yes"
|
||||
|
@ -266,7 +266,7 @@ msgstr "Ok"
|
|||
|
||||
#: js/oc-dialogs.js:219
|
||||
msgid "Error loading message template: {error}"
|
||||
msgstr ""
|
||||
msgstr "Nem sikerült betölteni az üzenet sablont: {error}"
|
||||
|
||||
#: js/oc-dialogs.js:347
|
||||
msgid "{count} file conflict"
|
||||
|
@ -276,17 +276,17 @@ msgstr[1] ""
|
|||
|
||||
#: js/oc-dialogs.js:361
|
||||
msgid "One file conflict"
|
||||
msgstr ""
|
||||
msgstr "Egy file ütközik"
|
||||
|
||||
#: js/oc-dialogs.js:367
|
||||
msgid "Which files do you want to keep?"
|
||||
msgstr ""
|
||||
msgstr "Melyik file-okat akarod megtartani?"
|
||||
|
||||
#: js/oc-dialogs.js:368
|
||||
msgid ""
|
||||
"If you select both versions, the copied file will have a number added to its"
|
||||
" name."
|
||||
msgstr ""
|
||||
msgstr "Ha kiválasztod mindazokaz a verziókat, a másolt fileok neve sorszámozva lesz."
|
||||
|
||||
#: js/oc-dialogs.js:376
|
||||
msgid "Cancel"
|
||||
|
@ -294,19 +294,19 @@ msgstr "Mégsem"
|
|||
|
||||
#: js/oc-dialogs.js:386
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
msgstr "Folytatás"
|
||||
|
||||
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
|
||||
msgid "(all selected)"
|
||||
msgstr ""
|
||||
msgstr "(all selected)"
|
||||
|
||||
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
|
||||
msgid "({count} selected)"
|
||||
msgstr ""
|
||||
msgstr "({count} kiválasztva)"
|
||||
|
||||
#: js/oc-dialogs.js:457
|
||||
msgid "Error loading file exists template"
|
||||
msgstr ""
|
||||
msgstr "Hiba a létező sablon betöltésekor"
|
||||
|
||||
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
|
||||
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
|
||||
|
@ -317,7 +317,7 @@ msgstr "Az objektum típusa nincs megadva."
|
|||
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
|
||||
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
|
||||
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
|
||||
#: js/share.js:645 js/share.js:657
|
||||
#: js/share.js:656 js/share.js:668
|
||||
msgid "Error"
|
||||
msgstr "Hiba"
|
||||
|
||||
|
@ -337,7 +337,7 @@ msgstr "Megosztott"
|
|||
msgid "Share"
|
||||
msgstr "Megosztás"
|
||||
|
||||
#: js/share.js:131 js/share.js:685
|
||||
#: js/share.js:131 js/share.js:696
|
||||
msgid "Error while sharing"
|
||||
msgstr "Nem sikerült létrehozni a megosztást"
|
||||
|
||||
|
@ -437,23 +437,23 @@ msgstr "töröl"
|
|||
msgid "share"
|
||||
msgstr "megoszt"
|
||||
|
||||
#: js/share.js:400 js/share.js:632
|
||||
#: js/share.js:400 js/share.js:643
|
||||
msgid "Password protected"
|
||||
msgstr "Jelszóval van védve"
|
||||
|
||||
#: js/share.js:645
|
||||
#: js/share.js:656
|
||||
msgid "Error unsetting expiration date"
|
||||
msgstr "Nem sikerült a lejárati időt törölni"
|
||||
|
||||
#: js/share.js:657
|
||||
#: js/share.js:668
|
||||
msgid "Error setting expiration date"
|
||||
msgstr "Nem sikerült a lejárati időt beállítani"
|
||||
|
||||
#: js/share.js:672
|
||||
#: js/share.js:683
|
||||
msgid "Sending ..."
|
||||
msgstr "Küldés ..."
|
||||
|
||||
#: js/share.js:683
|
||||
#: js/share.js:694
|
||||
msgid "Email sent"
|
||||
msgstr "Az emailt elküldtük"
|
||||
|
||||
|
@ -471,7 +471,7 @@ msgstr "A frissítés sikeres volt. Visszairányítjuk az ownCloud szolgáltatá
|
|||
#: lostpassword/controller.php:62
|
||||
#, php-format
|
||||
msgid "%s password reset"
|
||||
msgstr ""
|
||||
msgstr "%s jelszó visszaállítás"
|
||||
|
||||
#: lostpassword/templates/email.php:2
|
||||
msgid "Use the following link to reset your password: {link}"
|
||||
|
|
|
@ -9,9 +9,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-16 11:33-0400\n"
|
||||
"PO-Revision-Date: 2013-09-16 15:34+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 00:50+0000\n"
|
||||
"Last-Translator: ebela <bela@dandre.hu>\n"
|
||||
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -19,38 +19,38 @@ msgstr ""
|
|||
"Language: hu_HU\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: app.php:239
|
||||
#: app.php:237
|
||||
#, php-format
|
||||
msgid ""
|
||||
"App \"%s\" can't be installed because it is not compatible with this version"
|
||||
" of ownCloud."
|
||||
msgstr ""
|
||||
|
||||
#: app.php:250
|
||||
#: app.php:248
|
||||
msgid "No app name specified"
|
||||
msgstr ""
|
||||
msgstr "Nincs az alkalmazás név megadva."
|
||||
|
||||
#: app.php:361
|
||||
#: app.php:352
|
||||
msgid "Help"
|
||||
msgstr "Súgó"
|
||||
|
||||
#: app.php:374
|
||||
#: app.php:365
|
||||
msgid "Personal"
|
||||
msgstr "Személyes"
|
||||
|
||||
#: app.php:385
|
||||
#: app.php:376
|
||||
msgid "Settings"
|
||||
msgstr "Beállítások"
|
||||
|
||||
#: app.php:397
|
||||
#: app.php:388
|
||||
msgid "Users"
|
||||
msgstr "Felhasználók"
|
||||
|
||||
#: app.php:410
|
||||
#: app.php:401
|
||||
msgid "Admin"
|
||||
msgstr "Adminsztráció"
|
||||
|
||||
#: app.php:839
|
||||
#: app.php:832
|
||||
#, php-format
|
||||
msgid "Failed to upgrade \"%s\"."
|
||||
msgstr "Sikertelen Frissítés \"%s\"."
|
||||
|
@ -61,11 +61,11 @@ msgstr ""
|
|||
|
||||
#: avatar.php:64
|
||||
msgid "Unknown filetype"
|
||||
msgstr ""
|
||||
msgstr "Ismeretlen file tipús"
|
||||
|
||||
#: avatar.php:69
|
||||
msgid "Invalid image"
|
||||
msgstr ""
|
||||
msgstr "Hibás kép"
|
||||
|
||||
#: defaults.php:35
|
||||
msgid "web services under your control"
|
||||
|
@ -121,7 +121,7 @@ msgstr ""
|
|||
|
||||
#: installer.php:125
|
||||
msgid "App does not provide an info.xml file"
|
||||
msgstr ""
|
||||
msgstr "Az alkalmazás nem szolgáltatott info.xml file-t"
|
||||
|
||||
#: installer.php:131
|
||||
msgid "App can't be installed because of not allowed code in the App"
|
||||
|
@ -131,7 +131,7 @@ msgstr ""
|
|||
msgid ""
|
||||
"App can't be installed because it is not compatible with this version of "
|
||||
"ownCloud"
|
||||
msgstr ""
|
||||
msgstr "Az alalmazás nem telepíthető, mert nem kompatibilis az ownClod ezzel a verziójával."
|
||||
|
||||
#: installer.php:146
|
||||
msgid ""
|
||||
|
@ -147,12 +147,12 @@ msgstr ""
|
|||
|
||||
#: installer.php:162
|
||||
msgid "App directory already exists"
|
||||
msgstr ""
|
||||
msgstr "Az alkalmazás mappája már létezik"
|
||||
|
||||
#: installer.php:175
|
||||
#, php-format
|
||||
msgid "Can't create app folder. Please fix permissions. %s"
|
||||
msgstr ""
|
||||
msgstr "Nem lehetett létrehozni az alkalmzás mappáját. Kérlek ellenőrizd a jogosultásgokat. %s"
|
||||
|
||||
#: json.php:28
|
||||
msgid "Application is not enabled"
|
||||
|
@ -166,15 +166,15 @@ msgstr "Azonosítási hiba"
|
|||
msgid "Token expired. Please reload page."
|
||||
msgstr "A token lejárt. Frissítse az oldalt."
|
||||
|
||||
#: search/provider/file.php:17 search/provider/file.php:35
|
||||
#: search/provider/file.php:18 search/provider/file.php:36
|
||||
msgid "Files"
|
||||
msgstr "Fájlok"
|
||||
|
||||
#: search/provider/file.php:26 search/provider/file.php:33
|
||||
#: search/provider/file.php:27 search/provider/file.php:34
|
||||
msgid "Text"
|
||||
msgstr "Szöveg"
|
||||
|
||||
#: search/provider/file.php:29
|
||||
#: search/provider/file.php:30
|
||||
msgid "Images"
|
||||
msgstr "Képek"
|
||||
|
||||
|
@ -278,6 +278,11 @@ msgstr "Az Ön webkiszolgálója nincs megfelelően beállítva az állományok
|
|||
msgid "Please double check the <a href='%s'>installation guides</a>."
|
||||
msgstr "Kérjük tüzetesen tanulmányozza át a <a href='%s'>telepítési útmutatót</a>."
|
||||
|
||||
#: tags.php:194
|
||||
#, php-format
|
||||
msgid "Could not find category \"%s\""
|
||||
msgstr "Ez a kategória nem található: \"%s\""
|
||||
|
||||
#: template/functions.php:96
|
||||
msgid "seconds ago"
|
||||
msgstr "pár másodperce"
|
||||
|
@ -329,8 +334,3 @@ msgstr "több éve"
|
|||
#: template.php:297
|
||||
msgid "Caused by:"
|
||||
msgstr "Okozta:"
|
||||
|
||||
#: vcategories.php:188 vcategories.php:249
|
||||
#, php-format
|
||||
msgid "Could not find category \"%s\""
|
||||
msgstr "Ez a kategória nem található: \"%s\""
|
||||
|
|
|
@ -10,9 +10,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-20 10:45-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:17-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 00:21+0000\n"
|
||||
"Last-Translator: ebela <bela@dandre.hu>\n"
|
||||
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -89,42 +89,42 @@ msgstr "A program frissítése nem sikerült."
|
|||
|
||||
#: changepassword/controller.php:20
|
||||
msgid "Wrong password"
|
||||
msgstr ""
|
||||
msgstr "Hibás jelszó"
|
||||
|
||||
#: changepassword/controller.php:42
|
||||
msgid "No user supplied"
|
||||
msgstr ""
|
||||
msgstr "Nincs felhasználó által mellékelve"
|
||||
|
||||
#: changepassword/controller.php:74
|
||||
msgid ""
|
||||
"Please provide an admin recovery password, otherwise all user data will be "
|
||||
"lost"
|
||||
msgstr ""
|
||||
msgstr "Add meg az admin helyreállító jelszót, máskülönben az összes felhasználói adat elveszik."
|
||||
|
||||
#: changepassword/controller.php:79
|
||||
msgid ""
|
||||
"Wrong admin recovery password. Please check the password and try again."
|
||||
msgstr ""
|
||||
msgstr "Hibás admin helyreállítási jelszó. Ellenörizd a jelszót és próbáld újra."
|
||||
|
||||
#: changepassword/controller.php:87
|
||||
msgid ""
|
||||
"Back-end doesn't support password change, but the users encryption key was "
|
||||
"successfully updated."
|
||||
msgstr ""
|
||||
msgstr "A back-end nem támogatja a jelszó módosítást, de felhasználó titkosítási kulcsa sikeresen frissítve lett."
|
||||
|
||||
#: changepassword/controller.php:92 changepassword/controller.php:103
|
||||
msgid "Unable to change password"
|
||||
msgstr ""
|
||||
msgstr "Nem sikerült megváltoztatni a jelszót"
|
||||
|
||||
#: js/apps.js:43
|
||||
msgid "Update to {appversion}"
|
||||
msgstr "Frissítés erre a verzióra: {appversion}"
|
||||
|
||||
#: js/apps.js:49 js/apps.js:82 js/apps.js:108
|
||||
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
|
||||
msgid "Disable"
|
||||
msgstr "Letiltás"
|
||||
|
||||
#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
|
||||
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
|
||||
msgid "Enable"
|
||||
msgstr "engedélyezve"
|
||||
|
||||
|
@ -132,43 +132,43 @@ msgstr "engedélyezve"
|
|||
msgid "Please wait...."
|
||||
msgstr "Kérem várjon..."
|
||||
|
||||
#: js/apps.js:79 js/apps.js:80 js/apps.js:100
|
||||
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
|
||||
msgid "Error while disabling app"
|
||||
msgstr ""
|
||||
msgstr "Hiba az alkalmazás kikapcsolása közben"
|
||||
|
||||
#: js/apps.js:99 js/apps.js:112 js/apps.js:113
|
||||
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
|
||||
msgid "Error while enabling app"
|
||||
msgstr ""
|
||||
msgstr "Hiba az alalmazás engedélyezése közben"
|
||||
|
||||
#: js/apps.js:123
|
||||
#: js/apps.js:125
|
||||
msgid "Updating...."
|
||||
msgstr "Frissítés folyamatban..."
|
||||
|
||||
#: js/apps.js:126
|
||||
#: js/apps.js:128
|
||||
msgid "Error while updating app"
|
||||
msgstr "Hiba történt a programfrissítés közben"
|
||||
|
||||
#: js/apps.js:126
|
||||
#: js/apps.js:128
|
||||
msgid "Error"
|
||||
msgstr "Hiba"
|
||||
|
||||
#: js/apps.js:127 templates/apps.php:43
|
||||
#: js/apps.js:129 templates/apps.php:43
|
||||
msgid "Update"
|
||||
msgstr "Frissítés"
|
||||
|
||||
#: js/apps.js:130
|
||||
#: js/apps.js:132
|
||||
msgid "Updated"
|
||||
msgstr "Frissítve"
|
||||
|
||||
#: js/personal.js:220
|
||||
#: js/personal.js:221
|
||||
msgid "Select a profile picture"
|
||||
msgstr ""
|
||||
msgstr "Válassz profil képet"
|
||||
|
||||
#: js/personal.js:265
|
||||
#: js/personal.js:266
|
||||
msgid "Decrypting files... Please wait, this can take some time."
|
||||
msgstr ""
|
||||
msgstr "File-ok kititkosítása folyamatban... Kérlek várj, ez hosszabb ideig is eltarthat ..."
|
||||
|
||||
#: js/personal.js:287
|
||||
#: js/personal.js:288
|
||||
msgid "Saving..."
|
||||
msgstr "Mentés..."
|
||||
|
||||
|
@ -496,27 +496,27 @@ msgstr "Profilkép"
|
|||
|
||||
#: templates/personal.php:90
|
||||
msgid "Upload new"
|
||||
msgstr ""
|
||||
msgstr "Új feltöltése"
|
||||
|
||||
#: templates/personal.php:92
|
||||
msgid "Select new from Files"
|
||||
msgstr ""
|
||||
msgstr "Új kiválasztása Fileokból"
|
||||
|
||||
#: templates/personal.php:93
|
||||
msgid "Remove image"
|
||||
msgstr ""
|
||||
msgstr "Kép eltávolítása"
|
||||
|
||||
#: templates/personal.php:94
|
||||
msgid "Either png or jpg. Ideally square but you will be able to crop it."
|
||||
msgstr ""
|
||||
msgstr "Egyaránt png vagy jpg. Az ideális ha négyzet alaku, de késöbb még átszabható"
|
||||
|
||||
#: templates/personal.php:97
|
||||
msgid "Abort"
|
||||
msgstr ""
|
||||
msgstr "Megszakítás"
|
||||
|
||||
#: templates/personal.php:98
|
||||
msgid "Choose as profile image"
|
||||
msgstr ""
|
||||
msgstr "Válassz profil képet"
|
||||
|
||||
#: templates/personal.php:106 templates/personal.php:107
|
||||
msgid "Language"
|
||||
|
@ -543,15 +543,15 @@ msgstr "Titkosítás"
|
|||
|
||||
#: templates/personal.php:140
|
||||
msgid "The encryption app is no longer enabled, decrypt all your file"
|
||||
msgstr ""
|
||||
msgstr "A titkosító alkalmzás a továbbiakban nincs engedélyezve, kititkosítja az összes fileodat"
|
||||
|
||||
#: templates/personal.php:146
|
||||
msgid "Log-in password"
|
||||
msgstr ""
|
||||
msgstr "Bejelentkezési jelszó"
|
||||
|
||||
#: templates/personal.php:151
|
||||
msgid "Decrypt all Files"
|
||||
msgstr ""
|
||||
msgstr "Kititkosítja az összes file-t"
|
||||
|
||||
#: templates/users.php:21
|
||||
msgid "Login Name"
|
||||
|
|
|
@ -9,9 +9,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-27 00:01-0400\n"
|
||||
"PO-Revision-Date: 2013-09-24 19:00+0000\n"
|
||||
"Last-Translator: Laszlo Tornoci <torlasz@gmail.com>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 00:22+0000\n"
|
||||
"Last-Translator: ebela <bela@dandre.hu>\n"
|
||||
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -348,7 +348,7 @@ msgid ""
|
|||
"behavior as before ownCloud 5 enter the user display name attribute in the "
|
||||
"following field. Leave it empty for default behavior. Changes will have "
|
||||
"effect only on newly mapped (added) LDAP users."
|
||||
msgstr ""
|
||||
msgstr "Alapértelmezetten a belső felhasználónév az UUID tulajdonságból jön létre. Ez biztosítja a felhasználónév egyediségét és hogy a nem kell konvertálni a karaktereket benne. A belső felhasználónévnél a megkötés az, hogy csak a következő karakterek engdélyezettek benne: [ a-zA-Z0-9_.@- ]. Ezeken a karaktereken kivül minden karakter le lesz cserélve az adott karakter ASCII kódtáblában használható párjára vagy ha ilyen nincs akkor egyszerűen ki lesz hagyva. Ha így mégis ütköznének a nevek akkor hozzá lesz füzve egy folyamatosan növekvő számláló rész. A belső felhasználónevet lehet használni a felhasználó azonosítására a programon belül. Illetve ez lesz az alapáértelmezett neve a felhasználó kezdő könyvtárának az ownCloud-ban. Illetve..............................."
|
||||
|
||||
#: templates/settings.php:100
|
||||
msgid "Internal Username Attribute:"
|
||||
|
|
|
@ -9,9 +9,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-07-27 01:56-0400\n"
|
||||
"PO-Revision-Date: 2013-07-27 05:57+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 00:32+0000\n"
|
||||
"Last-Translator: ebela <bela@dandre.hu>\n"
|
||||
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -25,11 +25,11 @@ msgstr "WebDAV hitelesítés"
|
|||
|
||||
#: templates/settings.php:4
|
||||
msgid "Address: "
|
||||
msgstr ""
|
||||
msgstr "Címek:"
|
||||
|
||||
#: templates/settings.php:7
|
||||
msgid ""
|
||||
"The user credentials will be sent to this address. This plugin checks the "
|
||||
"response and will interpret the HTTP statuscodes 401 and 403 as invalid "
|
||||
"credentials, and all other responses as valid credentials."
|
||||
msgstr ""
|
||||
msgstr "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz."
|
||||
|
|
|
@ -9,9 +9,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-22 12:51-0400\n"
|
||||
"PO-Revision-Date: 2013-09-21 17:50+0000\n"
|
||||
"Last-Translator: polxmod <paolo.velati@gmail.com>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 12:15+0000\n"
|
||||
"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
|
||||
"Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -78,11 +78,11 @@ msgstr "Spazio di archiviazione insufficiente"
|
|||
|
||||
#: ajax/upload.php:120 ajax/upload.php:143
|
||||
msgid "Upload failed. Could not get file info."
|
||||
msgstr "Upload fallito. Impossibile ottenere informazioni sul file"
|
||||
msgstr "Caricamento non riuscito. Impossibile ottenere informazioni sul file."
|
||||
|
||||
#: ajax/upload.php:136
|
||||
msgid "Upload failed. Could not find uploaded file"
|
||||
msgstr "Upload fallit. Impossibile trovare file caricato"
|
||||
msgstr "Caricamento non riuscito. Impossibile trovare il file caricato."
|
||||
|
||||
#: ajax/upload.php:160
|
||||
msgid "Invalid directory."
|
||||
|
@ -94,7 +94,7 @@ msgstr "File"
|
|||
|
||||
#: js/file-upload.js:244
|
||||
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
|
||||
msgstr "Impossibile caricare {filename} poiché è una cartella oppure è di 0 byte"
|
||||
msgstr "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte."
|
||||
|
||||
#: js/file-upload.js:255
|
||||
msgid "Not enough space available"
|
||||
|
|
|
@ -11,9 +11,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-20 10:45-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:17-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 12:15+0000\n"
|
||||
"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
|
||||
"Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -121,11 +121,11 @@ msgstr "Impossibile cambiare la password"
|
|||
msgid "Update to {appversion}"
|
||||
msgstr "Aggiorna a {appversion}"
|
||||
|
||||
#: js/apps.js:49 js/apps.js:82 js/apps.js:108
|
||||
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
|
||||
msgid "Disable"
|
||||
msgstr "Disabilita"
|
||||
|
||||
#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
|
||||
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
|
||||
msgid "Enable"
|
||||
msgstr "Abilita"
|
||||
|
||||
|
@ -133,43 +133,43 @@ msgstr "Abilita"
|
|||
msgid "Please wait...."
|
||||
msgstr "Attendere..."
|
||||
|
||||
#: js/apps.js:79 js/apps.js:80 js/apps.js:100
|
||||
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
|
||||
msgid "Error while disabling app"
|
||||
msgstr "Errore durante la disattivazione"
|
||||
|
||||
#: js/apps.js:99 js/apps.js:112 js/apps.js:113
|
||||
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
|
||||
msgid "Error while enabling app"
|
||||
msgstr "Errore durante l'attivazione"
|
||||
|
||||
#: js/apps.js:123
|
||||
#: js/apps.js:125
|
||||
msgid "Updating...."
|
||||
msgstr "Aggiornamento in corso..."
|
||||
|
||||
#: js/apps.js:126
|
||||
#: js/apps.js:128
|
||||
msgid "Error while updating app"
|
||||
msgstr "Errore durante l'aggiornamento"
|
||||
|
||||
#: js/apps.js:126
|
||||
#: js/apps.js:128
|
||||
msgid "Error"
|
||||
msgstr "Errore"
|
||||
|
||||
#: js/apps.js:127 templates/apps.php:43
|
||||
#: js/apps.js:129 templates/apps.php:43
|
||||
msgid "Update"
|
||||
msgstr "Aggiorna"
|
||||
|
||||
#: js/apps.js:130
|
||||
#: js/apps.js:132
|
||||
msgid "Updated"
|
||||
msgstr "Aggiornato"
|
||||
|
||||
#: js/personal.js:220
|
||||
#: js/personal.js:221
|
||||
msgid "Select a profile picture"
|
||||
msgstr "Seleziona un'immagine del profilo"
|
||||
|
||||
#: js/personal.js:265
|
||||
#: js/personal.js:266
|
||||
msgid "Decrypting files... Please wait, this can take some time."
|
||||
msgstr "Decifratura dei file in corso... Attendi, potrebbe richiedere del tempo."
|
||||
|
||||
#: js/personal.js:287
|
||||
#: js/personal.js:288
|
||||
msgid "Saving..."
|
||||
msgstr "Salvataggio in corso..."
|
||||
|
||||
|
|
|
@ -11,9 +11,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-22 12:55-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 15:01+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 06:25+0000\n"
|
||||
"Last-Translator: Daisuke Deguchi <ddeguchi@nagoya-u.jp>\n"
|
||||
"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -112,7 +112,7 @@ msgstr "一時的なプロファイル用画像が利用できません。もう
|
|||
|
||||
#: avatar/controller.php:135
|
||||
msgid "No crop data provided"
|
||||
msgstr ""
|
||||
msgstr "クロップデータは提供されません"
|
||||
|
||||
#: js/config.php:32
|
||||
msgid "Sunday"
|
||||
|
@ -269,21 +269,21 @@ msgstr "メッセージテンプレートの読み込みエラー: {error}"
|
|||
#: js/oc-dialogs.js:347
|
||||
msgid "{count} file conflict"
|
||||
msgid_plural "{count} file conflicts"
|
||||
msgstr[0] ""
|
||||
msgstr[0] "{count} ファイルが競合"
|
||||
|
||||
#: js/oc-dialogs.js:361
|
||||
msgid "One file conflict"
|
||||
msgstr ""
|
||||
msgstr "1ファイルが競合"
|
||||
|
||||
#: js/oc-dialogs.js:367
|
||||
msgid "Which files do you want to keep?"
|
||||
msgstr ""
|
||||
msgstr "どちらのファイルを保持したいですか?"
|
||||
|
||||
#: js/oc-dialogs.js:368
|
||||
msgid ""
|
||||
"If you select both versions, the copied file will have a number added to its"
|
||||
" name."
|
||||
msgstr ""
|
||||
msgstr "両方のバージョンを選択した場合は、ファイル名の後ろに数字を追加したファイルのコピーを作成します。"
|
||||
|
||||
#: js/oc-dialogs.js:376
|
||||
msgid "Cancel"
|
||||
|
@ -291,19 +291,19 @@ msgstr "キャンセル"
|
|||
|
||||
#: js/oc-dialogs.js:386
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
msgstr "続ける"
|
||||
|
||||
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
|
||||
msgid "(all selected)"
|
||||
msgstr ""
|
||||
msgstr "(全て選択)"
|
||||
|
||||
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
|
||||
msgid "({count} selected)"
|
||||
msgstr ""
|
||||
msgstr "({count} 選択)"
|
||||
|
||||
#: js/oc-dialogs.js:457
|
||||
msgid "Error loading file exists template"
|
||||
msgstr ""
|
||||
msgstr "既存ファイルのテンプレートの読み込みエラー"
|
||||
|
||||
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
|
||||
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
|
||||
|
@ -314,7 +314,7 @@ msgstr "オブジェクタイプが指定されていません。"
|
|||
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
|
||||
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
|
||||
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
|
||||
#: js/share.js:645 js/share.js:657
|
||||
#: js/share.js:656 js/share.js:668
|
||||
msgid "Error"
|
||||
msgstr "エラー"
|
||||
|
||||
|
@ -334,7 +334,7 @@ msgstr "共有中"
|
|||
msgid "Share"
|
||||
msgstr "共有"
|
||||
|
||||
#: js/share.js:131 js/share.js:685
|
||||
#: js/share.js:131 js/share.js:696
|
||||
msgid "Error while sharing"
|
||||
msgstr "共有でエラー発生"
|
||||
|
||||
|
@ -434,23 +434,23 @@ msgstr "削除"
|
|||
msgid "share"
|
||||
msgstr "共有"
|
||||
|
||||
#: js/share.js:400 js/share.js:632
|
||||
#: js/share.js:400 js/share.js:643
|
||||
msgid "Password protected"
|
||||
msgstr "パスワード保護"
|
||||
|
||||
#: js/share.js:645
|
||||
#: js/share.js:656
|
||||
msgid "Error unsetting expiration date"
|
||||
msgstr "有効期限の未設定エラー"
|
||||
|
||||
#: js/share.js:657
|
||||
#: js/share.js:668
|
||||
msgid "Error setting expiration date"
|
||||
msgstr "有効期限の設定でエラー発生"
|
||||
|
||||
#: js/share.js:672
|
||||
#: js/share.js:683
|
||||
msgid "Sending ..."
|
||||
msgstr "送信中..."
|
||||
|
||||
#: js/share.js:683
|
||||
#: js/share.js:694
|
||||
msgid "Email sent"
|
||||
msgstr "メールを送信しました"
|
||||
|
||||
|
|
|
@ -12,9 +12,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-20 10:44-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 06:27+0000\n"
|
||||
"Last-Translator: Daisuke Deguchi <ddeguchi@nagoya-u.jp>\n"
|
||||
"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -81,23 +81,23 @@ msgstr "ストレージに十分な空き容量がありません"
|
|||
|
||||
#: ajax/upload.php:120 ajax/upload.php:143
|
||||
msgid "Upload failed. Could not get file info."
|
||||
msgstr ""
|
||||
msgstr "アップロードに失敗。ファイル情報を取得できませんでした。"
|
||||
|
||||
#: ajax/upload.php:136
|
||||
msgid "Upload failed. Could not find uploaded file"
|
||||
msgstr ""
|
||||
msgstr "アップロードに失敗。アップロード済みのファイルを見つけることができませんでした。"
|
||||
|
||||
#: ajax/upload.php:160
|
||||
msgid "Invalid directory."
|
||||
msgstr "無効なディレクトリです。"
|
||||
|
||||
#: appinfo/app.php:12
|
||||
#: appinfo/app.php:11
|
||||
msgid "Files"
|
||||
msgstr "ファイル"
|
||||
|
||||
#: js/file-upload.js:244
|
||||
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
|
||||
msgstr ""
|
||||
msgstr "ディレクトリもしくは0バイトのため {filename} をアップロードできません"
|
||||
|
||||
#: js/file-upload.js:255
|
||||
msgid "Not enough space available"
|
||||
|
@ -109,7 +109,7 @@ msgstr "アップロードはキャンセルされました。"
|
|||
|
||||
#: js/file-upload.js:356
|
||||
msgid "Could not get result from server."
|
||||
msgstr ""
|
||||
msgstr "サーバから結果を取得できませんでした。"
|
||||
|
||||
#: js/file-upload.js:446
|
||||
msgid ""
|
||||
|
@ -223,7 +223,7 @@ msgstr "ダウンロードの準備中です。ファイルサイズが大きい
|
|||
|
||||
#: js/files.js:507 js/files.js:545
|
||||
msgid "Error moving file"
|
||||
msgstr ""
|
||||
msgstr "ファイルの移動エラー"
|
||||
|
||||
#: js/files.js:558 templates/index.php:61
|
||||
msgid "Name"
|
||||
|
|
|
@ -10,9 +10,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-20 10:45-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:17-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 06:33+0000\n"
|
||||
"Last-Translator: Daisuke Deguchi <ddeguchi@nagoya-u.jp>\n"
|
||||
"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -89,42 +89,42 @@ msgstr "アプリを更新出来ませんでした。"
|
|||
|
||||
#: changepassword/controller.php:20
|
||||
msgid "Wrong password"
|
||||
msgstr ""
|
||||
msgstr "無効なパスワード"
|
||||
|
||||
#: changepassword/controller.php:42
|
||||
msgid "No user supplied"
|
||||
msgstr ""
|
||||
msgstr "ユーザが指定されていません"
|
||||
|
||||
#: changepassword/controller.php:74
|
||||
msgid ""
|
||||
"Please provide an admin recovery password, otherwise all user data will be "
|
||||
"lost"
|
||||
msgstr ""
|
||||
msgstr "復元用の管理者パスワードを入力してください。そうでない場合は、全ユーザのデータが失われます。"
|
||||
|
||||
#: changepassword/controller.php:79
|
||||
msgid ""
|
||||
"Wrong admin recovery password. Please check the password and try again."
|
||||
msgstr ""
|
||||
msgstr "無効な復元用の管理者パスワード。パスワードを確認して再度実行してください。"
|
||||
|
||||
#: changepassword/controller.php:87
|
||||
msgid ""
|
||||
"Back-end doesn't support password change, but the users encryption key was "
|
||||
"successfully updated."
|
||||
msgstr ""
|
||||
msgstr "バックエンドはパスワード変更をサポートしていませんが、ユーザの暗号化キーは正常に更新されました。"
|
||||
|
||||
#: changepassword/controller.php:92 changepassword/controller.php:103
|
||||
msgid "Unable to change password"
|
||||
msgstr ""
|
||||
msgstr "パスワードを変更できません"
|
||||
|
||||
#: js/apps.js:43
|
||||
msgid "Update to {appversion}"
|
||||
msgstr "{appversion} に更新"
|
||||
|
||||
#: js/apps.js:49 js/apps.js:82 js/apps.js:108
|
||||
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
|
||||
msgid "Disable"
|
||||
msgstr "無効"
|
||||
|
||||
#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
|
||||
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
|
||||
msgid "Enable"
|
||||
msgstr "有効化"
|
||||
|
||||
|
@ -132,43 +132,43 @@ msgstr "有効化"
|
|||
msgid "Please wait...."
|
||||
msgstr "しばらくお待ちください。"
|
||||
|
||||
#: js/apps.js:79 js/apps.js:80 js/apps.js:100
|
||||
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
|
||||
msgid "Error while disabling app"
|
||||
msgstr "アプリ無効化中にエラーが発生"
|
||||
|
||||
#: js/apps.js:99 js/apps.js:112 js/apps.js:113
|
||||
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
|
||||
msgid "Error while enabling app"
|
||||
msgstr "アプリ有効化中にエラーが発生"
|
||||
|
||||
#: js/apps.js:123
|
||||
#: js/apps.js:125
|
||||
msgid "Updating...."
|
||||
msgstr "更新中...."
|
||||
|
||||
#: js/apps.js:126
|
||||
#: js/apps.js:128
|
||||
msgid "Error while updating app"
|
||||
msgstr "アプリの更新中にエラーが発生"
|
||||
|
||||
#: js/apps.js:126
|
||||
#: js/apps.js:128
|
||||
msgid "Error"
|
||||
msgstr "エラー"
|
||||
|
||||
#: js/apps.js:127 templates/apps.php:43
|
||||
#: js/apps.js:129 templates/apps.php:43
|
||||
msgid "Update"
|
||||
msgstr "更新"
|
||||
|
||||
#: js/apps.js:130
|
||||
#: js/apps.js:132
|
||||
msgid "Updated"
|
||||
msgstr "更新済み"
|
||||
|
||||
#: js/personal.js:220
|
||||
#: js/personal.js:221
|
||||
msgid "Select a profile picture"
|
||||
msgstr "プロファイル画像を選択"
|
||||
|
||||
#: js/personal.js:265
|
||||
#: js/personal.js:266
|
||||
msgid "Decrypting files... Please wait, this can take some time."
|
||||
msgstr "ファイルを複合中... しばらくお待ちください、この処理には少し時間がかかるかもしれません。"
|
||||
|
||||
#: js/personal.js:287
|
||||
#: js/personal.js:288
|
||||
msgid "Saving..."
|
||||
msgstr "保存中..."
|
||||
|
||||
|
@ -496,11 +496,11 @@ msgstr "プロフィール写真"
|
|||
|
||||
#: templates/personal.php:90
|
||||
msgid "Upload new"
|
||||
msgstr ""
|
||||
msgstr "新規にアップロード"
|
||||
|
||||
#: templates/personal.php:92
|
||||
msgid "Select new from Files"
|
||||
msgstr ""
|
||||
msgstr "ファイルから新規に選択"
|
||||
|
||||
#: templates/personal.php:93
|
||||
msgid "Remove image"
|
||||
|
@ -508,7 +508,7 @@ msgstr "画像を削除"
|
|||
|
||||
#: templates/personal.php:94
|
||||
msgid "Either png or jpg. Ideally square but you will be able to crop it."
|
||||
msgstr ""
|
||||
msgstr "png と jpg のいずれか。正方形が理想ですが、切り取って加工することも可能です。"
|
||||
|
||||
#: templates/personal.php:97
|
||||
msgid "Abort"
|
||||
|
|
|
@ -5,13 +5,14 @@
|
|||
# Translators:
|
||||
# ujuc Gang <potopro@gmail.com>, 2013
|
||||
# ujuc Gang <potopro@gmail.com>, 2013
|
||||
# smallsnail <bjh13579@gmail.com>, 2013
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-20 10:44-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 10:06+0000\n"
|
||||
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
|
||||
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -31,11 +32,11 @@ msgstr "%s 항목을 이딩시키지 못하였음"
|
|||
|
||||
#: ajax/upload.php:16 ajax/upload.php:45
|
||||
msgid "Unable to set upload directory."
|
||||
msgstr ""
|
||||
msgstr "업로드 디렉터리를 정할수 없습니다"
|
||||
|
||||
#: ajax/upload.php:22
|
||||
msgid "Invalid Token"
|
||||
msgstr ""
|
||||
msgstr "잘못된 토큰"
|
||||
|
||||
#: ajax/upload.php:59
|
||||
msgid "No file was uploaded. Unknown error"
|
||||
|
@ -78,23 +79,23 @@ msgstr "저장소가 용량이 충분하지 않습니다."
|
|||
|
||||
#: ajax/upload.php:120 ajax/upload.php:143
|
||||
msgid "Upload failed. Could not get file info."
|
||||
msgstr ""
|
||||
msgstr "업로드에 실패했습니다. 파일 정보를 가져올수 없습니다."
|
||||
|
||||
#: ajax/upload.php:136
|
||||
msgid "Upload failed. Could not find uploaded file"
|
||||
msgstr ""
|
||||
msgstr "업로드에 실패했습니다. 업로드할 파일을 찾을수 없습니다"
|
||||
|
||||
#: ajax/upload.php:160
|
||||
msgid "Invalid directory."
|
||||
msgstr "올바르지 않은 디렉터리입니다."
|
||||
|
||||
#: appinfo/app.php:12
|
||||
#: appinfo/app.php:11
|
||||
msgid "Files"
|
||||
msgstr "파일"
|
||||
|
||||
#: js/file-upload.js:244
|
||||
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
|
||||
msgstr ""
|
||||
msgstr "{filename}을 업로드 할수 없습니다. 폴더이거나 0 바이트 파일입니다."
|
||||
|
||||
#: js/file-upload.js:255
|
||||
msgid "Not enough space available"
|
||||
|
@ -106,7 +107,7 @@ msgstr "업로드가 취소되었습니다."
|
|||
|
||||
#: js/file-upload.js:356
|
||||
msgid "Could not get result from server."
|
||||
msgstr ""
|
||||
msgstr "서버에서 결과를 가져올수 없습니다."
|
||||
|
||||
#: js/file-upload.js:446
|
||||
msgid ""
|
||||
|
@ -119,7 +120,7 @@ msgstr "URL을 입력해야 합니다."
|
|||
|
||||
#: js/file-upload.js:525 lib/app.php:53
|
||||
msgid "Invalid folder name. Usage of 'Shared' is reserved by ownCloud"
|
||||
msgstr ""
|
||||
msgstr "유효하지 않은 폴더명입니다. \"Shared\" 이름의 사용은 OwnCloud 가 이미 예약하고 있습니다."
|
||||
|
||||
#: js/file-upload.js:557 js/file-upload.js:573 js/files.js:507 js/files.js:545
|
||||
msgid "Error"
|
||||
|
@ -168,21 +169,21 @@ msgstr "되돌리기"
|
|||
#: js/filelist.js:533 js/filelist.js:599 js/files.js:576
|
||||
msgid "%n folder"
|
||||
msgid_plural "%n folders"
|
||||
msgstr[0] ""
|
||||
msgstr[0] "폴더 %n"
|
||||
|
||||
#: js/filelist.js:534 js/filelist.js:600 js/files.js:582
|
||||
msgid "%n file"
|
||||
msgid_plural "%n files"
|
||||
msgstr[0] ""
|
||||
msgstr[0] "파일 %n 개"
|
||||
|
||||
#: js/filelist.js:541
|
||||
msgid "{dirs} and {files}"
|
||||
msgstr ""
|
||||
msgstr "{dirs} 그리고 {files}"
|
||||
|
||||
#: js/filelist.js:731 js/filelist.js:769
|
||||
msgid "Uploading %n file"
|
||||
msgid_plural "Uploading %n files"
|
||||
msgstr[0] ""
|
||||
msgstr[0] "%n 개의 파일을 업로드중"
|
||||
|
||||
#: js/files.js:25
|
||||
msgid "'.' is an invalid file name."
|
||||
|
@ -210,7 +211,7 @@ msgstr "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)"
|
|||
msgid ""
|
||||
"Encryption was disabled but your files are still encrypted. Please go to "
|
||||
"your personal settings to decrypt your files."
|
||||
msgstr ""
|
||||
msgstr "암호화는 해제되어 있지만, 파일은 아직 암호화 되어 있습니다. 개인 설저에 가셔서 암호를 해제하십시오"
|
||||
|
||||
#: js/files.js:296
|
||||
msgid ""
|
||||
|
@ -220,7 +221,7 @@ msgstr "다운로드가 준비 중입니다. 파일 크기가 크다면 시간
|
|||
|
||||
#: js/files.js:507 js/files.js:545
|
||||
msgid "Error moving file"
|
||||
msgstr ""
|
||||
msgstr "파일 이동 오류"
|
||||
|
||||
#: js/files.js:558 templates/index.php:61
|
||||
msgid "Name"
|
||||
|
@ -237,7 +238,7 @@ msgstr "수정됨"
|
|||
#: lib/app.php:73
|
||||
#, php-format
|
||||
msgid "%s could not be renamed"
|
||||
msgstr ""
|
||||
msgstr "%s 의 이름을 변경할수 없습니다"
|
||||
|
||||
#: lib/helper.php:11 templates/index.php:17
|
||||
msgid "Upload"
|
||||
|
|
|
@ -3,13 +3,14 @@
|
|||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# smallsnail <bjh13579@gmail.com>, 2013
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-13 21:46-0400\n"
|
||||
"PO-Revision-Date: 2013-09-14 00:01+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 10:14+0000\n"
|
||||
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
|
||||
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -19,7 +20,7 @@ msgstr ""
|
|||
|
||||
#: templates/authenticate.php:4
|
||||
msgid "The password is wrong. Try again."
|
||||
msgstr ""
|
||||
msgstr "비밀번호가 틀립니다. 다시 입력해주세요."
|
||||
|
||||
#: templates/authenticate.php:7
|
||||
msgid "Password"
|
||||
|
@ -31,27 +32,27 @@ msgstr "제출"
|
|||
|
||||
#: templates/part.404.php:3
|
||||
msgid "Sorry, this link doesn’t seem to work anymore."
|
||||
msgstr ""
|
||||
msgstr "죄송합니다만 이 링크는 더이상 작동되지 않습니다."
|
||||
|
||||
#: templates/part.404.php:4
|
||||
msgid "Reasons might be:"
|
||||
msgstr ""
|
||||
msgstr "이유는 다음과 같을 수 있습니다:"
|
||||
|
||||
#: templates/part.404.php:6
|
||||
msgid "the item was removed"
|
||||
msgstr ""
|
||||
msgstr "이 항목은 삭제되었습니다"
|
||||
|
||||
#: templates/part.404.php:7
|
||||
msgid "the link expired"
|
||||
msgstr ""
|
||||
msgstr "링크가 만료되었습니다"
|
||||
|
||||
#: templates/part.404.php:8
|
||||
msgid "sharing is disabled"
|
||||
msgstr ""
|
||||
msgstr "공유가 비활성되었습니다"
|
||||
|
||||
#: templates/part.404.php:10
|
||||
msgid "For more info, please ask the person who sent this link."
|
||||
msgstr ""
|
||||
msgstr "더 자세한 설명은 링크를 보내신 분에게 여쭤보십시오"
|
||||
|
||||
#: templates/public.php:15
|
||||
#, php-format
|
||||
|
|
|
@ -3,13 +3,14 @@
|
|||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# smallsnail <bjh13579@gmail.com>, 2013
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-08-15 04:47-0400\n"
|
||||
"PO-Revision-Date: 2013-08-15 08:48+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 07:38+0000\n"
|
||||
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
|
||||
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -20,63 +21,63 @@ msgstr ""
|
|||
#: ajax/delete.php:42
|
||||
#, php-format
|
||||
msgid "Couldn't delete %s permanently"
|
||||
msgstr ""
|
||||
msgstr "%s를 영구적으로 삭제할수 없습니다"
|
||||
|
||||
#: ajax/undelete.php:42
|
||||
#, php-format
|
||||
msgid "Couldn't restore %s"
|
||||
msgstr ""
|
||||
msgstr "%s를 복원할수 없습니다"
|
||||
|
||||
#: js/trash.js:7 js/trash.js:100
|
||||
#: js/trash.js:7 js/trash.js:102
|
||||
msgid "perform restore operation"
|
||||
msgstr ""
|
||||
msgstr "복원 작업중"
|
||||
|
||||
#: js/trash.js:20 js/trash.js:48 js/trash.js:118 js/trash.js:146
|
||||
#: js/trash.js:20 js/trash.js:49 js/trash.js:120 js/trash.js:148
|
||||
msgid "Error"
|
||||
msgstr "오류"
|
||||
|
||||
#: js/trash.js:36
|
||||
#: js/trash.js:37
|
||||
msgid "delete file permanently"
|
||||
msgstr ""
|
||||
msgstr "영구적으로 파일 삭제하기"
|
||||
|
||||
#: js/trash.js:127
|
||||
#: js/trash.js:129
|
||||
msgid "Delete permanently"
|
||||
msgstr "영원히 삭제"
|
||||
|
||||
#: js/trash.js:182 templates/index.php:17
|
||||
#: js/trash.js:190 templates/index.php:21
|
||||
msgid "Name"
|
||||
msgstr "이름"
|
||||
|
||||
#: js/trash.js:183 templates/index.php:27
|
||||
#: js/trash.js:191 templates/index.php:31
|
||||
msgid "Deleted"
|
||||
msgstr ""
|
||||
msgstr "삭제됨"
|
||||
|
||||
#: js/trash.js:191
|
||||
#: js/trash.js:199
|
||||
msgid "%n folder"
|
||||
msgid_plural "%n folders"
|
||||
msgstr[0] ""
|
||||
msgstr[0] "폴더 %n개"
|
||||
|
||||
#: js/trash.js:197
|
||||
#: js/trash.js:205
|
||||
msgid "%n file"
|
||||
msgid_plural "%n files"
|
||||
msgstr[0] ""
|
||||
msgstr[0] "파일 %n개 "
|
||||
|
||||
#: lib/trash.php:819 lib/trash.php:821
|
||||
#: lib/trashbin.php:814 lib/trashbin.php:816
|
||||
msgid "restored"
|
||||
msgstr ""
|
||||
msgstr "복원됨"
|
||||
|
||||
#: templates/index.php:9
|
||||
msgid "Nothing in here. Your trash bin is empty!"
|
||||
msgstr ""
|
||||
msgstr "현재 휴지통은 비어있습니다!"
|
||||
|
||||
#: templates/index.php:20 templates/index.php:22
|
||||
#: templates/index.php:24 templates/index.php:26
|
||||
msgid "Restore"
|
||||
msgstr "복원"
|
||||
|
||||
#: templates/index.php:30 templates/index.php:31
|
||||
#: templates/index.php:34 templates/index.php:35
|
||||
msgid "Delete"
|
||||
msgstr "삭제"
|
||||
|
||||
#: templates/part.breadcrumb.php:9
|
||||
msgid "Deleted Files"
|
||||
msgstr ""
|
||||
msgstr "삭제된 파일들"
|
||||
|
|
|
@ -4,13 +4,14 @@
|
|||
#
|
||||
# Translators:
|
||||
# Shinjo Park <kde@peremen.name>, 2013
|
||||
# smallsnail <bjh13579@gmail.com>, 2013
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-07-28 01:56-0400\n"
|
||||
"PO-Revision-Date: 2013-07-27 06:10+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 10:18+0000\n"
|
||||
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
|
||||
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -29,16 +30,16 @@ msgstr "버전"
|
|||
|
||||
#: js/versions.js:53
|
||||
msgid "Failed to revert {file} to revision {timestamp}."
|
||||
msgstr ""
|
||||
msgstr "{timestamp} 판의 {file}로 돌리는데 실패했습니다."
|
||||
|
||||
#: js/versions.js:79
|
||||
msgid "More versions..."
|
||||
msgstr ""
|
||||
msgstr "더 많은 버전들..."
|
||||
|
||||
#: js/versions.js:116
|
||||
msgid "No other versions available"
|
||||
msgstr ""
|
||||
msgstr "다른 버전을 사용할수 없습니다"
|
||||
|
||||
#: js/versions.js:149
|
||||
#: js/versions.js:145
|
||||
msgid "Restore"
|
||||
msgstr "복원"
|
||||
|
|
|
@ -9,9 +9,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-16 11:33-0400\n"
|
||||
"PO-Revision-Date: 2013-09-16 15:34+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 07:46+0000\n"
|
||||
"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
|
||||
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -19,53 +19,53 @@ msgstr ""
|
|||
"Language: ko\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: app.php:239
|
||||
#: app.php:237
|
||||
#, php-format
|
||||
msgid ""
|
||||
"App \"%s\" can't be installed because it is not compatible with this version"
|
||||
" of ownCloud."
|
||||
msgstr "현재 ownCloud 버전과 호환되지 않기 때문에 \"%s\" 앱을 설치할 수 없습니다."
|
||||
|
||||
#: app.php:250
|
||||
#: app.php:248
|
||||
msgid "No app name specified"
|
||||
msgstr "앱 이름이 지정되지 않았습니다."
|
||||
|
||||
#: app.php:361
|
||||
#: app.php:352
|
||||
msgid "Help"
|
||||
msgstr "도움말"
|
||||
|
||||
#: app.php:374
|
||||
#: app.php:365
|
||||
msgid "Personal"
|
||||
msgstr "개인"
|
||||
|
||||
#: app.php:385
|
||||
#: app.php:376
|
||||
msgid "Settings"
|
||||
msgstr "설정"
|
||||
|
||||
#: app.php:397
|
||||
#: app.php:388
|
||||
msgid "Users"
|
||||
msgstr "사용자"
|
||||
|
||||
#: app.php:410
|
||||
#: app.php:401
|
||||
msgid "Admin"
|
||||
msgstr "관리자"
|
||||
|
||||
#: app.php:839
|
||||
#: app.php:832
|
||||
#, php-format
|
||||
msgid "Failed to upgrade \"%s\"."
|
||||
msgstr "\"%s\" 업그레이드에 실패했습니다."
|
||||
|
||||
#: avatar.php:56
|
||||
msgid "Custom profile pictures don't work with encryption yet"
|
||||
msgstr ""
|
||||
msgstr "개개인의 프로필 사진은 아직은 암호화 되지 않습니다"
|
||||
|
||||
#: avatar.php:64
|
||||
msgid "Unknown filetype"
|
||||
msgstr ""
|
||||
msgstr "알수없는 파일형식"
|
||||
|
||||
#: avatar.php:69
|
||||
msgid "Invalid image"
|
||||
msgstr ""
|
||||
msgstr "잘못된 그림"
|
||||
|
||||
#: defaults.php:35
|
||||
msgid "web services under your control"
|
||||
|
@ -96,7 +96,7 @@ msgstr "선택한 파일들은 ZIP 파일을 생성하기에 너무 큽니다."
|
|||
msgid ""
|
||||
"Download the files in smaller chunks, seperately or kindly ask your "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
msgstr "작은 조각들 안에 들어있는 파일들을 받고자 하신다면, 나누어서 받으시거나 혹은 시스템 관리자에게 정중하게 물어보십시오"
|
||||
|
||||
#: installer.php:63
|
||||
msgid "No source specified when installing app"
|
||||
|
@ -166,15 +166,15 @@ msgstr "인증 오류"
|
|||
msgid "Token expired. Please reload page."
|
||||
msgstr "토큰이 만료되었습니다. 페이지를 새로 고치십시오."
|
||||
|
||||
#: search/provider/file.php:17 search/provider/file.php:35
|
||||
#: search/provider/file.php:18 search/provider/file.php:36
|
||||
msgid "Files"
|
||||
msgstr "파일"
|
||||
|
||||
#: search/provider/file.php:26 search/provider/file.php:33
|
||||
#: search/provider/file.php:27 search/provider/file.php:34
|
||||
msgid "Text"
|
||||
msgstr "텍스트"
|
||||
|
||||
#: search/provider/file.php:29
|
||||
#: search/provider/file.php:30
|
||||
msgid "Images"
|
||||
msgstr "그림"
|
||||
|
||||
|
@ -278,6 +278,11 @@ msgstr "WebDAV 인터페이스가 제대로 작동하지 않습니다. 웹 서
|
|||
msgid "Please double check the <a href='%s'>installation guides</a>."
|
||||
msgstr "<a href='%s'>설치 가이드</a>를 다시 한 번 확인하십시오."
|
||||
|
||||
#: tags.php:194
|
||||
#, php-format
|
||||
msgid "Could not find category \"%s\""
|
||||
msgstr "분류 \"%s\"을(를) 찾을 수 없습니다."
|
||||
|
||||
#: template/functions.php:96
|
||||
msgid "seconds ago"
|
||||
msgstr "초 전"
|
||||
|
@ -325,8 +330,3 @@ msgstr "년 전"
|
|||
#: template.php:297
|
||||
msgid "Caused by:"
|
||||
msgstr "원인: "
|
||||
|
||||
#: vcategories.php:188 vcategories.php:249
|
||||
#, php-format
|
||||
msgid "Could not find category \"%s\""
|
||||
msgstr "분류 \"%s\"을(를) 찾을 수 없습니다."
|
||||
|
|
|
@ -11,9 +11,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-22 12:55-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 15:01+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 07:58+0000\n"
|
||||
"Last-Translator: Liudas Ališauskas <liudas.alisauskas@gmail.com>\n"
|
||||
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -277,23 +277,23 @@ msgstr "Klaida įkeliant žinutės ruošinį: {error}"
|
|||
#: js/oc-dialogs.js:347
|
||||
msgid "{count} file conflict"
|
||||
msgid_plural "{count} file conflicts"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
msgstr[0] "{count} failas konfliktuoja"
|
||||
msgstr[1] "{count} failai konfliktuoja"
|
||||
msgstr[2] "{count} failų konfliktų"
|
||||
|
||||
#: js/oc-dialogs.js:361
|
||||
msgid "One file conflict"
|
||||
msgstr ""
|
||||
msgstr "Vienas failo konfliktas"
|
||||
|
||||
#: js/oc-dialogs.js:367
|
||||
msgid "Which files do you want to keep?"
|
||||
msgstr ""
|
||||
msgstr "Kuriuos failus norite laikyti?"
|
||||
|
||||
#: js/oc-dialogs.js:368
|
||||
msgid ""
|
||||
"If you select both versions, the copied file will have a number added to its"
|
||||
" name."
|
||||
msgstr ""
|
||||
msgstr "Jei pasirenkate abi versijas, nukopijuotas failas turės pridėtą numerį pavadinime."
|
||||
|
||||
#: js/oc-dialogs.js:376
|
||||
msgid "Cancel"
|
||||
|
@ -301,19 +301,19 @@ msgstr "Atšaukti"
|
|||
|
||||
#: js/oc-dialogs.js:386
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
msgstr "Tęsti"
|
||||
|
||||
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
|
||||
msgid "(all selected)"
|
||||
msgstr ""
|
||||
msgstr "(visi pažymėti)"
|
||||
|
||||
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
|
||||
msgid "({count} selected)"
|
||||
msgstr ""
|
||||
msgstr "({count} pažymėtų)"
|
||||
|
||||
#: js/oc-dialogs.js:457
|
||||
msgid "Error loading file exists template"
|
||||
msgstr ""
|
||||
msgstr "Klaida įkeliant esančių failų ruošinį"
|
||||
|
||||
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
|
||||
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
|
||||
|
@ -324,7 +324,7 @@ msgstr "Objekto tipas nenurodytas."
|
|||
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
|
||||
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
|
||||
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
|
||||
#: js/share.js:645 js/share.js:657
|
||||
#: js/share.js:656 js/share.js:668
|
||||
msgid "Error"
|
||||
msgstr "Klaida"
|
||||
|
||||
|
@ -344,7 +344,7 @@ msgstr "Dalinamasi"
|
|||
msgid "Share"
|
||||
msgstr "Dalintis"
|
||||
|
||||
#: js/share.js:131 js/share.js:685
|
||||
#: js/share.js:131 js/share.js:696
|
||||
msgid "Error while sharing"
|
||||
msgstr "Klaida, dalijimosi metu"
|
||||
|
||||
|
@ -444,23 +444,23 @@ msgstr "ištrinti"
|
|||
msgid "share"
|
||||
msgstr "dalintis"
|
||||
|
||||
#: js/share.js:400 js/share.js:632
|
||||
#: js/share.js:400 js/share.js:643
|
||||
msgid "Password protected"
|
||||
msgstr "Apsaugota slaptažodžiu"
|
||||
|
||||
#: js/share.js:645
|
||||
#: js/share.js:656
|
||||
msgid "Error unsetting expiration date"
|
||||
msgstr "Klaida nuimant galiojimo laiką"
|
||||
|
||||
#: js/share.js:657
|
||||
#: js/share.js:668
|
||||
msgid "Error setting expiration date"
|
||||
msgstr "Klaida nustatant galiojimo laiką"
|
||||
|
||||
#: js/share.js:672
|
||||
#: js/share.js:683
|
||||
msgid "Sending ..."
|
||||
msgstr "Siunčiama..."
|
||||
|
||||
#: js/share.js:683
|
||||
#: js/share.js:694
|
||||
msgid "Email sent"
|
||||
msgstr "Laiškas išsiųstas"
|
||||
|
||||
|
|
|
@ -9,9 +9,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-20 10:44-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:14-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 08:46+0000\n"
|
||||
"Last-Translator: Liudas Ališauskas <liudas.alisauskas@gmail.com>\n"
|
||||
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -78,23 +78,23 @@ msgstr "Nepakanka vietos serveryje"
|
|||
|
||||
#: ajax/upload.php:120 ajax/upload.php:143
|
||||
msgid "Upload failed. Could not get file info."
|
||||
msgstr ""
|
||||
msgstr "Įkėlimas nepavyko. Nepavyko gauti failo informacijos."
|
||||
|
||||
#: ajax/upload.php:136
|
||||
msgid "Upload failed. Could not find uploaded file"
|
||||
msgstr ""
|
||||
msgstr "Įkėlimas nepavyko. Nepavyko rasti įkelto failo"
|
||||
|
||||
#: ajax/upload.php:160
|
||||
msgid "Invalid directory."
|
||||
msgstr "Neteisingas aplankas"
|
||||
|
||||
#: appinfo/app.php:12
|
||||
#: appinfo/app.php:11
|
||||
msgid "Files"
|
||||
msgstr "Failai"
|
||||
|
||||
#: js/file-upload.js:244
|
||||
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
|
||||
msgstr ""
|
||||
msgstr "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio"
|
||||
|
||||
#: js/file-upload.js:255
|
||||
msgid "Not enough space available"
|
||||
|
@ -106,7 +106,7 @@ msgstr "Įkėlimas atšauktas."
|
|||
|
||||
#: js/file-upload.js:356
|
||||
msgid "Could not get result from server."
|
||||
msgstr ""
|
||||
msgstr "Nepavyko gauti rezultato iš serverio."
|
||||
|
||||
#: js/file-upload.js:446
|
||||
msgid ""
|
||||
|
@ -226,7 +226,7 @@ msgstr "Jūsų atsisiuntimas yra paruošiamas. tai gali užtrukti jei atsisiunč
|
|||
|
||||
#: js/files.js:507 js/files.js:545
|
||||
msgid "Error moving file"
|
||||
msgstr ""
|
||||
msgstr "Klaida perkeliant failą"
|
||||
|
||||
#: js/files.js:558 templates/index.php:61
|
||||
msgid "Name"
|
||||
|
|
|
@ -11,9 +11,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-20 10:45-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 14:45+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:17-0400\n"
|
||||
"PO-Revision-Date: 2013-09-29 08:49+0000\n"
|
||||
"Last-Translator: Liudas Ališauskas <liudas.alisauskas@gmail.com>\n"
|
||||
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -90,42 +90,42 @@ msgstr "Nepavyko atnaujinti programos."
|
|||
|
||||
#: changepassword/controller.php:20
|
||||
msgid "Wrong password"
|
||||
msgstr ""
|
||||
msgstr "Neteisingas slaptažodis"
|
||||
|
||||
#: changepassword/controller.php:42
|
||||
msgid "No user supplied"
|
||||
msgstr ""
|
||||
msgstr "Nepateiktas naudotojas"
|
||||
|
||||
#: changepassword/controller.php:74
|
||||
msgid ""
|
||||
"Please provide an admin recovery password, otherwise all user data will be "
|
||||
"lost"
|
||||
msgstr ""
|
||||
msgstr "Prašome įvesti administratoriaus atkūrimo slaptažodį, kitaip visi naudotojo suomenys bus prarasti"
|
||||
|
||||
#: changepassword/controller.php:79
|
||||
msgid ""
|
||||
"Wrong admin recovery password. Please check the password and try again."
|
||||
msgstr ""
|
||||
msgstr "Netinkamas administratoriau atkūrimo slaptažodis. Prašome pasitikrinti ir bandyti vėl."
|
||||
|
||||
#: changepassword/controller.php:87
|
||||
msgid ""
|
||||
"Back-end doesn't support password change, but the users encryption key was "
|
||||
"successfully updated."
|
||||
msgstr ""
|
||||
msgstr "Sistema nepalaiko slaptažodžio keitimo, bet naudotojo šifravimo raktas buvo sėkmingai atnaujintas."
|
||||
|
||||
#: changepassword/controller.php:92 changepassword/controller.php:103
|
||||
msgid "Unable to change password"
|
||||
msgstr ""
|
||||
msgstr "Nepavyksta pakeisti slaptažodžio"
|
||||
|
||||
#: js/apps.js:43
|
||||
msgid "Update to {appversion}"
|
||||
msgstr "Atnaujinti iki {appversion}"
|
||||
|
||||
#: js/apps.js:49 js/apps.js:82 js/apps.js:108
|
||||
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
|
||||
msgid "Disable"
|
||||
msgstr "Išjungti"
|
||||
|
||||
#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
|
||||
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
|
||||
msgid "Enable"
|
||||
msgstr "Įjungti"
|
||||
|
||||
|
@ -133,43 +133,43 @@ msgstr "Įjungti"
|
|||
msgid "Please wait...."
|
||||
msgstr "Prašome palaukti..."
|
||||
|
||||
#: js/apps.js:79 js/apps.js:80 js/apps.js:100
|
||||
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
|
||||
msgid "Error while disabling app"
|
||||
msgstr "Klaida išjungiant programą"
|
||||
|
||||
#: js/apps.js:99 js/apps.js:112 js/apps.js:113
|
||||
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
|
||||
msgid "Error while enabling app"
|
||||
msgstr "Klaida įjungiant programą"
|
||||
|
||||
#: js/apps.js:123
|
||||
#: js/apps.js:125
|
||||
msgid "Updating...."
|
||||
msgstr "Atnaujinama..."
|
||||
|
||||
#: js/apps.js:126
|
||||
#: js/apps.js:128
|
||||
msgid "Error while updating app"
|
||||
msgstr "Įvyko klaida atnaujinant programą"
|
||||
|
||||
#: js/apps.js:126
|
||||
#: js/apps.js:128
|
||||
msgid "Error"
|
||||
msgstr "Klaida"
|
||||
|
||||
#: js/apps.js:127 templates/apps.php:43
|
||||
#: js/apps.js:129 templates/apps.php:43
|
||||
msgid "Update"
|
||||
msgstr "Atnaujinti"
|
||||
|
||||
#: js/apps.js:130
|
||||
#: js/apps.js:132
|
||||
msgid "Updated"
|
||||
msgstr "Atnaujinta"
|
||||
|
||||
#: js/personal.js:220
|
||||
#: js/personal.js:221
|
||||
msgid "Select a profile picture"
|
||||
msgstr "Pažymėkite profilio paveikslėlį"
|
||||
|
||||
#: js/personal.js:265
|
||||
#: js/personal.js:266
|
||||
msgid "Decrypting files... Please wait, this can take some time."
|
||||
msgstr "Iššifruojami failai... Prašome palaukti, tai gali užtrukti."
|
||||
|
||||
#: js/personal.js:287
|
||||
#: js/personal.js:288
|
||||
msgid "Saving..."
|
||||
msgstr "Saugoma..."
|
||||
|
||||
|
|
|
@ -9,9 +9,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: ownCloud\n"
|
||||
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
|
||||
"POT-Creation-Date: 2013-09-22 12:55-0400\n"
|
||||
"PO-Revision-Date: 2013-09-20 15:01+0000\n"
|
||||
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
|
||||
"POT-Creation-Date: 2013-09-30 10:16-0400\n"
|
||||
"PO-Revision-Date: 2013-09-30 12:27+0000\n"
|
||||
"Last-Translator: Cyryl Sochacki <cyrylsochacki@gmail.com>\n"
|
||||
"Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
@ -98,11 +98,11 @@ msgstr ""
|
|||
|
||||
#: avatar/controller.php:81
|
||||
msgid "Unknown filetype"
|
||||
msgstr ""
|
||||
msgstr "Nieznany typ pliku"
|
||||
|
||||
#: avatar/controller.php:85
|
||||
msgid "Invalid image"
|
||||
msgstr ""
|
||||
msgstr "Nieprawidłowe zdjęcie"
|
||||
|
||||
#: avatar/controller.php:115 avatar/controller.php:142
|
||||
msgid "No temporary profile picture available, try again"
|
||||
|
@ -275,13 +275,13 @@ msgstr ""
|
|||
#: js/oc-dialogs.js:347
|
||||
msgid "{count} file conflict"
|
||||
msgid_plural "{count} file conflicts"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
msgstr[0] "{count} konfliktów plików"
|
||||
msgstr[1] "{count} konfliktów plików"
|
||||
msgstr[2] "{count} konfliktów plików"
|
||||
|
||||
#: js/oc-dialogs.js:361
|
||||
msgid "One file conflict"
|
||||
msgstr ""
|
||||
msgstr "Konflikt pliku"
|
||||
|
||||
#: js/oc-dialogs.js:367
|
||||
msgid "Which files do you want to keep?"
|
||||
|
@ -299,15 +299,15 @@ msgstr "Anuluj"
|
|||
|
||||
#: js/oc-dialogs.js:386
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
msgstr "Kontynuuj "
|
||||
|
||||
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
|
||||
msgid "(all selected)"
|
||||
msgstr ""
|
||||
msgstr "(wszystkie zaznaczone)"
|
||||
|
||||
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
|
||||
msgid "({count} selected)"
|
||||
msgstr ""
|
||||
msgstr "({count} zaznaczonych)"
|
||||
|
||||
#: js/oc-dialogs.js:457
|
||||
msgid "Error loading file exists template"
|
||||
|
@ -322,7 +322,7 @@ msgstr "Nie określono typu obiektu."
|
|||
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
|
||||
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
|
||||
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
|
||||
#: js/share.js:645 js/share.js:657
|
||||
#: js/share.js:656 js/share.js:668
|
||||
msgid "Error"
|
||||
msgstr "Błąd"
|
||||
|
||||
|
@ -342,7 +342,7 @@ msgstr "Udostępniono"
|
|||
msgid "Share"
|
||||
msgstr "Udostępnij"
|
||||
|
||||
#: js/share.js:131 js/share.js:685
|
||||
#: js/share.js:131 js/share.js:696
|
||||
msgid "Error while sharing"
|
||||
msgstr "Błąd podczas współdzielenia"
|
||||
|
||||
|
@ -442,23 +442,23 @@ msgstr "usuń"
|
|||
msgid "share"
|
||||
msgstr "współdziel"
|
||||
|
||||
#: js/share.js:400 js/share.js:632
|
||||
#: js/share.js:400 js/share.js:643
|
||||
msgid "Password protected"
|
||||
msgstr "Zabezpieczone hasłem"
|
||||
|
||||
#: js/share.js:645
|
||||
#: js/share.js:656
|
||||
msgid "Error unsetting expiration date"
|
||||
msgstr "Błąd podczas usuwania daty wygaśnięcia"
|
||||
|
||||
#: js/share.js:657
|
||||
#: js/share.js:668
|
||||
msgid "Error setting expiration date"
|
||||
msgstr "Błąd podczas ustawiania daty wygaśnięcia"
|
||||
|
||||
#: js/share.js:672
|
||||
#: js/share.js:683
|
||||
msgid "Sending ..."
|
||||
msgstr "Wysyłanie..."
|
||||
|
||||
#: js/share.js:683
|
||||
#: js/share.js:694
|
||||
msgid "Email sent"
|
||||
msgstr "E-mail wysłany"
|
||||
|
||||
|
|