Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Haakon Meland Eriksen 2016-02-25 06:05:12 +01:00
commit 21f2df399d
28 changed files with 576 additions and 63 deletions

View file

@ -196,5 +196,4 @@ class Router {
} }
} }
} }
} }

View file

@ -50,7 +50,7 @@ define ( 'RED_VERSION', trim(file_get_contents('version.inc')));
define ( 'STD_VERSION', '1.2.4' ); define ( 'STD_VERSION', '1.2.4' );
define ( 'ZOT_REVISION', 1 ); define ( 'ZOT_REVISION', 1 );
define ( 'DB_UPDATE_VERSION', 1163 ); define ( 'DB_UPDATE_VERSION', 1164 );
/** /**

View file

@ -1595,8 +1595,17 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
if (is_null($nickname)) if (is_null($nickname))
$nickname = $channel['channel_address']; $nickname = $channel['channel_address'];
$uid = (($a->profile['profile_uid']) ? $a->profile['profile_uid'] : local_channel()); $uid = (($a->profile['profile_uid']) ? $a->profile['profile_uid'] : local_channel());
if($uid == local_channel()) {
$cal_link = '/events';
}
else {
$cal_link = '/cal/' . $nickname;
}
if (get_pconfig($uid, 'system', 'noprofiletabs')) if (get_pconfig($uid, 'system', 'noprofiletabs'))
return; return;
@ -1644,6 +1653,17 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
); );
} }
if($p['view_stream']) {
$tabs[] = array(
'label' => t('Events'),
'url' => $a->get_baseurl() . $cal_link,
'sel' => ((argv(0) == 'cal' || argv(0) == 'events') ? 'active' : ''),
'title' => t('Events'),
'id' => 'event-tab',
);
}
if ($p['chat']) { if ($p['chat']) {
require_once('include/chat.php'); require_once('include/chat.php');
$has_chats = chatroom_list_count($uid); $has_chats = chatroom_list_count($uid);

View file

@ -3724,10 +3724,6 @@ function mail_store($arr) {
/** /**
* @brief Process atom feed and update anything/everything we might need to update. * @brief Process atom feed and update anything/everything we might need to update.
* *
* $hub = should we find a hub declation in the feed, pass it back to our calling process, who might (or
* might not) try and subscribe to it.
* $datedir sorts in reverse order
*
* @param array $xml * @param array $xml
* The (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds. * The (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds.
* @param $importer * @param $importer
@ -3766,7 +3762,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
if(($chn_expire != 0) && ($chn_expire < $sys_expire)) if(($chn_expire != 0) && ($chn_expire < $sys_expire))
$expire_days = $chn_expire; $expire_days = $chn_expire;
logger('expire_days: ' . $expire_days); // logger('expire_days: ' . $expire_days);
$feed = new SimplePie(); $feed = new SimplePie();
$feed->set_raw_data($xml); $feed->set_raw_data($xml);
@ -3987,6 +3983,72 @@ logger('expire_days: ' . $expire_days);
} }
} }
/**
* @brief Process atom feed and return the first post and structure
*
* @param array $xml
* The (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds.
* @param $importer
* The contact_record (joined to user_record) of the local user who owns this
* relationship. It is this person's stuff that is going to be updated.
*/
function process_salmon_feed($xml, $importer) {
$ret = array();
require_once('library/simplepie/simplepie.inc');
if(! strlen($xml)) {
logger('process_feed: empty input');
return;
}
$feed = new SimplePie();
$feed->set_raw_data($xml);
$feed->init();
if($feed->error())
logger('Error parsing XML: ' . $feed->error());
$permalink = $feed->get_permalink();
if($feed->get_item_quantity()) {
// this should be exactly one
logger('feed item count = ' . $feed->get_item_quantity(), LOGGER_DEBUG);
$items = $feed->get_items();
foreach($items as $item) {
$item_id = base64url_encode($item->get_id());
logger('processing ' . $item_id, LOGGER_DEBUG);
$rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to');
if(isset($rawthread[0]['attribs']['']['ref'])) {
$is_reply = true;
$parent_mid = base64url_encode($rawthread[0]['attribs']['']['ref']);
}
if($is_reply)
$ret['is_reply'] = true;
$ret['author'] = array();
$datarray = get_atom_elements($feed,$item,$ret['author']);
$ret['item'] = $datarray;
}
}
return $ret;
}
function update_feed_item($uid,$datarray) { function update_feed_item($uid,$datarray) {
logger('update_feed_item: not implemented! ' . $uid . ' ' . print_r($datarray,true), LOGGER_DATA); logger('update_feed_item: not implemented! ' . $uid . ' ' . print_r($datarray,true), LOGGER_DATA);
} }
@ -4070,7 +4132,7 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
$o .= '<thr:in-reply-to ref="' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n"; $o .= '<thr:in-reply-to ref="' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n";
} }
if(activity_compare($item['obj_type'],ACTIVITY_OBJ_EVENT) && activity_compare($item['verb'],ACTIVITY_POST)) { if(activity_match($item['obj_type'],ACTIVITY_OBJ_EVENT) && activity_match($item['verb'],ACTIVITY_POST)) {
$obj = ((is_array($item['obj'])) ? $item['object'] : json_decode($item['object'],true)); $obj = ((is_array($item['obj'])) ? $item['object'] : json_decode($item['object'],true));
$o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n"; $o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n";

View file

@ -325,7 +325,8 @@ function get_plugin_info($plugin){
'description' => '', 'description' => '',
'author' => array(), 'author' => array(),
'maintainer' => array(), 'maintainer' => array(),
'version' => '' 'version' => '',
'requires' => ''
); );
if (!is_file("addon/$plugin/$plugin.php")) if (!is_file("addon/$plugin/$plugin.php"))
@ -383,6 +384,22 @@ function check_plugin_versions($info) {
} }
} }
if(array_key_exists('requires',$info)) {
$arr = explode(',',$info['requires']);
$found = true;
if($arr) {
foreach($arr as $test) {
$test = trim($test);
if(! $test)
continue;
if(! in_array($test,get_app()->plugins))
$found = false;
}
}
if(! $found)
return false;
}
return true; return true;
} }

View file

@ -148,7 +148,7 @@ function change_channel($change_channel) {
* @return string additional SQL where statement * @return string additional SQL where statement
*/ */
function permissions_sql($owner_id, $remote_observer = null) { function permissions_sql($owner_id, $remote_observer = null, $table = '') {
$local_channel = local_channel(); $local_channel = local_channel();
@ -158,10 +158,14 @@ function permissions_sql($owner_id, $remote_observer = null) {
* default permissions - anonymous user * default permissions - anonymous user
*/ */
$sql = " AND allow_cid = '' if($table)
AND allow_gid = '' $table .= '.';
AND deny_cid = ''
AND deny_gid = ''
$sql = " AND {$table}allow_cid = ''
AND {$table}allow_gid = ''
AND {$table}deny_cid = ''
AND {$table}deny_gid = ''
"; ";
/** /**
@ -193,8 +197,8 @@ function permissions_sql($owner_id, $remote_observer = null) {
} }
$regexop = db_getfunc('REGEXP'); $regexop = db_getfunc('REGEXP');
$sql = sprintf( $sql = sprintf(
" AND ( NOT (deny_cid like '%s' OR deny_gid $regexop '%s') " AND ( NOT ({$table}deny_cid like '%s' OR {$table}deny_gid $regexop '%s')
AND ( allow_cid like '%s' OR allow_gid $regexop '%s' OR ( allow_cid = '' AND allow_gid = '') ) AND ( {$table}allow_cid like '%s' OR {$table}allow_gid $regexop '%s' OR ( {$table}allow_cid = '' AND {$table}allow_gid = '') )
) )
", ",
dbesc(protect_sprintf( '%<' . $observer . '>%')), dbesc(protect_sprintf( '%<' . $observer . '>%')),

View file

@ -1,4 +1,5 @@
<?php <?php
/** /**
* @file include/session.php * @file include/session.php
* *
@ -14,8 +15,8 @@ $session_expire = 180000;
function new_cookie($time) { function new_cookie($time) {
$old_sid = session_id(); $old_sid = session_id();
// ??? This shouldn't have any effect if called after session_start() // ??? This shouldn't have any effect if called after session_start()
// We probably need to set the session expiration and change the PHPSESSID cookie. // We probably need to set the session expiration and change the PHPSESSID cookie.
session_set_cookie_params($time); session_set_cookie_params($time);
session_regenerate_id(false); session_regenerate_id(false);
@ -108,8 +109,9 @@ ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_httponly', 1); ini_set('session.cookie_httponly', 1);
/* /*
* PHP function which sets our user-level session storage functions. * Set our session storage functions.
*/ */
session_set_save_handler( session_set_save_handler(
'ref_session_open', 'ref_session_open',
'ref_session_close', 'ref_session_close',
@ -117,4 +119,17 @@ session_set_save_handler(
'ref_session_write', 'ref_session_write',
'ref_session_destroy', 'ref_session_destroy',
'ref_session_gc' 'ref_session_gc'
); );
// Force cookies to be secure (https only) if this site is SSL enabled. Must be done before session_start().
if(intval($a->config['system']['ssl_cookie_protection'])) {
$arr = session_get_cookie_params();
session_set_cookie_params(
((isset($arr['lifetime'])) ? $arr['lifetime'] : 0),
((isset($arr['path'])) ? $arr['path'] : '/'),
((isset($arr['domain'])) ? $arr['domain'] : $a->get_hostname()),
((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),
((isset($arr['httponly'])) ? $arr['httponly'] : true));
}

View file

@ -61,25 +61,11 @@ if(! $a->install) {
load_hooks(); load_hooks();
call_hooks('init_1'); call_hooks('init_1');
$a->language = get_best_language(); }
load_translation_table($a->language);
// Force the cookie to be secure (https only) if this site is SSL enabled. Must be done before session_start().
if(intval($a->config['system']['ssl_cookie_protection'])) {
$arr = session_get_cookie_params();
session_set_cookie_params(
((isset($arr['lifetime'])) ? $arr['lifetime'] : 0),
((isset($arr['path'])) ? $arr['path'] : '/'),
((isset($arr['domain'])) ? $arr['domain'] : $a->get_hostname()),
((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),
((isset($arr['httponly'])) ? $arr['httponly'] : true));
}
}
else {
// load translations but do not check plugins as we have no database
$a->language = get_best_language(); $a->language = get_best_language();
load_translation_table($a->language,true); load_translation_table($a->language,$a->install);
}
/** /**

View file

@ -230,6 +230,7 @@ CREATE TABLE IF NOT EXISTS `channel` (
`channel_w_like` int(10) unsigned NOT NULL DEFAULT '0', `channel_w_like` int(10) unsigned NOT NULL DEFAULT '0',
`channel_removed` tinyint(1) NOT NULL DEFAULT '0', `channel_removed` tinyint(1) NOT NULL DEFAULT '0',
`channel_system` tinyint(1) NOT NULL DEFAULT '0', `channel_system` tinyint(1) NOT NULL DEFAULT '0',
`channel_moved` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`channel_id`), PRIMARY KEY (`channel_id`),
UNIQUE KEY `channel_address_unique` (`channel_address`), UNIQUE KEY `channel_address_unique` (`channel_address`),
KEY `channel_account_id` (`channel_account_id`), KEY `channel_account_id` (`channel_account_id`),
@ -268,7 +269,8 @@ CREATE TABLE IF NOT EXISTS `channel` (
KEY `channel_w_like` (`channel_w_like`), KEY `channel_w_like` (`channel_w_like`),
KEY `channel_removed` (`channel_removed`), KEY `channel_removed` (`channel_removed`),
KEY `channel_system` (`channel_system`), KEY `channel_system` (`channel_system`),
KEY `channel_lastpost` (`channel_lastpost`) KEY `channel_lastpost` (`channel_lastpost`),
KEY `channel_moved` (`channel_moved`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `chat` ( CREATE TABLE IF NOT EXISTS `chat` (

View file

@ -225,6 +225,7 @@ CREATE TABLE "channel" (
"channel_w_like" bigint NOT NULL DEFAULT '128', "channel_w_like" bigint NOT NULL DEFAULT '128',
"channel_removed" smallint NOT NULL DEFAULT '0', "channel_removed" smallint NOT NULL DEFAULT '0',
"channel_system" smallint NOT NULL DEFAULT '0', "channel_system" smallint NOT NULL DEFAULT '0',
"channel_moved" text NOT NULL DEFAULT '',
PRIMARY KEY ("channel_id"), PRIMARY KEY ("channel_id"),
UNIQUE ("channel_address") UNIQUE ("channel_address")
); );
@ -265,6 +266,7 @@ create index "channel_dirdate" on channel ("channel_dirdate");
create index "channel_lastpost" on channel ("channel_lastpost"); create index "channel_lastpost" on channel ("channel_lastpost");
create index "channel_removed" on channel ("channel_removed"); create index "channel_removed" on channel ("channel_removed");
create index "channel_system" on channel ("channel_system"); create index "channel_system" on channel ("channel_system");
create index "channel_moved" on channel ("channel_moved");
CREATE TABLE "chat" ( CREATE TABLE "chat" (
"chat_id" serial NOT NULL, "chat_id" serial NOT NULL,
"chat_room" bigint NOT NULL DEFAULT '0', "chat_room" bigint NOT NULL DEFAULT '0',

View file

@ -1,6 +1,6 @@
<?php <?php
define( 'UPDATE_VERSION' , 1163 ); define( 'UPDATE_VERSION' , 1164 );
/** /**
* *
@ -2003,4 +2003,19 @@ function update_r1162() {
if($r1 && $r2) if($r1 && $r2)
return UPDATE_SUCCESS; return UPDATE_SUCCESS;
return UPDATE_FAILED; return UPDATE_FAILED;
}
function update_r1163() {
if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
$r1 = q("alter table channel add channel_moved text not null default '' ");
$r2 = q("create index \"channel_channel_moved\" on channel (\"channel_moved\") ");
}
else {
$r1 = q("alter table channel add channel_moved char(255) not null default '' ");
$r2 = q("alter table channel add index ( channel_moved ) ");
}
if($r1 && $r2)
return UPDATE_SUCCESS;
return UPDATE_FAILED;
} }

View file

@ -1275,7 +1275,7 @@ function admin_page_plugins(&$a){
'$str_minversion' => t('Minimum project version: '), '$str_minversion' => t('Minimum project version: '),
'$str_maxversion' => t('Maximum project version: '), '$str_maxversion' => t('Maximum project version: '),
'$str_minphpversion' => t('Minimum PHP version: '), '$str_minphpversion' => t('Minimum PHP version: '),
'$str_requires' => t('Requires: '),
'$disabled' => t('Disabled - version incompatibility'), '$disabled' => t('Disabled - version incompatibility'),
'$admin_form' => $admin_form, '$admin_form' => $admin_form,

343
mod/cal.php Executable file
View file

@ -0,0 +1,343 @@
<?php
require_once('include/conversation.php');
require_once('include/bbcode.php');
require_once('include/datetime.php');
require_once('include/event.php');
require_once('include/items.php');
require_once('Contact.php');
function cal_init(&$a) {
if((get_config('system','block_public')) && (! local_channel()) && (! remote_channel())) {
return;
}
$o = '';
if(argc() > 1) {
$nick = argv(1);
profile_load($a,$nick);
$channelx = channelx_by_nick($nick);
if(! $channelx)
return;
$a->data['channel'] = $channelx;
$observer = $a->get_observer();
$a->data['observer'] = $observer;
$observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
head_set_icon($a->data['channel']['xchan_photo_s']);
$a->page['htmlhead'] .= "<script> var ispublic = '" . t('everybody') . "'; var profile_uid = " . (($a->data['channel']) ? $a->data['channel']['channel_id'] : 0) . "; </script>" ;
}
return;
}
function cal_content(&$a) {
$channel = null;
if(argc() > 1) {
$channel = channelx_by_nick(argv(1));
}
if(! $channel) {
notice( t('Channel not found.') . EOL);
return;
}
// since we don't currently have an event permission - use the stream permission
if(! perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_stream')) {
notice( t('Permissions denied.') . EOL);
return;
}
$sql_extra = permissions_sql($channel['channel_id'],get_observer_hash(),'event');
$first_day = get_pconfig(local_channel(),'system','cal_first_day');
$first_day = (($first_day) ? $first_day : 0);
$htpl = get_markup_template('event_head.tpl');
$a->page['htmlhead'] .= replace_macros($htpl,array(
'$baseurl' => $a->get_baseurl(),
'$module_url' => '/cal/' . $channel['channel_address'],
'$modparams' => 2,
'$lang' => $a->language,
'$first_day' => $first_day
));
$o = '';
$mode = 'view';
$y = 0;
$m = 0;
$ignored = ((x($_REQUEST,'ignored')) ? " and ignored = " . intval($_REQUEST['ignored']) . " " : '');
logger('args: ' . print_r($a->argv,true));
if(argc() > 3 && intval(argv(2)) && intval(argv(3))) {
$mode = 'view';
$y = intval(argv(2));
$m = intval(argv(3));
}
if(argc() <= 3) {
$mode = 'view';
$event_id = argv(2);
}
if($mode == 'view') {
/* edit/create form */
if($event_id) {
$r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
dbesc($event_id),
intval($channel['channel_id'])
);
if(count($r))
$orig_event = $r[0];
}
// Passed parameters overrides anything found in the DB
if(!x($orig_event))
$orig_event = array();
$tz = date_default_timezone_get();
if(x($orig_event))
$tz = (($orig_event['adjust']) ? date_default_timezone_get() : 'UTC');
$syear = datetime_convert('UTC', $tz, $sdt, 'Y');
$smonth = datetime_convert('UTC', $tz, $sdt, 'm');
$sday = datetime_convert('UTC', $tz, $sdt, 'd');
$shour = datetime_convert('UTC', $tz, $sdt, 'H');
$sminute = datetime_convert('UTC', $tz, $sdt, 'i');
$stext = datetime_convert('UTC',$tz,$sdt);
$stext = substr($stext,0,14) . "00:00";
$fyear = datetime_convert('UTC', $tz, $fdt, 'Y');
$fmonth = datetime_convert('UTC', $tz, $fdt, 'm');
$fday = datetime_convert('UTC', $tz, $fdt, 'd');
$fhour = datetime_convert('UTC', $tz, $fdt, 'H');
$fminute = datetime_convert('UTC', $tz, $fdt, 'i');
$ftext = datetime_convert('UTC',$tz,$fdt);
$ftext = substr($ftext,0,14) . "00:00";
$type = ((x($orig_event)) ? $orig_event['type'] : 'event');
$f = get_config('system','event_input_format');
if(! $f)
$f = 'ymd';
$catsenabled = feature_enabled($channel['channel_id'],'categories');
$show_bd = perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_contacts');
if(! $show_bd) {
$sql_extra .= " and event.type != 'birthday' ";
}
$category = '';
$thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
$thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
if(! $y)
$y = intval($thisyear);
if(! $m)
$m = intval($thismonth);
// Put some limits on dates. The PHP date functions don't seem to do so well before 1900.
// An upper limit was chosen to keep search engines from exploring links millions of years in the future.
if($y < 1901)
$y = 1900;
if($y > 2099)
$y = 2100;
$nextyear = $y;
$nextmonth = $m + 1;
if($nextmonth > 12) {
$nextmonth = 1;
$nextyear ++;
}
$prevyear = $y;
if($m > 1)
$prevmonth = $m - 1;
else {
$prevmonth = 12;
$prevyear --;
}
$dim = get_dim($y,$m);
$start = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0);
$finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
if (argv(2) === 'json'){
if (x($_GET,'start')) $start = $_GET['start'];
if (x($_GET,'end')) $finish = $_GET['end'];
}
$start = datetime_convert('UTC','UTC',$start);
$finish = datetime_convert('UTC','UTC',$finish);
$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
if (x($_GET,'id')){
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d $sql_extra limit 1",
intval($channel['channel_id']),
intval($_GET['id'])
);
}
else {
// fixed an issue with "nofinish" events not showing up in the calendar.
// There's still an issue if the finish date crosses the end of month.
// Noting this for now - it will need to be fixed here and in Friendica.
// Ultimately the finish date shouldn't be involved in the query.
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on event_hash = resource_id
where resource_type = 'event' and event.uid = %d $ignored
AND (( adjust = 0 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )
OR ( adjust = 1 AND ( finish >= '%s' or nofinish = 1 ) AND start <= '%s' )) $sql_extra ",
intval($channel['channel_id']),
dbesc($start),
dbesc($finish),
dbesc($adjust_start),
dbesc($adjust_finish)
);
}
$links = array();
if($r) {
xchan_query($r);
$r = fetch_post_tags($r,true);
$r = sort_by_date($r);
}
if($r) {
foreach($r as $rr) {
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
if(! x($links,$j))
$links[$j] = $a->get_baseurl() . '/' . $a->cmd . '#link-' . $j;
}
}
$events=array();
$last_date = '';
$fmt = t('l, F j');
if($r) {
foreach($r as $rr) {
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
$d = day_translate($d);
$start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c'));
if ($rr['nofinish']){
$end = null;
} else {
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c'));
}
$is_first = ($d !== $last_date);
$last_date = $d;
$edit = false;
$drop = false;
$title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8'));
if(! $title) {
list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
$title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
}
$html = format_event_html($rr);
$rr['desc'] = bbcode($rr['desc']);
$rr['location'] = bbcode($rr['location']);
$events[] = array(
'id'=>$rr['id'],
'hash' => $rr['event_hash'],
'start'=> $start,
'end' => $end,
'drop' => $drop,
'allDay' => false,
'title' => $title,
'j' => $j,
'd' => $d,
'edit' => $edit,
'is_first'=>$is_first,
'item'=>$rr,
'html'=>$html,
'plink' => array($rr['plink'],t('Link to Source'),'',''),
);
}
}
if (argv(2) === 'json'){
echo json_encode($events); killme();
}
// links: array('href', 'text', 'extra css classes', 'title')
if (x($_GET,'id')){
$tpl = get_markup_template("event_cal.tpl");
}
else {
$tpl = get_markup_template("events_cal-js.tpl");
}
$nick = $channel['channel_address'];
$o = replace_macros($tpl, array(
'$baseurl' => $a->get_baseurl(),
'$new_event' => array($a->get_baseurl().'/cal',(($event_id) ? t('Edit Event') : t('Create Event')),'',''),
'$previus' => array($a->get_baseurl()."/cal/$nick/$prevyear/$prevmonth",t('Previous'),'',''),
'$next' => array($a->get_baseurl()."/cal/$nick/$nextyear/$nextmonth",t('Next'),'',''),
'$export' => array($a->get_baseurl()."/cal/$nick/$y/$m/export",t('Export'),'',''),
'$calendar' => cal($y,$m,$links, ' eventcal'),
'$events' => $events,
'$upload' => t('Import'),
'$submit' => t('Submit'),
'$prev' => t('Previous'),
'$next' => t('Next'),
'$today' => t('Today'),
'$form' => $form,
'$expandform' => ((x($_GET,'expandform')) ? true : false),
));
if (x($_GET,'id')){ echo $o; killme(); }
return $o;
}
}

View file

@ -283,6 +283,8 @@ function events_content(&$a) {
$htpl = get_markup_template('event_head.tpl'); $htpl = get_markup_template('event_head.tpl');
$a->page['htmlhead'] .= replace_macros($htpl,array( $a->page['htmlhead'] .= replace_macros($htpl,array(
'$baseurl' => $a->get_baseurl(), '$baseurl' => $a->get_baseurl(),
'$module_url' => '/events',
'$modparams' => 1,
'$lang' => $a->language, '$lang' => $a->language,
'$first_day' => $first_day '$first_day' => $first_day
)); ));
@ -296,6 +298,11 @@ function events_content(&$a) {
$m = 0; $m = 0;
$ignored = ((x($_REQUEST,'ignored')) ? " and ignored = " . intval($_REQUEST['ignored']) . " " : ''); $ignored = ((x($_REQUEST,'ignored')) ? " and ignored = " . intval($_REQUEST['ignored']) . " " : '');
logger('args: ' . print_r($a->argv,true));
if(argc() > 1) { if(argc() > 1) {
if(argc() > 2 && argv(1) === 'add') { if(argc() > 2 && argv(1) === 'add') {
$mode = 'add'; $mode = 'add';

View file

@ -250,6 +250,7 @@ function register_content(&$a) {
'$role' => $role, '$role' => $role,
'$default_role' => $default_role, '$default_role' => $default_role,
'$nickname' => $nickname, '$nickname' => $nickname,
'$enable_tos' => $enable_tos,
'$tos' => $tos, '$tos' => $tos,
'$email' => $email, '$email' => $email,
'$pass1' => $password, '$pass1' => $password,

View file

@ -128,6 +128,8 @@ function webpages_content(&$a) {
// Get a list of webpages. We can't display all them because endless scroll makes that unusable, // Get a list of webpages. We can't display all them because endless scroll makes that unusable,
// so just list titles and an edit link. // so just list titles and an edit link.
/** @TODO - this should be replaced with pagelist_widget */ /** @TODO - this should be replaced with pagelist_widget */
$sql_extra = item_permissions_sql($owner); $sql_extra = item_permissions_sql($owner);

View file

@ -35,8 +35,6 @@ function xrd_init(&$a) {
header("Content-type: application/xrd+xml"); header("Content-type: application/xrd+xml");
$tpl = get_markup_template('view/xrd_person.tpl');
$o = replace_macros(get_markup_template('xrd_person.tpl'), array( $o = replace_macros(get_markup_template('xrd_person.tpl'), array(
'$nick' => $r[0]['channel_address'], '$nick' => $r[0]['channel_address'],
'$accturi' => $uri, '$accturi' => $uri,
@ -51,7 +49,7 @@ function xrd_init(&$a) {
// '$salmen' => $a->get_baseurl() . '/salmon/' . $r[0]['channel_address'] . '/mention', // '$salmen' => $a->get_baseurl() . '/salmon/' . $r[0]['channel_address'] . '/mention',
'$modexp' => 'data:application/magic-public-key,' . $salmon_key, '$modexp' => 'data:application/magic-public-key,' . $salmon_key,
'$subscribe' => $a->get_baseurl() . '/follow?url={uri}', '$subscribe' => $a->get_baseurl() . '/follow?url={uri}',
// '$bigkey' => salmon_key($r[0]['pubkey']) '$bigkey' => salmon_key($r[0]['channel_pubkey'])
)); ));

View file

@ -1 +1 @@
2016-02-22.1315H 2016-02-24.1317H

View file

@ -37,7 +37,7 @@ nav .navbar-header img {
nav .dropdown-menu { nav .dropdown-menu {
max-height: 450px; max-height: 450px;
max-width: 300px; width: 270px;
overflow-y: auto; overflow-y: auto;
margin-top: 0px; margin-top: 0px;
} }

View file

@ -4,7 +4,7 @@ I'm the web server at {{$sitename}};
The Hubzilla developers released update {{$update}} recently, The Hubzilla developers released update {{$update}} recently,
but when I tried to install it, something went terribly wrong. but when I tried to install it, something went terribly wrong.
This needs to be fixed soon and it requires human intervention. This needs to be fixed soon and it requires human intervention.
Please contact a Red developer if you can not figure out how to Please contact a project developer if you can not figure out how to
fix it on your own. My database might be invalid. fix it on your own. My database might be invalid.
The error message is '{{$error}}'. The error message is '{{$error}}'.

View file

@ -1847,8 +1847,8 @@ $a->strings["Public Sites"] = "Openbare hubs";
$a->strings["The listed sites allow public registration for the \$Projectname network. All sites in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Op de hier weergegeven hubs kan iedereen zich voor het \$Projectname-netwerk aanmelden. Alle hubs in het \$Projectname-netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen betaalde abonnementen voor uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven."; $a->strings["The listed sites allow public registration for the \$Projectname network. All sites in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Op de hier weergegeven hubs kan iedereen zich voor het \$Projectname-netwerk aanmelden. Alle hubs in het \$Projectname-netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen betaalde abonnementen voor uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven.";
$a->strings["Rate this hub"] = "Beoordeel deze hub"; $a->strings["Rate this hub"] = "Beoordeel deze hub";
$a->strings["Site URL"] = "URL hub"; $a->strings["Site URL"] = "URL hub";
$a->strings["Access Type"] = "Toegangstype"; $a->strings["Access Type"] = "Toegangs-<br/>&nbsp;type";
$a->strings["Registration Policy"] = "Registratiebeleid"; $a->strings["Registration Policy"] = "Registratie-<br/>&nbsp;beleid";
$a->strings["Project"] = "Project"; $a->strings["Project"] = "Project";
$a->strings["View hub ratings"] = "Beoordelingen"; $a->strings["View hub ratings"] = "Beoordelingen";
$a->strings["Rate"] = "Beoordeel"; $a->strings["Rate"] = "Beoordeel";
@ -1877,7 +1877,7 @@ $a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"]
$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Deze \$Projectname-hub heeft het maximum aantal dagelijks toegestane registraties bereikt. Probeer het morgen (UTC) nogmaals."; $a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Deze \$Projectname-hub heeft het maximum aantal dagelijks toegestane registraties bereikt. Probeer het morgen (UTC) nogmaals.";
$a->strings["Terms of Service"] = "Gebruiksvoorwaarden"; $a->strings["Terms of Service"] = "Gebruiksvoorwaarden";
$a->strings["I accept the %s for this website"] = "Ik accepteer de %s van deze \$Projectname-hub"; $a->strings["I accept the %s for this website"] = "Ik accepteer de %s van deze \$Projectname-hub";
$a->strings["I am over 13 years of age and accept the %s for this website"] = "Ik accepteer de %s van deze \$Projectname-hub"; $a->strings["I am over 13 years of age and accept the %s for this website"] = "Ik ben 13 jaar of ouder en accepteer de %s van deze \$Projectname-hub";
$a->strings["Membership on this site is by invitation only."] = "Registreren op deze \$Projectname-hub kan alleen op uitnodiging."; $a->strings["Membership on this site is by invitation only."] = "Registreren op deze \$Projectname-hub kan alleen op uitnodiging.";
$a->strings["Please enter your invitation code"] = "Vul jouw uitnodigingscode in"; $a->strings["Please enter your invitation code"] = "Vul jouw uitnodigingscode in";
$a->strings["Enter your name"] = "Vul jouw naam in"; $a->strings["Enter your name"] = "Vul jouw naam in";

View file

@ -1,19 +1,19 @@
s met dit e-mailadres een account aangemaakt op {{$sitename}}.
Er is met dit e-mailadres een account aangemaakt op {{$sitename}}.
De inloggegevens zijn als volgt: De inloggegevens zijn als volgt:
Hub: {{$siteurl}} Hub: {{$siteurl}}
Inlognaam: {{$email}} Inlognaam: {{$email}}
Wachtwoord: (het wachtwoord dat je tijdens de registratie hebt opgegeven) Wachtwoord: (het wachtwoord dat je tijdens de registratie hebt opgegeven)
Wanneer dit account was aangemaakt zonder jouw medeweten en tevens niet gewenst, dan kan je {{$siteurl}} Wanneer dit account was aangemaakt zonder jouw medeweten en tevens niet gewenst, dan kan je {{$siteurl
bezoeken en een nieuwe wachtwoord aanvragen. Je kan daarna inloggen, een kanaal aanmaken en }}/lostpass bezoeken en het wachtwoord opnieuw instellen. Je kan daarna inloggen, een kanaal aanmaken en meteen via 'instellingen > account' (linksboven) het account verwijderen (rechtsboven).
meteen via 'instellingen > account' (linksboven) het account verwijderen (onderaan).
Excuses voor het eventuele ongemak. Excuses voor het eventuele ongemak.
Wanneer dit account wel door jou is aangemaakt: Dank je en welkom op {{$sitename}}. Wanneer dit account wel door jou is aangemaakt: Dank je en van harte welkom op {{$sitename}}.
Vriendelijke groet, Vriendelijke groet,
Beheerder {{$sitename}} ({{$siteurl}}) Beheerder {{$sitename}} ({{$siteurl}})

3
view/pdl/mod_cal.pdl Normal file
View file

@ -0,0 +1,3 @@
[region=aside]
[widget=fullprofile][/widget]
[/region]

View file

@ -3,9 +3,5 @@
} }
.wall-item-content-wrapper.comment { .wall-item-content-wrapper.comment {
border-width: 0px 0px 1px 0px; border-bottom: 1px solid #ccc;
}
.hide-comments-outer {
border-width: 1px 0px 1px 0px;
} }

View file

@ -24,6 +24,9 @@
{{if $info.minphpversion}} {{if $info.minphpversion}}
<p class="versionlimit">{{$str_minphpversion}}{{$info.minphpversion}}</p> <p class="versionlimit">{{$str_minphpversion}}{{$info.minphpversion}}</p>
{{/if}} {{/if}}
{{if $info.requires}}
<p class="versionlimit">{{$str_requires}}{{$info.requires}}</p>
{{/if}}
{{foreach $info.maintainer as $a}} {{foreach $info.maintainer as $a}}

14
view/tpl/event_cal.tpl Executable file
View file

@ -0,0 +1,14 @@
{{foreach $events as $event}}
<div class="event-wrapper">
<div class="event">
<div class="event-owner">
{{if $event.item.author.xchan_name}}<a href="{{$event.item.author.xchan_url}}" ><img src="{{$event.item.author.xchan_photo_s}}">{{$event.item.author.xchan_name}}</a>{{/if}}
</div>
{{$event.html}}
<div class="event-buttons">
{{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="icon-external-link btn btn-default" ></i></a>{{/if}}
</div>
<div class="clear"></div>
</div>
</div>
{{/foreach}}

View file

@ -6,7 +6,7 @@
<script> <script>
function showEvent(eventid) { function showEvent(eventid) {
$.get( $.get(
'{{$baseurl}}/events/?id='+eventid, '{{$baseurl}}{{$module_url}}/?id='+eventid,
function(data){ function(data){
$.colorbox({ scrolling: false, html: data, onComplete: function() { $.colorbox.resize(); }}); $.colorbox({ scrolling: false, html: data, onComplete: function() { $.colorbox.resize(); }});
} }
@ -36,7 +36,7 @@
$(document).ready(function() { $(document).ready(function() {
$('#events-calendar').fullCalendar({ $('#events-calendar').fullCalendar({
events: '{{$baseurl}}/events/json', events: '{{$baseurl}}{{$module_url}}/json',
header: false, header: false,
lang: '{{$lang}}', lang: '{{$lang}}',
firstDay: {{$first_day}}, firstDay: {{$first_day}},
@ -109,10 +109,17 @@
}); });
// center on date // center on date
// @fixme does not work for cal/$nick module_url
var args=location.href.replace(baseurl,"").split("/"); var args=location.href.replace(baseurl,"").split("/");
{{if $modparams == 2}}
if (args.length>=5) {
$("#events-calendar").fullCalendar('gotoDate',args[3] , args[4]-1);
}
{{else}}
if (args.length>=4) { if (args.length>=4) {
$("#events-calendar").fullCalendar('gotoDate',args[2] , args[3]-1); $("#events-calendar").fullCalendar('gotoDate',args[2] , args[3]-1);
} }
{{/if}}
// show event popup // show event popup
var hash = location.hash.split("-") var hash = location.hash.split("-")

17
view/tpl/events_cal-js.tpl Executable file
View file

@ -0,0 +1,17 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
<div class="btn-group">
<button class="btn btn-default btn-xs" onclick="changeView('prev', false);" title="{{$prev}}"><i class="icon-backward"></i></button>
<button id="events-spinner" class="btn btn-default btn-xs" onclick="changeView('today', false);" title="{{$today}}"><i class="icon-bullseye"></i></button>
<button class="btn btn-default btn-xs" onclick="changeView('next', false);" title="{{$next}}"><i class="icon-forward"></i></button>
</div>
</div>
<h2 id="title"></h2>
<div class="clear"></div>
</div>
<div class="clear"></div>
<div class="section-content-wrapper-np">
<div id="events-calendar"></div>
</div>
</div>