Merge branch 'master' into sabredav_1.6
This commit is contained in:
commit
33b06c4484
|
@ -794,7 +794,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
|
|||
? 'mysql_query' : 'mysql_unbuffered_query';
|
||||
$result = @$function($query, $connection);
|
||||
if (!$result) {
|
||||
$err =& $this->raiseError(null, null, null,
|
||||
$err =$this->raiseError(null, null, null,
|
||||
'Could not execute statement', __FUNCTION__);
|
||||
return $err;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,253 @@
|
|||
<?php
|
||||
#
|
||||
# Portable PHP password hashing framework.
|
||||
#
|
||||
# Version 0.3 / genuine.
|
||||
#
|
||||
# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
|
||||
# the public domain. Revised in subsequent years, still public domain.
|
||||
#
|
||||
# There's absolutely no warranty.
|
||||
#
|
||||
# The homepage URL for this framework is:
|
||||
#
|
||||
# http://www.openwall.com/phpass/
|
||||
#
|
||||
# Please be sure to update the Version line if you edit this file in any way.
|
||||
# It is suggested that you leave the main version number intact, but indicate
|
||||
# your project name (after the slash) and add your own revision information.
|
||||
#
|
||||
# Please do not change the "private" password hashing method implemented in
|
||||
# here, thereby making your hashes incompatible. However, if you must, please
|
||||
# change the hash type identifier (the "$P$") to something different.
|
||||
#
|
||||
# Obviously, since this code is in the public domain, the above are not
|
||||
# requirements (there can be none), but merely suggestions.
|
||||
#
|
||||
class PasswordHash {
|
||||
var $itoa64;
|
||||
var $iteration_count_log2;
|
||||
var $portable_hashes;
|
||||
var $random_state;
|
||||
|
||||
function PasswordHash($iteration_count_log2, $portable_hashes)
|
||||
{
|
||||
$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
|
||||
|
||||
if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
|
||||
$iteration_count_log2 = 8;
|
||||
$this->iteration_count_log2 = $iteration_count_log2;
|
||||
|
||||
$this->portable_hashes = $portable_hashes;
|
||||
|
||||
$this->random_state = microtime();
|
||||
if (function_exists('getmypid'))
|
||||
$this->random_state .= getmypid();
|
||||
}
|
||||
|
||||
function get_random_bytes($count)
|
||||
{
|
||||
$output = '';
|
||||
if (is_readable('/dev/urandom') &&
|
||||
($fh = @fopen('/dev/urandom', 'rb'))) {
|
||||
$output = fread($fh, $count);
|
||||
fclose($fh);
|
||||
}
|
||||
|
||||
if (strlen($output) < $count) {
|
||||
$output = '';
|
||||
for ($i = 0; $i < $count; $i += 16) {
|
||||
$this->random_state =
|
||||
md5(microtime() . $this->random_state);
|
||||
$output .=
|
||||
pack('H*', md5($this->random_state));
|
||||
}
|
||||
$output = substr($output, 0, $count);
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function encode64($input, $count)
|
||||
{
|
||||
$output = '';
|
||||
$i = 0;
|
||||
do {
|
||||
$value = ord($input[$i++]);
|
||||
$output .= $this->itoa64[$value & 0x3f];
|
||||
if ($i < $count)
|
||||
$value |= ord($input[$i]) << 8;
|
||||
$output .= $this->itoa64[($value >> 6) & 0x3f];
|
||||
if ($i++ >= $count)
|
||||
break;
|
||||
if ($i < $count)
|
||||
$value |= ord($input[$i]) << 16;
|
||||
$output .= $this->itoa64[($value >> 12) & 0x3f];
|
||||
if ($i++ >= $count)
|
||||
break;
|
||||
$output .= $this->itoa64[($value >> 18) & 0x3f];
|
||||
} while ($i < $count);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function gensalt_private($input)
|
||||
{
|
||||
$output = '$P$';
|
||||
$output .= $this->itoa64[min($this->iteration_count_log2 +
|
||||
((PHP_VERSION >= '5') ? 5 : 3), 30)];
|
||||
$output .= $this->encode64($input, 6);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function crypt_private($password, $setting)
|
||||
{
|
||||
$output = '*0';
|
||||
if (substr($setting, 0, 2) == $output)
|
||||
$output = '*1';
|
||||
|
||||
$id = substr($setting, 0, 3);
|
||||
# We use "$P$", phpBB3 uses "$H$" for the same thing
|
||||
if ($id != '$P$' && $id != '$H$')
|
||||
return $output;
|
||||
|
||||
$count_log2 = strpos($this->itoa64, $setting[3]);
|
||||
if ($count_log2 < 7 || $count_log2 > 30)
|
||||
return $output;
|
||||
|
||||
$count = 1 << $count_log2;
|
||||
|
||||
$salt = substr($setting, 4, 8);
|
||||
if (strlen($salt) != 8)
|
||||
return $output;
|
||||
|
||||
# We're kind of forced to use MD5 here since it's the only
|
||||
# cryptographic primitive available in all versions of PHP
|
||||
# currently in use. To implement our own low-level crypto
|
||||
# in PHP would result in much worse performance and
|
||||
# consequently in lower iteration counts and hashes that are
|
||||
# quicker to crack (by non-PHP code).
|
||||
if (PHP_VERSION >= '5') {
|
||||
$hash = md5($salt . $password, TRUE);
|
||||
do {
|
||||
$hash = md5($hash . $password, TRUE);
|
||||
} while (--$count);
|
||||
} else {
|
||||
$hash = pack('H*', md5($salt . $password));
|
||||
do {
|
||||
$hash = pack('H*', md5($hash . $password));
|
||||
} while (--$count);
|
||||
}
|
||||
|
||||
$output = substr($setting, 0, 12);
|
||||
$output .= $this->encode64($hash, 16);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function gensalt_extended($input)
|
||||
{
|
||||
$count_log2 = min($this->iteration_count_log2 + 8, 24);
|
||||
# This should be odd to not reveal weak DES keys, and the
|
||||
# maximum valid value is (2**24 - 1) which is odd anyway.
|
||||
$count = (1 << $count_log2) - 1;
|
||||
|
||||
$output = '_';
|
||||
$output .= $this->itoa64[$count & 0x3f];
|
||||
$output .= $this->itoa64[($count >> 6) & 0x3f];
|
||||
$output .= $this->itoa64[($count >> 12) & 0x3f];
|
||||
$output .= $this->itoa64[($count >> 18) & 0x3f];
|
||||
|
||||
$output .= $this->encode64($input, 3);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function gensalt_blowfish($input)
|
||||
{
|
||||
# This one needs to use a different order of characters and a
|
||||
# different encoding scheme from the one in encode64() above.
|
||||
# We care because the last character in our encoded string will
|
||||
# only represent 2 bits. While two known implementations of
|
||||
# bcrypt will happily accept and correct a salt string which
|
||||
# has the 4 unused bits set to non-zero, we do not want to take
|
||||
# chances and we also do not want to waste an additional byte
|
||||
# of entropy.
|
||||
$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||
|
||||
$output = '$2a$';
|
||||
$output .= chr(ord('0') + $this->iteration_count_log2 / 10);
|
||||
$output .= chr(ord('0') + $this->iteration_count_log2 % 10);
|
||||
$output .= '$';
|
||||
|
||||
$i = 0;
|
||||
do {
|
||||
$c1 = ord($input[$i++]);
|
||||
$output .= $itoa64[$c1 >> 2];
|
||||
$c1 = ($c1 & 0x03) << 4;
|
||||
if ($i >= 16) {
|
||||
$output .= $itoa64[$c1];
|
||||
break;
|
||||
}
|
||||
|
||||
$c2 = ord($input[$i++]);
|
||||
$c1 |= $c2 >> 4;
|
||||
$output .= $itoa64[$c1];
|
||||
$c1 = ($c2 & 0x0f) << 2;
|
||||
|
||||
$c2 = ord($input[$i++]);
|
||||
$c1 |= $c2 >> 6;
|
||||
$output .= $itoa64[$c1];
|
||||
$output .= $itoa64[$c2 & 0x3f];
|
||||
} while (1);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function HashPassword($password)
|
||||
{
|
||||
$random = '';
|
||||
|
||||
if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {
|
||||
$random = $this->get_random_bytes(16);
|
||||
$hash =
|
||||
crypt($password, $this->gensalt_blowfish($random));
|
||||
if (strlen($hash) == 60)
|
||||
return $hash;
|
||||
}
|
||||
|
||||
if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {
|
||||
if (strlen($random) < 3)
|
||||
$random = $this->get_random_bytes(3);
|
||||
$hash =
|
||||
crypt($password, $this->gensalt_extended($random));
|
||||
if (strlen($hash) == 20)
|
||||
return $hash;
|
||||
}
|
||||
|
||||
if (strlen($random) < 6)
|
||||
$random = $this->get_random_bytes(6);
|
||||
$hash =
|
||||
$this->crypt_private($password,
|
||||
$this->gensalt_private($random));
|
||||
if (strlen($hash) == 34)
|
||||
return $hash;
|
||||
|
||||
# Returning '*' on error is safe here, but would _not_ be safe
|
||||
# in a crypt(3)-like function used _both_ for generating new
|
||||
# hashes and for validating passwords against existing hashes.
|
||||
return '*';
|
||||
}
|
||||
|
||||
function CheckPassword($password, $stored_hash)
|
||||
{
|
||||
$hash = $this->crypt_private($password, $stored_hash);
|
||||
if ($hash[0] == '*')
|
||||
$hash = crypt($password, $stored_hash);
|
||||
|
||||
return $hash == $stored_hash;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -0,0 +1,21 @@
|
|||
#
|
||||
# Written by Solar Designer and placed in the public domain.
|
||||
# See crypt_private.c for more information.
|
||||
#
|
||||
CC = gcc
|
||||
LD = $(CC)
|
||||
RM = rm -f
|
||||
CFLAGS = -Wall -O2 -fomit-frame-pointer -funroll-loops
|
||||
LDFLAGS = -s
|
||||
LIBS = -lcrypto
|
||||
|
||||
all: crypt_private-test
|
||||
|
||||
crypt_private-test: crypt_private-test.o
|
||||
$(LD) $(LDFLAGS) $(LIBS) crypt_private-test.o -o $@
|
||||
|
||||
crypt_private-test.o: crypt_private.c
|
||||
$(CC) -c $(CFLAGS) crypt_private.c -DTEST -o $@
|
||||
|
||||
clean:
|
||||
$(RM) crypt_private-test*
|
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
* This code exists for the sole purpose to serve as another implementation
|
||||
* of the "private" password hashing method implemened in PasswordHash.php
|
||||
* and thus to confirm that these password hashes are indeed calculated as
|
||||
* intended.
|
||||
*
|
||||
* Other uses of this code are discouraged. There are much better password
|
||||
* hashing algorithms available to C programmers; one of those is bcrypt:
|
||||
*
|
||||
* http://www.openwall.com/crypt/
|
||||
*
|
||||
* Written by Solar Designer <solar at openwall.com> in 2005 and placed in
|
||||
* the public domain.
|
||||
*
|
||||
* There's absolutely no warranty.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <openssl/md5.h>
|
||||
|
||||
#ifdef TEST
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
static char *itoa64 =
|
||||
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||
|
||||
static void encode64(char *dst, char *src, int count)
|
||||
{
|
||||
int i, value;
|
||||
|
||||
i = 0;
|
||||
do {
|
||||
value = (unsigned char)src[i++];
|
||||
*dst++ = itoa64[value & 0x3f];
|
||||
if (i < count)
|
||||
value |= (unsigned char)src[i] << 8;
|
||||
*dst++ = itoa64[(value >> 6) & 0x3f];
|
||||
if (i++ >= count)
|
||||
break;
|
||||
if (i < count)
|
||||
value |= (unsigned char)src[i] << 16;
|
||||
*dst++ = itoa64[(value >> 12) & 0x3f];
|
||||
if (i++ >= count)
|
||||
break;
|
||||
*dst++ = itoa64[(value >> 18) & 0x3f];
|
||||
} while (i < count);
|
||||
}
|
||||
|
||||
char *crypt_private(char *password, char *setting)
|
||||
{
|
||||
static char output[35];
|
||||
MD5_CTX ctx;
|
||||
char hash[MD5_DIGEST_LENGTH];
|
||||
char *p, *salt;
|
||||
int count_log2, length, count;
|
||||
|
||||
strcpy(output, "*0");
|
||||
if (!strncmp(setting, output, 2))
|
||||
output[1] = '1';
|
||||
|
||||
if (strncmp(setting, "$P$", 3))
|
||||
return output;
|
||||
|
||||
p = strchr(itoa64, setting[3]);
|
||||
if (!p)
|
||||
return output;
|
||||
count_log2 = p - itoa64;
|
||||
if (count_log2 < 7 || count_log2 > 30)
|
||||
return output;
|
||||
|
||||
salt = setting + 4;
|
||||
if (strlen(salt) < 8)
|
||||
return output;
|
||||
|
||||
length = strlen(password);
|
||||
|
||||
MD5_Init(&ctx);
|
||||
MD5_Update(&ctx, salt, 8);
|
||||
MD5_Update(&ctx, password, length);
|
||||
MD5_Final(hash, &ctx);
|
||||
|
||||
count = 1 << count_log2;
|
||||
do {
|
||||
MD5_Init(&ctx);
|
||||
MD5_Update(&ctx, hash, MD5_DIGEST_LENGTH);
|
||||
MD5_Update(&ctx, password, length);
|
||||
MD5_Final(hash, &ctx);
|
||||
} while (--count);
|
||||
|
||||
memcpy(output, setting, 12);
|
||||
encode64(&output[12], hash, MD5_DIGEST_LENGTH);
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
if (argc != 3) return 1;
|
||||
|
||||
puts(crypt_private(argv[1], argv[2]));
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
#
|
||||
# This is a test program for the portable PHP password hashing framework.
|
||||
#
|
||||
# Written by Solar Designer and placed in the public domain.
|
||||
# See PasswordHash.php for more information.
|
||||
#
|
||||
|
||||
require 'PasswordHash.php';
|
||||
|
||||
header('Content-type: text/plain');
|
||||
|
||||
$ok = 0;
|
||||
|
||||
# Try to use stronger but system-specific hashes, with a possible fallback to
|
||||
# the weaker portable hashes.
|
||||
$t_hasher = new PasswordHash(8, FALSE);
|
||||
|
||||
$correct = 'test12345';
|
||||
$hash = $t_hasher->HashPassword($correct);
|
||||
|
||||
print 'Hash: ' . $hash . "\n";
|
||||
|
||||
$check = $t_hasher->CheckPassword($correct, $hash);
|
||||
if ($check) $ok++;
|
||||
print "Check correct: '" . $check . "' (should be '1')\n";
|
||||
|
||||
$wrong = 'test12346';
|
||||
$check = $t_hasher->CheckPassword($wrong, $hash);
|
||||
if (!$check) $ok++;
|
||||
print "Check wrong: '" . $check . "' (should be '0' or '')\n";
|
||||
|
||||
unset($t_hasher);
|
||||
|
||||
# Force the use of weaker portable hashes.
|
||||
$t_hasher = new PasswordHash(8, TRUE);
|
||||
|
||||
$hash = $t_hasher->HashPassword($correct);
|
||||
|
||||
print 'Hash: ' . $hash . "\n";
|
||||
|
||||
$check = $t_hasher->CheckPassword($correct, $hash);
|
||||
if ($check) $ok++;
|
||||
print "Check correct: '" . $check . "' (should be '1')\n";
|
||||
|
||||
$check = $t_hasher->CheckPassword($wrong, $hash);
|
||||
if (!$check) $ok++;
|
||||
print "Check wrong: '" . $check . "' (should be '0' or '')\n";
|
||||
|
||||
# A correct portable hash for 'test12345'.
|
||||
# Please note the use of single quotes to ensure that the dollar signs will
|
||||
# be interpreted literally. Of course, a real application making use of the
|
||||
# framework won't store password hashes within a PHP source file anyway.
|
||||
# We only do this for testing.
|
||||
$hash = '$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0';
|
||||
|
||||
print 'Hash: ' . $hash . "\n";
|
||||
|
||||
$check = $t_hasher->CheckPassword($correct, $hash);
|
||||
if ($check) $ok++;
|
||||
print "Check correct: '" . $check . "' (should be '1')\n";
|
||||
|
||||
$check = $t_hasher->CheckPassword($wrong, $hash);
|
||||
if (!$check) $ok++;
|
||||
print "Check wrong: '" . $check . "' (should be '0' or '')\n";
|
||||
|
||||
if ($ok == 6)
|
||||
print "All tests have PASSED\n";
|
||||
else
|
||||
print "Some tests have FAILED\n";
|
||||
|
||||
?>
|
|
@ -8,6 +8,7 @@
|
|||
*/
|
||||
|
||||
OC::$CLASSPATH['OC_Bookmarks_Bookmarks'] = 'apps/bookmarks/lib/bookmarks.php';
|
||||
OC::$CLASSPATH['OC_Search_Provider_Bookmarks'] = 'apps/bookmarks/lib/search.php';
|
||||
|
||||
OC_App::register( array( 'order' => 70, 'id' => 'bookmark', 'name' => 'Bookmarks' ));
|
||||
|
||||
|
@ -15,5 +16,5 @@ $l = new OC_l10n('bookmarks');
|
|||
OC_App::addNavigationEntry( array( 'id' => 'bookmarks_index', 'order' => 70, 'href' => OC_Helper::linkTo( 'bookmarks', 'index.php' ), 'icon' => OC_Helper::imagePath( 'bookmarks', 'bookmarks.png' ), 'name' => $l->t('Bookmarks')));
|
||||
|
||||
OC_App::registerPersonal('bookmarks', 'settings');
|
||||
require_once('apps/bookmarks/lib/search.php');
|
||||
OC_Util::addScript('bookmarks','bookmarksearch');
|
||||
OC_Search::registerProvider('OC_Search_Provider_Bookmarks');
|
||||
|
|
|
@ -17,7 +17,9 @@
|
|||
}
|
||||
|
||||
.bookmarks_list {
|
||||
margin-top: 36px;
|
||||
overflow: auto;
|
||||
position: fixed;
|
||||
top: 6.5em;
|
||||
}
|
||||
|
||||
.bookmarks_addBml {
|
||||
|
|
|
@ -5,7 +5,11 @@ var bookmarks_sorting = 'bookmarks_sorting_recent';
|
|||
|
||||
$(document).ready(function() {
|
||||
$('#bookmark_add_submit').click(addOrEditBookmark);
|
||||
$(window).scroll(updateOnBottom);
|
||||
$(window).resize(function () {
|
||||
fillWindow($('.bookmarks_list'));
|
||||
});
|
||||
$(window).resize();
|
||||
$($('.bookmarks_list')).scroll(updateOnBottom);
|
||||
|
||||
$('.bookmarks_list').empty();
|
||||
getBookmarks();
|
||||
|
@ -21,7 +25,9 @@ function getBookmarks() {
|
|||
url: 'ajax/updateList.php',
|
||||
data: 'tag=' + encodeURI($('#bookmarkFilterTag').val()) + '&page=' + bookmarks_page + '&sort=' + bookmarks_sorting,
|
||||
success: function(bookmarks){
|
||||
bookmarks_page += 1;
|
||||
if (bookmarks.data.length) {
|
||||
bookmarks_page += 1;
|
||||
}
|
||||
$('.bookmark_link').unbind('click', recordClick);
|
||||
$('.bookmark_delete').unbind('click', delBookmark);
|
||||
$('.bookmark_edit').unbind('click', showBookmark);
|
||||
|
@ -39,6 +45,9 @@ function getBookmarks() {
|
|||
$('.bookmark_edit').click(showBookmark);
|
||||
|
||||
bookmarks_loading = false;
|
||||
if (bookmarks.data.length) {
|
||||
updateOnBottom()
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -146,7 +155,11 @@ function updateBookmarksList(bookmark) {
|
|||
|
||||
function updateOnBottom() {
|
||||
//check wether user is on bottom of the page
|
||||
if ($('body').height() <= ($(window).height() + $(window).scrollTop())) {
|
||||
var top = $('.bookmarks_list>:last-child').position().top;
|
||||
var height = $('.bookmarks_list').height();
|
||||
// use a bit of margin to begin loading before we are really at the
|
||||
// bottom
|
||||
if (top < height * 1.2) {
|
||||
getBookmarks();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,8 +20,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
class OC_Search_Provider_Bookmarks extends OC_Search_Provider{
|
||||
function search($query){
|
||||
class OC_Search_Provider_Bookmarks implements OC_Search_Provider{
|
||||
static function search($query){
|
||||
$results=array();
|
||||
|
||||
$offset = 0;
|
||||
|
@ -45,6 +45,3 @@ class OC_Search_Provider_Bookmarks extends OC_Search_Provider{
|
|||
return $results;
|
||||
}
|
||||
}
|
||||
new OC_Search_Provider_Bookmarks();
|
||||
|
||||
?>
|
||||
|
|
|
@ -3,6 +3,6 @@
|
|||
function createBookmarklet() {
|
||||
$l = new OC_L10N('bookmarks');
|
||||
echo '<small>' . $l->t('Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:') . '</small>'
|
||||
. '<a class="button" href="javascript:(function(){var a=window,b=document,c=encodeURIComponent,d=a.open(\'' . OC_Helper::linkToAbsolute('bookmarks', 'addBm.php') . '?output=popup&url=\'+c(b.location),\'bkmk_popup\',\'left=\'+((a.screenX||a.screenLeft)+10)+\',top=\'+((a.screenY||a.screenTop)+10)+\',height=230px,width=230px,resizable=1,alwaysRaised=1\');a.setTimeout(function(){d.focus()},300);})();">'
|
||||
. '<a class="bookmarklet" href="javascript:(function(){var a=window,b=document,c=encodeURIComponent,d=a.open(\'' . OC_Helper::linkToAbsolute('bookmarks', 'addBm.php') . '?output=popup&url=\'+c(b.location),\'bkmk_popup\',\'left=\'+((a.screenX||a.screenLeft)+10)+\',top=\'+((a.screenY||a.screenTop)+10)+\',height=230px,width=230px,resizable=1,alwaysRaised=1\');a.setTimeout(function(){d.focus()},300);})();">'
|
||||
. $l->t('Read later') . '</a>';
|
||||
}
|
||||
|
|
|
@ -27,25 +27,40 @@ function create_return_event($event, $vevent){
|
|||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('calendar');
|
||||
|
||||
$start = DateTime::createFromFormat('U', $_GET['start']);
|
||||
$end = DateTime::createFromFormat('U', $_GET['end']);
|
||||
if(version_compare(PHP_VERSION, '5.3.0', '>=')){
|
||||
$start = DateTime::createFromFormat('U', $_GET['start']);
|
||||
$end = DateTime::createFromFormat('U', $_GET['end']);
|
||||
}else{
|
||||
$start = new DateTime('@' . $_GET['start']);
|
||||
$end = new DateTime('@' . $_GET['end']);
|
||||
}
|
||||
|
||||
$calendar = OC_Calendar_App::getCalendar($_GET['calendar_id']);
|
||||
OC_Response::enableCaching(0);
|
||||
OC_Response::setETagHeader($calendar['ctag']);
|
||||
$calendar_id = $_GET['calendar_id'];
|
||||
if (is_numeric($calendar_id)) {
|
||||
$calendar = OC_Calendar_App::getCalendar($calendar_id);
|
||||
OC_Response::enableCaching(0);
|
||||
OC_Response::setETagHeader($calendar['ctag']);
|
||||
$events = OC_Calendar_Object::allInPeriod($calendar_id, $start, $end);
|
||||
} else {
|
||||
$events = array();
|
||||
OC_Hook::emit('OC_Calendar', 'getEvents', array('calendar_id' => $calendar_id, 'events' => &$events));
|
||||
}
|
||||
|
||||
$events = OC_Calendar_Object::allInPeriod($_GET['calendar_id'], $start, $end);
|
||||
$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone', date_default_timezone_get());
|
||||
$return = array();
|
||||
foreach($events as $event){
|
||||
$object = OC_VObject::parse($event['calendardata']);
|
||||
$vevent = $object->VEVENT;
|
||||
if (isset($event['calendardata'])) {
|
||||
$object = OC_VObject::parse($event['calendardata']);
|
||||
$vevent = $object->VEVENT;
|
||||
} else {
|
||||
$vevent = $event['vevent'];
|
||||
}
|
||||
|
||||
$return_event = create_return_event($event, $vevent);
|
||||
|
||||
$dtstart = $vevent->DTSTART;
|
||||
$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
|
||||
$start_dt = $dtstart->getDateTime();
|
||||
$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
|
||||
$end_dt = $dtend->getDateTime();
|
||||
if ($dtstart->getDateType() == Sabre_VObject_Property_DateTime::DATE){
|
||||
$return_event['allDay'] = true;
|
||||
|
|
|
@ -11,7 +11,7 @@ require_once('../../../../lib/base.php');
|
|||
OC_JSON::checkLoggedIn();
|
||||
OC_Util::checkAppEnabled('calendar');
|
||||
$nl = "\n";
|
||||
$progressfile = OC::$SERVERROOT . '/apps/calendar/import_tmp/' . md5(session_id()) . '.txt';
|
||||
$progressfile = OC::$APPSROOT . '/apps/calendar/import_tmp/' . md5(session_id()) . '.txt';
|
||||
if(is_writable('import_tmp/')){
|
||||
$progressfopen = fopen($progressfile, 'w');
|
||||
fwrite($progressfopen, '10');
|
||||
|
@ -117,4 +117,4 @@ sleep(3);
|
|||
if(is_writable('import_tmp/')){
|
||||
unlink($progressfile);
|
||||
}
|
||||
OC_JSON::success();
|
||||
OC_JSON::success();
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
require_once('../../../../lib/base.php');
|
||||
OC_JSON::checkLoggedIn();
|
||||
$firstday = OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'firstday', 'mo');
|
||||
OC_JSON::encodedPrint(array('firstday' => $firstday));
|
||||
?>
|
|
@ -5,44 +5,23 @@
|
|||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
function make_array_out_of_xml ($xml){
|
||||
$returnarray = array();
|
||||
$xml = (array)$xml ;
|
||||
foreach ($xml as $property => $value){
|
||||
$value = (array)$value;
|
||||
if(!isset($value[0])){
|
||||
$returnarray[$property] = make_array_out_of_xml($value);
|
||||
}else{
|
||||
$returnarray[$property] = trim($value[0]);
|
||||
}
|
||||
}
|
||||
return $returnarray;
|
||||
}
|
||||
require_once('../../../../lib/base.php');
|
||||
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('calendar');
|
||||
$l = new OC_L10N('calendar');
|
||||
$lat = $_GET['lat'];
|
||||
$long = $_GET['long'];
|
||||
if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'position') == $lat . '-' . $long && OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone') != null){
|
||||
OC_JSON::success();
|
||||
exit;
|
||||
}
|
||||
OC_Preferences::setValue(OC_USER::getUser(), 'calendar', 'position', $lat . '-' . $long);
|
||||
$geolocation = file_get_contents('http://ws.geonames.org/timezone?lat=' . $lat . '&lng=' . $long);
|
||||
//Information are by Geonames (http://www.geonames.org) and licensed under the Creative Commons Attribution 3.0 License
|
||||
$geoxml = simplexml_load_string($geolocation);
|
||||
$geoarray = make_array_out_of_xml($geoxml);
|
||||
if($geoarray['timezone']['timezoneId'] == OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone')){
|
||||
OC_JSON::success();
|
||||
exit;
|
||||
}
|
||||
if(in_array($geoarray['timezone']['timezoneId'], DateTimeZone::listIdentifiers())){
|
||||
OC_Preferences::setValue(OC_USER::getUser(), 'calendar', 'timezone', $geoarray['timezone']['timezoneId']);
|
||||
$message = array('message'=> $l->t('New Timezone:') . $geoarray['timezone']['timezoneId']);
|
||||
OC_JSON::success($message);
|
||||
}else{
|
||||
OC_JSON::error();
|
||||
}
|
||||
|
||||
?>
|
||||
$l = new OC_L10N('calendar');
|
||||
|
||||
$lat = $_GET['lat'];
|
||||
$lng = $_GET['long'];
|
||||
|
||||
$timezone = OC_Geo::timezone($lat, $lng);
|
||||
|
||||
if($timezone == OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone')){
|
||||
OC_JSON::success();
|
||||
exit;
|
||||
}
|
||||
OC_Preferences::setValue(OC_USER::getUser(), 'calendar', 'timezone', $timezone);
|
||||
$message = array('message'=> $l->t('New Timezone:') . $timezone);
|
||||
OC_JSON::success($message);
|
||||
?>
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
require_once('../../../../lib/base.php');
|
||||
OC_JSON::checkLoggedIn();
|
||||
if(isset($_POST["firstday"])){
|
||||
OC_Preferences::setValue(OC_User::getUser(), 'calendar', 'firstday', $_POST["firstday"]);
|
||||
OC_JSON::success();
|
||||
}else{
|
||||
OC_JSON::error();
|
||||
}
|
||||
?>
|
||||
|
|
@ -1,23 +1,23 @@
|
|||
<?php
|
||||
if(version_compare(PHP_VERSION, '5.3.0', '>=')){
|
||||
$l=new OC_L10N('calendar');
|
||||
OC::$CLASSPATH['OC_Calendar_App'] = 'apps/calendar/lib/app.php';
|
||||
OC::$CLASSPATH['OC_Calendar_Calendar'] = 'apps/calendar/lib/calendar.php';
|
||||
OC::$CLASSPATH['OC_Calendar_Object'] = 'apps/calendar/lib/object.php';
|
||||
OC::$CLASSPATH['OC_Calendar_Hooks'] = 'apps/calendar/lib/hooks.php';
|
||||
OC::$CLASSPATH['OC_Connector_Sabre_CalDAV'] = 'apps/calendar/lib/connector_sabre.php';
|
||||
OC_HOOK::connect('OC_User', 'post_deleteUser', 'OC_Calendar_Hooks', 'deleteUser');
|
||||
OC_Util::addScript('calendar','loader');
|
||||
OC_App::register( array(
|
||||
'order' => 10,
|
||||
'id' => 'calendar',
|
||||
'name' => 'Calendar' ));
|
||||
OC_App::addNavigationEntry( array(
|
||||
'id' => 'calendar_index',
|
||||
'order' => 10,
|
||||
'href' => OC_Helper::linkTo( 'calendar', 'index.php' ),
|
||||
'icon' => OC_Helper::imagePath( 'calendar', 'icon.svg' ),
|
||||
'name' => $l->t('Calendar')));
|
||||
OC_App::registerPersonal('calendar', 'settings');
|
||||
require_once('apps/calendar/lib/search.php');
|
||||
}
|
||||
$l=new OC_L10N('calendar');
|
||||
OC::$CLASSPATH['OC_Calendar_App'] = 'apps/calendar/lib/app.php';
|
||||
OC::$CLASSPATH['OC_Calendar_Calendar'] = 'apps/calendar/lib/calendar.php';
|
||||
OC::$CLASSPATH['OC_Calendar_Object'] = 'apps/calendar/lib/object.php';
|
||||
OC::$CLASSPATH['OC_Calendar_Hooks'] = 'apps/calendar/lib/hooks.php';
|
||||
OC::$CLASSPATH['OC_Connector_Sabre_CalDAV'] = 'apps/calendar/lib/connector_sabre.php';
|
||||
OC::$CLASSPATH['OC_Search_Provider_Calendar'] = 'apps/calendar/lib/search.php';
|
||||
OC_HOOK::connect('OC_User', 'post_deleteUser', 'OC_Calendar_Hooks', 'deleteUser');
|
||||
OC_Hook::connect('OC_DAV', 'initialize', 'OC_Calendar_Hooks', 'initializeCalDAV');
|
||||
OC_Util::addScript('calendar','loader');
|
||||
OC_App::register( array(
|
||||
'order' => 10,
|
||||
'id' => 'calendar',
|
||||
'name' => 'Calendar' ));
|
||||
OC_App::addNavigationEntry( array(
|
||||
'id' => 'calendar_index',
|
||||
'order' => 10,
|
||||
'href' => OC_Helper::linkTo( 'calendar', 'index.php' ),
|
||||
'icon' => OC_Helper::imagePath( 'calendar', 'icon.svg' ),
|
||||
'name' => $l->t('Calendar')));
|
||||
OC_App::registerPersonal('calendar', 'settings');
|
||||
OC_Search::registerProvider('OC_Search_Provider_Calendar');
|
|
@ -25,7 +25,7 @@ $nodes = array(
|
|||
|
||||
// Fire up server
|
||||
$server = new Sabre_DAV_Server($nodes);
|
||||
$server->setBaseUri(OC::$WEBROOT.'/apps/calendar/caldav.php');
|
||||
$server->setBaseUri(OC::$APPSWEBROOT.'/apps/calendar/caldav.php');
|
||||
// Add plugins
|
||||
$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud'));
|
||||
$server->addPlugin(new Sabre_CalDAV_Plugin());
|
||||
|
|
|
@ -9,16 +9,20 @@
|
|||
require_once ('../../lib/base.php');
|
||||
OC_Util::checkLoggedIn();
|
||||
OC_Util::checkAppEnabled('calendar');
|
||||
|
||||
// Create default calendar ...
|
||||
$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1);
|
||||
if( count($calendars) == 0){
|
||||
OC_Calendar_Calendar::addCalendar(OC_User::getUser(),'Default calendar');
|
||||
$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1);
|
||||
}
|
||||
|
||||
$eventSources = array();
|
||||
foreach($calendars as $calendar){
|
||||
$eventSources[] = OC_Calendar_Calendar::getEventSourceInfo($calendar);
|
||||
}
|
||||
OC_Hook::emit('OC_Calendar', 'getSources', array('sources' => &$eventSources));
|
||||
|
||||
//Fix currentview for fullcalendar
|
||||
if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month') == "oneweekview"){
|
||||
OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "agendaWeek");
|
||||
|
|
|
@ -73,6 +73,9 @@ Calendar={
|
|||
}
|
||||
},
|
||||
editEvent:function(calEvent, jsEvent, view){
|
||||
if (calEvent.editable == false || calEvent.source.editable == false) {
|
||||
return;
|
||||
}
|
||||
var id = calEvent.id;
|
||||
if($('#event').dialog('isOpen') == true){
|
||||
// TODO: save event
|
||||
|
@ -214,7 +217,7 @@ Calendar={
|
|||
},
|
||||
initScroll:function(){
|
||||
if(window.addEventListener)
|
||||
document.addEventListener('DOMMouseScroll', Calendar.UI.scrollCalendar);
|
||||
document.addEventListener('DOMMouseScroll', Calendar.UI.scrollCalendar, false);
|
||||
//}else{
|
||||
document.onmousewheel = Calendar.UI.scrollCalendar;
|
||||
//}
|
||||
|
@ -661,7 +664,7 @@ $(document).ready(function(){
|
|||
Calendar.UI.initScroll();
|
||||
$('#calendar_holder').fullCalendar({
|
||||
header: false,
|
||||
firstDay: 1,
|
||||
firstDay: firstDay,
|
||||
editable: true,
|
||||
defaultView: defaultView,
|
||||
timeFormat: {
|
||||
|
|
|
@ -10,7 +10,6 @@ if (navigator.geolocation) {
|
|||
function(data){
|
||||
if (data.status == 'success' && typeof(data.message) != 'undefined'){
|
||||
$('#notification').html(data.message);
|
||||
$('#notification').attr('title', 'CC BY 3.0 by Geonames.org');
|
||||
$('#notification').slideDown();
|
||||
window.setTimeout(function(){$('#notification').slideUp();}, 5000);
|
||||
}else{
|
||||
|
|
|
@ -17,6 +17,14 @@ $(document).ready(function(){
|
|||
}
|
||||
});
|
||||
});
|
||||
$('#firstday').change( function(){
|
||||
var data = $('#firstday').serialize();
|
||||
$.post( OC.filePath('calendar', 'ajax/settings', 'setfirstday.php'), data, function(data){
|
||||
if(data == 'error'){
|
||||
console.log('saving firstday failed');
|
||||
}
|
||||
});
|
||||
});
|
||||
$('#timezonedetection').change( function(){
|
||||
var post = $('#timezonedetection').serialize();
|
||||
$.post( OC.filePath('calendar', 'ajax/settings', 'timezonedetection.php'), post, function(data){
|
||||
|
@ -32,4 +40,8 @@ $(document).ready(function(){
|
|||
$('#timezonedetection').attr('checked', 'checked');
|
||||
}
|
||||
});
|
||||
$.getJSON(OC.filePath('calendar', 'ajax/settings', 'getfirstday.php'), function(jsondata, status) {
|
||||
$('#' + jsondata.firstday).attr('selected',true);
|
||||
$('#firstday').chosen();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -240,9 +240,10 @@ class OC_Calendar_Calendar{
|
|||
'#9fc6e7', // "light blue"
|
||||
);
|
||||
}
|
||||
|
||||
public static function getEventSourceInfo($calendar){
|
||||
return array(
|
||||
'url' => 'ajax/events.php?calendar_id='.$calendar['id'],
|
||||
'url' => OC_Helper::linkTo('calendar', 'ajax/events.php').'?calendar_id='.$calendar['id'],
|
||||
'backgroundColor' => $calendar['calendarcolor'],
|
||||
'borderColor' => '#888',
|
||||
'textColor' => 'black',
|
||||
|
|
|
@ -17,11 +17,24 @@ class OC_Calendar_Hooks{
|
|||
*/
|
||||
public static function deleteUser($parameters) {
|
||||
$calendars = OC_Calendar_Calendar::allCalendars($parameters['uid']);
|
||||
|
||||
|
||||
foreach($calendars as $calendar) {
|
||||
OC_Calendar_Calendar::deleteCalendar($calendar['id']);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds the CardDAV resource to the DAV server
|
||||
* @param paramters parameters from initialize-Hook
|
||||
* @return array
|
||||
*/
|
||||
public static function initializeCalDAV($parameters){
|
||||
// We need a backend, the root node and the caldav plugin
|
||||
$parameters['backends']['caldav'] = new OC_Connector_Sabre_CalDAV();
|
||||
$parameters['nodes'][] = new Sabre_CalDAV_CalendarRootNode($parameters['backends']['principal'], $parameters['backends']['caldav']);
|
||||
$parameters['plugins'][] = new Sabre_CalDAV_Plugin();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -96,8 +96,7 @@ class OC_Calendar_Object{
|
|||
list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object);
|
||||
|
||||
if(is_null($uid)){
|
||||
$uid = self::createUID();
|
||||
$object->add('UID',$uid);
|
||||
$object->setUID();
|
||||
$data = $object->serialize();
|
||||
}
|
||||
|
||||
|
@ -208,14 +207,6 @@ class OC_Calendar_Object{
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Creates a UID
|
||||
* @return string
|
||||
*/
|
||||
protected static function createUID(){
|
||||
return substr(md5(rand().time()),0,10);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Extracts data from a vObject-Object
|
||||
* @param Sabre_VObject $object
|
||||
|
@ -309,6 +300,8 @@ class OC_Calendar_Object{
|
|||
$dtend = $vevent->DTEND;
|
||||
}else{
|
||||
$dtend = clone $vevent->DTSTART;
|
||||
// clone creates a shallow copy, also clone DateTime
|
||||
$dtend->setDateTime(clone $dtend->getDateTime(), $dtend->getDateType());
|
||||
if ($vevent->DURATION){
|
||||
$duration = strval($vevent->DURATION);
|
||||
$invert = 0;
|
||||
|
@ -817,4 +810,4 @@ class OC_Calendar_Object{
|
|||
|
||||
return $vcalendar;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
class OC_Search_Provider_Calendar extends OC_Search_Provider{
|
||||
function search($query){
|
||||
class OC_Search_Provider_Calendar implements OC_Search_Provider{
|
||||
static function search($query){
|
||||
$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1);
|
||||
if(count($calendars)==0 || !OC_App::isEnabled('calendar')){
|
||||
//return false;
|
||||
|
@ -44,4 +44,3 @@ class OC_Search_Provider_Calendar extends OC_Search_Provider{
|
|||
return $results;
|
||||
}
|
||||
}
|
||||
new OC_Search_Provider_Calendar();
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
var missing_field_startsbeforeends = '<?php echo addslashes($l->t('The event ends before it starts')) ?>';
|
||||
var missing_field_dberror = '<?php echo addslashes($l->t('There was a database fail')) ?>';
|
||||
var totalurl = '<?php echo OC_Helper::linkToAbsolute('calendar', 'caldav.php'); ?>/calendars';
|
||||
var firstDay = '<?php echo (OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'firstday', 'mo') == 'mo' ? '1' : '0'); ?>';
|
||||
$(document).ready(function() {
|
||||
<?php
|
||||
if(array_key_exists('showevent', $_)){
|
||||
|
|
|
@ -31,12 +31,19 @@
|
|||
</select><input type="checkbox" name="timezonedetection" id="timezonedetection"><label for="timezonedetection"><?php echo $l->t('Check always for changes of the timezone'); ?></label></td></tr>
|
||||
|
||||
<tr><td><label for="timeformat" class="bold"><?php echo $l->t('Timeformat');?></label></td><td>
|
||||
<select style="display: none;" id="timeformat" title="<?php echo "timeformat"; ?>" name="timeformat">
|
||||
<select style="display: none; width: 60px;" id="timeformat" title="<?php echo "timeformat"; ?>" name="timeformat">
|
||||
<option value="24" id="24h"><?php echo $l->t("24h"); ?></option>
|
||||
<option value="ampm" id="ampm"><?php echo $l->t("12h"); ?></option>
|
||||
</select>
|
||||
</td></tr>
|
||||
|
||||
<tr><td><label for="firstday" class="bold"><?php echo $l->t('First day of the week');?></label></td><td>
|
||||
<select style="display: none;" id="firstday" title="<?php echo "First day"; ?>" name="firstday">
|
||||
<option value="mo" id="mo"><?php echo $l->t("Monday"); ?></option>
|
||||
<option value="su" id="su"><?php echo $l->t("Sunday"); ?></option>
|
||||
</select>
|
||||
</td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
<?php echo $l->t('Calendar CalDAV syncing address:');?>
|
||||
|
|
|
@ -1,103 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Addressbook
|
||||
*
|
||||
* @author Jakob Sack
|
||||
* @copyright 2011 Jakob Sack mail@jakobsack.de
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
// Init owncloud
|
||||
require_once('../../../lib/base.php');
|
||||
function bailOut($msg) {
|
||||
OC_JSON::error(array('data' => array('message' => $msg)));
|
||||
OC_Log::write('contacts','ajax/addcard.php: '.$msg, OC_Log::DEBUG);
|
||||
exit();
|
||||
}
|
||||
|
||||
// Check if we are a user
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
$aid = $_POST['id'];
|
||||
OC_Contacts_App::getAddressbook( $aid ); // is owner access check
|
||||
|
||||
$fn = trim($_POST['fn']);
|
||||
$values = $_POST['value'];
|
||||
$parameters = $_POST['parameters'];
|
||||
|
||||
$vcard = new OC_VObject('VCARD');
|
||||
$vcard->setUID();
|
||||
|
||||
$n = isset($values['N'][0])?trim($values['N'][0]).';':';';
|
||||
$n .= isset($values['N'][1])?trim($values['N'][1]).';':';';
|
||||
$n .= isset($values['N'][2])?trim($values['N'][2]).';;':';;';
|
||||
|
||||
if(!$fn || ($n == ';;;;')) {
|
||||
bailOut('You have to enter both the extended name and the display name.');
|
||||
}
|
||||
|
||||
$vcard->setString('N',$n);
|
||||
$vcard->setString('FN',$fn);
|
||||
|
||||
// Data to add ...
|
||||
$add = array('TEL', 'EMAIL', 'ORG');
|
||||
$address = false;
|
||||
for($i = 0; $i < 7; $i++){
|
||||
if( isset($values['ADR'][$i] ) && $values['ADR'][$i]) $address = true;
|
||||
}
|
||||
if( $address ) $add[] = 'ADR';
|
||||
|
||||
// Add data
|
||||
foreach( $add as $propname){
|
||||
if( !( isset( $values[$propname] ) && $values[$propname] )){
|
||||
continue;
|
||||
}
|
||||
$value = $values[$propname];
|
||||
if( isset( $parameters[$propname] ) && count( $parameters[$propname] )){
|
||||
$prop_parameters = $parameters[$propname];
|
||||
} else {
|
||||
$prop_parameters = array();
|
||||
}
|
||||
if(is_array($value)){
|
||||
ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form!
|
||||
$value = OC_VObject::escapeSemicolons($value);
|
||||
}
|
||||
$vcard->addProperty($propname, strip_tags($value)); //, $prop_parameters);
|
||||
$line = count($vcard->children) - 1;
|
||||
foreach ($prop_parameters as $key=>$element) {
|
||||
if(is_array($element) && strtoupper($key) == 'TYPE') {
|
||||
// FIXME: Maybe this doesn't only apply for TYPE?
|
||||
// And it probably shouldn't be done here anyways :-/
|
||||
foreach($element as $e){
|
||||
if($e != '' && !is_null($e)){
|
||||
$vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key,$e);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key,$element);
|
||||
}
|
||||
}
|
||||
}
|
||||
$id = OC_Contacts_VCard::add($aid,$vcard->serialize());
|
||||
if(!$id) {
|
||||
OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('There was an error adding the contact.'))));
|
||||
OC_Log::write('contacts','ajax/addcard.php: Recieved non-positive ID on adding card: '.$id, OC_Log::ERROR);
|
||||
exit();
|
||||
}
|
||||
|
||||
// NOTE: Why is this in OC_Contacts_App?
|
||||
OC_Contacts_App::renderDetails($id, $vcard);
|
|
@ -52,7 +52,7 @@ $vcard->setUID();
|
|||
$vcard->setString('FN',$fn);
|
||||
$vcard->setString('N',$n);
|
||||
|
||||
$id = OC_Contacts_VCard::add($aid,$vcard->serialize());
|
||||
$id = OC_Contacts_VCard::add($aid,$vcard);
|
||||
if(!$id) {
|
||||
OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('There was an error adding the contact.'))));
|
||||
OC_Log::write('contacts','ajax/addcontact.php: Recieved non-positive ID on adding card: '.$id, OC_Log::ERROR);
|
||||
|
|
|
@ -27,14 +27,16 @@ require_once('../../../lib/base.php');
|
|||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
$id = $_POST['id'];
|
||||
$vcard = OC_Contacts_App::getContactVCard( $id );
|
||||
$id = isset($_POST['id'])?$_POST['id']:null;
|
||||
$name = isset($_POST['name'])?$_POST['name']:null;
|
||||
$value = isset($_POST['value'])?$_POST['value']:null;
|
||||
$parameters = isset($_POST['parameters'])?$_POST['parameters']:array();
|
||||
|
||||
$vcard = OC_Contacts_App::getContactVCard($id);
|
||||
|
||||
$name = $_POST['name'];
|
||||
$value = $_POST['value'];
|
||||
if(!is_array($value)){
|
||||
$value = trim($value);
|
||||
if(!$value && in_array($name, array('TEL', 'EMAIL', 'ORG', 'BDAY', 'NICKNAME'))) {
|
||||
if(!$value && in_array($name, array('TEL', 'EMAIL', 'ORG', 'BDAY', 'NICKNAME', 'NOTE'))) {
|
||||
OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Cannot add empty property.'))));
|
||||
exit();
|
||||
}
|
||||
|
@ -51,7 +53,6 @@ if(!is_array($value)){
|
|||
exit();
|
||||
}
|
||||
}
|
||||
$parameters = isset($_POST['parameters']) ? $_POST['parameters'] : array();
|
||||
|
||||
// Prevent setting a duplicate entry
|
||||
$current = $vcard->select($name);
|
||||
|
@ -82,7 +83,9 @@ switch($name) {
|
|||
}
|
||||
case 'N':
|
||||
case 'ORG':
|
||||
case 'NOTE':
|
||||
case 'NICKNAME':
|
||||
// TODO: Escape commas and semicolons.
|
||||
break;
|
||||
case 'EMAIL':
|
||||
$value = strtolower($value);
|
||||
|
@ -113,7 +116,7 @@ foreach ($parameters as $key=>$element) {
|
|||
}
|
||||
$checksum = md5($vcard->children[$line]->serialize());
|
||||
|
||||
if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) {
|
||||
if(!OC_Contacts_VCard::edit($id,$vcard)) {
|
||||
OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error adding contact property.'))));
|
||||
OC_Log::write('contacts','ajax/addproperty.php: Error updating contact property: '.$name, OC_Log::ERROR);
|
||||
exit();
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Thomas Tanghus <thomas@tanghus.net>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
require_once('../../../../lib/base.php');
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
$id = isset($_GET['id'])?$_GET['id']:null;
|
||||
if(is_null($id)) {
|
||||
OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('No ID provided'))));
|
||||
exit();
|
||||
}
|
||||
$vcard = OC_Contacts_App::getContactVCard( $id );
|
||||
foreach($vcard->children as $property){
|
||||
//OC_Log::write('contacts','ajax/categories/checksumfor.php: '.$property->name, OC_Log::DEBUG);
|
||||
if($property->name == 'CATEGORIES') {
|
||||
$checksum = md5($property->serialize());
|
||||
OC_JSON::success(array('data' => array('value'=>$property->value, 'checksum'=>$checksum)));
|
||||
exit();
|
||||
}
|
||||
}
|
||||
OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error setting checksum.'))));
|
||||
?>
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Thomas Tanghus <thomas@tanghus.net>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
require_once('../../../../lib/base.php');
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
foreach ($_POST as $key=>$element) {
|
||||
debug('_POST: '.$key.'=>'.print_r($element, true));
|
||||
}
|
||||
|
||||
function bailOut($msg) {
|
||||
OC_JSON::error(array('data' => array('message' => $msg)));
|
||||
OC_Log::write('contacts','ajax/categories/delete.php: '.$msg, OC_Log::DEBUG);
|
||||
exit();
|
||||
}
|
||||
function debug($msg) {
|
||||
OC_Log::write('contacts','ajax/categories/delete.php: '.$msg, OC_Log::DEBUG);
|
||||
}
|
||||
|
||||
$categories = isset($_POST['categories'])?$_POST['categories']:null;
|
||||
|
||||
if(is_null($categories)) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('No categories selected for deletion.'));
|
||||
}
|
||||
|
||||
debug(print_r($categories, true));
|
||||
|
||||
$addressbooks = OC_Contacts_Addressbook::all(OC_User::getUser());
|
||||
if(count($addressbooks) == 0) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('No address books found.'));
|
||||
}
|
||||
$addressbookids = array();
|
||||
foreach($addressbooks as $addressbook) {
|
||||
$addressbookids[] = $addressbook['id'];
|
||||
}
|
||||
$contacts = OC_Contacts_VCard::all($addressbookids);
|
||||
if(count($contacts) == 0) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('No contacts found.'));
|
||||
}
|
||||
|
||||
$cards = array();
|
||||
foreach($contacts as $contact) {
|
||||
$cards[] = array($contact['id'], $contact['carddata']);
|
||||
}
|
||||
|
||||
debug('Before delete: '.print_r($categories, true));
|
||||
|
||||
$catman = new OC_VCategories('contacts');
|
||||
$catman->delete($categories, $cards);
|
||||
debug('After delete: '.print_r($catman->categories(), true));
|
||||
OC_Contacts_VCard::updateDataByID($cards);
|
||||
OC_JSON::success(array('data' => array('categories'=>$catman->categories())));
|
||||
|
||||
?>
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Thomas Tanghus <thomas@tanghus.net>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
require_once('../../../../lib/base.php');
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
$categories = OC_Contacts_App::$categories->categories();
|
||||
|
||||
OC_JSON::success(array('data' => array('categories'=>$categories)));
|
||||
|
||||
?>
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Thomas Tanghus <thomas@tanghus.net>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
require_once('../../../../lib/base.php');
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
foreach ($_POST as $key=>$element) {
|
||||
debug('_POST: '.$key.'=>'.print_r($element, true));
|
||||
}
|
||||
|
||||
function bailOut($msg) {
|
||||
OC_JSON::error(array('data' => array('message' => $msg)));
|
||||
OC_Log::write('contacts','ajax/categories/rescan.php: '.$msg, OC_Log::DEBUG);
|
||||
exit();
|
||||
}
|
||||
function debug($msg) {
|
||||
OC_Log::write('contacts','ajax/categories/rescan.php: '.$msg, OC_Log::DEBUG);
|
||||
}
|
||||
|
||||
$addressbooks = OC_Contacts_Addressbook::all(OC_User::getUser());
|
||||
if(count($addressbooks) == 0) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('No address books found.'));
|
||||
}
|
||||
$addressbookids = array();
|
||||
foreach($addressbooks as $addressbook) {
|
||||
$addressbookids[] = $addressbook['id'];
|
||||
}
|
||||
$contacts = OC_Contacts_VCard::all($addressbookids);
|
||||
if(count($contacts) == 0) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('No contacts found.'));
|
||||
}
|
||||
|
||||
$cards = array();
|
||||
foreach($contacts as $contact) {
|
||||
$cards[] = $contact['carddata'];
|
||||
}
|
||||
|
||||
OC_Contacts_App::$categories->rescan($cards);
|
||||
$categories = OC_Contacts_App::$categories->categories();
|
||||
|
||||
OC_JSON::success(array('data' => array('categories'=>$categories)));
|
||||
|
||||
?>
|
|
@ -71,5 +71,5 @@ if(isset($details['PHOTO'])) {
|
|||
$details['PHOTO'] = false;
|
||||
}
|
||||
$details['id'] = $id;
|
||||
|
||||
OC_Contacts_App::setLastModifiedHeader($vcard);
|
||||
OC_JSON::success(array('data' => $details));
|
||||
|
|
|
@ -39,7 +39,7 @@ if(is_null($line)){
|
|||
|
||||
unset($vcard->children[$line]);
|
||||
|
||||
if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) {
|
||||
if(!OC_Contacts_VCard::edit($id,$vcard)) {
|
||||
OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error deleting contact property.'))));
|
||||
OC_Log::write('contacts','ajax/deleteproperty.php: Error deleting contact property', OC_Log::ERROR);
|
||||
exit();
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
/**
|
||||
* ownCloud - Addressbook
|
||||
*
|
||||
* @author Jakob Sack
|
||||
* @copyright 2011 Jakob Sack mail@jakobsack.de
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2012 Thomas Tanghus <thomas@tanghus.net>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
@ -22,31 +22,38 @@
|
|||
|
||||
// Init owncloud
|
||||
require_once('../../../lib/base.php');
|
||||
function bailOut($msg) {
|
||||
OC_JSON::error(array('data' => array('message' => $msg)));
|
||||
OC_Log::write('contacts','ajax/loadcard.php: '.$msg, OC_Log::DEBUG);
|
||||
exit();
|
||||
}
|
||||
function debug($msg) {
|
||||
OC_Log::write('contacts','ajax/loadcard.php: '.$msg, OC_Log::DEBUG);
|
||||
}
|
||||
// foreach ($_POST as $key=>$element) {
|
||||
// debug('_POST: '.$key.'=>'.$element);
|
||||
// }
|
||||
|
||||
// Check if we are a user
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
$id = $_GET['id'];
|
||||
$checksum = $_GET['checksum'];
|
||||
|
||||
$vcard = OC_Contacts_App::getContactVCard( $id );
|
||||
|
||||
$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum);
|
||||
if(is_null($line)){
|
||||
OC_JSON::error(array('data' => array( 'message' => OC_Contacts_App::$l10n->t('Information about vCard is incorrect. Please reload the page.'))));
|
||||
exit();
|
||||
}
|
||||
$upload_max_filesize = OC_Helper::computerFileSize(ini_get('upload_max_filesize'));
|
||||
$post_max_size = OC_Helper::computerFileSize(ini_get('post_max_size'));
|
||||
$maxUploadFilesize = min($upload_max_filesize, $post_max_size);
|
||||
|
||||
$freeSpace=OC_Filesystem::free_space('/');
|
||||
$freeSpace=max($freeSpace,0);
|
||||
$maxUploadFilesize = min($maxUploadFilesize ,$freeSpace);
|
||||
$adr_types = OC_Contacts_App::getTypesOfProperty('ADR');
|
||||
$phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
|
||||
|
||||
$tmpl = new OC_Template('contacts','part.setpropertyform');
|
||||
$tmpl->assign('id',$id);
|
||||
$tmpl->assign('checksum',$checksum);
|
||||
$tmpl->assign('property',OC_Contacts_VCard::structureProperty($vcard->children[$line]));
|
||||
$tmpl = new OC_Template('contacts','part.contact');
|
||||
$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize);
|
||||
$tmpl->assign('uploadMaxHumanFilesize', OC_Helper::humanFileSize($maxUploadFilesize));
|
||||
$tmpl->assign('adr_types',$adr_types);
|
||||
$tmpl->assign('phone_types',$phone_types);
|
||||
$tmpl->assign('id','');
|
||||
$page = $tmpl->fetchPage();
|
||||
|
||||
OC_JSON::success(array('data' => array( 'page' => $page )));
|
|
@ -18,8 +18,6 @@
|
|||
* 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/>.
|
||||
*
|
||||
* TODO: Translatable strings.
|
||||
* Remember to delete tmp file at some point.
|
||||
*/
|
||||
// Init owncloud
|
||||
require_once('../../../lib/base.php');
|
||||
|
@ -33,7 +31,7 @@ OC_JSON::checkAppEnabled('contacts');
|
|||
|
||||
function bailOut($msg) {
|
||||
OC_JSON::error(array('data' => array('message' => $msg)));
|
||||
OC_Log::write('contacts','ajax/savecrop.php: '.$msg, OC_Log::DEBUG);
|
||||
OC_Log::write('contacts','ajax/loadphoto.php: '.$msg, OC_Log::DEBUG);
|
||||
exit();
|
||||
}
|
||||
|
||||
|
@ -42,11 +40,20 @@ $image = null;
|
|||
$id = isset($_GET['id']) ? $_GET['id'] : '';
|
||||
|
||||
if($id == '') {
|
||||
bailOut('Missing contact id.');
|
||||
bailOut(OC_Contacts_App::$l10n->t('Missing contact id.'));
|
||||
}
|
||||
|
||||
$checksum = '';
|
||||
$vcard = OC_Contacts_App::getContactVCard( $id );
|
||||
foreach($vcard->children as $property){
|
||||
if($property->name == 'PHOTO') {
|
||||
$checksum = md5($property->serialize());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$tmpl = new OC_TEMPLATE("contacts", "part.contactphoto");
|
||||
$tmpl->assign('id', $id);
|
||||
$page = $tmpl->fetchPage();
|
||||
OC_JSON::success(array('data' => array('page'=>$page)));
|
||||
OC_JSON::success(array('data' => array('page'=>$page, 'checksum'=>$checksum)));
|
||||
?>
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
require_once('../../../lib/base.php');
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
$output = new OC_TEMPLATE("contacts", "part.messagebox");
|
||||
$output -> printpage();
|
||||
?>
|
|
@ -95,7 +95,7 @@ if(file_exists($tmp_path)) {
|
|||
OC_Log::write('contacts','savecrop.php: files: Adding PHOTO property.', OC_Log::DEBUG);
|
||||
$card->addProperty('PHOTO', $image->__toString(), array('ENCODING' => 'b', 'TYPE' => $image->mimeType()));
|
||||
}
|
||||
if(!OC_Contacts_VCard::edit($id,$card->serialize())) {
|
||||
if(!OC_Contacts_VCard::edit($id,$card)) {
|
||||
bailOut('Error saving contact.');
|
||||
}
|
||||
unlink($tmpfname);
|
||||
|
@ -104,6 +104,7 @@ if(file_exists($tmp_path)) {
|
|||
$tmpl->assign('tmp_path', $tmpfname);
|
||||
$tmpl->assign('mime', $image->mimeType());
|
||||
$tmpl->assign('id', $id);
|
||||
$tmpl->assign('refresh', true);
|
||||
$tmpl->assign('width', $image->width());
|
||||
$tmpl->assign('height', $image->height());
|
||||
$page = $tmpl->fetchPage();
|
||||
|
|
|
@ -36,7 +36,7 @@ function debug($msg) {
|
|||
OC_Log::write('contacts','ajax/saveproperty.php: '.$msg, OC_Log::DEBUG);
|
||||
}
|
||||
foreach ($_POST as $key=>$element) {
|
||||
debug('_POST: '.$key.'=>'.$element);
|
||||
debug('_POST: '.$key.'=>'.print_r($element, true));
|
||||
}
|
||||
|
||||
$id = isset($_POST['id'])?$_POST['id']:null;
|
||||
|
@ -51,12 +51,8 @@ $checksum = isset($_POST['checksum'])?$_POST['checksum']:null;
|
|||
// }
|
||||
// }
|
||||
|
||||
if(is_array($value)){
|
||||
$value = array_map('strip_tags', $value);
|
||||
ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form!
|
||||
$value = OC_VObject::escapeSemicolons($value);
|
||||
} else {
|
||||
$value = trim(strip_tags($value));
|
||||
if(!$name) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('element name is not set.'));
|
||||
}
|
||||
if(!$id) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('id is not set.'));
|
||||
|
@ -64,14 +60,22 @@ if(!$id) {
|
|||
if(!$checksum) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('checksum is not set.'));
|
||||
}
|
||||
if(!$name) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('element name is not set.'));
|
||||
if(is_array($value)){
|
||||
$value = array_map('strip_tags', $value);
|
||||
ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form!
|
||||
//if($name == 'CATEGORIES') {
|
||||
// $value = OC_Contacts_VCard::escapeDelimiters($value, ',');
|
||||
//} else {
|
||||
$value = OC_Contacts_VCard::escapeDelimiters($value, ';');
|
||||
//}
|
||||
} else {
|
||||
$value = trim(strip_tags($value));
|
||||
}
|
||||
|
||||
$vcard = OC_Contacts_App::getContactVCard( $id );
|
||||
$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum);
|
||||
if(is_null($line)) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('Information about vCard is incorrect. Please reload the page.'.$checksum.' "'.$line.'"'));
|
||||
bailOut(OC_Contacts_App::$l10n->t('Information about vCard is incorrect. Please reload the page: ').$checksum);
|
||||
}
|
||||
$element = $vcard->children[$line]->name;
|
||||
|
||||
|
@ -91,7 +95,9 @@ switch($element) {
|
|||
}
|
||||
case 'N':
|
||||
case 'ORG':
|
||||
case 'NOTE':
|
||||
case 'NICKNAME':
|
||||
case 'CATEGORIES':
|
||||
debug('Setting string:'.$name.' '.$value);
|
||||
$vcard->setString($name, $value);
|
||||
break;
|
||||
|
@ -122,13 +128,9 @@ switch($element) {
|
|||
$checksum = md5($vcard->children[$line]->serialize());
|
||||
debug('New checksum: '.$checksum);
|
||||
|
||||
if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) {
|
||||
OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error updating contact property.'))));
|
||||
OC_Log::write('contacts','ajax/setproperty.php: Error updating contact property: '.$value, OC_Log::ERROR);
|
||||
if(!OC_Contacts_VCard::edit($id,$vcard)) {
|
||||
bailOut(OC_Contacts_App::$l10n->t('Error updating contact property.'));
|
||||
exit();
|
||||
}
|
||||
|
||||
//$adr_types = OC_Contacts_App::getTypesOfProperty('ADR');
|
||||
//$phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
|
||||
|
||||
OC_JSON::success(array('data' => array( 'line' => $line, 'checksum' => $checksum, 'oldchecksum' => $_POST['checksum'] )));
|
||||
|
|
|
@ -1,106 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Addressbook
|
||||
*
|
||||
* @author Jakob Sack
|
||||
* @copyright 2011 Jakob Sack mail@jakobsack.de
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
// Init owncloud
|
||||
require_once('../../../lib/base.php');
|
||||
|
||||
// Check if we are a user
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
$id = $_POST['id'];
|
||||
$checksum = $_POST['checksum'];
|
||||
|
||||
$vcard = OC_Contacts_App::getContactVCard( $id );
|
||||
$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum);
|
||||
|
||||
// Set the value
|
||||
$value = $_POST['value'];
|
||||
if(is_array($value)){
|
||||
ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form!
|
||||
foreach(array_keys($value) as $key) {
|
||||
OC_Log::write('contacts','ajax/setproperty.php: setting: '.$key.': '.$value[$key], OC_Log::DEBUG);
|
||||
}
|
||||
$value = OC_VObject::escapeSemicolons($value);
|
||||
}
|
||||
OC_Log::write('contacts','ajax/setproperty.php: setting: '.$vcard->children[$line]->name.': '.$value, OC_Log::DEBUG);
|
||||
$vcard->children[$line]->setValue(strip_tags($value));
|
||||
|
||||
// Add parameters
|
||||
$postparameters = isset($_POST['parameters'])?$_POST['parameters']:array();
|
||||
if ($vcard->children[$line]->name == 'TEL' && !array_key_exists('TYPE', $postparameters)){
|
||||
$postparameters['TYPE']='';
|
||||
}
|
||||
for($i=0;$i<count($vcard->children[$line]->parameters);$i++){
|
||||
$name = $vcard->children[$line]->parameters[$i]->name;
|
||||
if(array_key_exists($name,$postparameters)){
|
||||
if($postparameters[$name] == '' || is_null($postparameters[$name])){
|
||||
unset($vcard->children[$line]->parameters[$i]);
|
||||
}
|
||||
else{
|
||||
unset($vcard->children[$line][$name]);
|
||||
$values = $postparameters[$name];
|
||||
if (!is_array($values)){
|
||||
$values = array($values);
|
||||
}
|
||||
foreach($values as $value){
|
||||
$vcard->children[$line]->add($name, $value);
|
||||
}
|
||||
}
|
||||
unset($postparameters[$name]);
|
||||
}
|
||||
}
|
||||
$missingparameters = array_keys($postparameters);
|
||||
foreach($missingparameters as $i){
|
||||
if(!$postparameters[$i] == '' && !is_null($postparameters[$i])){
|
||||
$vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($i,$postparameters[$i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Do checksum and be happy
|
||||
// NOTE: This checksum is not used..?
|
||||
$checksum = md5($vcard->children[$line]->serialize());
|
||||
|
||||
if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) {
|
||||
OC_JSON::error(array('data' => array('message' => $l->t('Error updating contact property.'))));
|
||||
OC_Log::write('contacts','ajax/setproperty.php: Error updating contact property: '.$value, OC_Log::ERROR);
|
||||
exit();
|
||||
}
|
||||
|
||||
$adr_types = OC_Contacts_App::getTypesOfProperty('ADR');
|
||||
$phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
|
||||
|
||||
if ($vcard->children[$line]->name == 'FN'){
|
||||
$tmpl = new OC_Template('contacts','part.property.FN');
|
||||
}
|
||||
elseif ($vcard->children[$line]->name == 'N'){
|
||||
$tmpl = new OC_Template('contacts','part.property.N');
|
||||
}
|
||||
else{
|
||||
$tmpl = new OC_Template('contacts','part.property');
|
||||
}
|
||||
$tmpl->assign('adr_types',$adr_types);
|
||||
$tmpl->assign('phone_types',$phone_types);
|
||||
$tmpl->assign('property',OC_Contacts_VCard::structureProperty($vcard->children[$line],$line));
|
||||
$page = $tmpl->fetchPage();
|
||||
|
||||
OC_JSON::success(array('data' => array( 'page' => $page, 'line' => $line, 'checksum' => $checksum, 'oldchecksum' => $_POST['checksum'] )));
|
|
@ -1,40 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Addressbook
|
||||
*
|
||||
* @author Jakob Sack
|
||||
* @copyright 2011 Jakob Sack mail@jakobsack.de
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
// Init owncloud
|
||||
require_once('../../../lib/base.php');
|
||||
|
||||
// Check if we are a user
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
$adr_types = OC_Contacts_App::getTypesOfProperty('ADR');
|
||||
$phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
|
||||
|
||||
$addressbooks = OC_Contacts_Addressbook::all(OC_USER::getUser());
|
||||
$tmpl = new OC_Template('contacts','part.addcardform');
|
||||
$tmpl->assign('addressbooks',$addressbooks);
|
||||
$tmpl->assign('adr_types',$adr_types);
|
||||
$tmpl->assign('phone_types',$phone_types);
|
||||
$page = $tmpl->fetchPage();
|
||||
|
||||
OC_JSON::success(array('data' => array( 'page' => $page )));
|
|
@ -1,37 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Addressbook
|
||||
*
|
||||
* @author Jakob Sack
|
||||
* @copyright 2011 Jakob Sack mail@jakobsack.de
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
// Init owncloud
|
||||
require_once('../../../lib/base.php');
|
||||
|
||||
// Check if we are a user
|
||||
OC_JSON::checkLoggedIn();
|
||||
OC_JSON::checkAppEnabled('contacts');
|
||||
|
||||
$id = $_GET['id'];
|
||||
$card = OC_Contacts_App::getContactObject( $id );
|
||||
|
||||
$tmpl = new OC_Template('contacts','part.addpropertyform');
|
||||
$tmpl->assign('id',$id);
|
||||
$page = $tmpl->fetchPage();
|
||||
|
||||
OC_JSON::success(array('data' => array( 'page' => $page )));
|
|
@ -4,7 +4,11 @@ OC::$CLASSPATH['OC_Contacts_Addressbook'] = 'apps/contacts/lib/addressbook.php';
|
|||
OC::$CLASSPATH['OC_Contacts_VCard'] = 'apps/contacts/lib/vcard.php';
|
||||
OC::$CLASSPATH['OC_Contacts_Hooks'] = 'apps/contacts/lib/hooks.php';
|
||||
OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/connector_sabre.php';
|
||||
OC::$CLASSPATH['OC_Search_Provider_Contacts'] = 'apps/contacts/lib/search.php';
|
||||
OC_HOOK::connect('OC_User', 'post_deleteUser', 'OC_Contacts_Hooks', 'deleteUser');
|
||||
OC_HOOK::connect('OC_Calendar', 'getEvents', 'OC_Contacts_Hooks', 'getBirthdayEvents');
|
||||
OC_HOOK::connect('OC_Calendar', 'getSources', 'OC_Contacts_Hooks', 'getCalenderSources');
|
||||
OC_Hook::connect('OC_DAV', 'initialize', 'OC_Contacts_Hooks', 'initializeCardDAV');
|
||||
|
||||
OC_App::register( array(
|
||||
'order' => 10,
|
||||
|
@ -21,4 +25,4 @@ OC_App::addNavigationEntry( array(
|
|||
|
||||
OC_APP::registerPersonal('contacts','settings');
|
||||
OC_UTIL::addScript('contacts', 'loader');
|
||||
require_once('apps/contacts/lib/search.php');
|
||||
OC_Search::registerProvider('OC_Search_Provider_Contacts');
|
||||
|
|
|
@ -39,7 +39,7 @@ $nodes = array(
|
|||
|
||||
// Fire up server
|
||||
$server = new Sabre_DAV_Server($nodes);
|
||||
$server->setBaseUri(OC::$WEBROOT.'/apps/contacts/carddav.php');
|
||||
$server->setBaseUri(OC::$APPSWEBROOT.'/apps/contacts/carddav.php');
|
||||
// Add plugins
|
||||
$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud'));
|
||||
$server->addPlugin(new Sabre_CardDAV_Plugin());
|
||||
|
|
|
@ -20,7 +20,8 @@
|
|||
#firstrun { width: 100%; position: absolute; top: 5em; left: 0; text-align: center; font-weight:bold; font-size:1.5em; color:#777; }
|
||||
#firstrun #selections { font-size:0.8em; margin: 2em auto auto auto; clear: both; }
|
||||
|
||||
#card input[type="text"].contacts_property,input[type="email"].contacts_property { width: 16em; }
|
||||
#card input[type="text"].contacts_property,input[type="email"].contacts_property { width: 14em; }
|
||||
.categories { float: left; width: 16em; }
|
||||
#card input[type="text"],input[type="email"],input[type="tel"],input[type="date"], select { background-color: #f8f8f8; border: 0 !important; -webkit-appearance:none !important; -moz-appearance:none !important; -webkit-box-sizing:none !important; -moz-box-sizing:none !important; box-sizing:none !important; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; float: left; }
|
||||
#card input[type="text"]:hover, input[type="text"]:focus, input[type="text"]:active,input[type="email"]:hover,input[type="tel"]:hover,input[type="date"]:hover,input[type="date"],input[type="date"]:hover,input[type="date"]:active,input[type="date"]:active,input[type="date"]:active,input[type="email"]:active,input[type="tel"]:active, select:hover, select:focus, select:active { border: 0 !important; -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; background:#fff; color:#333; border:1px solid #ddd; -moz-box-shadow:0 1px 1px #fff, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; outline:none; float: left; }
|
||||
input[type="text"]:invalid,input[type="email"]:invalid,input[type="tel"]:invalid,input[type="date"]:invalid { background-color: #ffc0c0 !important; }
|
||||
|
@ -68,7 +69,7 @@ dl.form
|
|||
/*background-color: yellow;*/
|
||||
}
|
||||
|
||||
.loading { background: url('../../../core/img/loading.gif') no-repeat center !important;}
|
||||
.loading { background: url('../../../core/img/loading.gif') no-repeat center !important; /*cursor: progress; */ cursor: wait; }
|
||||
|
||||
/*.add { cursor: pointer; width: 25px; height: 25px; margin: 0px; float: right; position:relative; content: "\+"; font-weight: bold; color: #666; font-size: large; bottom: 0px; right: 0px; clear: both; text-align: center; vertical-align: bottom; display: none; }*/
|
||||
|
||||
|
@ -185,4 +186,5 @@ input[type="checkbox"] { width: 20px; height: 20px; vertical-align: bottom; }
|
|||
.propertylist li > input[type="checkbox"],input[type="radio"] { float: left; clear: left; width: 20px; height: 20px; vertical-align: middle; }
|
||||
.propertylist li > select { float: left; max-width: 8em; }
|
||||
.typelist { float: left; max-width: 10em; } /* for multiselect */
|
||||
.addresslist { clear: both; }
|
||||
.addresslist { clear: both; }
|
||||
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
#contacts { padding-left:2px; padding-top: 5px; background: #fff; }
|
||||
#leftcontent a { height: 23px; display: block; margin: 0 0 0 0; padding: 0 0 0 25px; }
|
||||
#chooseaddressbook {margin-right: 170px; float: right;}
|
||||
#contacts_details_name { font-weight:bold;font-size:1.1em;margin-left:25%;}
|
||||
#contacts_details_name_n { font-size:0.8em;margin-left:25%;color:#666;}
|
||||
#contacts_details_photo { margin:.5em 0em .5em 25%; }
|
||||
|
||||
#contacts_deletecard {position:absolute;top:15px;right:25px;}
|
||||
#contacts_downloadcard {position:absolute;top:15px;right:50px;}
|
||||
#contacts_details_list { list-style:none; }
|
||||
#contacts_details_list li { overflow:visible; }
|
||||
#contacts_details_list li p.contacts_property_name { width:25%; float:left;text-align:right;padding-right:0.3em;color:#666; }
|
||||
#contacts_details_list li p.contacts_property_data, #contacts_details_list li ul.contacts_property_data { width:72%;float:left; clear: right; }
|
||||
#contacts_setproperty_button { margin-left:25%; }
|
||||
|
||||
#contacts_addcardform legend,label { font-weight: bold; width: 10em; overflow: ellipsis; }
|
||||
#contacts_addcardform legend { padding-left: 3em; font-size:1.1em; }
|
||||
#contacts_addcardform input[type="text"] { width: 25em; }
|
||||
#contacts_addcardform input[type="email"] { width: 15em; }
|
||||
#contacts_addcardform input[type="tel"] { width: 15em; }
|
||||
|
||||
dl.form { width: 100%; float: left; clear: right; margin: 1em; padding: 0; }
|
||||
.form dt { display: table-cell; clear: left; float: left; min-width: 10em; margin: 0; padding-top: 0.5em; padding-right: 1em;font-weight: bold; text-align:right; vertical-align: text-bottom; bottom: 0px; }
|
||||
.form dd { display: table-cell; clear: right; float: left; min-width: 20em; margin: 0; padding: 0; white-space: nowrap; top: 0px; }
|
||||
.form input { position: relative; width: 20em; }
|
||||
|
||||
.contacts_property_data ul, ol.contacts_property_data { list-style:none; }
|
||||
.contacts_property_data li { overflow: hidden; }
|
||||
.contacts_property_data li label { width:20%; float:left; text-align:right;padding-right:0.3em; }
|
||||
.contacts_property_data input { float:left; }
|
||||
.contacts_property_data li input { width:70%;overflow:hidden; }
|
||||
|
||||
.chzn-container { margin:3px 0 0; }
|
||||
.chzn-container .chzn-choices { border-radius: 0.5em; }
|
||||
.chzn-container.chzn-container-active .chzn-choices { border-bottom-left-radius: 0;border-bottom-right-radius: 0; }
|
||||
.chzn-container .chzn-drop { border-bottom-left-radius: 0.5em;border-bottom-right-radius: 0.5em; }
|
||||
|
|
@ -97,11 +97,15 @@ if(is_writable('import_tmp/')){
|
|||
fclose($progressfopen);
|
||||
}
|
||||
if(count($parts) == 1){
|
||||
OC_Contacts_VCard::add($id, $file);
|
||||
}else{
|
||||
foreach($importready as $import){
|
||||
OC_Contacts_VCard::add($id, $import);
|
||||
$importready = array($file);
|
||||
}
|
||||
foreach($importready as $import){
|
||||
$card = OC_VObject::parse($import);
|
||||
if (!$card) {
|
||||
OC_Log::write('contacts','Import: skipping card. Error parsing VCard: '.$import, OC_Log::ERROR);
|
||||
continue; // Ditch cards that can't be parsed by Sabre.
|
||||
}
|
||||
OC_Contacts_VCard::add($id, $card);
|
||||
}
|
||||
//done the import
|
||||
if(is_writable('import_tmp/')){
|
||||
|
@ -113,4 +117,4 @@ sleep(3);
|
|||
if(is_writable('import_tmp/')){
|
||||
unlink($progressfile);
|
||||
}
|
||||
OC_JSON::success();
|
||||
OC_JSON::success();
|
||||
|
|
|
@ -34,6 +34,7 @@ if(!is_null($id)) {
|
|||
}
|
||||
$property_types = OC_Contacts_App::getAddPropertyOptions();
|
||||
$phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
|
||||
$categories = OC_Contacts_App::$categories->categories();
|
||||
|
||||
$upload_max_filesize = OC_Helper::computerFileSize(ini_get('upload_max_filesize'));
|
||||
$post_max_size = OC_Helper::computerFileSize(ini_get('post_max_size'));
|
||||
|
@ -44,12 +45,14 @@ $freeSpace=max($freeSpace,0);
|
|||
$maxUploadFilesize = min($maxUploadFilesize ,$freeSpace);
|
||||
|
||||
OC_Util::addScript('','jquery.multiselect');
|
||||
OC_Util::addScript('','oc-vcategories');
|
||||
OC_Util::addScript('contacts','contacts');
|
||||
OC_Util::addScript('contacts','jquery.combobox');
|
||||
OC_Util::addScript('contacts','jquery.inview');
|
||||
OC_Util::addScript('contacts','jquery.Jcrop');
|
||||
OC_Util::addScript('contacts','jquery.multi-autocomplete');
|
||||
OC_Util::addStyle('','jquery.multiselect');
|
||||
//OC_Util::addStyle('contacts','styles');
|
||||
OC_Util::addStyle('','oc-vcategories');
|
||||
OC_Util::addStyle('contacts','jquery.combobox');
|
||||
OC_Util::addStyle('contacts','jquery.Jcrop');
|
||||
OC_Util::addStyle('contacts','contacts');
|
||||
|
@ -58,7 +61,9 @@ $tmpl = new OC_Template( "contacts", "index", "user" );
|
|||
$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize);
|
||||
$tmpl->assign('uploadMaxHumanFilesize', OC_Helper::humanFileSize($maxUploadFilesize));
|
||||
$tmpl->assign('property_types',$property_types);
|
||||
$tmpl->assign('categories',OC_Contacts_App::getCategories());
|
||||
$tmpl->assign('phone_types',$phone_types);
|
||||
$tmpl->assign('categories',$categories);
|
||||
$tmpl->assign('addressbooks', $addressbooks);
|
||||
$tmpl->assign('contacts', $contacts);
|
||||
$tmpl->assign('details', $details );
|
||||
|
|
|
@ -10,17 +10,16 @@ String.prototype.strip_tags = function(){
|
|||
return stripped;
|
||||
};
|
||||
|
||||
|
||||
Contacts={
|
||||
UI:{
|
||||
notImplemented:function() {
|
||||
Contacts.UI.messageBox(t('contacts', 'Not implemented'), t('contacts', 'Sorry, this functionality has not been implemented yet'));
|
||||
OC.dialogs.alert(t('contacts', 'Sorry, this functionality has not been implemented yet'), t('contacts', 'Not implemented'));
|
||||
},
|
||||
searchOSM:function(obj) {
|
||||
var adr = Contacts.UI.propertyContainerFor(obj).find('.adr').val();
|
||||
console.log('adr 1: ' + adr);
|
||||
if(adr == undefined) {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'Couldn\'t get a valid address.'));
|
||||
OC.dialogs.alert(t('contacts', 'Couldn\'t get a valid address.'), t('contacts', 'Error'));
|
||||
return;
|
||||
}
|
||||
// FIXME: I suck at regexp. /Tanghus
|
||||
|
@ -48,12 +47,11 @@ Contacts={
|
|||
console.log('uri: ' + uri);
|
||||
var newWindow = window.open(uri,'_blank');
|
||||
newWindow.focus();
|
||||
//Contacts.UI.notImplemented();
|
||||
},
|
||||
mailTo:function(obj) {
|
||||
var adr = Contacts.UI.propertyContainerFor($(obj)).find('input[type="email"]').val().trim();
|
||||
if(adr == '') {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'Please enter an email address.'));
|
||||
OC.dialogs.alert(t('contacts', 'Please enter an email address.'), t('contacts', 'Error'));
|
||||
return;
|
||||
}
|
||||
window.location.href='mailto:' + adr;
|
||||
|
@ -68,7 +66,7 @@ Contacts={
|
|||
return $(obj).parents('.propertycontainer').first().data('element');
|
||||
},
|
||||
showHideContactInfo:function() {
|
||||
var show = ($('#emaillist li[class*="propertycontainer"]').length > 0 || $('#phonelist li[class*="propertycontainer"]').length > 0 || $('#addressdisplay dl[class*="propertycontainer"]').length > 0);
|
||||
var show = ($('#emaillist li.propertycontainer').length > 0 || $('#phonelist li.propertycontainer').length > 0 || $('#addressdisplay dl.propertycontainer').length > 0);
|
||||
console.log('showHideContactInfo: ' + show);
|
||||
if(show) {
|
||||
$('#contact_communication').show();
|
||||
|
@ -82,19 +80,19 @@ Contacts={
|
|||
switch (type) {
|
||||
case 'EMAIL':
|
||||
console.log('emails: '+$('#emaillist>li').length);
|
||||
if($('#emaillist li[class*="propertycontainer"]').length == 0) {
|
||||
if($('#emaillist li.propertycontainer').length == 0) {
|
||||
$('#emails').hide();
|
||||
}
|
||||
break;
|
||||
case 'TEL':
|
||||
console.log('phones: '+$('#phonelist>li').length);
|
||||
if($('#phonelist li[class*="propertycontainer"]').length == 0) {
|
||||
if($('#phonelist li.propertycontainer').length == 0) {
|
||||
$('#phones').hide();
|
||||
}
|
||||
break;
|
||||
case 'ADR':
|
||||
console.log('addresses: '+$('#addressdisplay>dl').length);
|
||||
if($('#addressdisplay dl[class*="propertycontainer"]').length == 0) {
|
||||
if($('#addressdisplay dl.propertycontainer').length == 0) {
|
||||
$('#addresses').hide();
|
||||
}
|
||||
break;
|
||||
|
@ -116,34 +114,6 @@ Contacts={
|
|||
$('#carddav_url').show();
|
||||
$('#carddav_url_close').show();
|
||||
},
|
||||
messageBox:function(title, msg) {
|
||||
if(msg.toLowerCase().indexOf('auth') != -1) {
|
||||
// fugly hack, I know
|
||||
alert(msg);
|
||||
}
|
||||
if($('#messagebox').dialog('isOpen') == true){
|
||||
// NOTE: Do we ever get here?
|
||||
$('#messagebox').dialog('moveToTop');
|
||||
}else{
|
||||
$('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'messagebox.php'), function(){
|
||||
$('#messagebox').dialog(
|
||||
{
|
||||
autoOpen: true,
|
||||
title: title,
|
||||
buttons: [{
|
||||
text: "Ok",
|
||||
click: function() { $(this).dialog("close"); }
|
||||
}],
|
||||
close: function(event, ui) {
|
||||
$(this).dialog('destroy').remove();
|
||||
},
|
||||
open: function(event, ui) {
|
||||
$('#messagebox_msg').html(msg);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
},
|
||||
loadListHandlers:function() {
|
||||
//$('.add,.delete').hide();
|
||||
$('.globe,.mail,.delete,.edit').tipsy();
|
||||
|
@ -182,8 +152,14 @@ Contacts={
|
|||
$('#bday').datepicker({
|
||||
dateFormat : 'dd-mm-yy'
|
||||
});
|
||||
/*$('#categories_value').find('select').multiselect({
|
||||
noneSelectedText: t('contacts', 'Select categories'),
|
||||
header: false,
|
||||
selectedList: 6,
|
||||
classes: 'categories'
|
||||
});*/
|
||||
// Style phone types
|
||||
$('#phonelist').find('select[class*="contacts_property"]').multiselect({
|
||||
$('#phonelist').find('select.contacts_property').multiselect({
|
||||
noneSelectedText: t('contacts', 'Select type'),
|
||||
header: false,
|
||||
selectedList: 4,
|
||||
|
@ -223,6 +199,7 @@ Contacts={
|
|||
click: function() { $(this).dialog('close'); }
|
||||
}
|
||||
] );
|
||||
$('#categories').multiple_autocomplete({source: categories});
|
||||
Contacts.UI.loadListHandlers();
|
||||
},
|
||||
Card:{
|
||||
|
@ -252,12 +229,12 @@ Contacts={
|
|||
if(jsondata.status == 'success'){
|
||||
Contacts.UI.Card.loadContact(jsondata.data);
|
||||
} else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
}
|
||||
} else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -269,7 +246,7 @@ Contacts={
|
|||
$('#rightcontent').data('id','');
|
||||
$('#rightcontent').html(jsondata.data.page);
|
||||
} else {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -309,7 +286,7 @@ Contacts={
|
|||
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
|
@ -318,7 +295,7 @@ Contacts={
|
|||
// TODO: Add to contacts list.
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
|
@ -344,13 +321,13 @@ Contacts={
|
|||
$('#rightcontent').html(jsondata.data.page);
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
|
@ -361,19 +338,29 @@ Contacts={
|
|||
this.data = jsondata;
|
||||
this.id = this.data.id;
|
||||
$('#rightcontent').data('id',this.id);
|
||||
//console.log('loaded: ' + this.data.FN[0]['value']);
|
||||
console.log('loaded: ' + this.data.FN[0]['value']);
|
||||
this.populateNameFields();
|
||||
this.loadCategories();
|
||||
//this.loadCategories();
|
||||
this.loadPhoto();
|
||||
this.loadMails();
|
||||
this.loadPhones();
|
||||
this.loadAddresses();
|
||||
this.loadSingleProperties();
|
||||
// TODO: load NOTE ;-)
|
||||
if(this.data.NOTE) {
|
||||
$('#note').data('checksum', this.data.NOTE[0]['checksum']);
|
||||
$('#note').find('textarea').val(this.data.NOTE[0]['value']);
|
||||
$('#note').show();
|
||||
} else {
|
||||
$('#note').data('checksum', '');
|
||||
$('#note').find('textarea').val('');
|
||||
$('#note').hide();
|
||||
}
|
||||
},
|
||||
loadSingleProperties:function() {
|
||||
var props = ['BDAY', 'NICKNAME', 'ORG'];
|
||||
var props = ['BDAY', 'NICKNAME', 'ORG', 'CATEGORIES'];
|
||||
// Clear all elements
|
||||
$('#ident .propertycontainer[class*="propertycontainer"]').each(function(){
|
||||
$('#ident .propertycontainer').each(function(){
|
||||
if(props.indexOf($(this).data('element')) > -1) {
|
||||
$(this).data('checksum', '');
|
||||
$(this).find('input').val('');
|
||||
|
@ -407,6 +394,12 @@ Contacts={
|
|||
$('#contact_identity').find('#org_label').show();
|
||||
$('#contact_identity').find('#org_value').show();
|
||||
break;
|
||||
case 'CATEGORIES':
|
||||
$('#contact_identity').find('#categories').val(value);
|
||||
$('#contact_identity').find('#categories_value').data('checksum', checksum);
|
||||
$('#contact_identity').find('#categories_label').show();
|
||||
$('#contact_identity').find('#categories_value').show();
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
$('#contacts_propertymenu a[data-type="'+props[prop]+'"]').parent().show();
|
||||
|
@ -424,11 +417,11 @@ Contacts={
|
|||
} else {
|
||||
narray = this.data.N[0]['value'];
|
||||
}
|
||||
this.famname = narray[0];
|
||||
this.givname = narray[1];
|
||||
this.addname = narray[2];
|
||||
this.honpre = narray[3];
|
||||
this.honsuf = narray[4];
|
||||
this.famname = narray[0] || '';
|
||||
this.givname = narray[1] || '';
|
||||
this.addname = narray[2] || '';
|
||||
this.honpre = narray[3] || '';
|
||||
this.honsuf = narray[4] || '';
|
||||
if(this.honpre.length > 0) {
|
||||
this.fullname += this.honpre + ' ';
|
||||
}
|
||||
|
@ -448,6 +441,9 @@ Contacts={
|
|||
$('#fn_select option').remove();
|
||||
$('#fn_select').combobox('value', this.fn);
|
||||
var names = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname];
|
||||
if(this.data.ORG) {
|
||||
names[names.length]=this.data.ORG[0].value;
|
||||
}
|
||||
$.each(names, function(key, value) {
|
||||
$('#fn_select')
|
||||
.append($('<option></option>')
|
||||
|
@ -457,36 +453,79 @@ Contacts={
|
|||
$('#contact_identity').find('*[data-element="FN"]').data('checksum', this.data.FN[0]['checksum']);
|
||||
$('#contact_identity').show();
|
||||
},
|
||||
loadCategories:function(){
|
||||
hasCategory:function(category) {
|
||||
if(this.data.CATEGORIES) {
|
||||
//
|
||||
var categories = this.data.CATEGORIES[0]['value'].split(/,\s*/);
|
||||
for(var c in categories) {
|
||||
var cat = this.data.CATEGORIES[0]['value'][c];
|
||||
console.log('hasCategory: ' + cat + ' === ' + category + '?');
|
||||
if(typeof cat === 'string' && (cat.toUpperCase() === category.toUpperCase())) {
|
||||
console.log('Yes');
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
},
|
||||
categoriesChanged:function(newcategories) { // Categories added/deleted.
|
||||
console.log('categoriesChanged for ' + Contacts.UI.Card.id + ' : ' + newcategories);
|
||||
categories = newcategories;
|
||||
var categorylist = $('#categories_value').find('input');
|
||||
$.getJSON(OC.filePath('contacts', 'ajax', 'categories/categoriesfor.php'),{'id':Contacts.UI.Card.id},function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
console.log('Setting checksum: ' + jsondata.data.checksum + ', value: ' + jsondata.data.value);
|
||||
$('#categories_value').data('checksum', jsondata.data.checksum);
|
||||
categorylist.val(jsondata.data.value);
|
||||
} else {
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
},
|
||||
/*loadCategories:function(){ // On loading contact.
|
||||
var categories = $('#categories_value').find('select');
|
||||
if(this.data.CATEGORIES) {
|
||||
$('#categories_value').data('checksum', this.data.CATEGORIES[0]['checksum']);
|
||||
} else {
|
||||
$('#categories_value').data('checksum', '');
|
||||
}
|
||||
categories.find('option').each(function(){
|
||||
if(Contacts.UI.Card.hasCategory($(this).val())) {
|
||||
$(this).attr('selected', 'selected');
|
||||
} else {
|
||||
$(this).removeAttr('selected');
|
||||
}
|
||||
});
|
||||
categories.multiselect('refresh');
|
||||
},*/
|
||||
editNew:function(){ // add a new contact
|
||||
this.id = ''; this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = '';
|
||||
$.getJSON('ajax/newcontact.php',{},function(jsondata){
|
||||
$.getJSON(OC.filePath('contacts', 'ajax', 'newcontact.php'),{},function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
id = '';
|
||||
$('#rightcontent').data('id','');
|
||||
$('#rightcontent').html(jsondata.data.page);
|
||||
Contacts.UI.Card.editName();
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
} else {
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
},
|
||||
savePropertyInternal:function(name, fields, oldchecksum, checksum){
|
||||
// TODO: Add functionality for new fields.
|
||||
//console.log('savePropertyInternal: ' + name + ', checksum: ' + checksum);
|
||||
//console.log('savePropertyInternal: ' + this.data[name]);
|
||||
console.log('savePropertyInternal: ' + name + ', fields: ' + fields + 'checksum: ' + checksum);
|
||||
console.log('savePropertyInternal: ' + this.data[name]);
|
||||
var multivalue = ['CATEGORIES'];
|
||||
var params = {};
|
||||
var value = undefined;
|
||||
var value = multivalue.indexOf(name) != -1 ? new Array() : undefined;
|
||||
jQuery.each(fields, function(i, field){
|
||||
//.substring(11,'parameters[TYPE][]'.indexOf(']'))
|
||||
if(field.name.substring(0, 5) === 'value') {
|
||||
value = field.value;
|
||||
if(multivalue.indexOf(name) != -1) {
|
||||
value.push(field.value);
|
||||
} else {
|
||||
value = field.value;
|
||||
}
|
||||
} else if(field.name.substring(0, 10) === 'parameters') {
|
||||
var p = field.name.substring(11,'parameters[TYPE][]'.indexOf(']'));
|
||||
if(!(p in params)) {
|
||||
|
@ -506,11 +545,11 @@ Contacts={
|
|||
saveProperty:function(obj){
|
||||
// I couldn't get the selector to filter on 'contacts_property' so I filter by hand here :-/
|
||||
if(!$(obj).hasClass('contacts_property')) {
|
||||
//console.log('Filtering out object.' + obj);
|
||||
console.log('Filtering out object.' + obj);
|
||||
return false;
|
||||
}
|
||||
if($(obj).hasClass('nonempty') && $(obj).val().trim() == '') {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'This property has to be non-empty.'));
|
||||
OC.dialogs.alert(t('contacts', 'This property has to be non-empty.'), t('contacts', 'Error'));
|
||||
return false;
|
||||
}
|
||||
container = $(obj).parents('.propertycontainer').first(); // get the parent holding the metadata.
|
||||
|
@ -518,8 +557,8 @@ Contacts={
|
|||
var checksum = container.data('checksum');
|
||||
var name = container.data('element');
|
||||
console.log('saveProperty: ' + name);
|
||||
var fields = container.find('input[class*="contacts_property"],select[class*="contacts_property"]').serializeArray();
|
||||
var q = container.find('input[class*="contacts_property"],select[class*="contacts_property"]').serialize();
|
||||
var fields = container.find('input.contacts_property,select.contacts_property').serializeArray();
|
||||
var q = container.find('input.contacts_property,select.contacts_property,textarea.contacts_property').serialize();
|
||||
if(q == '' || q == undefined) {
|
||||
console.log('Couldn\'t serialize elements.');
|
||||
Contacts.UI.loading(container, false);
|
||||
|
@ -529,32 +568,38 @@ Contacts={
|
|||
if(checksum != undefined && checksum != '') { // save
|
||||
q = q + '&checksum=' + checksum;
|
||||
console.log('Saving: ' + q);
|
||||
$(obj).attr('disabled', 'disabled');
|
||||
$.post('ajax/saveproperty.php',q,function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
container.data('checksum', jsondata.data.checksum);
|
||||
Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum);
|
||||
Contacts.UI.loading(container, false);
|
||||
$(obj).removeAttr('disabled');
|
||||
return true;
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
Contacts.UI.loading(container, false);
|
||||
$(obj).removeAttr('disabled');
|
||||
return false;
|
||||
}
|
||||
},'json');
|
||||
} else { // add
|
||||
console.log('Adding: ' + q);
|
||||
$(obj).attr('disabled', 'disabled');
|
||||
$.post('ajax/addproperty.php',q,function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
container.data('checksum', jsondata.data.checksum);
|
||||
// TODO: savePropertyInternal doesn't know about new fields
|
||||
//Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum);
|
||||
Contacts.UI.loading(container, false);
|
||||
$(obj).removeAttr('disabled');
|
||||
return true;
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
Contacts.UI.loading(container, false);
|
||||
$(obj).removeAttr('disabled');
|
||||
return false;
|
||||
}
|
||||
},'json');
|
||||
|
@ -565,10 +610,14 @@ Contacts={
|
|||
console.log('addProperty:' + type);
|
||||
switch (type) {
|
||||
case 'PHOTO':
|
||||
this.loadPhoto();
|
||||
this.loadPhoto(true);
|
||||
$('#file_upload_form').show();
|
||||
$('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide();
|
||||
break;
|
||||
case 'NOTE':
|
||||
$('#note').show();
|
||||
$('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide();
|
||||
break;
|
||||
case 'EMAIL':
|
||||
if($('#emaillist>li').length == 1) {
|
||||
$('#emails').show();
|
||||
|
@ -593,6 +642,7 @@ Contacts={
|
|||
case 'NICKNAME':
|
||||
case 'ORG':
|
||||
case 'BDAY':
|
||||
case 'CATEGORIES':
|
||||
$('dl dt[data-element="'+type+'"],dd[data-element="'+type+'"]').show();
|
||||
$('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide();
|
||||
break;
|
||||
|
@ -612,17 +662,25 @@ Contacts={
|
|||
} else if(type == 'single') {
|
||||
var proptype = Contacts.UI.propertyTypeFor(obj);
|
||||
console.log('deleteProperty, hiding: ' + proptype);
|
||||
$('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide();
|
||||
var othertypes = ['NOTE', 'PHOTO'];
|
||||
if(othertypes.indexOf(proptype) != -1) {
|
||||
console.log('NOTE or PHOTO');
|
||||
Contacts.UI.propertyContainerFor(obj).hide();
|
||||
Contacts.UI.propertyContainerFor(obj).data('checksum', '');
|
||||
} else {
|
||||
$('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide();
|
||||
$('dl dd[data-element="'+proptype+'"]').data('checksum', '');
|
||||
}
|
||||
$('#contacts_propertymenu a[data-type="'+proptype+'"]').parent().show();
|
||||
Contacts.UI.loading(obj, false);
|
||||
} else {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'));
|
||||
OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error'));
|
||||
Contacts.UI.loading(obj, false);
|
||||
}
|
||||
}
|
||||
else{
|
||||
Contacts.UI.loading(obj, false);
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
} else { // Property hasn't been saved so there's nothing to delete.
|
||||
|
@ -637,7 +695,7 @@ Contacts={
|
|||
$('#contacts_propertymenu a[data-type="'+proptype+'"]').parent().show();
|
||||
Contacts.UI.loading(obj, false);
|
||||
} else {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'));
|
||||
OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error'));
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -647,8 +705,9 @@ Contacts={
|
|||
if($('#edit_name_dialog').dialog('isOpen') == true){
|
||||
$('#edit_name_dialog').dialog('moveToTop');
|
||||
}else{ // TODO: If id=='' call addcontact.php (or whatever name) instead and reload view with id.
|
||||
$('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editname.php')+'?id='+this.id, function(){
|
||||
$('#edit_name_dialog' ).dialog({
|
||||
$('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editname.php')+'?id='+this.id, function(jsondata){
|
||||
if(jsondata.status != 'error'){
|
||||
$('#edit_name_dialog' ).dialog({
|
||||
modal: (isnew && true || false),
|
||||
closeOnEscape: (isnew == '' && false || true),
|
||||
title: (isnew && t('contacts', 'Add contact') || t('contacts', 'Edit name')),
|
||||
|
@ -667,7 +726,10 @@ Contacts={
|
|||
open : function(event, ui) {
|
||||
// load 'N' property - maybe :-P
|
||||
}*/
|
||||
});
|
||||
});
|
||||
} else {
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
@ -692,7 +754,14 @@ Contacts={
|
|||
|
||||
$('#fn_select option').remove();
|
||||
//$('#fn_select').combobox('value', this.fn);
|
||||
var names = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname];
|
||||
var tmp = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname];
|
||||
var names = new Array();
|
||||
for(var name in tmp) {
|
||||
console.log('idx: ' + names.indexOf(tmp[name]));
|
||||
if(names.indexOf(tmp[name]) == -1) {
|
||||
names.push(tmp[name]);
|
||||
}
|
||||
}
|
||||
$.each(names, function(key, value) {
|
||||
$('#fn_select')
|
||||
.append($('<option></option>')
|
||||
|
@ -708,7 +777,7 @@ Contacts={
|
|||
},
|
||||
loadAddresses:function(){
|
||||
$('#addresses').hide();
|
||||
$('#addressdisplay dl[class*="propertycontainer"]').remove();
|
||||
$('#addressdisplay dl.propertycontainer').remove();
|
||||
for(var adr in this.data.ADR) {
|
||||
$('#addressdisplay dl').first().clone().insertAfter($('#addressdisplay dl').last()).show();
|
||||
$('#addressdisplay dl').last().removeClass('template').addClass('propertycontainer');
|
||||
|
@ -771,8 +840,9 @@ Contacts={
|
|||
if($('#edit_address_dialog').dialog('isOpen') == true){
|
||||
$('#edit_address_dialog').dialog('moveToTop');
|
||||
}else{
|
||||
$('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editaddress.php')+q, function(){
|
||||
$('#edit_address_dialog' ).dialog({
|
||||
$('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editaddress.php')+q, function(jsondata){
|
||||
if(jsondata.status != 'error'){
|
||||
$('#edit_address_dialog' ).dialog({
|
||||
/*modal: true,*/
|
||||
height: 'auto', width: 'auto',
|
||||
buttons: {
|
||||
|
@ -803,7 +873,10 @@ Contacts={
|
|||
open : function(event, ui) {
|
||||
// load 'ADR' property - maybe :-P
|
||||
}*/
|
||||
});
|
||||
});
|
||||
} else {
|
||||
alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
@ -843,7 +916,7 @@ Contacts={
|
|||
},
|
||||
uploadPhoto:function(filelist) {
|
||||
if(!filelist) {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts','No files selected for upload.'));
|
||||
OC.dialogs.alert(t('contacts','No files selected for upload.'), t('contacts', 'Error'));
|
||||
return;
|
||||
}
|
||||
//var file = filelist.item(0);
|
||||
|
@ -852,7 +925,7 @@ Contacts={
|
|||
var form = $('#file_upload_form');
|
||||
var totalSize=0;
|
||||
if(file.size > $('#max_upload').val()){
|
||||
Contacts.UI.messageBox(t('Upload too large'), t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'));
|
||||
OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts', 'Error'));
|
||||
return;
|
||||
} else {
|
||||
target.load(function(){
|
||||
|
@ -861,21 +934,22 @@ Contacts={
|
|||
Contacts.UI.Card.editPhoto(response.data.id, response.data.tmp);
|
||||
//alert('File: ' + file.tmp + ' ' + file.name + ' ' + file.mime);
|
||||
}else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), response.data.message);
|
||||
OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
form.submit();
|
||||
}
|
||||
},
|
||||
loadPhoto:function(){
|
||||
if(this.data.PHOTO) {
|
||||
loadPhoto:function(force){
|
||||
if(this.data.PHOTO||force==true) {
|
||||
$.getJSON('ajax/loadphoto.php',{'id':this.id},function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
//alert(jsondata.data.page);
|
||||
$('#file_upload_form').data('checksum', jsondata.data.checksum);
|
||||
$('#contacts_details_photo_wrapper').html(jsondata.data.page);
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
$('#file_upload_form').show();
|
||||
|
@ -894,7 +968,7 @@ Contacts={
|
|||
$('#edit_photo_dialog_img').html(jsondata.data.page);
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
if($('#edit_photo_dialog').dialog('isOpen') == true){
|
||||
|
@ -913,22 +987,22 @@ Contacts={
|
|||
// load cropped photo.
|
||||
$('#contacts_details_photo_wrapper').html(response.data.page);
|
||||
}else{
|
||||
Contacts.UI.messageBox(t('contacts','Error'), response.data.message);
|
||||
OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
$('#contacts [data-id="'+this.id+'"]').find('a').css('background','url(thumbnail.php?id='+this.id+'&refresh=1'+Math.random()+') no-repeat');
|
||||
},
|
||||
addMail:function() {
|
||||
//alert('addMail');
|
||||
$('#emaillist li[class*="template"]:first-child').clone().appendTo($('#emaillist')).show();
|
||||
$('#emaillist li[class*="template"]:last-child').removeClass('template').addClass('propertycontainer');
|
||||
$('#emaillist li.template:first-child').clone().appendTo($('#emaillist')).show();
|
||||
$('#emaillist li.template:last-child').removeClass('template').addClass('propertycontainer');
|
||||
$('#emaillist li:last-child').find('input[type="email"]').focus();
|
||||
Contacts.UI.loadListHandlers();
|
||||
return false;
|
||||
},
|
||||
loadMails:function() {
|
||||
$('#emails').hide();
|
||||
$('#emaillist li[class*="propertycontainer"]').remove();
|
||||
$('#emaillist li.propertycontainer').remove();
|
||||
for(var mail in this.data.EMAIL) {
|
||||
this.addMail();
|
||||
//$('#emaillist li:first-child').clone().appendTo($('#emaillist')).show();
|
||||
|
@ -950,9 +1024,9 @@ Contacts={
|
|||
return false;
|
||||
},
|
||||
addPhone:function() {
|
||||
$('#phonelist li[class*="template"]:first-child').clone().appendTo($('#phonelist')); //.show();
|
||||
$('#phonelist li[class*="template"]:last-child').find('select').addClass('contacts_property');
|
||||
$('#phonelist li[class*="template"]:last-child').removeClass('template').addClass('propertycontainer');
|
||||
$('#phonelist li.template:first-child').clone().appendTo($('#phonelist')); //.show();
|
||||
$('#phonelist li.template:last-child').find('select').addClass('contacts_property');
|
||||
$('#phonelist li.template:last-child').removeClass('template').addClass('propertycontainer');
|
||||
$('#phonelist li:last-child').find('input[type="text"]').focus();
|
||||
Contacts.UI.loadListHandlers();
|
||||
$('#phonelist li:last-child').find('select').multiselect({
|
||||
|
@ -966,7 +1040,7 @@ Contacts={
|
|||
},
|
||||
loadPhones:function() {
|
||||
$('#phones').hide();
|
||||
$('#phonelist li[class*="propertycontainer"]').remove();
|
||||
$('#phonelist li.propertycontainer').remove();
|
||||
for(var phone in this.data.TEL) {
|
||||
this.addPhone();
|
||||
$('#phonelist li:last-child').find('select').multiselect('destroy');
|
||||
|
@ -1006,13 +1080,17 @@ Contacts={
|
|||
if($('#chooseaddressbook_dialog').dialog('isOpen') == true){
|
||||
$('#chooseaddressbook_dialog').dialog('moveToTop');
|
||||
}else{
|
||||
$('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(){
|
||||
$('#chooseaddressbook_dialog').dialog({
|
||||
width : 600,
|
||||
close : function(event, ui) {
|
||||
$(this).dialog('destroy').remove();
|
||||
}
|
||||
});
|
||||
$('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(jsondata){
|
||||
if(jsondata.status != 'error'){
|
||||
$('#chooseaddressbook_dialog').dialog({
|
||||
width : 600,
|
||||
close : function(event, ui) {
|
||||
$(this).dialog('destroy').remove();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
@ -1049,7 +1127,7 @@ Contacts={
|
|||
Contacts.UI.Contacts.update();
|
||||
Contacts.UI.Addressbooks.overview();
|
||||
} else {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
//alert('Error: ' + data.message);
|
||||
}
|
||||
});
|
||||
|
@ -1064,7 +1142,7 @@ Contacts={
|
|||
var description = $("#description_"+bookid).val();
|
||||
|
||||
if(displayname.length == 0) {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'Displayname cannot be empty.'));
|
||||
OC.dialogs.alert(t('contacts', 'Displayname cannot be empty.'), t('contacts', 'Error'));
|
||||
return false;
|
||||
}
|
||||
var url;
|
||||
|
@ -1079,7 +1157,7 @@ Contacts={
|
|||
$(button).closest('tr').prev().html(jsondata.page).show().next().remove();
|
||||
Contacts.UI.Contacts.update();
|
||||
} else {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
@ -1099,7 +1177,7 @@ Contacts={
|
|||
Contacts.UI.Card.update();
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'),jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
|
@ -1121,6 +1199,8 @@ Contacts={
|
|||
$(document).ready(function(){
|
||||
|
||||
Contacts.UI.loadHandlers();
|
||||
OCCategories.changed = Contacts.UI.Card.categoriesChanged;
|
||||
OCCategories.app = 'contacts';
|
||||
|
||||
/**
|
||||
* Show the Addressbook chooser
|
||||
|
@ -1148,7 +1228,7 @@ $(document).ready(function(){
|
|||
Contacts.UI.Card.loadContact(jsondata.data);
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
|
@ -1189,7 +1269,8 @@ $(document).ready(function(){
|
|||
|
||||
// NOTE: For some reason the selector doesn't work when I select by '.contacts_property' too...
|
||||
// I do the filtering in the event handler instead.
|
||||
$('input[type="text"],input[type="checkbox"],input[type="email"],input[type="tel"],input[type="date"], select').live('change', function(){
|
||||
//$('input[type="text"],input[type="checkbox"],input[type="email"],input[type="tel"],input[type="date"], select').live('change', function(){
|
||||
$('.contacts_property').live('change', function(){
|
||||
Contacts.UI.Card.saveProperty(this);
|
||||
});
|
||||
|
||||
|
@ -1246,17 +1327,17 @@ $(document).ready(function(){
|
|||
var file = files[0];
|
||||
console.log('size: '+file.size);
|
||||
if(file.size > $('#max_upload').val()){
|
||||
Contacts.UI.messageBox(t('contacts','Upload too large'), t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'));
|
||||
OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large'));
|
||||
return;
|
||||
}
|
||||
if (file.type.indexOf("image") != 0) {
|
||||
Contacts.UI.messageBox(t('contacts','Wrong file type'), t('contacts','Only image files can be used as profile picture.'));
|
||||
OC.dialogs.alert(t('contacts','Only image files can be used as profile picture.'), t('contacts','Wrong file type'));
|
||||
return;
|
||||
}
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
||||
if (!xhr.upload) {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), t('contacts', 'Your browser doesn\'t support AJAX upload. Please click on the profile picture to select a photo to upload.'))
|
||||
OC.dialogs.alert(t('contacts', 'Your browser doesn\'t support AJAX upload. Please click on the profile picture to select a photo to upload.'), t('contacts', 'Error'))
|
||||
}
|
||||
fileUpload = xhr.upload,
|
||||
xhr.onreadystatechange = function() {
|
||||
|
@ -1266,11 +1347,11 @@ $(document).ready(function(){
|
|||
if(xhr.status == 200) {
|
||||
Contacts.UI.Card.editPhoto(response.data.id, response.data.tmp);
|
||||
} else {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), xhr.status + ': ' + xhr.responseText);
|
||||
OC.dialogs.alert(xhr.status + ': ' + xhr.responseText, t('contacts', 'Error'));
|
||||
}
|
||||
} else {
|
||||
//alert(xhr.responseText);
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), response.data.message);
|
||||
OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
|
||||
}
|
||||
// stop loading indicator
|
||||
//$('#contacts_details_photo_progress').hide();
|
||||
|
@ -1298,8 +1379,19 @@ $(document).ready(function(){
|
|||
xhr.send(file);
|
||||
}
|
||||
|
||||
$('body').live('click',function(e){
|
||||
if(!$(e.target).is('#contacts_propertymenu_button')) {
|
||||
$('#contacts_propertymenu').hide();
|
||||
}
|
||||
});
|
||||
$('#contacts_propertymenu_button').live('click',function(){
|
||||
$('#contacts_propertymenu').is(':hidden') && $('#contacts_propertymenu').slideDown() || $('#contacts_propertymenu').slideUp();
|
||||
var menu = $('#contacts_propertymenu');
|
||||
if(menu.is(':hidden')) {
|
||||
menu.show();
|
||||
menu.find('ul').focus();
|
||||
} else {
|
||||
menu.hide();
|
||||
}
|
||||
});
|
||||
$('#contacts_propertymenu a').live('click',function(){
|
||||
Contacts.UI.Card.addProperty(this);
|
||||
|
|
|
@ -1,409 +0,0 @@
|
|||
/**
|
||||
* ownCloud - Addressbook
|
||||
*
|
||||
* @author Jakob Sack
|
||||
* @copyright 2011 Jakob Sack mail@jakobsack.de
|
||||
* @copyright 2011-2012 Thomas Tanghus <thomas@tanghus.net>
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
Contacts={
|
||||
UI:{
|
||||
showCardDAVUrl:function(username, bookname){
|
||||
$('#carddav_url').val(totalurl + '/' + username + '/' + bookname);
|
||||
$('#carddav_url').show();
|
||||
$('#carddav_url_close').show();
|
||||
},
|
||||
messageBox:function(title, msg) {
|
||||
if($('#messagebox').dialog('isOpen') == true){
|
||||
// NOTE: Do we ever get here?
|
||||
$('#messagebox').dialog('moveToTop');
|
||||
}else{
|
||||
$('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'messagebox.php'), function(){
|
||||
$('#messagebox').dialog(
|
||||
{
|
||||
autoOpen: true,
|
||||
title: title,
|
||||
buttons: [{
|
||||
text: "Ok",
|
||||
click: function() { $(this).dialog("close"); }
|
||||
}],
|
||||
close: function(event, ui) {
|
||||
$(this).dialog('destroy').remove();
|
||||
},
|
||||
open: function(event, ui) {
|
||||
$('#messagebox_msg').html(msg);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
Addressbooks:{
|
||||
overview:function(){
|
||||
if($('#chooseaddressbook_dialog').dialog('isOpen') == true){
|
||||
$('#chooseaddressbook_dialog').dialog('moveToTop');
|
||||
}else{
|
||||
$('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(){
|
||||
$('#chooseaddressbook_dialog').dialog({
|
||||
width : 600,
|
||||
close : function(event, ui) {
|
||||
$(this).dialog('destroy').remove();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
activation:function(checkbox, bookid)
|
||||
{
|
||||
$.post(OC.filePath('contacts', 'ajax', 'activation.php'), { bookid: bookid, active: checkbox.checked?1:0 },
|
||||
function(data) {
|
||||
/*
|
||||
* Arguments:
|
||||
* data.status
|
||||
* data.bookid
|
||||
* data.active
|
||||
*/
|
||||
if (data.status == 'success'){
|
||||
checkbox.checked = data.active == 1;
|
||||
Contacts.UI.Contacts.update();
|
||||
}
|
||||
});
|
||||
},
|
||||
newAddressbook:function(object){
|
||||
var tr = $(document.createElement('tr'))
|
||||
.load(OC.filePath('contacts', 'ajax', 'addbook.php'));
|
||||
$(object).closest('tr').after(tr).hide();
|
||||
/* TODO: Shouldn't there be some kinda error checking here? */
|
||||
},
|
||||
editAddressbook:function(object, bookid){
|
||||
var tr = $(document.createElement('tr'))
|
||||
.load(OC.filePath('contacts', 'ajax', 'editaddressbook.php') + "?bookid="+bookid);
|
||||
$(object).closest('tr').after(tr).hide();
|
||||
},
|
||||
deleteAddressbook:function(bookid){
|
||||
var check = confirm("Do you really want to delete this address book?");
|
||||
if(check == false){
|
||||
return false;
|
||||
}else{
|
||||
$.post(OC.filePath('contacts', 'ajax', 'deletebook.php'), { id: bookid},
|
||||
function(data) {
|
||||
if (data.status == 'success'){
|
||||
$('#chooseaddressbook_dialog').dialog('destroy').remove();
|
||||
Contacts.UI.Contacts.update();
|
||||
Contacts.UI.Addressbooks.overview();
|
||||
} else {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), data.message);
|
||||
//alert('Error: ' + data.message);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
submit:function(button, bookid){
|
||||
var displayname = $("#displayname_"+bookid).val();
|
||||
var active = $("#edit_active_"+bookid+":checked").length;
|
||||
var description = $("#description_"+bookid).val();
|
||||
|
||||
var url;
|
||||
if (bookid == 'new'){
|
||||
url = OC.filePath('contacts', 'ajax', 'createaddressbook.php');
|
||||
}else{
|
||||
url = OC.filePath('contacts', 'ajax', 'updateaddressbook.php');
|
||||
}
|
||||
$.post(url, { id: bookid, name: displayname, active: active, description: description },
|
||||
function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$(button).closest('tr').prev().html(data.page).show().next().remove();
|
||||
Contacts.UI.Contacts.update();
|
||||
} else {
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
}
|
||||
});
|
||||
},
|
||||
cancel:function(button, bookid){
|
||||
$(button).closest('tr').prev().show().next().remove();
|
||||
}
|
||||
},
|
||||
Contacts:{
|
||||
/**
|
||||
* Reload the contacts list.
|
||||
*/
|
||||
update:function(){
|
||||
$.getJSON('ajax/contacts.php',{},function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('#contacts').html(jsondata.data.page);
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'),jsondata.data.message);
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
setTimeout(Contacts.UI.Contacts.lazyupdate, 500);
|
||||
},
|
||||
/**
|
||||
* Add thumbnails to the contact list as they become visible in the viewport.
|
||||
*/
|
||||
lazyupdate:function(){
|
||||
$('#contacts li').live('inview', function(){
|
||||
if (!$(this).find('a').attr('style')) {
|
||||
$(this).find('a').css('background','url(thumbnail.php?id='+$(this).data('id')+') no-repeat');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function(){
|
||||
/*-------------------------------------------------------------------------
|
||||
* Event handlers
|
||||
*-----------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Load the details view for a contact.
|
||||
*/
|
||||
$('#leftcontent li').live('click',function(){
|
||||
var id = $(this).data('id');
|
||||
var oldid = $('#rightcontent').data('id');
|
||||
if(oldid != 0){
|
||||
$('#leftcontent li[data-id="'+oldid+'"]').removeClass('active');
|
||||
}
|
||||
$.getJSON('ajax/getdetails.php',{'id':id},function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('#rightcontent').data('id',jsondata.data.id);
|
||||
$('#rightcontent').html(jsondata.data.page);
|
||||
$('#leftcontent li[data-id="'+jsondata.data.id+'"]').addClass('active');
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Delete currently selected contact (and clear form?)
|
||||
*/
|
||||
$('#contacts_deletecard').live('click',function(){
|
||||
$('#contacts_deletecard').tipsy('hide');
|
||||
var id = $('#rightcontent').data('id');
|
||||
$.getJSON('ajax/deletecard.php',{'id':id},function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('#leftcontent [data-id="'+jsondata.data.id+'"]').remove();
|
||||
$('#rightcontent').data('id','');
|
||||
$('#rightcontent').empty();
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Add a property to the contact.
|
||||
* NOTE: Where does 'contacts_addproperty' exist?
|
||||
*/
|
||||
$('#contacts_addproperty').live('click',function(){
|
||||
var id = $('#rightcontent').data('id');
|
||||
$.getJSON('ajax/showaddproperty.php',{'id':id},function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('#contacts_details_list').append(jsondata.data.page);
|
||||
$('#contacts_addproperty').hide();
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
alert('From handler: '+jsondata.data.message);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Change the inputs based on which type of property is selected for addition.
|
||||
*/
|
||||
$('#contacts_addpropertyform [name="name"]').live('change',function(){
|
||||
$('#contacts_addpropertyform #contacts_addresspart').remove();
|
||||
$('#contacts_addpropertyform #contacts_phonepart').remove();
|
||||
$('#contacts_addpropertyform #contacts_fieldpart').remove();
|
||||
$('#contacts_addpropertyform #contacts_generic').remove();
|
||||
if($(this).val() == 'ADR'){
|
||||
$('#contacts_addresspart').clone().insertAfter($('#contacts_addpropertyform .contacts_property_name'));
|
||||
}
|
||||
else if($(this).val() == 'TEL'){
|
||||
$('#contacts_phonepart').clone().insertAfter($('#contacts_addpropertyform .contacts_property_name'));
|
||||
}
|
||||
else{
|
||||
$('#contacts_generic').clone().insertAfter($('#contacts_addpropertyform .contacts_property_name'));
|
||||
}
|
||||
$('#contacts_addpropertyform .contacts_property_data select').chosen();
|
||||
});
|
||||
|
||||
$('#contacts_addpropertyform input[type="submit"]').live('click',function(){
|
||||
$.post('ajax/addproperty.php',$('#contacts_addpropertyform').serialize(),function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('#contacts_addpropertyform').before(jsondata.data.page);
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
}
|
||||
}, 'json');
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Show the Addressbook chooser
|
||||
*/
|
||||
$('#chooseaddressbook').click(function(){
|
||||
Contacts.UI.Addressbooks.overview();
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Open blank form to add new contact.
|
||||
*/
|
||||
$('#contacts_newcontact').click(function(){
|
||||
$.getJSON('ajax/showaddcard.php',{},function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('#rightcontent').data('id','');
|
||||
$('#rightcontent').html(jsondata.data.page)
|
||||
.find('select').chosen();
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Add and insert a new contact into the list.
|
||||
*/
|
||||
$('#contacts_addcardform input[type="submit"]').live('click',function(){
|
||||
$.post('ajax/addcard.php',$('#contacts_addcardform').serialize(),function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('#rightcontent').data('id',jsondata.data.id);
|
||||
$('#rightcontent').html(jsondata.data.page);
|
||||
$('#leftcontent .active').removeClass('active');
|
||||
var item = '<li data-id="'+jsondata.data.id+'" class="active"><a href="index.php?id='+jsondata.data.id+'" style="background: url(thumbnail.php?id='+jsondata.data.id+') no-repeat scroll 0% 0% transparent;">'+jsondata.data.name+'</a></li>';
|
||||
var added = false;
|
||||
$('#leftcontent ul li').each(function(){
|
||||
if ($(this).text().toLowerCase() > jsondata.data.name.toLowerCase()) {
|
||||
$(this).before(item).fadeIn('fast');
|
||||
added = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if(!added) {
|
||||
$('#leftcontent ul').append(item);
|
||||
}
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
}, 'json');
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Show inputs for editing a property.
|
||||
*/
|
||||
$('.contacts_property [data-use="edit"]').live('click',function(){
|
||||
var id = $('#rightcontent').data('id');
|
||||
var checksum = $(this).parents('.contacts_property').first().data('checksum');
|
||||
$.getJSON('ajax/showsetproperty.php',{'id': id, 'checksum': checksum },function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('.contacts_property[data-checksum="'+checksum+'"]').html(jsondata.data.page)
|
||||
.find('select').chosen();
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Save the edited property
|
||||
*/
|
||||
$('#contacts_setpropertyform input[type="submit"]').live('click',function(){
|
||||
$.post('ajax/setproperty.php',$(this).parents('form').first().serialize(),function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('.contacts_property[data-checksum="'+jsondata.data.oldchecksum+'"]').replaceWith(jsondata.data.page);
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
},'json');
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.contacts_property [data-use="delete"]').live('click',function(){
|
||||
var id = $('#rightcontent').data('id');
|
||||
var checksum = $(this).parents('li').first().data('checksum');
|
||||
$.getJSON('ajax/deleteproperty.php',{'id': id, 'checksum': checksum },function(jsondata){
|
||||
if(jsondata.status == 'success'){
|
||||
$('.contacts_property[data-checksum="'+checksum+'"]').remove();
|
||||
}
|
||||
else{
|
||||
Contacts.UI.messageBox(t('contacts', 'Error'), jsondata.data.message);
|
||||
//alert(jsondata.data.message);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
$('.contacts_property').live('mouseenter',function(){
|
||||
$(this).find('span[data-use]').show();
|
||||
});
|
||||
|
||||
$('.contacts_property').live('mouseleave',function(){
|
||||
$(this).find('span[data-use]').hide();
|
||||
});
|
||||
|
||||
$('#contacts_addcardform select').chosen();
|
||||
|
||||
$('#contacts li').bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
|
||||
if (isInView) { //NOTE: I've kept all conditions for future reference ;-)
|
||||
// element is now visible in the viewport
|
||||
if (visiblePartY == 'top') {
|
||||
// top part of element is visible
|
||||
} else if (visiblePartY == 'bottom') {
|
||||
// bottom part of element is visible
|
||||
} else {
|
||||
// whole part of element is visible
|
||||
if (!$(this).find('a').attr('style')) {
|
||||
//alert($(this).data('id') + ' has background: ' + $(this).attr('style'));
|
||||
$(this).find('a').css('background','url(thumbnail.php?id='+$(this).data('id')+') no-repeat');
|
||||
}/* else {
|
||||
alert($(this).data('id') + ' has style ' + $(this).attr('style').match('url'));
|
||||
}*/
|
||||
}
|
||||
} else {
|
||||
// element has gone out of viewport
|
||||
}
|
||||
});
|
||||
|
||||
$('.button').tipsy();
|
||||
//Contacts.UI.messageBox('Hello','Sailor');
|
||||
});
|
|
@ -0,0 +1,81 @@
|
|||
/**
|
||||
* Inspired by http://jqueryui.com/demos/autocomplete/#multiple
|
||||
*/
|
||||
|
||||
(function( $ ) {
|
||||
$.widget('ui.multiple_autocomplete', {
|
||||
_create: function() {
|
||||
function split( val ) {
|
||||
return val.split( /,\s*/ );
|
||||
}
|
||||
function extractLast( term ) {
|
||||
return split( term ).pop();
|
||||
}
|
||||
//console.log('_create: ' + this.options['id']);
|
||||
var self = this;
|
||||
this.element.bind('blur', function( event ) {
|
||||
var tmp = self.element.val().trim();
|
||||
if(tmp[tmp.length-1] == ',') {
|
||||
self.element.val(tmp.substring(0, tmp.length-1));
|
||||
} else {
|
||||
self.element.val(tmp);
|
||||
}
|
||||
self.element.trigger('change'); // Changes wasn't saved when only using the dropdown.
|
||||
});
|
||||
this.element.bind( "keydown", function( event ) {
|
||||
if ( event.keyCode === $.ui.keyCode.TAB &&
|
||||
$( this ).data( "autocomplete" ).menu.active ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
})
|
||||
.autocomplete({
|
||||
minLength: 0,
|
||||
source: function( request, response ) {
|
||||
// delegate back to autocomplete, but extract the last term
|
||||
response( $.ui.autocomplete.filter(
|
||||
self.options.source, extractLast( request.term ) ) );
|
||||
},
|
||||
focus: function() {
|
||||
// prevent value inserted on focus
|
||||
return false;
|
||||
},
|
||||
select: function( event, ui ) {
|
||||
var terms = split( this.value );
|
||||
// remove the current input
|
||||
terms.pop();
|
||||
// add the selected item
|
||||
terms.push( ui.item.value );
|
||||
// add placeholder to get the comma-and-space at the end
|
||||
terms.push( "" );
|
||||
this.value = terms.join( ", " );
|
||||
return false;
|
||||
}
|
||||
});
|
||||
this.button = $( "<button type='button'> </button>" )
|
||||
.attr( "tabIndex", -1 )
|
||||
.attr( "title", "Show All Items" )
|
||||
.insertAfter( this.element )
|
||||
.addClass('svg')
|
||||
.addClass('action')
|
||||
.addClass('combo-button')
|
||||
.click(function() {
|
||||
// close if already visible
|
||||
if ( self.element.autocomplete( "widget" ).is( ":visible" ) ) {
|
||||
self.element.autocomplete( "close" );
|
||||
return;
|
||||
}
|
||||
|
||||
// work around a bug (likely same cause as #5265)
|
||||
$( this ).blur();
|
||||
|
||||
var tmp = self.element.val().trim();
|
||||
if(tmp[tmp.length-1] != ',') {
|
||||
self.element.val(tmp+', ');
|
||||
}
|
||||
// pass empty string as value to search for, displaying all results
|
||||
self.element.autocomplete( "search", "" );
|
||||
self.element.focus();
|
||||
});
|
||||
},
|
||||
});
|
||||
})( jQuery );
|
|
@ -1,20 +1,17 @@
|
|||
../appinfo/app.php
|
||||
../ajax/activation.php
|
||||
../ajax/addbook.php
|
||||
../ajax/addcard.php
|
||||
../ajax/addproperty.php
|
||||
../ajax/createaddressbook.php
|
||||
../ajax/deletebook.php
|
||||
../ajax/deleteproperty.php
|
||||
../ajax/getdetails.php
|
||||
../ajax/setproperty.php
|
||||
../ajax/saveproperty.php
|
||||
../ajax/updateaddressbook.php
|
||||
../lib/app.php
|
||||
../templates/index.php
|
||||
../templates/part.addcardform.php
|
||||
../templates/part.chooseaddressbook.php
|
||||
../templates/part.chooseaddressbook.rowfields.php
|
||||
../templates/part.details.php
|
||||
../templates/part.editaddressbook.php
|
||||
../templates/part.property.php
|
||||
../templates/part.setpropertyform.php
|
||||
|
|
|
@ -10,8 +10,10 @@
|
|||
* This class manages our app actions
|
||||
*/
|
||||
OC_Contacts_App::$l10n = new OC_L10N('contacts');
|
||||
OC_Contacts_App::$categories = new OC_VCategories('contacts');
|
||||
class OC_Contacts_App {
|
||||
public static $l10n;
|
||||
public static $categories;
|
||||
|
||||
/**
|
||||
* Render templates/part.details to json output
|
||||
|
@ -83,7 +85,7 @@ class OC_Contacts_App {
|
|||
$vcard = OC_VObject::parse($card['carddata']);
|
||||
// Try to fix cards with missing 'N' field from pre ownCloud 4. Hot damn, this is ugly...
|
||||
if(!is_null($vcard) && !$vcard->__isset('N')) {
|
||||
$appinfo = $info=OC_App::getAppInfo('contacts');
|
||||
$appinfo = OC_App::getAppInfo('contacts');
|
||||
if($appinfo['version'] >= 5) {
|
||||
OC_Log::write('contacts','OC_Contacts_App::getContactVCard. Deprecated check for missing N field', OC_Log::DEBUG);
|
||||
}
|
||||
|
@ -92,7 +94,7 @@ class OC_Contacts_App {
|
|||
OC_Log::write('contacts','getContactVCard, found FN field: '.$vcard->__get('FN'), OC_Log::DEBUG);
|
||||
$n = implode(';', array_reverse(array_slice(explode(' ', $vcard->__get('FN')), 0, 2))).';;;';
|
||||
$vcard->setString('N', $n);
|
||||
OC_Contacts_VCard::edit( $id, $vcard->serialize());
|
||||
OC_Contacts_VCard::edit( $id, $vcard);
|
||||
} else { // Else just add an empty 'N' field :-P
|
||||
$vcard->setString('N', 'Unknown;Name;;;');
|
||||
}
|
||||
|
@ -153,6 +155,10 @@ class OC_Contacts_App {
|
|||
}
|
||||
}
|
||||
|
||||
public static function getCategories() {
|
||||
return self::$categories->categories();
|
||||
}
|
||||
|
||||
public static function setLastModifiedHeader($contact) {
|
||||
$rev = $contact->getAsString('REV');
|
||||
if ($rev) {
|
||||
|
|
|
@ -29,7 +29,7 @@ class OC_Contacts_Hooks{
|
|||
* @param paramters parameters from postDeleteUser-Hook
|
||||
* @return array
|
||||
*/
|
||||
public function deleteUser($parameters) {
|
||||
static public function deleteUser($parameters) {
|
||||
$addressbooks = OC_Contacts_Addressbook::all($parameters['uid']);
|
||||
|
||||
foreach($addressbooks as $addressbook) {
|
||||
|
@ -38,4 +38,62 @@ class OC_Contacts_Hooks{
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds the CardDAV resource to the DAV server
|
||||
* @param paramters parameters from initialize-Hook
|
||||
* @return array
|
||||
*/
|
||||
static public function initializeCardDAV($parameters){
|
||||
// We need a backend, the root node and the carddav plugin
|
||||
$parameters['backends']['carddav'] = new OC_Connector_Sabre_CardDAV();
|
||||
$parameters['nodes'][] = new Sabre_CardDAV_AddressBookRoot($parameters['backends']['principal'], $parameters['backends']['carddav']);
|
||||
$parameters['plugins'][] = new Sabre_CardDAV_Plugin();
|
||||
return true;
|
||||
}
|
||||
|
||||
static public function getCalenderSources($parameters) {
|
||||
$base_url = OC_Helper::linkTo('calendar', 'ajax/events.php').'?calendar_id=';
|
||||
foreach(OC_Contacts_Addressbook::all(OC_User::getUser()) as $addressbook) {
|
||||
$parameters['sources'][] =
|
||||
array(
|
||||
'url' => $base_url.'birthday_'. $addressbook['id'],
|
||||
'backgroundColor' => '#cccccc',
|
||||
'borderColor' => '#888',
|
||||
'textColor' => 'black',
|
||||
'cache' => true,
|
||||
'editable' => false,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static public function getBirthdayEvents($parameters) {
|
||||
$name = $parameters['calendar_id'];
|
||||
if (strpos('birthday_', $name) != 0) {
|
||||
return;
|
||||
}
|
||||
$info = explode('_', $name);
|
||||
$aid = $info[1];
|
||||
OC_Contacts_App::getAddressbook($aid);
|
||||
foreach(OC_Contacts_VCard::all($aid) as $card){
|
||||
$vcard = OC_VObject::parse($card['carddata']);
|
||||
$birthday = $vcard->BDAY;
|
||||
if ($birthday) {
|
||||
$date = new DateTime($birthday);
|
||||
$vevent = new OC_VObject('VEVENT');
|
||||
$vevent->setDateTime('LAST-MODIFIED', new DateTime($vcard->REV));
|
||||
$vevent->setDateTime('DTSTART', $date, Sabre_VObject_Element_DateTime::DATE);
|
||||
$vevent->setString('DURATION', 'P1D');
|
||||
// DESCRIPTION?
|
||||
$vevent->setString('RRULE', 'FREQ=YEARLY');
|
||||
$title = str_replace('{name}', $vcard->getAsString('FN'), OC_Contacts_App::$l10n->t('{name}\'s Birthday'));
|
||||
$parameters['events'][] = array(
|
||||
'id' => 0,//$card['id'],
|
||||
'vevent' => $vevent,
|
||||
'repeating' => true,
|
||||
'summary' => $title,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
class OC_Search_Provider_Contacts extends OC_Search_Provider{
|
||||
function search($query){
|
||||
class OC_Search_Provider_Contacts implements OC_Search_Provider{
|
||||
static function search($query){
|
||||
$addressbooks = OC_Contacts_Addressbook::all(OC_User::getUser(), 1);
|
||||
// if(count($calendars)==0 || !OC_App::isEnabled('contacts')){
|
||||
// //return false;
|
||||
|
@ -26,4 +26,3 @@ class OC_Search_Provider_Contacts extends OC_Search_Provider{
|
|||
return $results;
|
||||
}
|
||||
}
|
||||
new OC_Search_Provider_Contacts();
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*
|
||||
* @author Jakob Sack
|
||||
* @copyright 2011 Jakob Sack mail@jakobsack.de
|
||||
* @copyright 2012 Thomas Tanghus <thomas@tanghus.net>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
@ -174,6 +175,9 @@ class OC_Contacts_VCard{
|
|||
if($property->name == 'UID'){
|
||||
$uid = $property->value;
|
||||
}
|
||||
if($property->name == 'ORG'){
|
||||
$org = $property->value;
|
||||
}
|
||||
if($property->name == 'EMAIL' && is_null($email)){ // only use the first email as substitute for missing N or FN.
|
||||
$email = $property->value;
|
||||
}
|
||||
|
@ -184,6 +188,8 @@ class OC_Contacts_VCard{
|
|||
$fn = join(' ', array_reverse(array_slice(explode(';', $n), 0, 2)));
|
||||
} elseif($email) {
|
||||
$fn = $email;
|
||||
} elseif($org) {
|
||||
$fn = $org;
|
||||
} else {
|
||||
$fn = 'Unknown Name';
|
||||
}
|
||||
|
@ -217,31 +223,37 @@ class OC_Contacts_VCard{
|
|||
|
||||
/**
|
||||
* @brief Adds a card
|
||||
* @param integer $id Addressbook id
|
||||
* @param string $data vCard file
|
||||
* @return insertid on success or null if card is not parseable.
|
||||
* @param integer $aid Addressbook id
|
||||
* @param OC_VObject $card vCard file
|
||||
* @param string $uri the uri of the card, default based on the UID
|
||||
* @return insertid on success or null if no card.
|
||||
*/
|
||||
public static function add($id,$data){
|
||||
$fn = null;
|
||||
|
||||
$card = OC_VObject::parse($data);
|
||||
if(!is_null($card)){
|
||||
self::updateValuesFromAdd($card);
|
||||
$data = $card->serialize();
|
||||
}
|
||||
else{
|
||||
OC_Log::write('contacts','OC_Contacts_VCard::add. Error parsing VCard: '.$data,OC_Log::ERROR);
|
||||
return null; // Ditch cards that can't be parsed by Sabre.
|
||||
public static function add($aid, $card, $uri=null){
|
||||
if(is_null($card)){
|
||||
OC_Log::write('contacts','OC_Contacts_VCard::add. No vCard supplied', OC_Log::ERROR);
|
||||
return null;
|
||||
};
|
||||
|
||||
OC_Contacts_App::$categories->loadFromVObject($card);
|
||||
|
||||
self::updateValuesFromAdd($card);
|
||||
|
||||
$fn = $card->getAsString('FN');
|
||||
$uid = $card->getAsString('UID');
|
||||
$uri = $uid.'.vcf';
|
||||
if (empty($fn)) {
|
||||
$fn = null;
|
||||
}
|
||||
|
||||
if (!$uri) {
|
||||
$uid = $card->getAsString('UID');
|
||||
$uri = $uid.'.vcf';
|
||||
}
|
||||
|
||||
$data = $card->serialize();
|
||||
$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' );
|
||||
$result = $stmt->execute(array($id,$fn,$data,$uri,time()));
|
||||
$result = $stmt->execute(array($aid,$fn,$data,$uri,time()));
|
||||
$newid = OC_DB::insertid('*PREFIX*contacts_cards');
|
||||
|
||||
OC_Contacts_Addressbook::touch($id);
|
||||
OC_Contacts_Addressbook::touch($aid);
|
||||
|
||||
return $newid;
|
||||
}
|
||||
|
@ -255,49 +267,56 @@ class OC_Contacts_VCard{
|
|||
*/
|
||||
public static function addFromDAVData($id,$uri,$data){
|
||||
$card = OC_VObject::parse($data);
|
||||
if(!is_null($card)){
|
||||
self::updateValuesFromAdd($card);
|
||||
$data = $card->serialize();
|
||||
} else {
|
||||
OC_Log::write('contacts','OC_Contacts_VCard::addFromDAVData. Error parsing VCard: '.$data, OC_Log::ERROR);
|
||||
return null; // Ditch cards that can't be parsed by Sabre.
|
||||
};
|
||||
$fn = $card->getAsString('FN');
|
||||
return self::add($id, $data, $uri);
|
||||
}
|
||||
|
||||
$stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' );
|
||||
$result = $stmt->execute(array($id,$fn,$data,$uri,time()));
|
||||
$newid = OC_DB::insertid('*PREFIX*contacts_cards');
|
||||
|
||||
OC_Contacts_Addressbook::touch($id);
|
||||
|
||||
return $newid;
|
||||
/**
|
||||
* @brief Mass updates an array of cards
|
||||
* @param array $objects An array of [id, carddata].
|
||||
*/
|
||||
public static function updateDataByID($objects){
|
||||
$stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET carddata = ?, lastmodified = ? WHERE id = ?' );
|
||||
$now = new DateTime;
|
||||
foreach($objects as $object) {
|
||||
$vcard = OC_VObject::parse($object[1]);
|
||||
if(!is_null($vcard)){
|
||||
$vcard->setString('REV', $now->format(DateTime::W3C));
|
||||
$data = $vcard->serialize();
|
||||
try {
|
||||
$result = $stmt->execute(array($data,time(),$object[0]));
|
||||
//OC_Log::write('contacts','OC_Contacts_VCard::updateDataByID, id: '.$object[0].': '.$object[1],OC_Log::DEBUG);
|
||||
} catch(Exception $e) {
|
||||
OC_Log::write('contacts','OC_Contacts_VCard::updateDataByID:, exception: '.$e->getMessage(),OC_Log::DEBUG);
|
||||
OC_Log::write('contacts','OC_Contacts_VCard::updateDataByID, id: '.$object[0],OC_Log::DEBUG);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief edits a card
|
||||
* @param integer $id id of card
|
||||
* @param string $data vCard file
|
||||
* @param OC_VObject $card vCard file
|
||||
* @return boolean
|
||||
*/
|
||||
public static function edit($id, $data){
|
||||
public static function edit($id, OC_VObject $card){
|
||||
$oldcard = self::find($id);
|
||||
$fn = null;
|
||||
|
||||
$card = OC_VObject::parse($data);
|
||||
if(!is_null($card)){
|
||||
foreach($card->children as $property){
|
||||
if($property->name == 'FN'){
|
||||
$fn = $property->value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(is_null($card)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
OC_Contacts_App::$categories->loadFromVObject($card);
|
||||
|
||||
$fn = $card->getAsString('FN');
|
||||
if (empty($fn)) {
|
||||
$fn = null;
|
||||
}
|
||||
|
||||
$now = new DateTime;
|
||||
$card->setString('REV', $now->format(DateTime::W3C));
|
||||
$data = $card->serialize();
|
||||
|
||||
$data = $card->serialize();
|
||||
$stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' );
|
||||
$result = $stmt->execute(array($fn,$data,time(),$id));
|
||||
|
||||
|
@ -315,27 +334,8 @@ class OC_Contacts_VCard{
|
|||
*/
|
||||
public static function editFromDAVData($aid,$uri,$data){
|
||||
$oldcard = self::findWhereDAVDataIs($aid,$uri);
|
||||
|
||||
$fn = null;
|
||||
$card = OC_VObject::parse($data);
|
||||
if(!is_null($card)){
|
||||
foreach($card->children as $property){
|
||||
if($property->name == 'FN'){
|
||||
$fn = $property->value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
$now = new DateTime;
|
||||
$card->setString('REV', $now->format(DateTime::W3C));
|
||||
$data = $card->serialize();
|
||||
|
||||
$stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' );
|
||||
$result = $stmt->execute(array($fn,$data,time(),$oldcard['id']));
|
||||
|
||||
OC_Contacts_Addressbook::touch($oldcard['addressbookid']);
|
||||
|
||||
return true;
|
||||
return self::edit($oldcard['id'], $card);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -351,14 +351,6 @@ class OC_Contacts_VCard{
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Creates a UID
|
||||
* @return string
|
||||
*/
|
||||
public static function createUID(){
|
||||
return substr(md5(rand().time()),0,10);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief deletes a card with the data provided by sabredav
|
||||
* @param integer $aid Addressbook id
|
||||
|
@ -374,6 +366,43 @@ class OC_Contacts_VCard{
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Escapes delimiters from an array and returns a string.
|
||||
* @param array $value
|
||||
* @param char $delimiter
|
||||
* @return string
|
||||
*/
|
||||
public static function escapeDelimiters($value, $delimiter=';') {
|
||||
foreach($value as &$i ) {
|
||||
$i = implode("\\$delimiter", explode($delimiter, $i));
|
||||
}
|
||||
return implode($delimiter, $value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Creates an array out of a multivalue property
|
||||
* @param string $value
|
||||
* @param char $delimiter
|
||||
* @return array
|
||||
*/
|
||||
public static function unescapeDelimiters($value, $delimiter=';') {
|
||||
$array = explode($delimiter,$value);
|
||||
for($i=0;$i<count($array);$i++) {
|
||||
if(substr($array[$i],-1,1)=="\\") {
|
||||
if(isset($array[$i+1])) {
|
||||
$array[$i] = substr($array[$i],0,count($array[$i])-2).$delimiter.$array[$i+1];
|
||||
unset($array[$i+1]);
|
||||
} else {
|
||||
$array[$i] = substr($array[$i],0,count($array[$i])-2).$delimiter;
|
||||
}
|
||||
$i = $i - 1;
|
||||
}
|
||||
}
|
||||
$array = array_map('trim', $array);
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Data structure of vCard
|
||||
* @param object $property
|
||||
|
@ -412,8 +441,10 @@ class OC_Contacts_VCard{
|
|||
$value = $property->value;
|
||||
//$value = htmlspecialchars($value);
|
||||
if($property->name == 'ADR' || $property->name == 'N'){
|
||||
$value = OC_VObject::unescapeSemicolons($value);
|
||||
}
|
||||
$value = self::unescapeDelimiters($value);
|
||||
}/* elseif($property->name == 'CATEGORIES') {
|
||||
$value = self::unescapeDelimiters($value, ',');
|
||||
}*/
|
||||
$temp = array(
|
||||
'name' => $property->name,
|
||||
'value' => $value,
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<script type='text/javascript'>
|
||||
var totalurl = '<?php echo OC_Helper::linkToAbsolute('contacts', 'carddav.php'); ?>/addressbooks';
|
||||
var categories = <?php sort($_['categories']); echo json_encode($_['categories']); ?>;
|
||||
</script>
|
||||
<div id="controls">
|
||||
<form>
|
||||
|
|
|
@ -1,138 +0,0 @@
|
|||
<form id="contacts_addcardform">
|
||||
<?php if(count($_['addressbooks'])==1): ?>
|
||||
<input type="hidden" name="id" value="<?php echo $_['addressbooks'][0]['id']; ?>">
|
||||
<?php else: ?>
|
||||
<fieldset class="inputs">
|
||||
<dl class="form">
|
||||
<dt>
|
||||
<label for="id"><?php echo $l->t('Addressbook'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<select name="id" size="1">
|
||||
<?php echo html_select_options($_['addressbooks'], null, array('value'=>'id', 'label'=>'displayname')); ?>
|
||||
</select>
|
||||
</dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
<?php endif; ?>
|
||||
<fieldset class="inputs">
|
||||
<dl class="form">
|
||||
<dt>
|
||||
<label for="n1"><?php echo $l->t('Given name'); ?></label>
|
||||
</dd>
|
||||
<dd>
|
||||
<input id="n1" type="text" name="value[N][1]" value="">
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="n0"><?php echo $l->t('Family name'); ?></label>
|
||||
</dd>
|
||||
<dd>
|
||||
<input id="n0" type="text" name="value[N][0]" value="">
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="n2"><?php echo $l->t('Additional names'); ?></label>
|
||||
</dd>
|
||||
<dd>
|
||||
<input id="n2" type="text" name="value[N][2]" value="">
|
||||
<input type="hidden" name="value[N][4]" value="">
|
||||
<input type="hidden" name="value[N][5]" value="">
|
||||
</dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
<fieldset class="inputs">
|
||||
<dl class="form">
|
||||
<dt>
|
||||
<label for="fn"><?php echo $l->t('Display name'); ?></label>
|
||||
</dd>
|
||||
<dd>
|
||||
<input id="fn" type="text" name="fn" placeholder="<?php echo $l->t('How you want the name displayed in the list'); ?>" value="">
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="org"><?php echo $l->t('Organization'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input id="org" type="text" name="value[ORG]" value="">
|
||||
</dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
<fieldset class="inputs">
|
||||
<dl class="form">
|
||||
<dt>
|
||||
<label for="email"><?php echo $l->t('Email'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input id="email" type="email" name="value[EMAIL]" value="">
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="tel"><?php echo $l->t('Telephone'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input type="tel" id="tel" name="value[TEL]" value="">
|
||||
<select id="TEL" name="parameters[TEL][TYPE][]" multiple="multiple">
|
||||
<?php echo html_select_options($_['phone_types'], 'CELL') ?>
|
||||
</select>
|
||||
</dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
<fieldset class="inputs">
|
||||
<legend><?php echo $l->t('Address'); ?></legend>
|
||||
<dl class="form">
|
||||
<dt>
|
||||
<label for="adr_type"><?php echo $l->t('Type'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<select id="adr_type" name="parameters[ADR][TYPE]" size="1">
|
||||
<?php echo html_select_options($_['adr_types'], 'HOME') ?>
|
||||
</select>
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="adr_pobox"><?php echo $l->t('PO Box'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input type="text" id="adr_pobox" name="value[ADR][0]" placeholder="<?php echo $l->t('Post Office box'); ?>" value="">
|
||||
</dd>
|
||||
<dd>
|
||||
<!-- dt>
|
||||
<label class="label" for="adr_extended"><?php echo $l->t('Extended'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input type="text" id="adr_extended" name="value[ADR][1]" value="">
|
||||
</dd -->
|
||||
<dt>
|
||||
<label for="adr_street"><?php echo $l->t('Street'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input style="width: 12em;" type="text" id="adr_street" name="value[ADR][2]" placeholder="<?php echo $l->t('Street name and no.'); ?>" value="">
|
||||
<label for="adr_extended"><?php echo $l->t('Extended'); ?></label>
|
||||
<input style="width: 7em;" type="text" id="adr_extended" name="value[ADR][1]" placeholder="<?php echo $l->t('Apart. no., floor'); ?>" value="">
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="adr_city"><?php echo $l->t('City'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input style="width: 12em;" type="text" id="adr_city" name="value[ADR][3]" value="">
|
||||
<label for="adr_zipcode"><?php echo $l->t('Zipcode'); ?></label>
|
||||
<input style="width: 5em;" type="text" id="adr_zipcode" name="value[ADR][5]" value="">
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="adr_region"><?php echo $l->t('Region'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input type="text" id="adr_region" name="value[ADR][4]" placeholder="<?php echo $l->t('E.g. state or province'); ?>" value="">
|
||||
</dd>
|
||||
<!-- dt>
|
||||
<label class="label" for="adr_zipcode"><?php echo $l->t('Zipcode'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input type="text" id="adr_zipcode" name="value[ADR][5]" value="">
|
||||
</dd -->
|
||||
<dt>
|
||||
<label for="adr_country"><?php echo $l->t('Country'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input type="text" id="adr_country" name="value[ADR][6]" value="">
|
||||
</dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
<input class="create" type="submit" name="submit" value="<?php echo $l->t('Create Contact'); ?>">
|
||||
</form>
|
|
@ -13,6 +13,8 @@ $id = isset($_['id']) ? $_['id'] : '';
|
|||
<li><a data-type="TEL"><?php echo $l->t('Phone'); ?></a></li>
|
||||
<li><a data-type="EMAIL"><?php echo $l->t('Email'); ?></a></li>
|
||||
<li><a data-type="ADR"><?php echo $l->t('Address'); ?></a></li>
|
||||
<li><a data-type="NOTE"><?php echo $l->t('Note'); ?></a></li>
|
||||
<li><a data-type="CATEGORIES"><?php echo $l->t('Categories'); ?></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<img onclick="Contacts.UI.Card.export();" class="svg action" id="contacts_downloadcard" src="<?php echo image_path('', 'actions/download.svg'); ?>" title="<?php echo $l->t('Download contact');?>" />
|
||||
|
@ -21,8 +23,9 @@ $id = isset($_['id']) ? $_['id'] : '';
|
|||
|
||||
<div class="contactsection">
|
||||
|
||||
<form style="display:none;" id="file_upload_form" action="ajax/uploadphoto.php" method="post" enctype="multipart/form-data" target="file_upload_target">
|
||||
<form style="display:none;" id="file_upload_form" action="ajax/uploadphoto.php" method="post" enctype="multipart/form-data" target="file_upload_target" class="propertycontainer" data-element="PHOTO">
|
||||
<fieldset id="photo" class="formfloat">
|
||||
<a class="action delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a>
|
||||
<div id="contacts_details_photo_wrapper" title="<?php echo $l->t('Click or drop to upload picture'); ?> (max <?php echo $_['uploadMaxHumanFilesize']; ?>)">
|
||||
<!-- img style="padding: 1em;" id="contacts_details_photo" alt="Profile picture" src="photo.php?id=<?php echo $_['id']; ?>" / -->
|
||||
<progress id="contacts_details_photo_progress" style="display:none;" value="0" max="100">0 %</progress>
|
||||
|
@ -45,7 +48,7 @@ $id = isset($_['id']) ? $_['id'] : '';
|
|||
<dt><label for="fn"><?php echo $l->t('Display name'); ?></label></dt>
|
||||
<dd class="propertycontainer" data-element="FN">
|
||||
<select id="fn_select" title="<?php echo $l->t('Format custom, Short name, Full name, Reverse or Reverse with comma'); ?>" style="width:16em;">
|
||||
</select><a id="edit_name" class="edit" title="<?php echo $l->t('Edit name details'); ?>"></a>
|
||||
</select><a id="edit_name" class="action edit" title="<?php echo $l->t('Edit name details'); ?>"></a>
|
||||
</dd>
|
||||
<dt style="display:none;" id="org_label" data-element="ORG"><label for="org"><?php echo $l->t('Organization'); ?></label></dt>
|
||||
<dd style="display:none;" class="propertycontainer" id="org_value" data-element="ORG"><input id="org" required="required" name="value[ORG]" type="text" class="contacts_property" style="width:16em;" name="value" value="" placeholder="<?php echo $l->t('Organization'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a></dd>
|
||||
|
@ -53,8 +56,21 @@ $id = isset($_['id']) ? $_['id'] : '';
|
|||
<dd style="display:none;" class="propertycontainer" id="nickname_value" data-element="NICKNAME"><input id="nickname" required="required" name="value[NICKNAME]" type="text" class="contacts_property" style="width:16em;" name="value" value="" placeholder="<?php echo $l->t('Enter nickname'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a></dd>
|
||||
<dt style="display:none;" id="bday_label" data-element="BDAY"><label for="bday"><?php echo $l->t('Birthday'); ?></label></dt>
|
||||
<dd style="display:none;" class="propertycontainer" id="bday_value" data-element="BDAY"><input id="bday" required="required" name="value" type="text" class="contacts_property" value="" placeholder="<?php echo $l->t('dd-mm-yyyy'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a></dd>
|
||||
<!-- dt id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Categories'); ?></label></dt>
|
||||
<dd class="propertycontainer" id="categories_value" data-element="CATEGORIES">
|
||||
<select class="contacts_property" multiple="multiple" id="categories" name="value[]">
|
||||
<?php echo html_select_options($_['categories'], array(), array('combine'=>true)) ?>
|
||||
</select>
|
||||
<a class="action edit" onclick="$(this).tipsy('hide');OCCategories.edit();" title="<?php echo $l->t('Edit categories'); ?>"></a>
|
||||
</dd -->
|
||||
<dt style="display:none;" id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Categories'); ?></label></dt>
|
||||
<dd style="display:none;" class="propertycontainer" id="categories_value" data-element="CATEGORIES"><input id="categories" required="required" name="value[CATEGORIES]" type="text" class="contacts_property" style="width:16em;" name="value" value="" placeholder="<?php echo $l->t('Categories'); ?>" /><a class="action delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a><a class="action edit" onclick="$(this).tipsy('hide');OCCategories.edit();" title="<?php echo $l->t('Edit categories'); ?>"></a></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
<fieldset id="note" class="formfloat propertycontainer contactpart" style="display:none;" data-element="NOTE">
|
||||
<legend><?php echo $l->t('Note'); ?><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a></legend>
|
||||
<textarea class="contacts_property note" name="value" cols="60" rows="10"></textarea>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -2,8 +2,9 @@
|
|||
$id = $_['id'];
|
||||
$wattr = isset($_['width'])?'width="'.$_['width'].'"':'';
|
||||
$hattr = isset($_['height'])?'height="'.$_['height'].'"':'';
|
||||
$rand = isset($_['refresh'])?'&'.rand().'='.rand():'';
|
||||
?>
|
||||
<img class="loading" id="contacts_details_photo" <?php echo $wattr; ?> <?php echo $hattr; ?> src="<?php echo OC_Helper::linkToAbsolute('contacts', 'photo.php'); ?>?id=<?php echo $id; ?>&refresh=<?php echo rand(); ?>" />
|
||||
<img class="loading" id="contacts_details_photo" <?php echo $wattr; ?> <?php echo $hattr; ?> src="<?php echo OC_Helper::linkToAbsolute('contacts', 'photo.php'); ?>?id=<?php echo $id.$rand; ?>" />
|
||||
<progress id="contacts_details_photo_progress" style="display:none;" value="0" max="100">0 %</progress>
|
||||
|
||||
|
||||
|
|
|
@ -1,96 +0,0 @@
|
|||
<?php if(array_key_exists('FN',$_['details'])): ?>
|
||||
<?php echo $this->inc('part.property.FN', array('property' => $_['details']['FN'][0])); ?>
|
||||
<?php echo $this->inc('part.property.N', array('property' => $_['details']['N'][0])); ?>
|
||||
<a href="export.php?contactid=<?php echo $_['id']; ?>"><img class="svg action" id="contacts_downloadcard" src="<?php echo image_path('', 'actions/download.svg'); ?>" title="<?php echo $l->t('Download contact');?>" /></a>
|
||||
<img class="svg action" id="contacts_deletecard" src="<?php echo image_path('', 'actions/delete.svg'); ?>" title="<?php echo $l->t('Delete contact');?>" />
|
||||
|
||||
<?php if(isset($_['details']['PHOTO'])): // Emails first ?>
|
||||
<img id="contacts_details_photo" src="photo.php?id=<?php echo $_['id']; ?>">
|
||||
<?php endif; ?>
|
||||
|
||||
<ul id="contacts_details_list">
|
||||
<?php if(isset($_['details']['BDAY'])): // Emails first ?>
|
||||
<?php echo $this->inc('part.property', array('property' => $_['details']['BDAY'][0])); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if(isset($_['details']['ORG'])): // Emails first ?>
|
||||
<?php echo $this->inc('part.property', array('property' => $_['details']['ORG'][0])); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php foreach(array('EMAIL','TEL','ADR') as $type): ?>
|
||||
<?php if(isset($_['details'][$type])): // Emails first ?>
|
||||
<?php foreach($_['details'][$type] as $property): ?>
|
||||
<?php echo $this->inc('part.property',array('property' => $property )); ?>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<li class="contacts_property_add">
|
||||
<form id="contacts_addpropertyform">
|
||||
<input type="hidden" name="id" value="<?php echo $_['id']; ?>">
|
||||
<p class="contacts_property_name">
|
||||
<select name="name" size="1">
|
||||
<?php echo html_select_options($_['property_types'], 'EMAIL') ?>
|
||||
</select>
|
||||
<br>
|
||||
<input id="contacts_addproperty_button" type="submit" value="<?php echo $l->t('Add'); ?>">
|
||||
</p>
|
||||
<p class="contacts_property_data" id="contacts_generic">
|
||||
<input type="text" name="value" value="">
|
||||
</p>
|
||||
</form>
|
||||
<div id="contacts_addcontactsparts" style="display:none;">
|
||||
<ul class="contacts_property_data" id="contacts_addresspart">
|
||||
<li>
|
||||
<label for="adr_type"><?php echo $l->t('Type'); ?></label>
|
||||
<select id="adr_type" name="parameters[TYPE]" size="1">
|
||||
<?php echo html_select_options($_['adr_types'], 'HOME') ?>
|
||||
</select>
|
||||
</li>
|
||||
<li>
|
||||
<label for="adr_pobox"><?php echo $l->t('PO Box'); ?></label>
|
||||
<input id="adr_pobox" type="text" name="value[0]" value="">
|
||||
</li>
|
||||
<li>
|
||||
<label for="adr_extended"><?php echo $l->t('Extended'); ?></label>
|
||||
<input id="adr_extended" type="text" name="value[1]" value="">
|
||||
</li>
|
||||
<li>
|
||||
<label for="adr_street"><?php echo $l->t('Street'); ?></label>
|
||||
<input id="adr_street" type="text" name="value[2]" value="">
|
||||
</li>
|
||||
<li>
|
||||
<label for="adr_city"><?php echo $l->t('City'); ?></label>
|
||||
<input id="adr_city" type="text" name="value[3]" value="">
|
||||
</li>
|
||||
<li>
|
||||
<label for="adr_region"><?php echo $l->t('Region'); ?></label>
|
||||
<input id="adr_region" type="text" name="value[4]" value="">
|
||||
</li>
|
||||
<li>
|
||||
<label for="adr_zipcode"><?php echo $l->t('Zipcode'); ?></label>
|
||||
<input id="adr_zipcode" type="text" name="value[5]" value="">
|
||||
</li>
|
||||
<li>
|
||||
<label for="adr_country"><?php echo $l->t('Country'); ?></label>
|
||||
<input id="adr_country" type="text" name="value[6]" value="">
|
||||
</li>
|
||||
</ul>
|
||||
<p class="contacts_property_data" id="contacts_phonepart">
|
||||
<input type="text" name="value" value="">
|
||||
<select name="parameters[TYPE][]" multiple="multiple" data-placeholder="<?php echo $l->t('Type') ?>">
|
||||
<?php echo html_select_options($_['phone_types'], 'CELL') ?>
|
||||
</select>
|
||||
</p>
|
||||
<p class="contacts_property_data" id="contacts_generic">
|
||||
<input type="text" name="value" value="">
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
<script language="Javascript">
|
||||
/* Re-tipsify ;-)*/
|
||||
$('#contacts_deletecard').tipsy({gravity: 'ne'});
|
||||
$('#contacts_downloadcard').tipsy({gravity: 'ne'});
|
||||
$('.button').tipsy();
|
||||
</script>
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
$categories = isset($_['categories'])?$_['categories']:array();
|
||||
?>
|
||||
<div id="edit_categories_dialog" title="<?php echo $l->t('Edit categories'); ?>">
|
||||
<!-- ?php print_r($types); ? -->
|
||||
<form method="post" id="categoryform">
|
||||
<div class="scrollarea">
|
||||
<ul id="categorylist">
|
||||
<?php foreach($categories as $category) { ?>
|
||||
<li><input type="checkbox" name="categories[]" value="<?php echo $category; ?>" /><?php echo $category; ?></li>
|
||||
<?php } ?>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="bottombuttons"><input type="text" id="category_addinput" name="category" /><button id="category_addbutton" disabled="disabled"><?php echo $l->t('Add'); ?></button></div>
|
||||
</form>
|
||||
</div>
|
|
@ -1,3 +0,0 @@
|
|||
<div id="messagebox">
|
||||
<div id="messagebox_msg"></div>
|
||||
</di>
|
|
@ -1,8 +0,0 @@
|
|||
<div id="firstrun">
|
||||
You have no contacts in your list.
|
||||
<div id="selections">
|
||||
<input type="button" value="Import contacts" onclick="Contacts.UI.Addressbooks.import()" />
|
||||
<input type="button" value="Add contact" onclick="Contacts.UI.Card.editNew()" />
|
||||
<input type="button" value="Edit addressbooks" onclick="Contacts.UI.Addressbooks.overview()" />
|
||||
</div>
|
||||
</div>
|
|
@ -1,9 +0,0 @@
|
|||
<p id="contacts_details_name" class="contacts_property" data-checksum="<?php echo $_['property']['checksum']; ?>">
|
||||
<?php echo htmlspecialchars($_['property']['value']); ?>
|
||||
<span style="display:none;" data-use="edit"><img class="svg action" src="<?php echo image_path('', 'actions/rename.svg'); ?>" /></span>
|
||||
</p>
|
||||
<?php if (!isset($_['details'])): ?>
|
||||
<script>
|
||||
$('#leftcontent li.active a').text('<?php echo htmlspecialchars($_['property']['value']); ?>');
|
||||
</script>
|
||||
<?php endif ?>
|
|
@ -1,4 +0,0 @@
|
|||
<p id="contacts_details_name_n" class="contacts_property" data-checksum="<?php echo $_['property']['checksum']; ?>">
|
||||
(<?php echo $_['property']['value'][0].', '.$_['property']['value'][1].' '.$_['property']['value'][2]; ?>)
|
||||
<span style="display:none;" data-use="edit"><img class="svg action" src="<?php echo image_path('', 'actions/rename.svg'); ?>" /></span>
|
||||
</p>
|
|
@ -1,86 +0,0 @@
|
|||
<li class="contacts_property" data-checksum="<?php echo $_['property']['checksum']; ?>">
|
||||
<?php if($_['property']['name'] == 'BDAY'): ?>
|
||||
<p class="contacts_property_name"><?php echo $l->t('Birthday'); ?></p>
|
||||
<p class="contacts_property_data">
|
||||
<?php echo $l->l('date',new DateTime($_['property']['value'])); ?>
|
||||
<span style="display:none;" data-use="delete"><img class="svg action" src="<?php echo image_path('', 'actions/delete.svg'); ?>" /></span>
|
||||
</p>
|
||||
<?php elseif($_['property']['name'] == 'ORG'): ?>
|
||||
<p class="contacts_property_name"><?php echo $l->t('Organization'); ?></p>
|
||||
<p class="contacts_property_data">
|
||||
<?php echo htmlspecialchars($_['property']['value']); ?>
|
||||
<span style="display:none;" data-use="edit"><img class="svg action" src="<?php echo image_path('', 'actions/rename.svg'); ?>" /></span>
|
||||
<span style="display:none;" data-use="delete"><img class="svg action" src="<?php echo image_path('', 'actions/delete.svg'); ?>" /></span>
|
||||
</p>
|
||||
<?php elseif($_['property']['name'] == 'EMAIL'): ?>
|
||||
<p class="contacts_property_name"><?php echo $l->t('Email'); ?></p>
|
||||
<p class="contacts_property_data">
|
||||
<?php echo htmlspecialchars($_['property']['value']); ?>
|
||||
<span style="display:none;" data-use="edit"><img class="svg action" src="<?php echo image_path('', 'actions/rename.svg'); ?>" /></span>
|
||||
<span style="display:none;" data-use="delete"><img class="svg action" src="<?php echo image_path('', 'actions/delete.svg'); ?>" /></span>
|
||||
</p>
|
||||
<?php elseif($_['property']['name'] == 'TEL'): ?>
|
||||
<p class="contacts_property_name"><?php echo (isset($_['property']['parameters']['PREF']) && $_['property']['parameters']['PREF']) ? $l->t('Preferred').' ' : '' ?><?php echo $l->t('Phone'); ?></p>
|
||||
<p class="contacts_property_data">
|
||||
<?php echo htmlspecialchars($_['property']['value']); ?>
|
||||
<?php if(isset($_['property']['parameters']['TYPE']) && !empty($_['property']['parameters']['TYPE'])): ?>
|
||||
<?php
|
||||
foreach($_['property']['parameters']['TYPE'] as $type) {
|
||||
if (isset($_['phone_types'][strtoupper($type)])){
|
||||
$types[]=$_['phone_types'][strtoupper($type)];
|
||||
}
|
||||
else{
|
||||
$types[]=$l->t(ucwords(strtolower($type)));
|
||||
}
|
||||
}
|
||||
$label = join(' ', $types);
|
||||
?>
|
||||
(<?php echo $label; ?>)
|
||||
<?php endif; ?>
|
||||
<span style="display:none;" data-use="edit"><img class="svg action" src="<?php echo image_path('', 'actions/rename.svg'); ?>" /></span>
|
||||
<span style="display:none;" data-use="delete"><img class="svg action" src="<?php echo image_path('', 'actions/delete.svg'); ?>" /></span>
|
||||
</p>
|
||||
<?php elseif($_['property']['name'] == 'ADR'): ?>
|
||||
<p class="contacts_property_name">
|
||||
<?php echo $l->t('Address'); ?>
|
||||
<?php if(isset($_['property']['parameters']['TYPE'])): ?>
|
||||
<br>
|
||||
<?php
|
||||
$type = $_['property']['parameters']['TYPE'];
|
||||
if (isset($_['adr_types'][strtoupper($type)])){
|
||||
$label=$_['adr_types'][strtoupper($type)];
|
||||
}
|
||||
else{
|
||||
$label=$l->t(ucwords(strtolower($type)));
|
||||
}
|
||||
?>
|
||||
(<?php echo $label; ?>)
|
||||
<?php endif; ?>
|
||||
</p>
|
||||
<p class="contacts_property_data">
|
||||
<?php if(!empty($_['property']['value'][0])): ?>
|
||||
<?php echo htmlspecialchars($_['property']['value'][0]); ?><br>
|
||||
<?php endif; ?>
|
||||
<?php if(!empty($_['property']['value'][1])): ?>
|
||||
<?php echo htmlspecialchars($_['property']['value'][1]); ?><br>
|
||||
<?php endif; ?>
|
||||
<?php if(!empty($_['property']['value'][2])): ?>
|
||||
<?php echo htmlspecialchars($_['property']['value'][2]); ?><br>
|
||||
<?php endif; ?>
|
||||
<?php if(!empty($_['property']['value'][3])): ?>
|
||||
<?php echo htmlspecialchars($_['property']['value'][3]); ?><br>
|
||||
<?php endif; ?>
|
||||
<?php if(!empty($_['property']['value'][4])): ?>
|
||||
<?php echo htmlspecialchars($_['property']['value'][4]); ?><br>
|
||||
<?php endif; ?>
|
||||
<?php if(!empty($_['property']['value'][5])): ?>
|
||||
<?php echo htmlspecialchars($_['property']['value'][5]); ?><br>
|
||||
<?php endif; ?>
|
||||
<?php if(!empty($_['property']['value'][6])): ?>
|
||||
<?php echo htmlspecialchars($_['property']['value'][6]); ?>
|
||||
<?php endif; ?>
|
||||
<span style="display:none;" data-use="edit"><img class="svg action" src="<?php echo image_path('', 'actions/rename.svg'); ?>" /></span>
|
||||
<span style="display:none;" data-use="delete"><img class="svg action" src="<?php echo image_path('', 'actions/delete.svg'); ?>" /></span>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
</li>
|
|
@ -1,91 +0,0 @@
|
|||
<form id="contacts_setpropertyform">
|
||||
<input type="hidden" name="checksum" value="<?php echo $_['property']['checksum']; ?>">
|
||||
<input type="hidden" name="id" value="<?php echo $_['id']; ?>">
|
||||
<?php if($_['property']['name']=='N'): ?>
|
||||
<p class="contacts_property_name">
|
||||
<dl class="contacts_property_data form">
|
||||
<dt><label for="n1"><?php echo $l->t('Given name'); ?></label></dt>
|
||||
<dd><input id="n1" type="text" name="value[1]" value="<?php echo htmlspecialchars($_['property']['value'][1]); ?>"></dd>
|
||||
<dt><label for="n0"><?php echo $l->t('Family name'); ?></dt>
|
||||
<dd><input id="n0" type="text" name="value[0]" value="<?php echo htmlspecialchars($_['property']['value'][0]); ?>"></dd>
|
||||
<dt><label for="n2"><?php echo $l->t('Additional names'); ?></dt>
|
||||
<dd><input id="n2" type="text" name="value[2]" value="<?php echo htmlspecialchars($_['property']['value'][2]); ?>">
|
||||
<input id="n3" type="hidden" name="value[3]" value="<?php echo htmlspecialchars($_['property']['value'][3]); ?>">
|
||||
<input id="n4" type="hidden" name="value[4]" value="<?php echo htmlspecialchars($_['property']['value'][4]); ?>">
|
||||
</dd>
|
||||
</dl>
|
||||
</p>
|
||||
<?php elseif($_['property']['name']=='FN'): ?>
|
||||
<p class="contacts_property_data"><input id="fn" type="text" name="value" value="<?php echo htmlspecialchars($_['property']['value']); ?>"></p>
|
||||
<?php elseif($_['property']['name']=='ADR'): ?>
|
||||
<p class="contacts_property_name"><label for="adr_pobox"><?php echo $l->t('Address'); ?></label></p>
|
||||
<dl class="contacts_property_data form" id="contacts_addresspart">
|
||||
<dt>
|
||||
<label class="label" for="adr_type"><?php echo $l->t('Type'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<select id="adr_type" name="parameters[TYPE]" size="1">
|
||||
<?php echo html_select_options($_['adr_types'], strtoupper($_['property']['parameters']['TYPE'])) ?>
|
||||
</select>
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="adr_pobox"><?php echo $l->t('PO Box'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input id="adr_pobox" type="text" name="value[0]" value="<?php echo htmlspecialchars($_['property']['value'][0]) ?>">
|
||||
</dd>
|
||||
<!-- dt>
|
||||
<label for="adr_extended"><?php echo $l->t('Extended'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input style="width: 7em;" id="adr_extended" type="text" name="value[1]" value="<?php echo htmlspecialchars($_['property']['value'][1]) ?>">
|
||||
</dd -->
|
||||
<dt>
|
||||
<label for="adr_street"><?php echo $l->t('Street'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input style="width: 12em;" id="adr_street" type="text" name="value[2]" value="<?php echo htmlspecialchars($_['property']['value'][2]) ?>">
|
||||
<label for="adr_extended"><?php echo $l->t('Extended'); ?></label><input style="width: 7em;" id="adr_extended" type="text" name="value[1]" value="<?php echo htmlspecialchars($_['property']['value'][1]) ?>">
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="adr_city"><?php echo $l->t('City'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input style="width: 12em;" id="adr_city" type="text" name="value[3]" value="<?php echo htmlspecialchars($_['property']['value'][3]) ?>">
|
||||
<label for="adr_zipcode"><?php echo $l->t('Zipcode'); ?></label>
|
||||
<input style="width: 5em;" id="adr_zipcode" type="text" name="value[5]" value="<?php echo htmlspecialchars($_['property']['value'][5]) ?>">
|
||||
</dd>
|
||||
<dt>
|
||||
<label for="adr_region"><?php echo $l->t('Region'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input id="adr_region" type="text" name="value[4]" value="<?php echo htmlspecialchars($_['property']['value'][4]) ?>">
|
||||
</dd>
|
||||
<!-- dt>
|
||||
<label for="adr_zipcode"><?php echo $l->t('Zipcode'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input style="width: 7em;" id="adr_zipcode" type="text" name="value[5]" value="<?php echo htmlspecialchars($_['property']['value'][5]) ?>">
|
||||
</dd -->
|
||||
<dt>
|
||||
<label for="adr_country"><?php echo $l->t('Country'); ?></label>
|
||||
</dt>
|
||||
<dd>
|
||||
<input style="width: 25em;" id="adr_country" type="text" name="value[6]" value="<?php echo htmlspecialchars($_['property']['value'][6]) ?>">
|
||||
</dd>
|
||||
</dl>
|
||||
<?php elseif($_['property']['name']=='TEL'): ?>
|
||||
<p class="contacts_property_name"><label for="tel"><?php echo $l->t('Phone'); ?></label></p>
|
||||
<p class="contacts_property_data"><input id="tel" type="phone" name="value" value="<?php echo htmlspecialchars($_['property']['value']) ?>">
|
||||
<select id="tel_type<?php echo $_['property']['checksum'] ?>" name="parameters[TYPE][]" multiple="multiple" data-placeholder="<?php echo $l->t('Type') ?>">
|
||||
<?php echo html_select_options($_['phone_types'], isset($_['property']['parameters']['TYPE'])?$_['property']['parameters']['TYPE']:array()) ?>
|
||||
</select></p>
|
||||
<?php elseif($_['property']['name']=='EMAIL'): ?>
|
||||
<p class="contacts_property_name"><label for="email"><?php echo $l->t('Email'); ?></label></p>
|
||||
<p class="contacts_property_data"><input id="email" type="text" name="value" value="<?php echo htmlspecialchars($_['property']['value']); ?>"></p>
|
||||
<?php elseif($_['property']['name']=='ORG'): ?>
|
||||
<p class="contacts_property_name"><label for="org"><?php echo $l->t('Organization'); ?></label></p>
|
||||
<p class="contacts_property_data"><input id="org" type="text" name="value" value="<?php echo htmlspecialchars($_['property']['value']); ?>"></p>
|
||||
<?php endif; ?>
|
||||
<input id="contacts_setproperty_button" type="submit" value="<?php echo $l->t('Update'); ?>">
|
||||
</form>
|
|
@ -1,7 +1,12 @@
|
|||
<form id="mediaform">
|
||||
<form id="contacts">
|
||||
<fieldset class="personalblock">
|
||||
<strong><?php echo $l->t('Contacts'); ?></strong><br />
|
||||
<?php echo $l->t('CardDAV syncing address:'); ?>
|
||||
<?php echo OC_Helper::linkToAbsolute('contacts', 'carddav.php'); ?><br />
|
||||
<?php echo $l->t('CardDAV syncing addresses:'); ?>
|
||||
<dl>
|
||||
<dt><?php echo $l->t('Primary address (Kontact et al)'); ?></dt>
|
||||
<dd><code><?php echo OC_Helper::linkToAbsolute('contacts', 'carddav.php'); ?>/</code></dd>
|
||||
<dt><?php echo $l->t('iOS/OS X'); ?></dt>
|
||||
<dd><code><?php echo OC_Helper::linkToAbsolute('contacts', 'carddav.php'); ?>/principals/<?php echo OC_User::getUser(); ?></code>/</dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Copyright (c) 2011, Frank Karlitschek <karlitschek@kde.org>
|
||||
* This file is licensed under the Affero General Public License version 3 or later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
require_once('../../../lib/base.php');
|
||||
OC_Util::checkAdminUser();
|
||||
|
||||
$sites = array();
|
||||
for ($i = 0; $i < sizeof($_POST['site_name']); $i++) {
|
||||
if (!empty($_POST['site_name'][$i]) && !empty($_POST['site_url'][$i])) {
|
||||
array_push($sites, array($_POST['site_name'][$i], $_POST['site_url'][$i]));
|
||||
}
|
||||
}
|
||||
|
||||
if (sizeof($sites) == 0)
|
||||
OC_Appconfig::deleteKey('external', 'sites');
|
||||
else
|
||||
OC_Appconfig::setValue('external', 'sites', json_encode($sites));
|
||||
|
||||
echo 'true';
|
||||
?>
|
|
@ -1,24 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2011, Frank Karlitschek <karlitschek@kde.org>
|
||||
* This file is licensed under the Affero General Public License version 3 or later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
require_once('../../../lib/base.php');
|
||||
OC_Util::checkAdminUser();
|
||||
|
||||
if(isset($_POST['s1name'])) OC_Appconfig::setValue( 'external','site1name', $_POST['s1name'] );
|
||||
if(isset($_POST['s1url'])) OC_Appconfig::setValue( 'external','site1url', $_POST['s1url'] );
|
||||
if(isset($_POST['s2name'])) OC_Appconfig::setValue( 'external','site2name', $_POST['s2name'] );
|
||||
if(isset($_POST['s2url'])) OC_Appconfig::setValue( 'external','site2url', $_POST['s2url'] );
|
||||
if(isset($_POST['s3name'])) OC_Appconfig::setValue( 'external','site3name', $_POST['s3name'] );
|
||||
if(isset($_POST['s3url'])) OC_Appconfig::setValue( 'external','site3url', $_POST['s3url'] );
|
||||
if(isset($_POST['s4name'])) OC_Appconfig::setValue( 'external','site4name', $_POST['s4name'] );
|
||||
if(isset($_POST['s4url'])) OC_Appconfig::setValue( 'external','site4url', $_POST['s4url'] );
|
||||
if(isset($_POST['s5name'])) OC_Appconfig::setValue( 'external','site5name', $_POST['s5name'] );
|
||||
if(isset($_POST['s5url'])) OC_Appconfig::setValue( 'external','site5url', $_POST['s5url'] );
|
||||
|
||||
echo 'true';
|
||||
|
||||
?>
|
|
@ -1,37 +1,35 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - External plugin
|
||||
*
|
||||
* @author Frank Karlitschek
|
||||
* @copyright 2011 Frank Karlitschek karlitschek@kde.org
|
||||
*
|
||||
* 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 Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
* ownCloud - External plugin
|
||||
*
|
||||
* @author Frank Karlitschek
|
||||
* @copyright 2011 Frank Karlitschek karlitschek@kde.org
|
||||
*
|
||||
* 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 Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
OC_APP::registerAdmin('external','settings');
|
||||
OC::$CLASSPATH['OC_External'] = 'apps/external/lib/external.php';
|
||||
OC_Util::addStyle( 'external', 'style');
|
||||
|
||||
OC_App::register( array( 'order' => 70, 'id' => 'external', 'name' => 'External' ));
|
||||
OC_APP::registerAdmin('external', 'settings');
|
||||
|
||||
if(OC_Appconfig::getValue( "external","site1name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index1', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=1', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Appconfig::getValue( "external","site1name", '' )));
|
||||
|
||||
if(OC_Appconfig::getValue( "external","site2name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index2', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=2', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Appconfig::getValue( "external","site2name", '' )));
|
||||
|
||||
if(OC_Appconfig::getValue( "external","site3name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index3', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=3', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Appconfig::getValue( "external","site3name", '' )));
|
||||
|
||||
if(OC_Appconfig::getValue( "external","site4name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index4', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=4', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Appconfig::getValue( "external","site4name", '' )));
|
||||
|
||||
if(OC_Appconfig::getValue( "external","site5name", '' )<>'') OC_App::addNavigationEntry( array( 'id' => 'external_index5', 'order' => 80, 'href' => OC_Helper::linkTo( 'external', 'index.php' ).'?id=5', 'icon' => OC_Helper::imagePath( 'external', 'external.png' ), 'name' => OC_Appconfig::getValue( "external","site5name", '' )));
|
||||
OC_App::register(array('order' => 70, 'id' => 'external', 'name' => 'External'));
|
||||
|
||||
$sites = OC_External::getSites();
|
||||
for ($i = 0; $i < sizeof($sites); $i++) {
|
||||
OC_App::addNavigationEntry(
|
||||
array('id' => 'external_index' . ($i + 1), 'order' => 80 + $i, 'href' => OC_Helper::linkTo('external', 'index.php') . '?id=' . ($i + 1), 'icon' => OC_Helper::imagePath('external', 'external.png'), 'name' => $sites[$i][0]));
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- /
|
||||
/* vim: set shiftwidth=4 tabstop=8 autoindent cindent expandtab: */
|
||||
|
||||
.site_url {
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
.delete_button {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.external_sites {
|
||||
width: 450px;
|
||||
}
|
|
@ -1,42 +1,43 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - External plugin
|
||||
*
|
||||
* @author Frank Karlitschek
|
||||
* @copyright 2011 Frank Karlitschek karlitschek@kde.org
|
||||
*
|
||||
* 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 Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
* ownCloud - External plugin
|
||||
*
|
||||
* @author Frank Karlitschek
|
||||
* @copyright 2011 Frank Karlitschek karlitschek@kde.org
|
||||
*
|
||||
* 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 Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
require_once('../../lib/base.php');
|
||||
require_once('lib/external.php');
|
||||
|
||||
OC_Util::checkLoggedIn();
|
||||
|
||||
if(isset($_GET['id'])){
|
||||
if (isset($_GET['id'])) {
|
||||
|
||||
$id=$_GET['id'];
|
||||
$id = $_GET['id'];
|
||||
$id = (int) $id;
|
||||
|
||||
$url=OC_Appconfig::getValue( "external","site".$id."url", '' );
|
||||
OC_App::setActiveNavigationEntry( 'external_index'.$id );
|
||||
|
||||
$tmpl = new OC_Template( 'external', 'frame', 'user' );
|
||||
$tmpl->assign('url',$url);
|
||||
$tmpl->printPage();
|
||||
$sites = OC_External::getSites();
|
||||
if (sizeof($sites) >= $id) {
|
||||
$url = $sites[$id - 1][1];
|
||||
OC_App::setActiveNavigationEntry('external_index' . $id);
|
||||
|
||||
$tmpl = new OC_Template('external', 'frame', 'user');
|
||||
$tmpl->assign('url', $url);
|
||||
$tmpl->printPage();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -1,68 +1,57 @@
|
|||
$(document).ready(function(){
|
||||
newSiteHtml = '<li><input type="text" class="site_name" name="site_name[]" value="" placeholder="Name" />\n\
|
||||
<input type="text" name="site_url[]" class="site_url" value="" placeholder="URL" />\n\
|
||||
<img class="svg action delete_button" src="'+OC.imagePath("core", "actions/delete") +'" title="Remove site" /></li>';
|
||||
|
||||
|
||||
|
||||
$('#s1name').blur(function(event){
|
||||
// Handler functions
|
||||
function addSiteEventHandler(event) {
|
||||
event.preventDefault();
|
||||
var post = $( "#s1name" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s1name .msg', data); });
|
||||
});
|
||||
|
||||
saveSites();
|
||||
}
|
||||
|
||||
$('#s2name').blur(function(event){
|
||||
function deleteButtonEventHandler(event) {
|
||||
event.preventDefault();
|
||||
var post = $( "#s2name" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s2name .msg', data); });
|
||||
});
|
||||
|
||||
$('#s3name').blur(function(event){
|
||||
$(this).tipsy('hide');
|
||||
$(this).parent().remove();
|
||||
|
||||
saveSites();
|
||||
}
|
||||
|
||||
function saveSites() {
|
||||
var post = $('#external').serialize();
|
||||
$.post( OC.filePath('external','ajax','setsites.php') , post, function(data) {
|
||||
// OC.msg.finishedSaving('#site_name .msg', data);
|
||||
});
|
||||
}
|
||||
|
||||
function showDeleteButton(event) {
|
||||
$(this).find('img.delete_button').fadeIn(100);
|
||||
}
|
||||
|
||||
function hideDeleteButton(event) {
|
||||
$(this).find('img.delete_button').fadeOut(100);
|
||||
}
|
||||
|
||||
// Initialize events
|
||||
$('input[name^=site_]').change(addSiteEventHandler);
|
||||
$('img.delete_button').click(deleteButtonEventHandler);
|
||||
$('img.delete_button').tipsy();
|
||||
|
||||
$('#external li').hover(showDeleteButton, hideDeleteButton);
|
||||
|
||||
$('#add_external_site').click(function(event) {
|
||||
event.preventDefault();
|
||||
var post = $( "#s3name" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s3name .msg', data); });
|
||||
});
|
||||
$('#external ul').append(newSiteHtml);
|
||||
|
||||
$('#s4name').blur(function(event){
|
||||
event.preventDefault();
|
||||
var post = $( "#s4name" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s4name .msg', data); });
|
||||
$('input.site_url:last').prev('input.site_name').andSelf().change(addSiteEventHandler);
|
||||
$('img.delete_button').click(deleteButtonEventHandler);
|
||||
$('img.delete_button:last').tipsy();
|
||||
$('#external li:last').hover(showDeleteButton, hideDeleteButton);
|
||||
|
||||
});
|
||||
|
||||
$('#s5name').blur(function(event){
|
||||
event.preventDefault();
|
||||
var post = $( "#s5name" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s5name .msg', data); });
|
||||
});
|
||||
|
||||
$('#s1url').blur(function(event){
|
||||
event.preventDefault();
|
||||
var post = $( "#s1url" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s1url .msg', data); });
|
||||
});
|
||||
|
||||
$('#s2url').blur(function(event){
|
||||
event.preventDefault();
|
||||
var post = $( "#s2url" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s2url .msg', data); });
|
||||
});
|
||||
|
||||
$('#s3url').blur(function(event){
|
||||
event.preventDefault();
|
||||
var post = $( "#s3url" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s3url .msg', data); });
|
||||
});
|
||||
|
||||
$('#s4url').blur(function(event){
|
||||
event.preventDefault();
|
||||
var post = $( "#s4url" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s4url .msg', data); });
|
||||
});
|
||||
|
||||
$('#s5url').blur(function(event){
|
||||
event.preventDefault();
|
||||
var post = $( "#s5url" ).serialize();
|
||||
$.post( OC.filePath('external','ajax','seturls.php') , post, function(data){ OC.msg.finishedSaving('#s5url .msg', data); });
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - gallery application
|
||||
*
|
||||
* @author Bartek Przybylski
|
||||
* @copyright 2012 Bartek Przybylski bart.p.pl@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
class OC_External {
|
||||
|
||||
public static function getSites() {
|
||||
if (($sites = json_decode(OC_Appconfig::getValue("external", "sites", ''))) != NULL) {
|
||||
return $sites;
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
|
@ -6,17 +6,5 @@ OC_Util::addScript( "external", "admin" );
|
|||
|
||||
$tmpl = new OC_Template( 'external', 'settings');
|
||||
|
||||
$tmpl->assign('s1name',OC_Appconfig::getValue( "external","site1name", '' ));
|
||||
$tmpl->assign('s2name',OC_Appconfig::getValue( "external","site2name", '' ));
|
||||
$tmpl->assign('s3name',OC_Appconfig::getValue( "external","site3name", '' ));
|
||||
$tmpl->assign('s4name',OC_Appconfig::getValue( "external","site4name", '' ));
|
||||
$tmpl->assign('s5name',OC_Appconfig::getValue( "external","site5name", '' ));
|
||||
|
||||
$tmpl->assign('s1url',OC_Appconfig::getValue( "external","site1url", '' ));
|
||||
$tmpl->assign('s2url',OC_Appconfig::getValue( "external","site2url", '' ));
|
||||
$tmpl->assign('s3url',OC_Appconfig::getValue( "external","site3url", '' ));
|
||||
$tmpl->assign('s4url',OC_Appconfig::getValue( "external","site4url", '' ));
|
||||
$tmpl->assign('s5url',OC_Appconfig::getValue( "external","site5url", '' ));
|
||||
|
||||
return $tmpl->fetchPage();
|
||||
?>
|
||||
|
|
|
@ -1,23 +1,21 @@
|
|||
<form id="external">
|
||||
<fieldset class="personalblock">
|
||||
<strong>External Sites</strong><br />
|
||||
<input type="text" name="s1name" id="s1name" value="<?php echo $_['s1name']; ?>" placeholder="<?php echo $l->t('Name');?>" />
|
||||
<input type="text" name="s1url" id="s1url" value="<?php echo $_['s1url']; ?>" placeholder="<?php echo $l->t('Url');?>" />
|
||||
<br />
|
||||
<input type="text" name="s2name" id="s2name" value="<?php echo $_['s2name']; ?>" placeholder="<?php echo $l->t('Name');?>" />
|
||||
<input type="text" name="s2url" id="s2url" value="<?php echo $_['s2url']; ?>" placeholder="<?php echo $l->t('Url');?>" />
|
||||
<br />
|
||||
<input type="text" name="s3name" id="s3name" value="<?php echo $_['s3name']; ?>" placeholder="<?php echo $l->t('Name');?>" />
|
||||
<input type="text" name="s3url" id="s3url" value="<?php echo $_['s3url']; ?>" placeholder="<?php echo $l->t('Url');?>" />
|
||||
<br />
|
||||
<input type="text" name="s4name" id="s4name" value="<?php echo $_['s4name']; ?>" placeholder="<?php echo $l->t('Name');?>" />
|
||||
<input type="text" name="s4url" id="s4url" value="<?php echo $_['s4url']; ?>" placeholder="<?php echo $l->t('Url');?>" />
|
||||
<br />
|
||||
<input type="text" name="s5name" id="s5name" value="<?php echo $_['s5name']; ?>" placeholder="<?php echo $l->t('Name');?>" />
|
||||
<input type="text" name="s5url" id="s5url" value="<?php echo $_['s5url']; ?>" placeholder="<?php echo $l->t('Url');?>" />
|
||||
<br />
|
||||
<ul class="external_sites">
|
||||
|
||||
<?php
|
||||
$sites = OC_External::getSites();
|
||||
for($i = 0; $i < sizeof($sites); $i++) {
|
||||
echo '<li><input type="text" name="site_name[]" class="site_name" value="'.$sites[$i][0].'" placeholder="'.$l->t('Name').'" />
|
||||
<input type="text" class="site_url" name="site_url[]" value="'.$sites[$i][1].'" placeholder="'.$l->t('URL').'" />
|
||||
<img class="svg action delete_button" src="'.image_path("", "actions/delete.svg") .'" title="'.$l->t("Remove site").'" />
|
||||
</li>';
|
||||
}
|
||||
?>
|
||||
|
||||
<span class="msg"></span>
|
||||
</ul>
|
||||
|
||||
<input type="button" id="add_external_site" value="Add" />
|
||||
<span class="msg"></span>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
OC::$CLASSPATH['OC_Archive'] = 'apps/files_archive/lib/archive.php';
|
||||
foreach(array('ZIP') as $type){
|
||||
OC::$CLASSPATH['OC_Archive_'.$type] = 'apps/files_archive/lib/'.strtolower($type).'.php';
|
||||
}
|
||||
|
||||
OC::$CLASSPATH['OC_Filestorage_Archive']='apps/files_archive/lib/storage.php';
|
||||
|
||||
OC_Hook::connect('OC_Filesystem','get_mountpoint','OC_Filestorage_Archive','autoMount');
|
||||
|
||||
OC_Util::addScript( 'files_archive', 'archive' );
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0"?>
|
||||
<info>
|
||||
<id>files_archive</id>
|
||||
<name>Archive support</name>
|
||||
<description>Transparent opening of archives</description>
|
||||
<version>0.1</version>
|
||||
<licence>AGPL</licence>
|
||||
<author>Robin Appelman</author>
|
||||
<require>3</require>
|
||||
</info>
|
|
@ -0,0 +1,15 @@
|
|||
/**
|
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
$(document).ready(function() {
|
||||
if(typeof FileActions!=='undefined'){
|
||||
FileActions.register('application/zip','Open','',function(filename){
|
||||
window.location='index.php?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename);
|
||||
});
|
||||
FileActions.setDefault('application/zip','Open');
|
||||
}
|
||||
});
|
|
@ -0,0 +1,99 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
abstract class OC_Archive{
|
||||
/**
|
||||
* open any of the supporeted archive types
|
||||
* @param string path
|
||||
* @return OC_Archive
|
||||
*/
|
||||
public static function open($path){
|
||||
$ext=substr($path,strrpos($path,'.'));
|
||||
switch($ext){
|
||||
case '.zip':
|
||||
return new OC_Archive_ZIP($path);
|
||||
}
|
||||
}
|
||||
|
||||
abstract function __construct($source);
|
||||
/**
|
||||
* add an empty folder to the archive
|
||||
* @param string path
|
||||
* @return bool
|
||||
*/
|
||||
abstract function addFolder($path);
|
||||
/**
|
||||
* add a file to the archive
|
||||
* @param string path
|
||||
* @param string source either a local file or string data
|
||||
* @return bool
|
||||
*/
|
||||
abstract function addFile($path,$source='');
|
||||
/**
|
||||
* rename a file or folder in the archive
|
||||
* @param string source
|
||||
* @param string dest
|
||||
* @return bool
|
||||
*/
|
||||
abstract function rename($source,$dest);
|
||||
/**
|
||||
* get the uncompressed size of a file in the archive
|
||||
* @param string path
|
||||
* @return int
|
||||
*/
|
||||
abstract function filesize($path);
|
||||
/**
|
||||
* get the last modified time of a file in the archive
|
||||
* @param string path
|
||||
* @return int
|
||||
*/
|
||||
abstract function mtime($path);
|
||||
/**
|
||||
* get the files in a folder
|
||||
* @param path
|
||||
* @return array
|
||||
*/
|
||||
abstract function getFolder($path);
|
||||
/**
|
||||
*get all files in the archive
|
||||
* @return array
|
||||
*/
|
||||
abstract function getFiles();
|
||||
/**
|
||||
* get the content of a file
|
||||
* @param string path
|
||||
* @return string
|
||||
*/
|
||||
abstract function getFile($path);
|
||||
/**
|
||||
* extract a single file from the archive
|
||||
* @param string path
|
||||
* @param string dest
|
||||
* @return bool
|
||||
*/
|
||||
abstract function extractFile($path,$dest);
|
||||
/**
|
||||
* check if a file or folder exists in the archive
|
||||
* @param string path
|
||||
* @return bool
|
||||
*/
|
||||
abstract function fileExists($path);
|
||||
/**
|
||||
* remove a file or folder from the archive
|
||||
* @param string path
|
||||
* @return bool
|
||||
*/
|
||||
abstract function remove($path);
|
||||
/**
|
||||
* get a file handler
|
||||
* @param string path
|
||||
* @param string mode
|
||||
* @return resource
|
||||
*/
|
||||
abstract function getStream($path,$mode);
|
||||
}
|
|
@ -0,0 +1,142 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
class OC_Filestorage_Archive extends OC_Filestorage_Common{
|
||||
/**
|
||||
* underlying local storage used for missing functions
|
||||
* @var OC_Archive
|
||||
*/
|
||||
private $archive;
|
||||
private $path;
|
||||
private static $mounted=array();
|
||||
private static $enableAutomount=true;
|
||||
private static $rootView;
|
||||
|
||||
private function stripPath($path){//files should never start with /
|
||||
if(substr($path,0,1)=='/'){
|
||||
$path=substr($path,1);
|
||||
}
|
||||
return $path;
|
||||
}
|
||||
|
||||
public function __construct($params){
|
||||
$this->archive=OC_Archive::open($params['archive']);
|
||||
$this->path=$params['archive'];
|
||||
}
|
||||
|
||||
public function mkdir($path){
|
||||
$path=$this->stripPath($path);
|
||||
return $this->archive->addFolder($path);
|
||||
}
|
||||
public function rmdir($path){
|
||||
$path=$this->stripPath($path);
|
||||
return $this->archive->remove($path.'/');
|
||||
}
|
||||
public function opendir($path){
|
||||
$path=$this->stripPath($path);
|
||||
$content=$this->archive->getFolder($path);
|
||||
foreach($content as &$file){
|
||||
if(substr($file,-1)=='/'){
|
||||
$file=substr($file,0,-1);
|
||||
}
|
||||
}
|
||||
$id=md5($this->path.$path);
|
||||
OC_FakeDirStream::$dirs[$id]=$content;
|
||||
return opendir('fakedir://'.$id);
|
||||
}
|
||||
public function stat($path){
|
||||
$ctime=filectime($this->path);
|
||||
$path=$this->stripPath($path);
|
||||
if($path==''){
|
||||
$stat=stat($this->path);
|
||||
}else{
|
||||
if($this->is_dir($path)){
|
||||
$stat=array('size'=>0);
|
||||
$stat['mtime']=filemtime($this->path);
|
||||
}else{
|
||||
$stat=array();
|
||||
$stat['mtime']=$this->archive->mtime($path);
|
||||
$stat['size']=$this->archive->filesize($path);
|
||||
}
|
||||
}
|
||||
$stat['ctime']=$ctime;
|
||||
return $stat;
|
||||
}
|
||||
public function filetype($path){
|
||||
$path=$this->stripPath($path);
|
||||
if($path==''){
|
||||
return 'dir';
|
||||
}
|
||||
if(substr($path,-1)=='/'){
|
||||
return $this->archive->fileExists($path)?'dir':'file';
|
||||
}else{
|
||||
return $this->archive->fileExists($path.'/')?'dir':'file';
|
||||
}
|
||||
}
|
||||
public function is_readable($path){
|
||||
return is_readable($this->path);
|
||||
}
|
||||
public function is_writable($path){
|
||||
return is_writable($this->path);
|
||||
}
|
||||
public function file_exists($path){
|
||||
$path=$this->stripPath($path);
|
||||
if($path==''){
|
||||
return file_exists($this->path);
|
||||
}
|
||||
return $this->archive->fileExists($path) or $this->archive->fileExists($path.'/');
|
||||
}
|
||||
public function unlink($path){
|
||||
$path=$this->stripPath($path);
|
||||
return $this->archive->remove($path);
|
||||
}
|
||||
public function fopen($path,$mode){
|
||||
$path=$this->stripPath($path);
|
||||
return $this->archive->getStream($path,$mode);
|
||||
}
|
||||
public function free_space($path){
|
||||
return 0;
|
||||
}
|
||||
public function touch($path, $mtime=null){
|
||||
if(is_null($mtime)){
|
||||
$tmpFile=OC_Helper::tmpFile();
|
||||
$this->archive->extractFile($path,$tmpFile);
|
||||
$this->archive->addfile($path,$tmpFile);
|
||||
}else{
|
||||
return false;//not supported
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* automount paths from file hooks
|
||||
* @param aray params
|
||||
*/
|
||||
public static function autoMount($params){
|
||||
if(!self::$enableAutomount){
|
||||
return;
|
||||
}
|
||||
$path=$params['path'];
|
||||
if(!self::$rootView){
|
||||
self::$rootView=new OC_FilesystemView('');
|
||||
}
|
||||
self::$enableAutomount=false;//prevent recursion
|
||||
$supported=array('zip');
|
||||
foreach($supported as $type){
|
||||
$ext='.'.$type.'/';
|
||||
if(($pos=strpos(strtolower($path),$ext))!==false){
|
||||
$archive=substr($path,0,$pos+strlen($ext)-1);
|
||||
if(self::$rootView->file_exists($archive) and array_search($archive,self::$mounted)===false){
|
||||
$localArchive=self::$rootView->getLocalFile($archive);
|
||||
OC_Filesystem::mount('OC_Filestorage_Archive',array('archive'=>$localArchive),$archive.'/');
|
||||
self::$mounted[]=$archive;
|
||||
}
|
||||
}
|
||||
}
|
||||
self::$enableAutomount=true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,182 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
class OC_Archive_ZIP extends OC_Archive{
|
||||
/**
|
||||
* @var ZipArchive zip
|
||||
*/
|
||||
private $zip=null;
|
||||
private $contents=array();
|
||||
private $success=false;
|
||||
private $path;
|
||||
|
||||
function __construct($source){
|
||||
$this->path=$source;
|
||||
$this->zip=new ZipArchive();
|
||||
if($this->zip->open($source,ZipArchive::CREATE)){
|
||||
}else{
|
||||
OC_LOG::write('files_archive','Error while opening archive '.$source,OC_Log::WARN);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* add an empty folder to the archive
|
||||
* @param string path
|
||||
* @return bool
|
||||
*/
|
||||
function addFolder($path){
|
||||
return $this->zip->addEmptyDir($path);
|
||||
}
|
||||
/**
|
||||
* add a file to the archive
|
||||
* @param string path
|
||||
* @param string source either a local file or string data
|
||||
* @return bool
|
||||
*/
|
||||
function addFile($path,$source=''){
|
||||
if(file_exists($source)){
|
||||
$result=$this->zip->addFile($source,$path);
|
||||
}else{
|
||||
$result=$this->zip->addFromString($path,$source);
|
||||
}
|
||||
if($result){
|
||||
$this->zip->close();//close and reopen to save the zip
|
||||
$this->zip->open($this->path);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
/**
|
||||
* rename a file or folder in the archive
|
||||
* @param string source
|
||||
* @param string dest
|
||||
* @return bool
|
||||
*/
|
||||
function rename($source,$dest){
|
||||
return $this->zip->renameName($source,$dest);
|
||||
}
|
||||
/**
|
||||
* get the uncompressed size of a file in the archive
|
||||
* @param string path
|
||||
* @return int
|
||||
*/
|
||||
function filesize($path){
|
||||
$stat=$this->zip->statName($path);
|
||||
return $stat['size'];
|
||||
}
|
||||
/**
|
||||
* get the last modified time of a file in the archive
|
||||
* @param string path
|
||||
* @return int
|
||||
*/
|
||||
function mtime($path){
|
||||
$stat=$this->zip->statName($path);
|
||||
return $stat['mtime'];
|
||||
}
|
||||
/**
|
||||
* get the files in a folder
|
||||
* @param path
|
||||
* @return array
|
||||
*/
|
||||
function getFolder($path){
|
||||
$files=$this->getFiles();
|
||||
$folderContent=array();
|
||||
$pathLength=strlen($path);
|
||||
foreach($files as $file){
|
||||
if(substr($file,0,$pathLength)==$path and $file!=$path){
|
||||
if(strrpos(substr($file,0,-1),'/')<=$pathLength){
|
||||
$folderContent[]=substr($file,$pathLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $folderContent;
|
||||
}
|
||||
/**
|
||||
*get all files in the archive
|
||||
* @return array
|
||||
*/
|
||||
function getFiles(){
|
||||
if(count($this->contents)){
|
||||
return $this->contents;
|
||||
}
|
||||
$fileCount=$this->zip->numFiles;
|
||||
$files=array();
|
||||
for($i=0;$i<$fileCount;$i++){
|
||||
$files[]=$this->zip->getNameIndex($i);
|
||||
}
|
||||
$this->contents=$files;
|
||||
return $files;
|
||||
}
|
||||
/**
|
||||
* get the content of a file
|
||||
* @param string path
|
||||
* @return string
|
||||
*/
|
||||
function getFile($path){
|
||||
return $this->zip->getFromName($path);
|
||||
}
|
||||
/**
|
||||
* extract a single file from the archive
|
||||
* @param string path
|
||||
* @param string dest
|
||||
* @return bool
|
||||
*/
|
||||
function extractFile($path,$dest){
|
||||
$fp = $this->zip->getStream($path);
|
||||
file_put_contents($dest,$fp);
|
||||
}
|
||||
/**
|
||||
* check if a file or folder exists in the archive
|
||||
* @param string path
|
||||
* @return bool
|
||||
*/
|
||||
function fileExists($path){
|
||||
return $this->zip->locateName($path)!==false;
|
||||
}
|
||||
/**
|
||||
* remove a file or folder from the archive
|
||||
* @param string path
|
||||
* @return bool
|
||||
*/
|
||||
function remove($path){
|
||||
return $this->zip->deleteName($path);
|
||||
}
|
||||
/**
|
||||
* get a file handler
|
||||
* @param string path
|
||||
* @param string mode
|
||||
* @return resource
|
||||
*/
|
||||
function getStream($path,$mode){
|
||||
if($mode=='r' or $mode=='rb'){
|
||||
return $this->zip->getStream($path);
|
||||
}else{//since we cant directly get a writable stream, make a temp copy of the file and put it back in the archive when the stream is closed
|
||||
if(strrpos($path,'.')!==false){
|
||||
$ext=substr($path,strrpos($path,'.'));
|
||||
}else{
|
||||
$ext='';
|
||||
}
|
||||
$tmpFile=OC_Helper::tmpFile($ext);
|
||||
OC_CloseStreamWrapper::$callBacks[$tmpFile]=array($this,'writeBack');
|
||||
if($this->fileExists($path)){
|
||||
$this->extractFile($path,$tmpFile);
|
||||
}
|
||||
self::$tempFiles[$tmpFile]=$path;
|
||||
return fopen('close://'.$tmpFile,$mode);
|
||||
}
|
||||
}
|
||||
|
||||
private static $tempFiles=array();
|
||||
/**
|
||||
* write back temporary files
|
||||
*/
|
||||
function writeBack($tmpFile){
|
||||
if(isset(self::$tempFiles[$tmpFile])){
|
||||
$this->addFile(self::$tempFiles[$tmpFile],$tmpFile);
|
||||
unlink($tmpFile);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
abstract class Test_Archive extends UnitTestCase {
|
||||
/**
|
||||
* @var OC_Archive
|
||||
*/
|
||||
protected $instance;
|
||||
|
||||
/**
|
||||
* get the existing test archive
|
||||
* @return OC_Archive
|
||||
*/
|
||||
abstract protected function getExisting();
|
||||
/**
|
||||
* get a new archive for write testing
|
||||
* @return OC_Archive
|
||||
*/
|
||||
abstract protected function getNew();
|
||||
|
||||
public function testGetFiles(){
|
||||
$this->instance=$this->getExisting();
|
||||
$allFiles=$this->instance->getFiles();
|
||||
$expected=array('lorem.txt','logo-wide.png','dir/','dir/lorem.txt');
|
||||
$this->assertEqual(4,count($allFiles));
|
||||
foreach($expected as $file){
|
||||
$this->assertNotIdentical(false,array_search($file,$allFiles),'cant find '.$file.' in archive');
|
||||
$this->assertTrue($this->instance->fileExists($file));
|
||||
}
|
||||
$this->assertFalse($this->instance->fileExists('non/existing/file'));
|
||||
|
||||
$rootContent=$this->instance->getFolder('');
|
||||
$expected=array('lorem.txt','logo-wide.png','dir/');
|
||||
$this->assertEqual(3,count($rootContent));
|
||||
foreach($expected as $file){
|
||||
$this->assertNotIdentical(false,array_search($file,$rootContent),'cant find '.$file.' in archive');
|
||||
}
|
||||
|
||||
$dirContent=$this->instance->getFolder('dir/');
|
||||
$expected=array('lorem.txt');
|
||||
$this->assertEqual(1,count($dirContent));
|
||||
foreach($expected as $file){
|
||||
$this->assertNotIdentical(false,array_search($file,$dirContent),'cant find '.$file.' in archive');
|
||||
}
|
||||
}
|
||||
|
||||
public function testContent(){
|
||||
$this->instance=$this->getExisting();
|
||||
$dir=OC::$SERVERROOT.'/apps/files_archive/tests/data';
|
||||
$textFile=$dir.'/lorem.txt';
|
||||
$this->assertEqual(file_get_contents($textFile),$this->instance->getFile('lorem.txt'));
|
||||
|
||||
$tmpFile=OC_Helper::tmpFile('.txt');
|
||||
$this->instance->extractFile('lorem.txt',$tmpFile);
|
||||
$this->assertEqual(file_get_contents($textFile),file_get_contents($tmpFile));
|
||||
}
|
||||
|
||||
public function testWrite(){
|
||||
$dir=OC::$SERVERROOT.'/apps/files_archive/tests/data';
|
||||
$textFile=$dir.'/lorem.txt';
|
||||
$this->instance=$this->getNew();
|
||||
$this->assertEqual(0,count($this->instance->getFiles()));
|
||||
$this->instance->addFile('lorem.txt',$textFile);
|
||||
$this->assertEqual(1,count($this->instance->getFiles()));
|
||||
$this->assertTrue($this->instance->fileExists('lorem.txt'));
|
||||
|
||||
$this->assertEqual(file_get_contents($textFile),$this->instance->getFile('lorem.txt'));
|
||||
$this->instance->addFile('lorem.txt','foobar');
|
||||
$this->assertEqual('foobar',$this->instance->getFile('lorem.txt'));
|
||||
}
|
||||
|
||||
public function testReadStream(){
|
||||
$dir=OC::$SERVERROOT.'/apps/files_archive/tests/data';
|
||||
$this->instance=$this->getExisting();
|
||||
$fh=$this->instance->getStream('lorem.txt','r');
|
||||
$this->assertTrue($fh);
|
||||
$content=fread($fh,$this->instance->filesize('lorem.txt'));
|
||||
fclose($fh);
|
||||
$this->assertEqual(file_get_contents($dir.'/lorem.txt'),$content);
|
||||
}
|
||||
public function testWriteStream(){
|
||||
$dir=OC::$SERVERROOT.'/apps/files_archive/tests/data';
|
||||
$this->instance=$this->getNew();
|
||||
$fh=$this->instance->getStream('lorem.txt','w');
|
||||
$source=fopen($dir.'/lorem.txt','r');
|
||||
OC_Helper::streamCopy($source,$fh);
|
||||
fclose($source);
|
||||
fclose($fh);
|
||||
$this->assertTrue($this->instance->fileExists('lorem.txt'));
|
||||
$this->assertEqual(file_get_contents($dir.'/lorem.txt'),$this->instance->getFile('lorem.txt'));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
class Test_Filestorage_Archive_Zip extends Test_FileStorage {
|
||||
/**
|
||||
* @var string tmpDir
|
||||
*/
|
||||
private $tmpFile;
|
||||
|
||||
public function setUp(){
|
||||
$this->tmpFile=OC_Helper::tmpFile('.zip');
|
||||
$this->instance=new OC_Filestorage_Archive(array('archive'=>$this->tmpFile));
|
||||
}
|
||||
|
||||
public function tearDown(){
|
||||
unlink($this->tmpFile);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
require_once('archive.php');
|
||||
|
||||
class Test_Archive_ZIP extends Test_Archive{
|
||||
protected function getExisting(){
|
||||
$dir=OC::$SERVERROOT.'/apps/files_archive/tests/data';
|
||||
return new OC_Archive_ZIP($dir.'/data.zip');
|
||||
}
|
||||
|
||||
protected function getNew(){
|
||||
return new OC_Archive_ZIP(OC_Helper::tmpFile('.zip'));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
OC::$CLASSPATH['OC_Crypt'] = 'apps/files_encryption/lib/crypt.php';
|
||||
OC::$CLASSPATH['OC_CryptStream'] = 'apps/files_encryption/lib/cryptstream.php';
|
||||
OC::$CLASSPATH['OC_FileProxy_Encryption'] = 'apps/files_encryption/lib/proxy.php';
|
||||
|
||||
OC_FileProxy::register(new OC_FileProxy_Encryption());
|
||||
|
||||
OC_Hook::connect('OC_User','post_login','OC_Crypt','loginListener');
|
||||
|
||||
stream_wrapper_register('crypt','OC_CryptStream');
|
||||
|
||||
if(!isset($_SESSION['enckey']) and OC_User::isLoggedIn()){//force the user to re-loggin if the encryption key isn't unlocked (happens when a user is logged in before the encryption app is enabled)
|
||||
OC_User::logout();
|
||||
header("Location: ".OC::$WEBROOT.'/');
|
||||
exit();
|
||||
}
|
||||
|
||||
OC_App::registerAdmin('files_encryption', 'settings');
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0"?>
|
||||
<info>
|
||||
<id>files_encryption</id>
|
||||
<name>Encryption</name>
|
||||
<description>Server side encryption of files</description>
|
||||
<version>0.1</version>
|
||||
<licence>AGPL</licence>
|
||||
<author>Robin Appelman</author>
|
||||
<require>3</require>
|
||||
</info>
|
|
@ -0,0 +1,19 @@
|
|||
/**
|
||||
* Copyright (c) 2011, Robin Appelman <icewind1991@gmail.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
|
||||
$(document).ready(function(){
|
||||
$('#encryption_blacklist').multiSelect({
|
||||
oncheck:blackListChange,
|
||||
onuncheck:blackListChange,
|
||||
createText:'...',
|
||||
});
|
||||
|
||||
function blackListChange(){
|
||||
var blackList=$('#encryption_blacklist').val().join(',');
|
||||
OC.AppConfig.setValue('files_encryption','type_blacklist',blackList);
|
||||
}
|
||||
})
|
|
@ -37,90 +37,111 @@ require_once('Crypt_Blowfish/Blowfish.php');
|
|||
* This class is for crypting and decrypting
|
||||
*/
|
||||
class OC_Crypt {
|
||||
static private $bf = null;
|
||||
|
||||
static $encription_extension='.encrypted';
|
||||
public static function loginListener($params){
|
||||
self::init($params['uid'],$params['password']);
|
||||
}
|
||||
|
||||
public static function init($login,$password) {
|
||||
$_SESSION['user_password'] = $password; // save the password as passcode for the encryption
|
||||
if(OC_User::isLoggedIn()){
|
||||
// does key exist?
|
||||
if(!file_exists(OC_Config::getValue( "datadirectory").'/'.$login.'/encryption.key')){
|
||||
OC_Crypt::createkey($_SESSION['user_password']);
|
||||
$view=new OC_FilesystemView('/'.$login);
|
||||
OC_FileProxy::$enabled=false;
|
||||
if(!$view->file_exists('/encryption.key')){// does key exist?
|
||||
OC_Crypt::createkey($login,$password);
|
||||
}
|
||||
$key=$view->file_get_contents('/encryption.key');
|
||||
OC_FileProxy::$enabled=true;
|
||||
$_SESSION['enckey']=OC_Crypt::decrypt($key, $password);
|
||||
}
|
||||
|
||||
/**
|
||||
* get the blowfish encryption handeler for a key
|
||||
* @param string $key (optional)
|
||||
* @return Crypt_Blowfish
|
||||
*
|
||||
* if the key is left out, the default handeler will be used
|
||||
*/
|
||||
public static function getBlowfish($key=''){
|
||||
if($key){
|
||||
return new Crypt_Blowfish($key);
|
||||
}else{
|
||||
if(!isset($_SESSION['enckey'])){
|
||||
return false;
|
||||
}
|
||||
if(!self::$bf){
|
||||
self::$bf=new Crypt_Blowfish($_SESSION['enckey']);
|
||||
}
|
||||
return self::$bf;
|
||||
}
|
||||
}
|
||||
|
||||
public static function createkey($username,$passcode) {
|
||||
// generate a random key
|
||||
$key=mt_rand(10000,99999).mt_rand(10000,99999).mt_rand(10000,99999).mt_rand(10000,99999);
|
||||
|
||||
// encrypt the key with the passcode of the user
|
||||
$enckey=OC_Crypt::encrypt($key,$passcode);
|
||||
|
||||
public static function createkey($passcode) {
|
||||
if(OC_User::isLoggedIn()){
|
||||
// generate a random key
|
||||
$key=mt_rand(10000,99999).mt_rand(10000,99999).mt_rand(10000,99999).mt_rand(10000,99999);
|
||||
|
||||
// encrypt the key with the passcode of the user
|
||||
$enckey=OC_Crypt::encrypt($key,$passcode);
|
||||
|
||||
// Write the file
|
||||
$username=OC_USER::getUser();
|
||||
@file_put_contents(OC_Config::getValue( "datadirectory").'/'.$username.'/encryption.key', $enckey );
|
||||
}
|
||||
// Write the file
|
||||
$proxyEnabled=OC_FileProxy::$enabled;
|
||||
OC_FileProxy::$enabled=false;
|
||||
$view=new OC_FilesystemView('/'.$username);
|
||||
$view->file_put_contents('/encryption.key',$enckey);
|
||||
OC_FileProxy::$enabled=$proxyEnabled;
|
||||
}
|
||||
|
||||
public static function changekeypasscode( $newpasscode) {
|
||||
public static function changekeypasscode($oldPassword, $newPassword) {
|
||||
if(OC_User::isLoggedIn()){
|
||||
$username=OC_USER::getUser();
|
||||
$username=OC_USER::getUser();
|
||||
$view=new OC_FilesystemView('/'.$username);
|
||||
|
||||
// read old key
|
||||
$key=file_get_contents(OC_Config::getValue( "datadirectory").'/'.$username.'/encryption.key');
|
||||
$key=$view->file_get_contents('/encryption.key');
|
||||
|
||||
// decrypt key with old passcode
|
||||
$key=OC_Crypt::decrypt($key, $_SESSION['user_password']);
|
||||
$key=OC_Crypt::decrypt($key, $oldPassword);
|
||||
|
||||
// encrypt again with new passcode
|
||||
$key=OC_Crypt::encrypt($key,$newpassword);
|
||||
$key=OC_Crypt::encrypt($key, $newPassword);
|
||||
|
||||
// store the new key
|
||||
file_put_contents(OC_Config::getValue( "datadirectory").'/'.$username.'/encryption.key', $key );
|
||||
|
||||
$_SESSION['user_password']=$newpasscode;
|
||||
$view->file_put_contents('/encryption.key', $key );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief encrypts an content
|
||||
* @param $content the cleartext message you want to encrypt
|
||||
* @param $key the encryption key
|
||||
* @param $key the encryption key (optional)
|
||||
* @returns encrypted content
|
||||
*
|
||||
* This function encrypts an content
|
||||
*/
|
||||
public static function encrypt( $content, $key) {
|
||||
$bf = new Crypt_Blowfish($key);
|
||||
public static function encrypt( $content, $key='') {
|
||||
$bf = self::getBlowfish($key);
|
||||
return($bf->encrypt($content));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief decryption of an content
|
||||
* @param $content the cleartext message you want to decrypt
|
||||
* @param $key the encryption key (optional)
|
||||
* @returns cleartext content
|
||||
*
|
||||
* This function decrypts an content
|
||||
*/
|
||||
public static function decrypt( $content, $key='') {
|
||||
$bf = self::getBlowfish($key);
|
||||
return($bf->decrypt($content));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief decryption of an content
|
||||
* @param $content the cleartext message you want to decrypt
|
||||
* @param $key the encryption key
|
||||
* @returns cleartext content
|
||||
*
|
||||
* This function decrypts an content
|
||||
*/
|
||||
public static function decrypt( $content, $key) {
|
||||
$bf = new Crypt_Blowfish($key);
|
||||
return($bf->encrypt($contents));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief encryption of a file
|
||||
* @param $filename
|
||||
* @param $key the encryption key
|
||||
*
|
||||
* This function encrypts a file
|
||||
*/
|
||||
/**
|
||||
* @brief encryption of a file
|
||||
* @param $filename
|
||||
* @param $key the encryption key
|
||||
*
|
||||
* This function encrypts a file
|
||||
*/
|
||||
public static function encryptfile( $filename, $key) {
|
||||
$handleread = fopen($filename, "rb");
|
||||
if($handleread<>FALSE) {
|
||||
|
@ -158,8 +179,28 @@ class OC_Crypt {
|
|||
}
|
||||
fclose($handleread);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* encrypt data in 8192b sized blocks
|
||||
*/
|
||||
public static function blockEncrypt($data){
|
||||
$result='';
|
||||
while(strlen($data)){
|
||||
$result=self::encrypt(substr($data,0,8192));
|
||||
$data=substr($data,8192);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* decrypt data in 8192b sized blocks
|
||||
*/
|
||||
public static function blockDecrypt($data){
|
||||
$result='';
|
||||
while(strlen($data)){
|
||||
$result=self::decrypt(substr($data,0,8192));
|
||||
$data=substr($data,8192);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Robin Appelman
|
||||
* @copyright 2011 Robin Appelman icewind1991@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* transparently encrypted filestream
|
||||
*
|
||||
* you can use it as wrapper around an existing stream by setting OC_CryptStream::$sourceStreams['foo']=array('path'=>$path,'stream'=>$stream)
|
||||
* and then fopen('crypt://streams/foo');
|
||||
*/
|
||||
|
||||
class OC_CryptStream{
|
||||
public static $sourceStreams=array();
|
||||
private $source;
|
||||
private $path;
|
||||
private $readBuffer;//for streams that dont support seeking
|
||||
private $meta=array();//header/meta for source stream
|
||||
|
||||
public function stream_open($path, $mode, $options, &$opened_path){
|
||||
$path=str_replace('crypt://','',$path);
|
||||
if(dirname($path)=='streams' and isset(self::$sourceStreams[basename($path)])){
|
||||
$this->source=self::$sourceStreams[basename($path)]['stream'];
|
||||
$this->path=self::$sourceStreams[basename($path)]['path'];
|
||||
}else{
|
||||
$this->path=$path;
|
||||
OC_Log::write('files_encryption','open encrypted '.$path. ' in '.$mode,OC_Log::DEBUG);
|
||||
OC_FileProxy::$enabled=false;//disable fileproxies so we can open the source file
|
||||
$this->source=OC_FileSystem::fopen($path,$mode);
|
||||
OC_FileProxy::$enabled=true;
|
||||
if(!is_resource($this->source)){
|
||||
OC_Log::write('files_encryption','failed to open '.$path,OC_Log::ERROR);
|
||||
}
|
||||
}
|
||||
if(is_resource($this->source)){
|
||||
$this->meta=stream_get_meta_data($this->source);
|
||||
}
|
||||
return is_resource($this->source);
|
||||
}
|
||||
|
||||
public function stream_seek($offset, $whence=SEEK_SET){
|
||||
fseek($this->source,$offset,$whence);
|
||||
}
|
||||
|
||||
public function stream_tell(){
|
||||
return ftell($this->source);
|
||||
}
|
||||
|
||||
public function stream_read($count){
|
||||
$pos=0;
|
||||
$currentPos=ftell($this->source);
|
||||
$offset=$currentPos%8192;
|
||||
$result='';
|
||||
if($offset>0){
|
||||
if($this->meta['seekable']){
|
||||
fseek($this->source,-$offset,SEEK_CUR);//if seeking isnt supported the internal read buffer will be used
|
||||
}else{
|
||||
$pos=strlen($this->readBuffer);
|
||||
$result=$this->readBuffer;
|
||||
}
|
||||
}
|
||||
while($count>$pos){
|
||||
$data=fread($this->source,8192);
|
||||
$pos+=8192;
|
||||
if(strlen($data)){
|
||||
$result.=OC_Crypt::decrypt($data);
|
||||
}
|
||||
}
|
||||
if(!$this->meta['seekable']){
|
||||
$this->readBuffer=substr($result,$count);
|
||||
}
|
||||
return substr($result,0,$count);
|
||||
}
|
||||
|
||||
public function stream_write($data){
|
||||
$length=strlen($data);
|
||||
$written=0;
|
||||
$currentPos=ftell($this->source);
|
||||
if($currentPos%8192!=0){
|
||||
//make sure we always start on a block start
|
||||
fseek($this->source,-($currentPos%8192),SEEK_CUR);
|
||||
$encryptedBlock=fread($this->source,8192);
|
||||
fseek($this->source,-($currentPos%8192),SEEK_CUR);
|
||||
$block=OC_Crypt::decrypt($encryptedBlock);
|
||||
$data=substr($block,0,$currentPos%8192).$data;
|
||||
}
|
||||
while(strlen($data)>0){
|
||||
if(strlen($data)<8192){
|
||||
//fetch the current data in that block and append it to the input so we always write entire blocks
|
||||
$oldPos=ftell($this->source);
|
||||
$encryptedBlock=fread($this->source,8192);
|
||||
fseek($this->source,$oldPos);
|
||||
$block=OC_Crypt::decrypt($encryptedBlock);
|
||||
$data.=substr($block,strlen($data));
|
||||
}
|
||||
$encrypted=OC_Crypt::encrypt(substr($data,0,8192));
|
||||
fwrite($this->source,$encrypted);
|
||||
$data=substr($data,8192);
|
||||
}
|
||||
return $length;
|
||||
}
|
||||
|
||||
public function stream_set_option($option,$arg1,$arg2){
|
||||
switch($option){
|
||||
case STREAM_OPTION_BLOCKING:
|
||||
stream_set_blocking($this->source,$arg1);
|
||||
break;
|
||||
case STREAM_OPTION_READ_TIMEOUT:
|
||||
stream_set_timeout($this->source,$arg1,$arg2);
|
||||
break;
|
||||
case STREAM_OPTION_WRITE_BUFFER:
|
||||
stream_set_write_buffer($this->source,$arg1,$arg2);
|
||||
}
|
||||
}
|
||||
|
||||
public function stream_stat(){
|
||||
return fstat($this->source);
|
||||
}
|
||||
|
||||
public function stream_lock($mode){
|
||||
flock($this->source,$mode);
|
||||
}
|
||||
|
||||
public function stream_flush(){
|
||||
return fflush($this->source);
|
||||
}
|
||||
|
||||
public function stream_eof(){
|
||||
return feof($this->source);
|
||||
}
|
||||
|
||||
public function stream_close(){
|
||||
OC_FileCache::put($this->path,array('encrypted'=>true));
|
||||
return fclose($this->source);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,115 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Robin Appelman
|
||||
* @copyright 2011 Robin Appelman icewind1991@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* transparent encryption
|
||||
*/
|
||||
|
||||
class OC_FileProxy_Encryption extends OC_FileProxy{
|
||||
private static $blackList=null; //mimetypes blacklisted from encryption
|
||||
private static $metaData=array(); //metadata cache
|
||||
|
||||
/**
|
||||
* check if a file should be encrypted during write
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
private static function shouldEncrypt($path){
|
||||
if(is_null(self::$blackList)){
|
||||
self::$blackList=explode(',',OC_Appconfig::getValue('files_encryption','type_blacklist','jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg'));
|
||||
}
|
||||
if(self::isEncrypted($path)){
|
||||
return true;
|
||||
}
|
||||
$extention=substr($path,strrpos($path,'.')+1);
|
||||
if(array_search($extention,self::$blackList)===false){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* check if a file is encrypted
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
private static function isEncrypted($path){
|
||||
if(isset(self::$metaData[$path])){
|
||||
$metadata=self::$metaData[$path];
|
||||
}else{
|
||||
$metadata=OC_FileCache::getCached($path);
|
||||
self::$metaData[$path]=$metadata;
|
||||
}
|
||||
return (bool)$metadata['encrypted'];
|
||||
}
|
||||
|
||||
public function preFile_put_contents($path,&$data){
|
||||
if(self::shouldEncrypt($path)){
|
||||
if (!is_resource($data)) {//stream put contents should have been converter to fopen
|
||||
$data=OC_Crypt::blockEncrypt($data);
|
||||
OC_FileCache::put($path,array('encrypted'=>true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function postFile_get_contents($path,$data){
|
||||
if(self::isEncrypted($path)){
|
||||
$data=OC_Crypt::blockDecrypt($data);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function postFopen($path,&$result){
|
||||
if(!$result){
|
||||
return $result;
|
||||
}
|
||||
$meta=stream_get_meta_data($result);
|
||||
if(self::isEncrypted($path)){
|
||||
fclose($result);
|
||||
$result=fopen('crypt://'.$path,$meta['mode']);
|
||||
}elseif(self::shouldEncrypt($path) and $meta['mode']!='r' and $meta['mode']!='rb'){
|
||||
if(OC_Filesystem::file_exists($path) and OC_Filesystem::filesize($path)>0){
|
||||
//first encrypt the target file so we don't end up with a half encrypted file
|
||||
OC_Log::write('files_encryption','Decrypting '.$path.' before writing',OC_Log::DEBUG);
|
||||
$tmp=fopen('php://temp');
|
||||
while(!feof($result)){
|
||||
$chunk=fread($result,8192);
|
||||
if($chunk){
|
||||
fwrite($tmp,$chunk);
|
||||
}
|
||||
}
|
||||
fclose($result);
|
||||
OC_Filesystem::file_put_contents($path,$tmp);
|
||||
fclose($tmp);
|
||||
}
|
||||
$result=fopen('crypt://'.$path,$meta['mode']);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function postGetMimeType($path,$mime){
|
||||
if(self::isEncrypted($path)){
|
||||
$mime=OC_Helper::getMimeType('crypt://'.$path,'w');
|
||||
}
|
||||
return $mime;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2011 Robin Appelman <icewind@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
$tmpl = new OC_Template( 'files_encryption', 'settings');
|
||||
$blackList=explode(',',OC_Appconfig::getValue('files_encryption','type_blacklist','jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg'));
|
||||
$tmpl->assign('blacklist',$blackList);
|
||||
|
||||
OC_Util::addScript('files_encryption','settings');
|
||||
OC_Util::addScript('core','multiselect');
|
||||
|
||||
return $tmpl->fetchPage();
|
|
@ -0,0 +1,11 @@
|
|||
<form id="calendar">
|
||||
<fieldset class="personalblock">
|
||||
<strong><?php echo $l->t('Encryption'); ?></strong>
|
||||
<?php echo $l->t("Exclude the following file types from encryption"); ?>
|
||||
<select id='encryption_blacklist' title="<?php echo $l->t('None')?>" multiple="multiple">
|
||||
<?php foreach($_["blacklist"] as $type): ?>
|
||||
<option selected="selected" value="<?php echo $type;?>"><?php echo $type;?></option>
|
||||
<?php endforeach;?>
|
||||
</select>
|
||||
</fieldset>
|
||||
</form>
|
|
@ -58,7 +58,7 @@ class OC_Filestorage_Shared extends OC_Filestorage {
|
|||
}
|
||||
|
||||
public function mkdir($path) {
|
||||
if ($path == "" || $path == "/" || !$this->is_writeable($path)) {
|
||||
if ($path == "" || $path == "/" || !$this->is_writable($path)) {
|
||||
return false;
|
||||
} else {
|
||||
$source = $this->getSource($path);
|
||||
|
@ -79,7 +79,6 @@ class OC_Filestorage_Shared extends OC_Filestorage {
|
|||
if ($path == "" || $path == "/") {
|
||||
$path = $this->datadir.$path;
|
||||
$sharedItems = OC_Share::getItemsInFolder($path);
|
||||
global $FAKEDIRS;
|
||||
$files = array();
|
||||
foreach ($sharedItems as $item) {
|
||||
// If item is in the root of the shared storage provider and the item exists add it to the fakedirs
|
||||
|
@ -87,7 +86,7 @@ class OC_Filestorage_Shared extends OC_Filestorage {
|
|||
$files[] = basename($item['target']);
|
||||
}
|
||||
}
|
||||
$FAKEDIRS['shared'] = $files;
|
||||
OC_FakeDirStream::$dirs['shared']=$files;
|
||||
return opendir('fakedir://shared');
|
||||
} else {
|
||||
$source = $this->getSource($path);
|
||||
|
@ -281,14 +280,6 @@ class OC_Filestorage_Shared extends OC_Filestorage {
|
|||
}
|
||||
}
|
||||
|
||||
public function readfile($path) {
|
||||
$source = $this->getSource($path);
|
||||
if ($source) {
|
||||
$storage = OC_Filesystem::getStorage($source);
|
||||
return $storage->readfile($this->getInternalPath($source));
|
||||
}
|
||||
}
|
||||
|
||||
public function filectime($path) {
|
||||
if ($path == "" || $path == "/") {
|
||||
$ctime = 0;
|
||||
|
@ -514,7 +505,13 @@ class OC_Filestorage_Shared extends OC_Filestorage {
|
|||
return $storage->getLocalFile($this->getInternalPath($source));
|
||||
}
|
||||
}
|
||||
|
||||
public function touch($path, $mtime=null){
|
||||
$source = $this->getSource($path);
|
||||
if ($source) {
|
||||
$storage = OC_Filesystem::getStorage($source);
|
||||
return $storage->touch($this->getInternalPath($source),$time);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -28,7 +28,7 @@ require_once('../../../lib/base.php');
|
|||
OC_JSON::checkLoggedIn();
|
||||
|
||||
// Get paramteres
|
||||
$filecontents = htmlspecialchars_decode($_POST['filecontents']);
|
||||
$filecontents = $_POST['filecontents'];
|
||||
$path = isset($_POST['path']) ? $_POST['path'] : '';
|
||||
$mtime = isset($_POST['mtime']) ? $_POST['mtime'] : '';
|
||||
|
||||
|
|
|
@ -11,37 +11,43 @@ function getFileExtension(file){
|
|||
function setSyntaxMode(ext){
|
||||
// Loads the syntax mode files and tells the editor
|
||||
var filetype = new Array();
|
||||
// Todo finish these
|
||||
filetype["h"] = "c_cpp";
|
||||
filetype["c"] = "c_cpp";
|
||||
filetype["clj"] = "clojure";
|
||||
filetype["coffee"] = "coffee"; // coffescript can be compiled to javascript
|
||||
filetype["coldfusion"] = "cfc";
|
||||
filetype["cpp"] = "c_cpp";
|
||||
filetype["cs"] = "csharp";
|
||||
// add file extensions like this: filetype["extension"] = "filetype":
|
||||
filetype["h"] = "c_cpp";
|
||||
filetype["c"] = "c_cpp";
|
||||
filetype["clj"] = "clojure";
|
||||
filetype["coffee"] = "coffee"; // coffescript can be compiled to javascript
|
||||
filetype["coldfusion"] = "cfc";
|
||||
filetype["cpp"] = "c_cpp";
|
||||
filetype["cs"] = "csharp";
|
||||
filetype["css"] = "css";
|
||||
filetype["groovy"] = "groovy";
|
||||
filetype["haxe"] = "hx";
|
||||
filetype["groovy"] = "groovy";
|
||||
filetype["haxe"] = "hx";
|
||||
filetype["html"] = "html";
|
||||
filetype["java"] = "java";
|
||||
filetype["java"] = "java";
|
||||
filetype["js"] = "javascript";
|
||||
filetype["json"] = "json";
|
||||
filetype["latex"] = "latex";
|
||||
filetype["lua"] = "lua";
|
||||
filetype["markdown"] = "markdown"; // also: .md .markdown .mdown .mdwn
|
||||
filetype["ml"] = "ocaml";
|
||||
filetype["mli"] = "ocaml";
|
||||
filetype["json"] = "json";
|
||||
filetype["latex"] = "latex";
|
||||
filetype["ly"] = "latex";
|
||||
filetype["ily"] = "latex";
|
||||
filetype["lua"] = "lua";
|
||||
filetype["markdown"] = "markdown";
|
||||
filetype["md"] = "markdown";
|
||||
filetype["mdown"] = "markdown";
|
||||
filetype["mdwn"] = "markdown";
|
||||
filetype["mkd"] = "markdown";
|
||||
filetype["ml"] = "ocaml";
|
||||
filetype["mli"] = "ocaml";
|
||||
filetype["pl"] = "perl";
|
||||
filetype["php"] = "php";
|
||||
filetype["powershell"] = "ps1";
|
||||
filetype["py"] = "python";
|
||||
filetype["rb"] = "ruby";
|
||||
filetype["scad"] = "scad"; // seems to be something like 3d model files printed with e.g. reprap
|
||||
filetype["scala"] = "scala";
|
||||
filetype["scss"] = "scss"; // "sassy css"
|
||||
filetype["sql"] = "sql";
|
||||
filetype["svg"] = "svg";
|
||||
filetype["textile"] = "textile"; // related to markdown
|
||||
filetype["scad"] = "scad"; // seems to be something like 3d model files printed with e.g. reprap
|
||||
filetype["scala"] = "scala";
|
||||
filetype["scss"] = "scss"; // "sassy css"
|
||||
filetype["sql"] = "sql";
|
||||
filetype["svg"] = "svg";
|
||||
filetype["textile"] = "textile"; // related to markdown
|
||||
filetype["xml"] = "xml";
|
||||
|
||||
if(filetype[ext]!=null){
|
||||
|
@ -142,7 +148,7 @@ function doFileSave(){
|
|||
// Show saving spinner
|
||||
$("#editor_save").die('click',doFileSave);
|
||||
$('#save_result').remove();
|
||||
$('#editor_save').text(t('files_texteditor','Saving...'));//after('<img id="saving_icon" src="'+OC.filePath('core','img','loading.gif')+'"></img>');
|
||||
$('#editor_save').text(t('files_texteditor','Saving...'));
|
||||
// Get the data
|
||||
var filecontents = window.aceEditor.getSession().getValue();
|
||||
// Send the data
|
||||
|
@ -192,6 +198,7 @@ function showFileEditor(dir,filename){
|
|||
$('#editor').attr('data-filename', filename);
|
||||
window.aceEditor = ace.edit("editor");
|
||||
aceEditor.setShowPrintMargin(false);
|
||||
aceEditor.getSession().setUseWrapMode(true);
|
||||
if(result.data.write=='false'){
|
||||
aceEditor.setReadOnly(true);
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue