aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaakon Meland Eriksen <haakon.eriksen@far.no>2015-09-18 18:51:39 +0200
committerHaakon Meland Eriksen <haakon.eriksen@far.no>2015-09-18 18:51:39 +0200
commitce28760c2a7319f3cdc25c39a62582b722e91006 (patch)
tree802f64d3988fc14a277c79ee5192693a4202b502
parent438cb1d7e0f1518dd35a3a377dfd9a9fd885f80c (diff)
parent87c8cf489210136958d2e0b44e4c3ca48c1ff8af (diff)
downloadvolse-hubzilla-ce28760c2a7319f3cdc25c39a62582b722e91006.tar.gz
volse-hubzilla-ce28760c2a7319f3cdc25c39a62582b722e91006.tar.bz2
volse-hubzilla-ce28760c2a7319f3cdc25c39a62582b722e91006.zip
Merge remote-tracking branch 'upstream/master'
-rw-r--r--doc/about.bb14
-rw-r--r--doc/features.bb24
-rw-r--r--doc/main.bb2
-rw-r--r--doc/to_do_code.bb2
-rw-r--r--doc/what_is_zot.bb30
-rw-r--r--images/default_profile_photos/arrow_avatar/300.pngbin14163 -> 13995 bytes
-rw-r--r--images/default_profile_photos/arrow_avatar/48.pngbin2279 -> 2111 bytes
-rw-r--r--images/default_profile_photos/arrow_avatar/80.pngbin3861 -> 3693 bytes
-rw-r--r--images/default_profile_photos/black_avatar_1/300.pngbin11081 -> 10913 bytes
-rw-r--r--images/default_profile_photos/black_avatar_1/48.pngbin1763 -> 1595 bytes
-rw-r--r--images/default_profile_photos/black_avatar_1/80.pngbin2986 -> 2818 bytes
-rw-r--r--images/default_profile_photos/black_avatar_2/300.pngbin10148 -> 9980 bytes
-rw-r--r--images/default_profile_photos/black_avatar_2/48.pngbin1516 -> 1348 bytes
-rw-r--r--images/default_profile_photos/black_avatar_2/80.pngbin2598 -> 2430 bytes
-rw-r--r--images/default_profile_photos/red_avatar/300.pngbin8856 -> 8688 bytes
-rw-r--r--images/default_profile_photos/red_avatar/48.pngbin1724 -> 1556 bytes
-rw-r--r--images/default_profile_photos/red_avatar/80.pngbin2660 -> 2492 bytes
-rw-r--r--images/hz-16.pngbin876 -> 678 bytes
-rw-r--r--images/hz-32.pngbin1615 -> 1358 bytes
-rw-r--r--images/hz-64.pngbin3627 -> 2708 bytes
-rw-r--r--include/attach.php12
-rw-r--r--include/bbcode.php2
-rw-r--r--include/checksites.php61
-rw-r--r--include/conversation.php4
-rw-r--r--include/deliver.php4
-rw-r--r--include/hubloc.php32
-rwxr-xr-xinclude/items.php4
-rw-r--r--include/nav.php4
-rw-r--r--include/network.php20
-rw-r--r--include/notifier.php57
-rw-r--r--include/poller.php3
-rw-r--r--include/zot.php349
-rw-r--r--mod/hostxrd.php3
-rw-r--r--mod/invite.php2
-rw-r--r--mod/mail.php5
-rw-r--r--mod/message.php50
-rw-r--r--mod/photos.php4
-rw-r--r--mod/profile_photo.php72
-rw-r--r--mod/siteinfo.php5
-rw-r--r--mod/thing.php10
-rw-r--r--mod/webfinger.php2
-rw-r--r--mod/wfinger.php19
-rw-r--r--mod/xrd.php3
-rw-r--r--mod/zfinger.php292
-rw-r--r--version.inc2
-rw-r--r--view/css/choklet.css8
-rw-r--r--view/css/choklet_bannertwo.css16
-rw-r--r--view/css/choklet_edgesthree.css10
-rw-r--r--view/css/choklet_edgestwo.css10
-rw-r--r--view/css/choklet_full.css2
-rw-r--r--view/css/choklet_three.css8
-rw-r--r--view/css/default.css9
-rw-r--r--view/css/full.css8
-rw-r--r--view/es/messages.po378
-rw-r--r--view/es/strings.php10
-rw-r--r--view/it/messages.po2
-rw-r--r--view/php/choklet.php2
-rw-r--r--view/theme/redbasic/css/align_left.css8
-rw-r--r--view/theme/redbasic/css/converse_center.css10
-rw-r--r--view/theme/redbasic/css/style.css43
-rw-r--r--view/theme/redbasic/php/config.php8
-rw-r--r--view/theme/redbasic/php/style.php15
-rw-r--r--view/theme/redbasic/schema/dark.php3
-rw-r--r--view/theme/redbasic/schema/simple_black_on_white.php3
-rw-r--r--view/theme/redbasic/schema/simple_green_on_black.php2
-rw-r--r--view/theme/redbasic/schema/simple_white_on_black.php2
-rw-r--r--view/theme/redbasic/tpl/theme_settings.tpl9
-rwxr-xr-xview/tpl/admin_users.tpl10
-rw-r--r--view/tpl/locmanage.tpl2
-rwxr-xr-xview/tpl/mail_display.tpl22
-rwxr-xr-xview/tpl/mail_head.tpl13
-rwxr-xr-xview/tpl/mail_list.tpl14
-rwxr-xr-xview/tpl/photo_view.tpl2
-rwxr-xr-xview/tpl/siteinfo.tpl1
-rwxr-xr-xview/tpl/xrd_host.tpl2
75 files changed, 964 insertions, 761 deletions
diff --git a/doc/about.bb b/doc/about.bb
index 508795aed..1d1a2d099 100644
--- a/doc/about.bb
+++ b/doc/about.bb
@@ -1,8 +1,8 @@
[b]About[/b]
-The $Projectname is a decentralized communication network, which aims to provide communication that is censorship-resistant, privacy-respecting, and thus free from the oppressive claws of contemporary corporate communication giants. These giants function primarily as spy networks for paying clients of all sorts and types, in addition to monopolizing and centralizing the Internet; a feature that was not part of the original and revolutionary goals that produced the World Wide Web.
+$Projectname is a decentralized communication network, which aims to provide communication that is censorship-resistant, privacy-respecting, and thus free from the oppressive claws of contemporary corporate communication giants. These giants function primarily as spy networks for paying clients of all sorts and types, in addition to monopolizing and centralizing the Internet; a feature that was not part of the original and revolutionary goals that produced the World Wide Web.
-The $Projectname is free and open source. It is designed to scale from a $35 Raspberry Pi, to top of the line AMD and Intel Xeon-powered multi-core enterprise servers. It can be used to support communication between a few individuals, or scale to many thousands and more.
+$Projectname is free and open source. It is designed to scale from a $35 Raspberry Pi, to top of the line AMD and Intel Xeon-powered multi-core enterprise servers. It can be used to support communication between a few individuals, or scale to many thousands and more.
Red aims to be skill and resource agnostic. It is easy to use by everyday computer users, as well as by systems administrators and developers.
@@ -10,15 +10,15 @@ How you use it depends on how you want to use it.
It is written in the PHP scripting language, thus making it trivial to install on any hosting platform in use today. This includes self-hosting at home, at hosting providers such as [url=http://mediatemple.com/]Media Temple[/url] and [url=http://www.dreamhost.com/]Dreamhost[/url], or on virtual and dedicated servers, offered by the likes of [url=https://www.linode.com]Linode[/url], [url=http://greenqloud.com]GreenQloud[/url] or [url=https://aws.amazon.com]Amazon AWS[/url].
-In other words, the $Projectname can run on any computing platform that comes with a web server, a MySQL-compatible database, and the PHP scripting language.
+In other words, $Projectname can run on any computing platform that comes with a web server, a MySQL-compatible database, and the PHP scripting language.
-Along the way, Red offers a number of unique goodies:
+Along the way, $Projectname offers a number of unique goodies:
-[b]Single-click user identification:[/b] meaning you can access sites on the $Projectname simply by clicking on links to remote sites. Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.
+[b]Single-click user identification:[/b] meaning you can access sites on $Projectname simply by clicking on links to remote sites. Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.
-[b]Cloning:[/b] of online identities. Your online presence no longer has to be tied to a single server, domain name or IP address. You can clone and import your identity (or channel as we call it) to another server (or, a hub as servers are known in the $Projectname). Now, should your primary hub go down, no worries, your contacts, posts[i]*[/i], and messages[i]*[/i] will automagically continue to be available and accessible under your cloned channel. [i](*: only posts and messages as from the moment you cloned your channel)[/i]
+[b]Cloning:[/b] of online identities. Your online presence no longer has to be tied to a single server, domain name or IP address. You can clone and import your identity (or channel as we call it) to another server (or, a hub as servers are known in $Projectname). Now, should your primary hub go down, no worries, your contacts, posts[i]*[/i], and messages[i]*[/i] will automagically continue to be available and accessible under your cloned channel. [i](*: only posts and messages as from the moment you cloned your channel)[/i]
-[b]Privacy:[/b] Red identities (Zot IDs) can be deleted, backed up/downloaded, and cloned. The user is in full control of their data. Should you decide to delete all your content and erase your Zot ID, all you have to do is click on a link and it's immediately deleted from the hub. No questions, no fuss.
+[b]Privacy:[/b] $Projectname identities (Zot IDs) can be deleted, backed up/downloaded, and cloned. The user is in full control of their data. Should you decide to delete all your content and erase your Zot ID, all you have to do is click on a link and it's immediately deleted from the hub. No questions, no fuss.
#include doc/macros/main_footer.bb;
diff --git a/doc/features.bb b/doc/features.bb
index cb194966e..06b7fb6b0 100644
--- a/doc/features.bb
+++ b/doc/features.bb
@@ -8,14 +8,14 @@ $Projectname provides distributed web publishing and social communications with
So what exactly are "decentralised permissions"? They give me the ability to share something on my website (photos, media, files, webpages, etc.) with specific people on completely different websites - but not necessarily [i]everybody[/i] on those websites; and they do not need a password on my website and do not need to login to my website to view the things I've shared with them. They have one password on their own website and "magic authentication" between affiliated websites in the network. Also, as it is decentralised, there is no third party which has the ability to bypass permissions and see everything in the network.
-$Projectname combines many features of traditional blogs, social networking and media, content management systems, and personal cloud storage into an easy to use framework. Each node in the matrix can operate standalone or link with other nodes to create a super-network; leaving privacy under the control of the original publisher.
+$Projectname combines many features of traditional blogs, social networking and media, content management systems, and personal cloud storage into an easy to use framework. Each node in the grid can operate standalone or link with other nodes to create a super-network; leaving privacy under the control of the original publisher.
$Projectname is an open source webserver application written originally in PHP/MySQL and is easily installable by those with basic website administration skills. It is also easily extended via plugins and themes and other third-party tools.
[b][size=24]$Projectname Features[/size][/b]
-The $Projectname is a general-purpose web publishing and communication network, with several unique features. It is designed to be used by the widest range of people on the web, from non-technical bloggers, to expert PHP programmers and seasoned systems administrators.
+$Projectname is a general-purpose web publishing and communication network, with several unique features. It is designed to be used by the widest range of people on the web, from non-technical bloggers, to expert PHP programmers and seasoned systems administrators.
This page lists some of the core features of $Projectname that are bundled with the official release. As with most free and open source software, there may be many other extensions, additions, plugins, themes and configurations that are limited only by the needs and imagination of the members.
@@ -29,7 +29,7 @@ When adding connnections in $Projectname, members have the option of assigning "
On the other hand, when adding a friend's channel, they could be placed under the affinity level of &quot;Friends&quot;.
-At this point, the $Projectname [i]Affinity Slider[/i] tool, which usually appears at the top of your &quot;Matrix&quot; page, adjusts the content on the page to include those within the desired affinity range. Channels outside that range will not be displayed, unless you adjust the slider to include them.
+At this point, $Projectname [i]Affinity Slider[/i] tool, which usually appears at the top of your &quot;Matrix&quot; page, adjusts the content on the page to include those within the desired affinity range. Channels outside that range will not be displayed, unless you adjust the slider to include them.
The Affinity Slider allows instantaneous filtering of large amounts of content, grouped by levels of closeness.
@@ -47,7 +47,7 @@ Access Control Lists may be applied to content and posts, photos, events, webpag
[b]Single Sign-on[/b]
-Access Control Lists work for all channels in the matrix due to our unique single sign-on technology. Most internal links provide an identity token which can be verified on other $Projectname sites and used to control access to private resources. You login once to your home hub. After that, authentication to all $Projectname resources is "magic".
+Access Control Lists work for all channels in the grid due to our unique single sign-on technology. Most internal links provide an identity token which can be verified on other $Projectname sites and used to control access to private resources. You login once to your home hub. After that, authentication to all $Projectname resources is "magic".
[b]WebDAV enabled File Storage[/b]
@@ -89,7 +89,7 @@ Messages marked [b]private[/b] are encrypted with AES-CBC 256-bit symmetric ciph
These private messages are also stored in an encrypted form on remote systems.
-Each Red channel has it's own unique set of private and associated public RSA 4096-bit keys, generated when the channels is first created.
+Each$Projectname channel has it's own unique set of private and associated public RSA 4096-bit keys, generated when the channels is first created.
Additionally, messages may be created utilising "end-to-end encryption" which cannot be read by $Projectname operators or ISPs or anybody who does not know the passcode.
@@ -146,9 +146,9 @@ Forums are typically channels which may be open to participation from multiple a
[b]Account Cloning[/b]
-Accounts in the $Projectname are referred to as [i]nomadic identities[/i], because a member's identity is not bound to the hub where the identity was originally created. For example, when you create a Facebook or Gmail account, it is tied to those services. They cannot function without Facebook.com or Gmail.com.
+Accounts in $Projectname are referred to as [i]nomadic identities[/i], because a member's identity is not bound to the hub where the identity was originally created. For example, when you create a Facebook or Gmail account, it is tied to those services. They cannot function without Facebook.com or Gmail.com.
-By contrast, say you've created a Red identity called [b]tina@redhub.com[/b]. You can clone it to another Red hub by choosing the same, or a different name: [b]liveForever@Some$ProjectnameHub.info[/b]
+By contrast, say you've created a$Projectname identity called [b]tina@redhub.com[/b]. You can clone it to another$Projectname hub by choosing the same, or a different name: [b]liveForever@Some$ProjectnameHub.info[/b]
Both channels are now synchronized, which means all your contacts and preferences will be duplicated on your clone. It doesn't matter whether you send a post from your original hub, or the new hub. Posts will be mirrored on both accounts.
@@ -156,9 +156,9 @@ This is a rather revolutionary feature, if we consider some scenarios:
- What happens if the hub where an identity is based suddenly goes offline? Without cloning, a member will not be able to communicate until that hub comes back online (no doubt many of you have seen and cursed the Twitter "Fail Whale"). With cloning, you just log into your cloned account, and life goes on happily ever after.
- - The administrator of your hub can no longer afford to pay for his free and public $Projectname hub. He announces that the hub will be shutting down in two weeks. This gives you ample time to clone your identity(ies) and preserve your Red relationships, friends and content.
+ - The administrator of your hub can no longer afford to pay for his free and public $Projectname hub. He announces that the hub will be shutting down in two weeks. This gives you ample time to clone your identity(ies) and preserve your$Projectname relationships, friends and content.
- - What if your identity is subject to government censorship? Your hub provider may be compelled to delete your account, along with any identities and associated data. With cloning, the $Projectname offers [b]censorship resistance[/b]. You can have hundreds of clones, if you wanted to, all named different, and existing on many different hubs, strewn around the internet.
+ - What if your identity is subject to government censorship? Your hub provider may be compelled to delete your account, along with any identities and associated data. With cloning, $Projectname offers [b]censorship resistance[/b]. You can have hundreds of clones, if you wanted to, all named different, and existing on many different hubs, strewn around the internet.
Red offers interesting new possibilities for privacy. You can read more at the &lt;&lt;Private Communications Best Practices&gt;&gt; page.
@@ -176,7 +176,7 @@ Backups can then be used to clone or restore a profile.
[b]Account Deletion[/b]
-Accounts can be immediately deleted by clicking on a link. That's it. All associated content is then deleted from the matrix (this includes posts and any other content produced by the deleted profile). Depending on the number of connections you have, the process of deleting remote content could take some time but it is scheduled to happen as quickly as is practical.
+Accounts can be immediately deleted by clicking on a link. That's it. All associated content is then deleted from the grid (this includes posts and any other content produced by the deleted profile). Depending on the number of connections you have, the process of deleting remote content could take some time but it is scheduled to happen as quickly as is practical.
[b][size=20]Content Creation[/size][/b]
@@ -187,10 +187,10 @@ Red supports a number of different ways of adding rich-text content. The default
When creating &quot;Websites&quot;, content may be entered in HTML, Markdown, BBcode, and/or plain text.
[b]Deletion of content[/b]
-Any content created in the $Projectname remains under the control of the member (or channel) that originally created it. At any time, a member can delete a message, or a range of messages. The deletion process ensures that the content is deleted, regardless of whether it was posted on a channel's primary (home) hub, or on another hub, where the channel was remotely authenticated via Zot (the $Projectname communication and authentication protocol).
+Any content created in $Projectname remains under the control of the member (or channel) that originally created it. At any time, a member can delete a message, or a range of messages. The deletion process ensures that the content is deleted, regardless of whether it was posted on a channel's primary (home) hub, or on another hub, where the channel was remotely authenticated via Zot ($Projectname communication and authentication protocol).
[b]Media[/b]
-Similar to any other modern blogging system, social network, or a micro-blogging service, Red supports the uploading of files, embedding of videos, linking web pages.
+Similar to any other modern blogging system, social network, or a micro-blogging service, $Projectname supports the uploading of files, embedding of videos, linking web pages.
[b]Previewing/Editing[/b]
Post can be previewed prior to sending and edited after sending.
diff --git a/doc/main.bb b/doc/main.bb
index 44f227c16..8ba5d481b 100644
--- a/doc/main.bb
+++ b/doc/main.bb
@@ -5,7 +5,7 @@ $Projectname is a decentralized communication and publishing platform that enabl
[zrl=[baseurl]/help/features][b]$Projectname Features[/b][/zrl]
$Projectname is already running as a global distributed network and proves its versatility and scalability from standalone to huge sites on a daily basis.
-Think of standalone family communication platforms, distributed online communities, support forums, blogs and homepages. Or professional content providers with commercial premium channels and targeted content acces. Whatever you want, the $Projectname is there to cater to your creativity.
+Think of standalone family communication platforms, distributed online communities, support forums, blogs and homepages. Or professional content providers with commercial premium channels and targeted content acces. Whatever you want, $Projectname is there to cater to your creativity.
[zrl=[baseurl]/help/what_is_zot][b]Got Zot? Well, you should.[/b][/zrl]
Zot is the great new communicaton protocol invented especially for $Projectname. As a member you are no longer bound to a single site or hub thanks to "Nomadic Identities". Migrate easily to another server and keep your contacts intact, or clone it and run the same channel on several servers. Just in case one of them might shut down, you don't lose out. Plus once you are inside $Projectname there is no need for you to authenticate twice, even when accessing another $Projectname site. Zot is what sets $Projectname apart.
diff --git a/doc/to_do_code.bb b/doc/to_do_code.bb
index b5c7b9903..3050bea94 100644
--- a/doc/to_do_code.bb
+++ b/doc/to_do_code.bb
@@ -6,6 +6,8 @@ We need much more than this, but here are areas where developers can help. Pleas
[li]Include TOS link in registration/verification email[/li]
[li]Auto preview posts/comments (configurable timer kicks in the preview if not 0)[/li]
[li]Create bug tracker module[/li]
+[li]Filing posts - provide a dropdown menu integrated with the 'post actions menu'[/li]
+[li]integrate Mozilla Persona (possibly via plugin) https://github.com/mozilla/id-specs/blob/prod/browserid/index.md and become an idP[/li]
[li]translation plugins - moses or apertium[/li]
[li]plugins - provide 'disable' which is softer than 'uninstall' for those plugins which create additional DB tables[/li]
[li]Infinite scroll improvements (i.e. embedded page links) see http://scrollsample.appspot.com/items [/li]
diff --git a/doc/what_is_zot.bb b/doc/what_is_zot.bb
index 50df9e392..9285f4ec6 100644
--- a/doc/what_is_zot.bb
+++ b/doc/what_is_zot.bb
@@ -1,6 +1,6 @@
[b]What is Zot?[/b]
-Zot is the protocol that powers the $Projectname, providing three core capabilities: Communications, Identity, and Access Control.
+Zot is the protocol that powers $Projectname, providing three core capabilities: Communications, Identity, and Access Control.
The functionality it provides can also be described as follows:
@@ -9,43 +9,43 @@ The functionality it provides can also be described as follows:
[b][size=20]Communications[/size][/b]
-Zot is a revolutionary protocol which provides [i]decentralised communications[/i] and [i]identity management[/i] across the matrix. The resulting platform can provide web services comparable to those offered by large corporate providers, but without the large corporate provider and their associated privacy issues, insatiable profit drive, and walled-garden mentality.
+Zot is a revolutionary protocol which provides [i]decentralised communications[/i] and [i]identity management[/i] across the grid. The resulting platform can provide web services comparable to those offered by large corporate providers, but without the large corporate provider and their associated privacy issues, insatiable profit drive, and walled-garden mentality.
-Communications and social networking are an integral part of the matrix. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale. These communications may be public or private - and private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers.
+Communications and social networking are an integral part of the grid. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale. These communications may be public or private - and private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers.
-Zot allows a wide array of background services in the matrix, from offering friend suggestions, to directory services. You can also perform other things which would typically only be possibly on a centralized provider - such as &quot;Wall to Wall&quot; posts. Priivate/multiple profiles can be easily created, and web content can be tailored to the viewer via the [i]Affinity Slider[/i].
+Zot allows a wide array of background services in the grid, from offering friend suggestions, to directory services. You can also perform other things which would typically only be possibly on a centralized provider - such as &quot;Wall to Wall&quot; posts. Private/multiple profiles can be easily created, and web content can be tailored to the viewer via the [i]Affinity Slider[/i].
You won't find these features at all on other decentralized communication services. In addition to providing hub (server) decentralization, perhaps the most innovative and interesting Zot feature is its provision of [i]decentralized identity[/i] services.
[b][size=20]Identity[/size][/b]
-Zot's identity layer is unique. It provides [i]invisible single sign-on[/i] across all sites in the matrix.
+Zot's identity layer is unique. It provides [i]invisible single sign-on[/i] across all sites in the grid.
It also provides [i]nomadic identity[/i], so that your communications with friends, family, and or anyone else you're communicating with won't be affected by the loss of your primary communication node - either temporarily or permanently.
-The important bits of your identity and relationships can be backed up to a thumb drive, or your laptop, and may appear at any node in the matrix at any time - with all your friends and preferences intact.
+The important bits of your identity and relationships can be backed up to a thumb drive, or your laptop, and may appear at any node in the grid at any time - with all your friends and preferences intact.
Crucially, these nomadic instances are kept in sync so any instance can take over if another one is compromised or damaged. This protects you against not only major system failure, but also temporary site overloads and governmental manipulation or censorship.
-Nomadic identity, single sign-on, and Red's decentralization of hubs, we believe, introduce a high degree of degree of [i]resiliency[/i] and [i]persistence[/i] in internet communications, that are sorely needed amidst global trends towards corporate centralization, as well as mass and indiscriminate government surveillance and censorship.
+Nomadic identity, single sign-on, and $Projectname's decentralization of hubs, we believe, introduce a high degree of degree of [i]resiliency[/i] and [i]persistence[/i] in internet communications, that are sorely needed amidst global trends towards corporate centralization, as well as mass and indiscriminate government surveillance and censorship.
-As you browse the matrix, viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No passwords to enter. Nothing to type. You're just greeted by name on every new site you visit.
+As you browse the grid, viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No passwords to enter. Nothing to type. You're just greeted by name on every new site you visit.
-How does Zot do that? We call it [i]magic-auth[/i], because Red hides the details of the complexities that go into single sign-on logins, and nomadic identities, from the experience of browsing on the matrix. This is one of the design goals of Red: to increase privacy, and freedom on the web, while reducing the complexity and tedium brought by the need to enter new passwords and user names for every different sight that someone might visit online.
+How does Zot do that? We call it [i]magic-auth[/i], because $Projectname hides the details of the complexities that go into single sign-on logins, and nomadic identities, from the experience of browsing on the grid. This is one of the design goals of $Projectname: to increase privacy, and freedom on the web, while reducing the complexity and tedium brought by the need to enter new passwords and user names for every different sight that someone might visit online.
-You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the matrix - such as shopping, blogs, forums, and access to private information. This is just like the services offered by large corporate providers with huge user databases; however you can be a member of this community, as well as a server on this network using a $35 Rasberry Pi. Your password isn't stored on a thousand different sites, or even worse, only on a few sites like Google and Facebook, beyond your direct control.
+You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the grid - such as shopping, blogs, forums, and access to private information. This is just like the services offered by large corporate providers with huge user databases; however you can be a member of this community, as well as a server on this network using a $35 Rasberry Pi. Your password isn't stored on a thousand different sites, or even worse, only on a few sites like Google and Facebook, beyond your direct control.
-You cannot be silenced. You cannot be removed from the matrix, unless you yourself choose to exit it.
+You cannot be silenced. You cannot be removed from the grid, unless you yourself choose to exit it.
[b][size=20]Access Control[/size][/b]
-Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across the $Projectname. This is like having one super huge website made up of an army of small individual websites - and where each channel in the matrix can completely control their privacy and sharing preferences for any web resources they create.
+Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across $Projectname. This is like having one super huge website made up of an army of small individual websites - and where each channel in the grid can completely control their privacy and sharing preferences for any web resources they create.
-Currently, the matrix supports communications, photo albums, events, and files. This will be extended in the future to provide content management services (web pages) and cloud storage facilities, such as WebDAV and multi-media libraries. Every object and how it is shared and with whom is completely under your control.
+Currently, the grid supports communications, photo albums, events, and files. This will be extended in the future to provide content management services (web pages) and cloud storage facilities, such as WebDAV and multi-media libraries. Every object and how it is shared and with whom is completely under your control.
-This type of control is available on large corporate providers such as Facebook and Google, because they own the user database. Within the matrix, there is no need for a huge user databaseon your machine - because the matrix [i]is[/i] your user database. It has what is essentially infinite capacity (limited by the total number of hubs online across the internet), and is spread amongst hundreds, and potentially millions of computers.
+This type of control is available on large corporate providers such as Facebook and Google, because they own the user database. Within the grid, there is no need for a huge user databaseon your machine - because the grid [i]is[/i] your user database. It has what is essentially infinite capacity (limited by the total number of hubs online across the internet), and is spread amongst hundreds, and potentially millions of computers.
-Access can be granted or denied for any resource, to any channel, or any group of channels; anywhere within the matrix. Others can access your content if you permit them to do so, and they do not even need to have an account on your hub. Your private photos cannot be viewed, because permission really work; they are not an addon that was added as an afterthought. If you aren't on the list of allowed viewers for a particular photo, you aren't going to look at it.
+Access can be granted or denied for any resource, to any channel, or any group of channels; anywhere within the grid. Others can access your content if you permit them to do so, and they do not even need to have an account on your hub. Your private photos cannot be viewed, because permission really work; they are not an addon that was added as an afterthought. If you aren't on the list of allowed viewers for a particular photo, you aren't going to look at it.
[b][size=18]Additional Resources and Links[/size][/b]
diff --git a/images/default_profile_photos/arrow_avatar/300.png b/images/default_profile_photos/arrow_avatar/300.png
index a13221ceb..2ea9afa2b 100644
--- a/images/default_profile_photos/arrow_avatar/300.png
+++ b/images/default_profile_photos/arrow_avatar/300.png
Binary files differ
diff --git a/images/default_profile_photos/arrow_avatar/48.png b/images/default_profile_photos/arrow_avatar/48.png
index aaa86c152..2fa859dbb 100644
--- a/images/default_profile_photos/arrow_avatar/48.png
+++ b/images/default_profile_photos/arrow_avatar/48.png
Binary files differ
diff --git a/images/default_profile_photos/arrow_avatar/80.png b/images/default_profile_photos/arrow_avatar/80.png
index cf48c584a..015fc7ebb 100644
--- a/images/default_profile_photos/arrow_avatar/80.png
+++ b/images/default_profile_photos/arrow_avatar/80.png
Binary files differ
diff --git a/images/default_profile_photos/black_avatar_1/300.png b/images/default_profile_photos/black_avatar_1/300.png
index 0ed1fe763..00323ae50 100644
--- a/images/default_profile_photos/black_avatar_1/300.png
+++ b/images/default_profile_photos/black_avatar_1/300.png
Binary files differ
diff --git a/images/default_profile_photos/black_avatar_1/48.png b/images/default_profile_photos/black_avatar_1/48.png
index 7c7ed4504..89def2594 100644
--- a/images/default_profile_photos/black_avatar_1/48.png
+++ b/images/default_profile_photos/black_avatar_1/48.png
Binary files differ
diff --git a/images/default_profile_photos/black_avatar_1/80.png b/images/default_profile_photos/black_avatar_1/80.png
index 21108b008..ae41d20ef 100644
--- a/images/default_profile_photos/black_avatar_1/80.png
+++ b/images/default_profile_photos/black_avatar_1/80.png
Binary files differ
diff --git a/images/default_profile_photos/black_avatar_2/300.png b/images/default_profile_photos/black_avatar_2/300.png
index c86490d7c..57f729ea5 100644
--- a/images/default_profile_photos/black_avatar_2/300.png
+++ b/images/default_profile_photos/black_avatar_2/300.png
Binary files differ
diff --git a/images/default_profile_photos/black_avatar_2/48.png b/images/default_profile_photos/black_avatar_2/48.png
index e7c37b741..07a52c48c 100644
--- a/images/default_profile_photos/black_avatar_2/48.png
+++ b/images/default_profile_photos/black_avatar_2/48.png
Binary files differ
diff --git a/images/default_profile_photos/black_avatar_2/80.png b/images/default_profile_photos/black_avatar_2/80.png
index 9a4843562..f55e7ebec 100644
--- a/images/default_profile_photos/black_avatar_2/80.png
+++ b/images/default_profile_photos/black_avatar_2/80.png
Binary files differ
diff --git a/images/default_profile_photos/red_avatar/300.png b/images/default_profile_photos/red_avatar/300.png
index 9188aa08c..209287123 100644
--- a/images/default_profile_photos/red_avatar/300.png
+++ b/images/default_profile_photos/red_avatar/300.png
Binary files differ
diff --git a/images/default_profile_photos/red_avatar/48.png b/images/default_profile_photos/red_avatar/48.png
index cf42b51fa..05c5561a2 100644
--- a/images/default_profile_photos/red_avatar/48.png
+++ b/images/default_profile_photos/red_avatar/48.png
Binary files differ
diff --git a/images/default_profile_photos/red_avatar/80.png b/images/default_profile_photos/red_avatar/80.png
index 850c59938..19bede48f 100644
--- a/images/default_profile_photos/red_avatar/80.png
+++ b/images/default_profile_photos/red_avatar/80.png
Binary files differ
diff --git a/images/hz-16.png b/images/hz-16.png
index b88b6aa57..fd234733e 100644
--- a/images/hz-16.png
+++ b/images/hz-16.png
Binary files differ
diff --git a/images/hz-32.png b/images/hz-32.png
index 79c728a83..54dc7cca3 100644
--- a/images/hz-32.png
+++ b/images/hz-32.png
Binary files differ
diff --git a/images/hz-64.png b/images/hz-64.png
index bff03d8da..a09479db2 100644
--- a/images/hz-64.png
+++ b/images/hz-64.png
Binary files differ
diff --git a/include/attach.php b/include/attach.php
index 513486bfc..39fdb5c3a 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -1132,7 +1132,7 @@ function attach_mkdirp($channel, $observer_hash, $arr = null) {
*/
function attach_change_permissions($channel_id, $resource, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $recurse = false) {
- $r = q("select hash, flags, is_dir from attach where hash = '%s' and uid = %d limit 1",
+ $r = q("select hash, flags, is_dir, is_photo from attach where hash = '%s' and uid = %d limit 1",
dbesc($resource),
intval($channel_id)
);
@@ -1162,6 +1162,16 @@ function attach_change_permissions($channel_id, $resource, $allow_cid, $allow_gi
dbesc($resource),
intval($channel_id)
);
+ if($r[0]['is_photo']) {
+ $x = q("update photo set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where resource_id = '%s' and uid = %d",
+ dbesc($allow_cid),
+ dbesc($allow_gid),
+ dbesc($deny_cid),
+ dbesc($deny_gid),
+ dbesc($resource),
+ intval($channel_id)
+ );
+ }
}
/**
diff --git a/include/bbcode.php b/include/bbcode.php
index 66bf6b5ec..db5824237 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -437,7 +437,7 @@ function bb_observer($Text) {
// BBcode 2 HTML was written by WAY2WEB.net
- // extended to work with Mistpark/Friendica/Red - Mike Macgirvin
+ // extended to work with Mistpark/Friendica/Redmatrix/Hubzilla - Mike Macgirvin
function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false) {
diff --git a/include/checksites.php b/include/checksites.php
new file mode 100644
index 000000000..e14837255
--- /dev/null
+++ b/include/checksites.php
@@ -0,0 +1,61 @@
+<?php /** @file */
+
+require_once('boot.php');
+require_once('include/cli_startup.php');
+require_once('include/zot.php');
+require_once('include/hubloc.php');
+
+
+
+function checksites_run($argv, $argc){
+
+
+ cli_startup();
+ $a = get_app();
+
+ logger('checksites: start');
+
+ if(($argc > 1) && ($argv[1]))
+ $site_id = $argv[1];
+
+ if($site_id)
+ $sql_options = " and site_url = '" . dbesc($argv[1]) . "' ";
+
+ $days = intval(get_config('system','sitecheckdays'));
+ if($days < 1)
+ $days = 30;
+
+ $r = q("select * from site where site_dead = 0 and site_update < %s - INTERVAL %s $sql_options ",
+ db_utcnow(), db_quoteinterval($days . ' DAY')
+ );
+
+ if(! $r)
+ return;
+
+ foreach($r as $rr) {
+ if(! strcasecmp($rr['site_url'],z_root()))
+ continue;
+
+ $x = ping_site($rr['site_url']);
+ if($x['success']) {
+ logger('checksites: ' . $rr['site_url']);
+ q("update site set site_update = '%s' where site_url = '%s' ",
+ dbesc(datetime_convert()),
+ dbesc($rr['site_url'])
+ );
+ }
+ else {
+ logger('marking dead site: ' . $x['message']);
+ q("update site set site_dead = 1 where site_url = '%s' ",
+ dbesc($rr['site_url'])
+ );
+ }
+ }
+
+ return;
+}
+
+if (array_search(__file__,get_included_files())===0){
+ checksites_run($argv,$argc);
+ killme();
+}
diff --git a/include/conversation.php b/include/conversation.php
index fb8ef8585..0f6f8685b 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -943,9 +943,9 @@ function item_photo_menu($item){
t("View Status") => $status_link,
t("View Profile") => $profile_link,
t("View Photos") => $photos_link,
- t("Matrix Activity") => $posts_link,
+ t("Activity/Posts") => $posts_link,
t("Connect") => $follow_url,
- t("Edit Contact") => $contact_url,
+ t("Edit Connection") => $contact_url,
t("Send PM") => $pm_url,
t("Poke") => $poke_link
);
diff --git a/include/deliver.php b/include/deliver.php
index 5ab44a620..26739fb06 100644
--- a/include/deliver.php
+++ b/include/deliver.php
@@ -92,12 +92,12 @@ function deliver_run($argv, $argc) {
$m = json_decode($r[0]['outq_msg'],true);
if(array_key_exists('message_list',$m)) {
foreach($m['message_list'] as $mm) {
- $msg = array('body' => json_encode(array('pickup' => array(array('notify' => $notify,'message' => $mm)))));
+ $msg = array('body' => json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify,'message' => $mm)))));
zot_import($msg,z_root());
}
}
else {
- $msg = array('body' => json_encode(array('pickup' => array(array('notify' => $notify,'message' => $m)))));
+ $msg = array('body' => json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify,'message' => $m)))));
zot_import($msg,z_root());
}
$r = q("delete from outq where outq_hash = '%s'",
diff --git a/include/hubloc.php b/include/hubloc.php
index 396f4ddfa..674a3885f 100644
--- a/include/hubloc.php
+++ b/include/hubloc.php
@@ -275,4 +275,34 @@ function xchan_fetch($arr) {
$ret[str_replace('xchan_','',$k)] = $v;
}
return $ret;
-} \ No newline at end of file
+}
+
+
+
+function ping_site($url) {
+
+ $ret = array('success' => false);
+
+ $sys = get_sys_channel();
+
+ $m = zot_build_packet($sys,'ping');
+ $r = zot_zot($url . '/post',$m);
+ if(! $r['success']) {
+ $ret['message'] = 'no answer from ' . $url;
+ return $ret;
+ }
+ $packet_result = json_decode($r['body'],true);
+ if(! $packet_result['success']) {
+ $ret['message'] = 'packet failure from ' . $url;
+ return $ret;
+ }
+
+ if($packet_result['success']) {
+ $ret['success'] = true;
+ }
+ else {
+ $ret['message'] = 'unknown error from ' . $url;
+ }
+
+ return $ret;
+}
diff --git a/include/items.php b/include/items.php
index 28fd8502b..657168601 100755
--- a/include/items.php
+++ b/include/items.php
@@ -3441,6 +3441,8 @@ function post_is_importable($item,$abook) {
if($exclude) {
foreach($exclude as $word) {
$word = trim($word);
+ if(! $word)
+ continue;
if(substr($word,0,1) === '#' && $tags) {
foreach($tags as $t)
if(($t['type'] == TERM_HASHTAG) && (($t['term'] === substr($word,1)) || (substr($word,1) === '*')))
@@ -3460,6 +3462,8 @@ function post_is_importable($item,$abook) {
if($include) {
foreach($include as $word) {
$word = trim($word);
+ if(! $word)
+ continue;
if(substr($word,0,1) === '#' && $tags) {
foreach($tags as $t)
if(($t['type'] == TERM_HASHTAG) && (($t['term'] === substr($word,1)) || (substr($word,1) === '*')))
diff --git a/include/nav.php b/include/nav.php
index 898805bba..59a7c83a3 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -172,8 +172,8 @@ EOT;
if(local_channel()) {
- $nav['network'] = array('network', t('Matrix'), "", t('Your matrix'),'network_nav_btn');
- $nav['network']['mark'] = array('', t('Mark all matrix notifications seen'), '','');
+ $nav['network'] = array('network', t('Grid'), "", t('Your grid'),'network_nav_btn');
+ $nav['network']['mark'] = array('', t('Mark all grid notifications seen'), '','');
$nav['home'] = array('channel/' . $channel['channel_address'], t('Channel Home'), "", t('Channel home'),'home_nav_btn');
$nav['home']['mark'] = array('', t('Mark all channel notifications seen'), '','');
diff --git a/include/network.php b/include/network.php
index d3320f3ee..41e1ff37c 100644
--- a/include/network.php
+++ b/include/network.php
@@ -1053,16 +1053,20 @@ function discover_by_webbie($webbie) {
$webbie = strtolower($webbie);
- $x = webfinger_rfc7033($webbie);
+ $x = webfinger_rfc7033($webbie,true);
if($x && array_key_exists('links',$x) && $x['links']) {
foreach($x['links'] as $link) {
if(array_key_exists('rel',$link) && $link['rel'] == 'http://purl.org/zot/protocol') {
logger('discover_by_webbie: zot found for ' . $webbie, LOGGER_DEBUG);
- $z = z_fetch_url($link['href']);
- if($z['success']) {
- $j = json_decode($z['body'],true);
- $i = import_xchan($j);
- return true;
+ if(array_key_exists('zot',$x) && $x['zot']['success'])
+ $i = import_xchan($x['zot']);
+ else {
+ $z = z_fetch_url($link['href']);
+ if($z['success']) {
+ $j = json_decode($z['body'],true);
+ $i = import_xchan($j);
+ return true;
+ }
}
}
}
@@ -1282,7 +1286,7 @@ LSIeXnd14lQYK/uxW/8cTFjcmddsKxeXysoQxbSa9VdDK+KkpZdgYXYrTTofXs6v+
}
-function webfinger_rfc7033($webbie) {
+function webfinger_rfc7033($webbie,$zot = false) {
if(! strpos($webbie,'@'))
@@ -1292,7 +1296,7 @@ function webfinger_rfc7033($webbie) {
$resource = 'acct:' . $webbie;
- $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?resource=' . $resource);
+ $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=1' : ''));
if($s['success'])
$j = json_decode($s['body'],true);
diff --git a/include/notifier.php b/include/notifier.php
index 62aea4106..e16f80ecf 100644
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -486,20 +486,6 @@ function notifier_run($argv, $argc){
if($details) {
foreach($details as $d) {
- // If the recipient is federated from a traditional network they won't be able to
- // handle nomadic identity. If we're publishing from a site that they aren't
- // directly connected with, ignore them.
-
- // FIXME: make sure we run through a notifier loop on the hub they're connected
- // with if this post comes in from a different hub - so that we will deliver to them.
-
- // On the down side, these channels will stop working if the hub they connected with
- // goes down permanently, as they are (doh) not nomadic.
-
- if(($d['xchan_instance_url']) && ($d['xchan_instance_url'] != z_root()))
- continue;
-
-
$recip_list[] = $d['xchan_addr'] . ' (' . $d['xchan_hash'] . ')';
if($private)
$env_recips[] = array('guid' => $d['xchan_guid'],'guid_sig' => $d['xchan_guid_sig'],'hash' => $d['xchan_hash']);
@@ -526,31 +512,10 @@ function notifier_run($argv, $argc){
// Now we have collected recipients (except for external mentions, FIXME)
// Let's reduce this to a set of hubs.
- logger('notifier: hub choice: ' . intval($relay_to_owner) . ' ' . intval($private) . ' ' . $cmd, LOGGER_DEBUG);
-
- // FIXME: I think we need to remove the private bit or this clause will never execute. Needs more coffee to think it through.
- // We may in fact have to send it to clones in case the one we pick recently died.
-
- if($relay_to_owner && (! $private) && ($cmd !== 'relay')) {
-
- // If sending a followup to the post owner, only send it to one channel clone - to avoid race conditions.
- // In this case we'll pick the most recently contacted hub, as their primary might be down and the most
- // recently contacted has the best chance of being alive.
-
- // For private posts or uplinks we have to do things differently as only the sending clone will have the recipient list.
- // We have to send to all clone channels of the owner to find out who has the definitive list. Posts with
- // item_private set (but no ACL list) will return empty recipients (except for the sender and owner) in
- // collect_recipients() above. The end result is we should get only one delivery per delivery chain if we
- // aren't the owner or author.
-
-
- $r = q("select * from hubloc
- where hubloc_hash in (" . implode(',',$recipients) . ") order by hubloc_connected desc limit 1");
- }
- else {
- $r = q("select * from hubloc where hubloc_hash in (" . implode(',',$recipients) . ")
- and hubloc_error = 0 and hubloc_deleted = 0");
- }
+ $r = q("select * from hubloc where hubloc_hash in (" . implode(',',$recipients) . ")
+ and hubloc_error = 0 and hubloc_deleted = 0"
+ );
+
if(! $r) {
logger('notifier: no hubs');
@@ -559,6 +524,15 @@ function notifier_run($argv, $argc){
$hubs = $r;
+ $dead_hubs = array();
+
+ $dh = q("select site_url from site where site_dead = 1");
+ if(dh) {
+ foreach($dh as $dead) {
+ $dead_hubs[] = $dead['site_url'];
+ }
+ }
+
/**
* Reduce the hubs to those that are unique. For zot hubs, we need to verify uniqueness by the sitekey, since it may have been
@@ -574,6 +548,11 @@ function notifier_run($argv, $argc){
foreach($hubs as $hub) {
+ if(in_array($hub['hubloc_url'],$dead_hubs)) {
+ logger('skipping dead hub: ' . $hub['hubloc_url'], LOGGER_DEBUG);
+ continue;
+ }
+
if($hub['hubloc_network'] == 'zot') {
if(! in_array($hub['hubloc_sitekey'],$keys)) {
$hublist[] = $hub['hubloc_host'];
diff --git a/include/poller.php b/include/poller.php
index a1b25bf41..72f22d946 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -175,7 +175,10 @@ function poller_run($argv, $argc){
logger('regdir: ' . print_r(z_fetch_url(get_directory_primary() . '/regdir?f=&url=' . urlencode(z_root()) . '&realm=' . urlencode(get_directory_realm())),true));
}
+ // Check for dead sites
+ proc_run('php', 'include/checksites.php');
+ // update searchable doc indexes
proc_run('php', 'include/importdoc.php');
/**
diff --git a/include/zot.php b/include/zot.php
index 0e00f39b4..ebdcb4cfb 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -537,7 +537,7 @@ function zot_refresh($them, $channel = null, $force = false) {
* @returns array|null null if site is blacklisted or not found, otherwise an
* array with an hubloc record
*/
-function zot_gethub($arr) {
+function zot_gethub($arr,$multiple = false) {
if($arr['guid'] && $arr['guid_sig'] && $arr['url'] && $arr['url_sig']) {
@@ -556,18 +556,20 @@ function zot_gethub($arr) {
return null;
}
+ $limit = (($multiple) ? '' : ' limit 1 ');
+
$r = q("select * from hubloc
where hubloc_guid = '%s' and hubloc_guid_sig = '%s'
and hubloc_url = '%s' and hubloc_url_sig = '%s'
- limit 1",
+ $limit",
dbesc($arr['guid']),
dbesc($arr['guid_sig']),
dbesc($arr['url']),
dbesc($arr['url_sig'])
);
- if($r && count($r)) {
+ if($r) {
logger('zot_gethub: found', LOGGER_DEBUG);
- return $r[0];
+ return (($multiple) ? $r : $r[0]);
}
}
logger('zot_gethub: not found: ' . print_r($arr,true), LOGGER_DEBUG);
@@ -951,7 +953,7 @@ function zot_process_response($hub, $arr, $outq) {
// update the timestamp for this site
- q("update site set site_update = '%s' where site_url = '%s'",
+ q("update site set site_dead = 0, site_update = '%s' where site_url = '%s'",
dbesc(datetime_convert()),
dbesc(dirname($hub))
);
@@ -996,27 +998,38 @@ function zot_fetch($arr) {
$url = $arr['sender']['url'] . $arr['callback'];
- $ret_hub = zot_gethub($arr['sender']);
- if(! $ret_hub) {
+ // set $multiple param on zot_gethub() to return all matching hubs
+ // This allows us to recover from re-installs when a redundant (but invalid) hubloc for
+ // this identity is widely dispersed throughout the network.
+
+ $ret_hubs = zot_gethub($arr['sender'],true);
+ if(! $ret_hubs) {
logger('zot_fetch: no hub: ' . print_r($arr['sender'],true));
return;
}
- $data = array(
- 'type' => 'pickup',
- 'url' => z_root(),
- 'callback_sig' => base64url_encode(rsa_sign(z_root() . '/post',get_config('system','prvkey'))),
- 'callback' => z_root() . '/post',
- 'secret' => $arr['secret'],
- 'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey')))
- );
+ foreach($ret_hubs as $ret_hub) {
+ $data = array(
+ 'type' => 'pickup',
+ 'url' => z_root(),
+ 'callback_sig' => base64url_encode(rsa_sign(z_root() . '/post',get_config('system','prvkey'))),
+ 'callback' => z_root() . '/post',
+ 'secret' => $arr['secret'],
+ 'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey')))
+ );
- $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey']));
+ $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey']));
- $fetch = zot_zot($url,$datatosend);
- $result = zot_import($fetch, $arr['sender']['url']);
+ $fetch = zot_zot($url,$datatosend);
+
+ $result = zot_import($fetch, $arr['sender']['url']);
+
+ if($result)
+ return $result;
+ }
+
+ return;
- return $result;
}
/**
@@ -1055,6 +1068,12 @@ function zot_import($arr, $sender_url) {
$data = json_decode(crypto_unencapsulate($data,get_config('system','prvkey')),true);
}
+ if(! $data['success']) {
+ if($data['message'])
+ logger('remote pickup failed: ' . $data['message']);
+ return false;
+ }
+
$incoming = $data['pickup'];
$return = array();
@@ -2663,7 +2682,7 @@ function import_site($arr, $pubkey) {
// logger('import_site: input: ' . print_r($arr,true));
// logger('import_site: stored: ' . print_r($siterecord,true));
- $r = q("update site set site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s', site_realm = '%s'
+ $r = q("update site set site_dead = 0, site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s', site_realm = '%s'
where site_url = '%s'",
dbesc($site_location),
intval($site_directory),
@@ -2681,7 +2700,7 @@ function import_site($arr, $pubkey) {
}
else {
// update the timestamp to indicate we communicated with this site
- q("update site set site_update = '%s' where site_url = '%s'",
+ q("update site set site_dead = 0, site_update = '%s' where site_url = '%s'",
dbesc(datetime_convert()),
dbesc($url)
);
@@ -3385,3 +3404,291 @@ function zot_process_message_request($data) {
return $ret;
}
+
+
+function zotinfo($arr) {
+
+ $ret = array('success' => false);
+
+ $zhash = ((x($arr,'guid_hash')) ? $arr['guid_hash'] : '');
+ $zguid = ((x($arr,'guid')) ? $arr['guid'] : '');
+ $zguid_sig = ((x($arr,'guid_sig')) ? $arr['guid_sig'] : '');
+ $zaddr = ((x($arr,'address')) ? $arr['address'] : '');
+ $ztarget = ((x($arr,'target')) ? $arr['target'] : '');
+ $zsig = ((x($arr,'target_sig')) ? $arr['target_sig'] : '');
+ $zkey = ((x($arr,'key')) ? $arr['key'] : '');
+ $mindate = ((x($arr,'mindate')) ? $arr['mindate'] : '');
+ $feed = ((x($arr,'feed')) ? intval($arr['feed']) : 0);
+
+ if($ztarget) {
+ if((! $zkey) || (! $zsig) || (! rsa_verify($ztarget,base64url_decode($zsig),$zkey))) {
+ logger('zfinger: invalid target signature');
+ $ret['message'] = t("invalid target signature");
+ return($ret);
+ }
+ }
+
+ $r = null;
+
+ if(strlen($zhash)) {
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where channel_hash = '%s' limit 1",
+ dbesc($zhash)
+ );
+ }
+ elseif(strlen($zguid) && strlen($zguid_sig)) {
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where channel_guid = '%s' and channel_guid_sig = '%s' limit 1",
+ dbesc($zguid),
+ dbesc($zguid_sig)
+ );
+ }
+ elseif(strlen($zaddr)) {
+ if(strpos($zaddr,'[system]') === false) { /* normal address lookup */
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where ( channel_address = '%s' or xchan_addr = '%s' ) limit 1",
+ dbesc($zaddr),
+ dbesc($zaddr)
+ );
+ }
+
+ else {
+
+ /**
+ * The special address '[system]' will return a system channel if one has been defined,
+ * Or the first valid channel we find if there are no system channels.
+ *
+ * This is used by magic-auth if we have no prior communications with this site - and
+ * returns an identity on this site which we can use to create a valid hub record so that
+ * we can exchange signed messages. The precise identity is irrelevant. It's the hub
+ * information that we really need at the other end - and this will return it.
+ *
+ */
+
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where channel_system = 1 order by channel_id limit 1");
+ if(! $r) {
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where channel_removed = 0 order by channel_id limit 1");
+ }
+ }
+ }
+ else {
+ $ret['message'] = 'Invalid request';
+ return($ret);
+ }
+
+ if(! $r) {
+ $ret['message'] = 'Item not found.';
+ return($ret);
+ }
+
+ $e = $r[0];
+
+ $id = $e['channel_id'];
+
+ $sys_channel = (intval($e['channel_system']) ? true : false);
+ $special_channel = (($e['channel_pageflags'] & PAGE_PREMIUM) ? true : false);
+ $adult_channel = (($e['channel_pageflags'] & PAGE_ADULT) ? true : false);
+ $censored = (($e['channel_pageflags'] & PAGE_CENSORED) ? true : false);
+ $searchable = (($e['channel_pageflags'] & PAGE_HIDDEN) ? false : true);
+ $deleted = (intval($e['xchan_deleted']) ? true : false);
+
+ if($deleted || $censored || $sys_channel)
+ $searchable = false;
+
+ $public_forum = false;
+
+ $role = get_pconfig($e['channel_id'],'system','permissions_role');
+ if($role === 'forum' || $role === 'repository') {
+ $public_forum = true;
+ }
+ else {
+ // check if it has characteristics of a public forum based on custom permissions.
+ $t = q("select abook_my_perms from abook where abook_channel = %d and abook_self = 1 limit 1",
+ intval($e['channel_id'])
+ );
+ if(($t) && (($t[0]['abook_my_perms'] & PERMS_W_TAGWALL) && (! ($t[0]['abook_my_perms'] & PERMS_W_STREAM))))
+ $public_forum = true;
+ }
+
+
+ // This is for birthdays and keywords, but must check access permissions
+ $p = q("select * from profile where uid = %d and is_default = 1",
+ intval($e['channel_id'])
+ );
+
+ $profile = array();
+
+ if($p) {
+
+ if(! intval($p[0]['publish']))
+ $searchable = false;
+
+ $profile['description'] = $p[0]['pdesc'];
+ $profile['birthday'] = $p[0]['dob'];
+ if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],$e['channel_timezone'])) !== ''))
+ $profile['next_birthday'] = $bd;
+
+ if($age = age($p[0]['dob'],$e['channel_timezone'],''))
+ $profile['age'] = $age;
+ $profile['gender'] = $p[0]['gender'];
+ $profile['marital'] = $p[0]['marital'];
+ $profile['sexual'] = $p[0]['sexual'];
+ $profile['locale'] = $p[0]['locality'];
+ $profile['region'] = $p[0]['region'];
+ $profile['postcode'] = $p[0]['postal_code'];
+ $profile['country'] = $p[0]['country_name'];
+ $profile['about'] = $p[0]['about'];
+ $profile['homepage'] = $p[0]['homepage'];
+ $profile['hometown'] = $p[0]['hometown'];
+
+ if($p[0]['keywords']) {
+ $tags = array();
+ $k = explode(' ',$p[0]['keywords']);
+ if($k) {
+ foreach($k as $kk) {
+ if(trim($kk," \t\n\r\0\x0B,")) {
+ $tags[] = trim($kk," \t\n\r\0\x0B,");
+ }
+ }
+ }
+ if($tags)
+ $profile['keywords'] = $tags;
+ }
+ }
+
+ $ret['success'] = true;
+
+ // Communication details
+
+ $ret['guid'] = $e['xchan_guid'];
+ $ret['guid_sig'] = $e['xchan_guid_sig'];
+ $ret['key'] = $e['xchan_pubkey'];
+ $ret['name'] = $e['xchan_name'];
+ $ret['name_updated'] = $e['xchan_name_date'];
+ $ret['address'] = $e['xchan_addr'];
+ $ret['photo_mimetype'] = $e['xchan_photo_mimetype'];
+ $ret['photo'] = $e['xchan_photo_l'];
+ $ret['photo_updated'] = $e['xchan_photo_date'];
+ $ret['url'] = $e['xchan_url'];
+ $ret['connections_url']= (($e['xchan_connurl']) ? $e['xchan_connurl'] : z_root() . '/poco/' . $e['channel_address']);
+ $ret['target'] = $ztarget;
+ $ret['target_sig'] = $zsig;
+ $ret['searchable'] = $searchable;
+ $ret['adult_content'] = $adult_channel;
+ $ret['public_forum'] = $public_forum;
+ if($deleted)
+ $ret['deleted'] = $deleted;
+
+ // premium or other channel desiring some contact with potential followers before connecting.
+ // This is a template - %s will be replaced with the follow_url we discover for the return channel.
+
+ if($special_channel)
+ $ret['connect_url'] = z_root() . '/connect/' . $e['channel_address'];
+
+ // This is a template for our follow url, %s will be replaced with a webbie
+
+ $ret['follow_url'] = z_root() . '/follow?f=&url=%s';
+
+ $ztarget_hash = (($ztarget && $zsig)
+ ? make_xchan_hash($ztarget,$zsig)
+ : '' );
+
+ $permissions = get_all_perms($e['channel_id'],$ztarget_hash,false);
+
+ if($ztarget_hash) {
+ $permissions['connected'] = false;
+ $b = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc($ztarget_hash),
+ intval($e['channel_id'])
+ );
+ if($b)
+ $permissions['connected'] = true;
+ }
+
+ $ret['permissions'] = (($ztarget && $zkey) ? crypto_encapsulate(json_encode($permissions),$zkey) : $permissions);
+
+ if($permissions['view_profile'])
+ $ret['profile'] = $profile;
+
+ // array of (verified) hubs this channel uses
+
+ $x = zot_encode_locations($e);
+ if($x)
+ $ret['locations'] = $x;
+
+ $ret['site'] = array();
+ $ret['site']['url'] = z_root();
+ $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),$e['channel_prvkey']));
+
+ $dirmode = get_config('system','directory_mode');
+ if(($dirmode === false) || ($dirmode == DIRECTORY_MODE_NORMAL))
+ $ret['site']['directory_mode'] = 'normal';
+
+ if($dirmode == DIRECTORY_MODE_PRIMARY)
+ $ret['site']['directory_mode'] = 'primary';
+ elseif($dirmode == DIRECTORY_MODE_SECONDARY)
+ $ret['site']['directory_mode'] = 'secondary';
+ elseif($dirmode == DIRECTORY_MODE_STANDALONE)
+ $ret['site']['directory_mode'] = 'standalone';
+ if($dirmode != DIRECTORY_MODE_NORMAL)
+ $ret['site']['directory_url'] = z_root() . '/dirsearch';
+
+
+ // hide detailed site information if you're off the grid
+
+ if($dirmode != DIRECTORY_MODE_STANDALONE) {
+
+ $register_policy = intval(get_config('system','register_policy'));
+
+ if($register_policy == REGISTER_CLOSED)
+ $ret['site']['register_policy'] = 'closed';
+ if($register_policy == REGISTER_APPROVE)
+ $ret['site']['register_policy'] = 'approve';
+ if($register_policy == REGISTER_OPEN)
+ $ret['site']['register_policy'] = 'open';
+
+
+ $access_policy = intval(get_config('system','access_policy'));
+
+ if($access_policy == ACCESS_PRIVATE)
+ $ret['site']['access_policy'] = 'private';
+ if($access_policy == ACCESS_PAID)
+ $ret['site']['access_policy'] = 'paid';
+ if($access_policy == ACCESS_FREE)
+ $ret['site']['access_policy'] = 'free';
+ if($access_policy == ACCESS_TIERED)
+ $ret['site']['access_policy'] = 'tiered';
+
+ $ret['site']['accounts'] = account_total();
+
+ require_once('include/identity.php');
+ $ret['site']['channels'] = channel_total();
+
+
+ $ret['site']['version'] = PLATFORM_NAME . ' ' . RED_VERSION . '[' . DB_UPDATE_VERSION . ']';
+
+ $ret['site']['admin'] = get_config('system','admin_email');
+
+ $a = get_app();
+
+ $visible_plugins = array();
+ if(is_array($a->plugins) && count($a->plugins)) {
+ $r = q("select * from addon where hidden = 0");
+ if($r)
+ foreach($r as $rr)
+ $visible_plugins[] = $rr['name'];
+ }
+
+ $ret['site']['plugins'] = $visible_plugins;
+ $ret['site']['sitehash'] = get_config('system','location_hash');
+ $ret['site']['sitename'] = get_config('system','sitename');
+ $ret['site']['sellpage'] = get_config('system','sellpage');
+ $ret['site']['location'] = get_config('system','site_location');
+ $ret['site']['realm'] = get_directory_realm();
+
+ }
+ call_hooks('zot_finger',$ret);
+ return($ret);
+} \ No newline at end of file
diff --git a/mod/hostxrd.php b/mod/hostxrd.php
index ef86f2dd9..0e18c133b 100644
--- a/mod/hostxrd.php
+++ b/mod/hostxrd.php
@@ -2,7 +2,8 @@
function hostxrd_init(&$a) {
header('Access-Control-Allow-Origin: *');
- header("Content-type: text/xml");
+ header("Content-type: application/xrd+xml");
+ logger('hostxrd',LOGGER_DEBUG);
$tpl = get_markup_template('xrd_host.tpl');
$x = replace_macros(get_markup_template('xrd_host.tpl'), array(
diff --git a/mod/invite.php b/mod/invite.php
index 1fdfbacc6..46fa7b413 100644
--- a/mod/invite.php
+++ b/mod/invite.php
@@ -73,7 +73,7 @@ function invite_post(&$a) {
$account = $a->get_account();
- $res = mail($recip, sprintf( t('Please join us on Red'), $a->config['sitename']),
+ $res = mail($recip, sprintf( t('Please join us on $Projectname'), $a->config['sitename']),
$nmessage,
"From: " . $account['account_email'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
diff --git a/mod/mail.php b/mod/mail.php
index 152db3231..80d7f477d 100644
--- a/mod/mail.php
+++ b/mod/mail.php
@@ -125,8 +125,7 @@ function mail_content(&$a) {
$tpl = get_markup_template('mail_head.tpl');
$header = replace_macros($tpl, array(
- '$messages' => t('Messages'),
- '$tab_content' => $tab_content
+ '$header' => t('Messages'),
));
if((argc() == 3) && (argv(1) === 'drop')) {
@@ -160,8 +159,6 @@ function mail_content(&$a) {
if((argc() > 1) && (argv(1) === 'new')) {
- $o .= $header;
-
$plaintext = true;
$tpl = get_markup_template('msg-header.tpl');
diff --git a/mod/message.php b/mod/message.php
index 9cf4b6987..9f62f6b61 100644
--- a/mod/message.php
+++ b/mod/message.php
@@ -25,11 +25,7 @@ function message_content(&$a) {
$cipher = 'aes256';
- $tpl = get_markup_template('mail_head.tpl');
- $header = replace_macros($tpl, array(
- '$messages' => t('Messages'),
- '$tab_content' => $tab_content
- ));
+
if((argc() == 3) && (argv(1) === 'dropconv')) {
if(! intval(argv(2)))
@@ -42,9 +38,6 @@ function message_content(&$a) {
}
if(argc() == 1) {
- // list messages
-
- $o .= $header;
// private_messages_list() can do other more complicated stuff, for now keep it simple
@@ -55,24 +48,33 @@ function message_content(&$a) {
return $o;
}
- $tpl = get_markup_template('mail_list.tpl');
+ $messages = array();
+
foreach($r as $rr) {
-
- $o .= replace_macros($tpl, array(
- '$id' => $rr['id'],
- '$from_name' => $rr['from']['xchan_name'],
- '$from_url' => chanlink_hash($rr['from_xchan']),
- '$from_photo' => $rr['from']['xchan_photo_s'],
- '$to_name' => $rr['to']['xchan_name'],
- '$to_url' => chanlink_hash($rr['to_xchan']),
- '$to_photo' => $rr['to']['xchan_photo_s'],
- '$subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
- '$delete' => t('Delete conversation'),
- '$body' => smilies(bbcode($rr['body'])),
- '$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')),
- '$seen' => $rr['seen']
- ));
+ $messages[] = array(
+ 'id' => $rr['id'],
+ 'from_name' => $rr['from']['xchan_name'],
+ 'from_url' => chanlink_hash($rr['from_xchan']),
+ 'from_photo' => $rr['from']['xchan_photo_s'],
+ 'to_name' => $rr['to']['xchan_name'],
+ 'to_url' => chanlink_hash($rr['to_xchan']),
+ 'to_photo' => $rr['to']['xchan_photo_s'],
+ 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
+ 'delete' => t('Delete conversation'),
+ 'body' => smilies(bbcode($rr['body'])),
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')),
+ 'seen' => $rr['seen']
+ );
}
+
+
+ $tpl = get_markup_template('mail_head.tpl');
+ $o = replace_macros($tpl, array(
+ '$header' => t('Messages'),
+ '$messages' => $messages
+ ));
+
+
$o .= alt_pager($a,count($r));
return $o;
}
diff --git a/mod/photos.php b/mod/photos.php
index f48603d71..cd293b39d 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -770,7 +770,7 @@ function photos_content(&$a) {
// fetch image, item containing image, then comments
- $ph = q("SELECT aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,`type`,height,width,`size`,scale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
+ $ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,`type`,height,width,`size`,scale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
$sql_extra ORDER BY `scale` ASC ",
intval($owner_uid),
dbesc($datum)
@@ -1147,7 +1147,7 @@ function photos_content(&$a) {
$photo_tpl = get_markup_template('photo_view.tpl');
$o .= replace_macros($photo_tpl, array(
- '$id' => $link_item['id'], //$ph[0]['id'],
+ '$id' => $ph[0]['id'],
'$album' => $album_e,
'$tools' => $tools,
'$lock' => $lockstate[1],
diff --git a/mod/profile_photo.php b/mod/profile_photo.php
index 7564a3f69..7067a9f76 100644
--- a/mod/profile_photo.php
+++ b/mod/profile_photo.php
@@ -92,12 +92,15 @@ function profile_photo_post(&$a) {
$is_default_profile = 1;
if($_REQUEST['profile']) {
- $r = q("select id, is_default from profile where id = %d and uid = %d limit 1",
+ $r = q("select id, profile_guid, is_default, gender from profile where id = %d and uid = %d limit 1",
intval($_REQUEST['profile']),
intval(local_channel())
);
- if(($r) && (! intval($r[0]['is_default'])))
- $is_default_profile = 0;
+ if($r) {
+ $profile = $r[0];
+ if(! intval($profile['is_default']))
+ $is_default_profile = 0;
+ }
}
@@ -167,6 +170,8 @@ function profile_photo_post(&$a) {
return;
}
+ $channel = $a->get_channel();
+
// If setting for the default profile, unset the profile photo flag from any other photos I own
if($is_default_profile) {
@@ -177,6 +182,9 @@ function profile_photo_post(&$a) {
dbesc($base_image['resource_id']),
intval(local_channel())
);
+
+ send_profile_photo_activity($channel,$base_image,$profile);
+
}
else {
$r = q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d",
@@ -190,7 +198,6 @@ function profile_photo_post(&$a) {
// We'll set the updated profile-photo timestamp even if it isn't the default profile,
// so that browsers will do a cache update unconditionally
- $channel = $a->get_channel();
$r = q("UPDATE xchan set xchan_photo_mimetype = '%s', xchan_photo_date = '%s'
where xchan_hash = '%s'",
@@ -206,7 +213,9 @@ function profile_photo_post(&$a) {
// Now copy profile-permissions to pictures, to prevent privacyleaks by automatically created folder 'Profile Pictures'
- profile_photo_set_profile_perms($_REQUEST['profile']);
+ profile_photo_set_profile_perms($_REQUEST['profile']);
+
+
}
else
@@ -262,6 +271,59 @@ function profile_photo_post(&$a) {
}
+function send_profile_photo_activity($channel,$photo,$profile) {
+
+ // for now only create activities for the default profile
+
+ if(! intval($profile['is_default']))
+ return;
+
+ $arr = array();
+ $arr['item_thread_top'] = 1;
+ $arr['item_origin'] = 1;
+ $arr['item_wall'] = 1;
+ $arr['obj_type'] = ACTIVITY_OBJ_PHOTO;
+ $arr['verb'] = ACTIVITY_UPDATE;
+
+ $arr['object'] = json_encode(array(
+ 'type' => $arr['obj_type'],
+ 'id' => z_root() . '/photo/profile/l/' . $channel['channel_id'],
+ 'link' => array('rel' => 'photo', 'type' => $photo['type'], 'href' => z_root() . '/photo/profile/l/' . $channel['channel_id'])
+ ));
+
+ if(stripos($profile['gender'],t('female')) !== false)
+ $t = t('%1$s updated her %2$s');
+ elseif(stripos($profile['gender'],t('male')) !== false)
+ $t = t('%1$s updated his %2$s');
+ else
+ $t = t('%1$s updated their %2$s');
+
+ $ptext = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']' . t('profile photo') . '[/zrl]';
+
+ $ltext = '[zrl=' . z_root() . '/profile/' . $channel['channel_address'] . ']' . '[zmg=150x150]' . z_root() . '/photo/' . $photo['resource_id'] . '-4[/zmg][/zrl]';
+
+ $arr['body'] = sprintf($t,$channel['channel_name'],$ptext) . "\n\n" . $ltext;
+
+ $acl = new AccessList($channel);
+ $x = $acl->get();
+ $arr['allow_cid'] = $x['allow_cid'];
+
+ $arr['allow_gid'] = $x['allow_gid'];
+ $arr['deny_cid'] = $x['deny_cid'];
+ $arr['deny_gid'] = $x['deny_gid'];
+
+ $arr['uid'] = $channel['channel_id'];
+ $arr['aid'] = $channel['channel_account_id'];
+
+ $arr['owner_xchan'] = $channel['channel_hash'];
+ $arr['author_xchan'] = $channel['channel_hash'];
+
+ post_activity_item($arr);
+
+
+}
+
+
/* @brief Generate content of profile-photo view
*
* @param $a Current application
diff --git a/mod/siteinfo.php b/mod/siteinfo.php
index 8281a7a0a..14aaef144 100644
--- a/mod/siteinfo.php
+++ b/mod/siteinfo.php
@@ -150,6 +150,9 @@ function siteinfo_content(&$a) {
if(file_exists('doc/site_donate.html'))
$donate .= file_get_contents('doc/site_donate.html');
+ if(function_exists('sys_getloadavg'))
+ $loadavg = sys_getloadavg();
+
$o = replace_macros(get_markup_template('siteinfo.tpl'), array(
'$title' => t('$Projectname'),
'$description' => t('This is a hub of $Projectname - a global cooperative network of decentralized privacy enhanced websites.'),
@@ -158,6 +161,8 @@ function siteinfo_content(&$a) {
'$tag' => $tag,
'$polled' => t('Last background fetch: '),
'$lastpoll' => get_poller_runtime(),
+ '$load_average' => t('Current load average: '),
+ '$loadavg_all' => $loadavg[0] . ', ' . $loadavg[1] . ', ' . $loadavg[2],
'$commit' => $commit,
'$web_location' => t('Running at web location') . ' ' . z_root(),
'$visit' => t('Please visit <a href="https://redmatrix.me">redmatrix.me</a> to learn more about $Projectname.'),
diff --git a/mod/thing.php b/mod/thing.php
index 03dc7db5b..280cc194d 100644
--- a/mod/thing.php
+++ b/mod/thing.php
@@ -234,9 +234,17 @@ function thing_init(&$a) {
function thing_content(&$a) {
+ // @FIXME one problem with things is we can't share them unless we provide the channel in the url
+ // so we can definitively lookup the owner.
+
if(argc() == 2) {
- $sql_extra = permissions_sql();
+ $r = q("select obj_channel from obj where obj_type = %d and obj_obj = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc(argv(1))
+ );
+ if($r)
+ $sql_extra = permissions_sql($r[0]['obj_channel']);
$r = q("select * from obj where obj_type = %d and obj_obj = '%s' $sql_extra limit 1",
intval(TERM_OBJ_THING),
diff --git a/mod/webfinger.php b/mod/webfinger.php
index a646961a8..74bfc3ce5 100644
--- a/mod/webfinger.php
+++ b/mod/webfinger.php
@@ -15,7 +15,7 @@ function webfinger_content(&$a) {
if(x($_GET,'addr')) {
$addr = trim($_GET['addr']);
if(strpos($addr,'@') !== false) {
- $res = webfinger_rfc7033($addr);
+ $res = webfinger_rfc7033($addr,true);
if(! $res)
$res = old_webfinger($addr);
}
diff --git a/mod/wfinger.php b/mod/wfinger.php
index 1493dd6ba..8b9abe4af 100644
--- a/mod/wfinger.php
+++ b/mod/wfinger.php
@@ -1,5 +1,7 @@
<?php
+require_once('include/zot.php');
+
function wfinger_init(&$a) {
$result = array();
@@ -11,15 +13,16 @@ function wfinger_init(&$a) {
elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
$scheme = 'https';
- // Don't complain to me - I'm just implementing the spec.
+ $zot = intval($_REQUEST['zot']);
- if($scheme !== 'https') {
+ if(($scheme !== 'https') && (! $zot)) {
header($_SERVER["SERVER_PROTOCOL"] . ' ' . 500 . ' ' . 'Webfinger requires HTTPS');
killme();
}
- $resource = $_REQUEST['resource'];
+ $resource = $_REQUEST['resource'];
+ logger('webfinger: ' . $resource,LOGGER_DEBUG);
$r = null;
@@ -30,7 +33,7 @@ function wfinger_init(&$a) {
if(strpos($channel,'@') !== false) {
$host = substr($channel,strpos($channel,'@')+1);
if(strcasecmp($host,get_app()->get_hostname())) {
- goaway('https://' . $host . '/.well-known/webfinger?resource=' . $resource);
+ goaway('https://' . $host . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=' . $zot : ''));
}
$channel = substr($channel,0,strpos($channel,'@'));
}
@@ -46,16 +49,14 @@ function wfinger_init(&$a) {
}
-
header('Access-Control-Allow-Origin: *');
header('Content-type: application/jrd+json');
-
if($resource && $r) {
- $h = q("select hubloc_addr from hubloc where hubloc_hash = '%s'",
+ $h = q("select hubloc_addr from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0",
dbesc($r[0]['channel_hash'])
);
@@ -105,6 +106,10 @@ function wfinger_init(&$a) {
)
);
+ if($zot) {
+ // get a zotinfo packet and return it with webfinger
+ $result['zot'] = zotinfo(array('address' => $r[0]['xchan_addr']));
+ }
}
else {
header($_SERVER["SERVER_PROTOCOL"] . ' ' . 400 . ' ' . 'Bad Request');
diff --git a/mod/xrd.php b/mod/xrd.php
index d547194ad..a373f8bf5 100644
--- a/mod/xrd.php
+++ b/mod/xrd.php
@@ -5,6 +5,7 @@ require_once('include/crypto.php');
function xrd_init(&$a) {
$uri = urldecode(notags(trim($_GET['uri'])));
+ logger('xrd: ' . $uri,LOGGER_DEBUG);
if(substr($uri,0,4) === 'http')
$name = basename($uri);
@@ -31,7 +32,7 @@ function xrd_init(&$a) {
$salmon_key = salmon_key($r[0]['channel_pubkey']);
header('Access-Control-Allow-Origin: *');
- header("Content-type: text/xml");
+ header("Content-type: application/xrd+xml");
$tpl = get_markup_template('view/xrd_person.tpl');
diff --git a/mod/zfinger.php b/mod/zfinger.php
index 54ea52bc9..fb3333280 100644
--- a/mod/zfinger.php
+++ b/mod/zfinger.php
@@ -5,297 +5,9 @@ function zfinger_init(&$a) {
require_once('include/zot.php');
require_once('include/crypto.php');
- $ret = array('success' => false);
- $zhash = ((x($_REQUEST,'guid_hash')) ? $_REQUEST['guid_hash'] : '');
- $zguid = ((x($_REQUEST,'guid')) ? $_REQUEST['guid'] : '');
- $zguid_sig = ((x($_REQUEST,'guid_sig')) ? $_REQUEST['guid_sig'] : '');
- $zaddr = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
- $ztarget = ((x($_REQUEST,'target')) ? $_REQUEST['target'] : '');
- $zsig = ((x($_REQUEST,'target_sig')) ? $_REQUEST['target_sig'] : '');
- $zkey = ((x($_REQUEST,'key')) ? $_REQUEST['key'] : '');
- $mindate = ((x($_REQUEST,'mindate')) ? $_REQUEST['mindate'] : '');
- $feed = ((x($_REQUEST,'feed')) ? intval($_REQUEST['feed']) : 0);
+ $x = zotinfo($_REQUEST);
+ json_return_and_die($x);
- if($ztarget) {
- if((! $zkey) || (! $zsig) || (! rsa_verify($ztarget,base64url_decode($zsig),$zkey))) {
- logger('zfinger: invalid target signature');
- $ret['message'] = t("invalid target signature");
- json_return_and_die($ret);
- }
- }
-
- // allow re-written domains so bob@foo.example.com can provide an address of bob@example.com
- // The top-level domain also needs to redirect .well-known/zot-info to the sub-domain with a 301 or 308
-
- // TODO: Make 308 work in include/network.php for zot_fetch_url and zot_post_url
-
- if(($zaddr) && ($s = get_config('system','zotinfo_domainrewrite'))) {
- $arr = explode('^',$s);
- if(count($arr) == 2)
- $zaddr = str_replace($arr[0],$arr[1],$zaddr);
- }
-
- $r = null;
-
- if(strlen($zhash)) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
- where channel_hash = '%s' limit 1",
- dbesc($zhash)
- );
- }
- elseif(strlen($zguid) && strlen($zguid_sig)) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
- where channel_guid = '%s' and channel_guid_sig = '%s' limit 1",
- dbesc($zguid),
- dbesc($zguid_sig)
- );
- }
- elseif(strlen($zaddr)) {
- if(strpos($zaddr,'[system]') === false) { /* normal address lookup */
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
- where ( channel_address = '%s' or xchan_addr = '%s' ) limit 1",
- dbesc($zaddr),
- dbesc($zaddr)
- );
- }
-
- else {
-
- /**
- * The special address '[system]' will return a system channel if one has been defined,
- * Or the first valid channel we find if there are no system channels.
- *
- * This is used by magic-auth if we have no prior communications with this site - and
- * returns an identity on this site which we can use to create a valid hub record so that
- * we can exchange signed messages. The precise identity is irrelevant. It's the hub
- * information that we really need at the other end - and this will return it.
- *
- */
-
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
- where channel_system = 1 order by channel_id limit 1");
- if(! $r) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
- where channel_removed = 0 order by channel_id limit 1");
- }
- }
- }
- else {
- $ret['message'] = 'Invalid request';
- json_return_and_die($ret);
- }
-
- if(! $r) {
- $ret['message'] = 'Item not found.';
- json_return_and_die($ret);
- }
-
- $e = $r[0];
-
- $id = $e['channel_id'];
-
- $sys_channel = (intval($e['channel_system']) ? true : false);
- $special_channel = (($e['channel_pageflags'] & PAGE_PREMIUM) ? true : false);
- $adult_channel = (($e['channel_pageflags'] & PAGE_ADULT) ? true : false);
- $censored = (($e['channel_pageflags'] & PAGE_CENSORED) ? true : false);
- $searchable = (($e['channel_pageflags'] & PAGE_HIDDEN) ? false : true);
- $deleted = (intval($e['xchan_deleted']) ? true : false);
-
- if($deleted || $censored || $sys_channel)
- $searchable = false;
-
- $public_forum = false;
-
- $role = get_pconfig($e['channel_id'],'system','permissions_role');
- if($role === 'forum' || $role === 'repository') {
- $public_forum = true;
- }
- else {
- // check if it has characteristics of a public forum based on custom permissions.
- $t = q("select abook_my_perms from abook where abook_channel = %d and abook_self = 1 limit 1",
- intval($e['channel_id'])
- );
- if(($t) && (($t[0]['abook_my_perms'] & PERMS_W_TAGWALL) && (! ($t[0]['abook_my_perms'] & PERMS_W_STREAM))))
- $public_forum = true;
- }
-
-
- // This is for birthdays and keywords, but must check access permissions
- $p = q("select * from profile where uid = %d and is_default = 1",
- intval($e['channel_id'])
- );
-
- $profile = array();
-
- if($p) {
-
- if(! intval($p[0]['publish']))
- $searchable = false;
-
- $profile['description'] = $p[0]['pdesc'];
- $profile['birthday'] = $p[0]['dob'];
- if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],$e['channel_timezone'])) !== ''))
- $profile['next_birthday'] = $bd;
-
- if($age = age($p[0]['dob'],$e['channel_timezone'],''))
- $profile['age'] = $age;
- $profile['gender'] = $p[0]['gender'];
- $profile['marital'] = $p[0]['marital'];
- $profile['sexual'] = $p[0]['sexual'];
- $profile['locale'] = $p[0]['locality'];
- $profile['region'] = $p[0]['region'];
- $profile['postcode'] = $p[0]['postal_code'];
- $profile['country'] = $p[0]['country_name'];
- $profile['about'] = $p[0]['about'];
- $profile['homepage'] = $p[0]['homepage'];
- $profile['hometown'] = $p[0]['hometown'];
-
- if($p[0]['keywords']) {
- $tags = array();
- $k = explode(' ',$p[0]['keywords']);
- if($k) {
- foreach($k as $kk) {
- if(trim($kk," \t\n\r\0\x0B,")) {
- $tags[] = trim($kk," \t\n\r\0\x0B,");
- }
- }
- }
- if($tags)
- $profile['keywords'] = $tags;
- }
- }
-
- $ret['success'] = true;
-
- // Communication details
-
- $ret['guid'] = $e['xchan_guid'];
- $ret['guid_sig'] = $e['xchan_guid_sig'];
- $ret['key'] = $e['xchan_pubkey'];
- $ret['name'] = $e['xchan_name'];
- $ret['name_updated'] = $e['xchan_name_date'];
- $ret['address'] = $e['xchan_addr'];
- $ret['photo_mimetype'] = $e['xchan_photo_mimetype'];
- $ret['photo'] = $e['xchan_photo_l'];
- $ret['photo_updated'] = $e['xchan_photo_date'];
- $ret['url'] = $e['xchan_url'];
- $ret['connections_url']= (($e['xchan_connurl']) ? $e['xchan_connurl'] : z_root() . '/poco/' . $e['channel_address']);
- $ret['target'] = $ztarget;
- $ret['target_sig'] = $zsig;
- $ret['searchable'] = $searchable;
- $ret['adult_content'] = $adult_channel;
- $ret['public_forum'] = $public_forum;
- if($deleted)
- $ret['deleted'] = $deleted;
-
- // premium or other channel desiring some contact with potential followers before connecting.
- // This is a template - %s will be replaced with the follow_url we discover for the return channel.
-
- if($special_channel)
- $ret['connect_url'] = z_root() . '/connect/' . $e['channel_address'];
-
- // This is a template for our follow url, %s will be replaced with a webbie
-
- $ret['follow_url'] = z_root() . '/follow?f=&url=%s';
-
- $ztarget_hash = (($ztarget && $zsig)
- ? make_xchan_hash($ztarget,$zsig)
- : '' );
-
- $permissions = get_all_perms($e['channel_id'],$ztarget_hash,false);
-
- if($ztarget_hash) {
- $permissions['connected'] = false;
- $b = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
- dbesc($ztarget_hash),
- intval($e['channel_id'])
- );
- if($b)
- $permissions['connected'] = true;
- }
-
- $ret['permissions'] = (($ztarget && $zkey) ? crypto_encapsulate(json_encode($permissions),$zkey) : $permissions);
-
- if($permissions['view_profile'])
- $ret['profile'] = $profile;
-
- // array of (verified) hubs this channel uses
-
- $x = zot_encode_locations($e);
- if($x)
- $ret['locations'] = $x;
-
- $ret['site'] = array();
- $ret['site']['url'] = z_root();
- $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),$e['channel_prvkey']));
-
- $dirmode = get_config('system','directory_mode');
- if(($dirmode === false) || ($dirmode == DIRECTORY_MODE_NORMAL))
- $ret['site']['directory_mode'] = 'normal';
-
- if($dirmode == DIRECTORY_MODE_PRIMARY)
- $ret['site']['directory_mode'] = 'primary';
- elseif($dirmode == DIRECTORY_MODE_SECONDARY)
- $ret['site']['directory_mode'] = 'secondary';
- elseif($dirmode == DIRECTORY_MODE_STANDALONE)
- $ret['site']['directory_mode'] = 'standalone';
- if($dirmode != DIRECTORY_MODE_NORMAL)
- $ret['site']['directory_url'] = z_root() . '/dirsearch';
-
-
- // hide detailed site information if you're off the grid
-
- if($dirmode != DIRECTORY_MODE_STANDALONE) {
-
- $register_policy = intval(get_config('system','register_policy'));
-
- if($register_policy == REGISTER_CLOSED)
- $ret['site']['register_policy'] = 'closed';
- if($register_policy == REGISTER_APPROVE)
- $ret['site']['register_policy'] = 'approve';
- if($register_policy == REGISTER_OPEN)
- $ret['site']['register_policy'] = 'open';
-
-
- $access_policy = intval(get_config('system','access_policy'));
-
- if($access_policy == ACCESS_PRIVATE)
- $ret['site']['access_policy'] = 'private';
- if($access_policy == ACCESS_PAID)
- $ret['site']['access_policy'] = 'paid';
- if($access_policy == ACCESS_FREE)
- $ret['site']['access_policy'] = 'free';
- if($access_policy == ACCESS_TIERED)
- $ret['site']['access_policy'] = 'tiered';
-
- $ret['site']['accounts'] = account_total();
-
- require_once('include/identity.php');
- $ret['site']['channels'] = channel_total();
-
-
- $ret['site']['version'] = PLATFORM_NAME . ' ' . RED_VERSION . '[' . DB_UPDATE_VERSION . ']';
-
- $ret['site']['admin'] = get_config('system','admin_email');
-
- $visible_plugins = array();
- if(is_array($a->plugins) && count($a->plugins)) {
- $r = q("select * from addon where hidden = 0");
- if($r)
- foreach($r as $rr)
- $visible_plugins[] = $rr['name'];
- }
-
- $ret['site']['plugins'] = $visible_plugins;
- $ret['site']['sitehash'] = get_config('system','location_hash');
- $ret['site']['sitename'] = get_config('system','sitename');
- $ret['site']['sellpage'] = get_config('system','sellpage');
- $ret['site']['location'] = get_config('system','site_location');
- $ret['site']['realm'] = get_directory_realm();
-
- }
- call_hooks('zot_finger',$ret);
- json_return_and_die($ret);
}
diff --git a/version.inc b/version.inc
index 763c01a75..e008faecc 100644
--- a/version.inc
+++ b/version.inc
@@ -1 +1 @@
-2015-09-10.1151
+2015-09-16.1157
diff --git a/view/css/choklet.css b/view/css/choklet.css
index bf97e07b7..42a7fa6c4 100644
--- a/view/css/choklet.css
+++ b/view/css/choklet.css
@@ -1,9 +1,9 @@
header #banner {
position: fixed;
- top: 0;
- width: 250px;
- margin-left: auto;
- margin-right: auto;
+ top: 0px;
+ width: 33%;
+ margin-left: 33%;
+ margin-right: 33%;
}
#blog-banner {
diff --git a/view/css/choklet_bannertwo.css b/view/css/choklet_bannertwo.css
index 92150ac94..7ae012224 100644
--- a/view/css/choklet_bannertwo.css
+++ b/view/css/choklet_bannertwo.css
@@ -1,9 +1,9 @@
header #banner {
position: fixed;
- top: 0;
- width: 250px;
- margin-left: auto;
- margin-right: auto;
+ top: 0px;
+ width: 33%;
+ margin-left: 33%;
+ margin-right: 33%;
}
#blog-banner {
position: relative;
@@ -35,11 +35,12 @@ nav.navbar {
}
aside#region_1 {
- min-width: 231px;
- max-width: 231px;
+ min-width: 285px;
+ max-width: 285px;
display: table-cell;
- width: 231px;
+ width: 285px;
margin-left: 10px;
+ vertical-align: top;
}
aside input[type='text'] {
@@ -53,6 +54,7 @@ section {
width: 100%;
display: table-cell;
padding: 0 10px 200px 10px;
+ vertical-align: top;
}
#region_3 {
diff --git a/view/css/choklet_edgesthree.css b/view/css/choklet_edgesthree.css
index df936d66e..e267a4891 100644
--- a/view/css/choklet_edgesthree.css
+++ b/view/css/choklet_edgesthree.css
@@ -1,9 +1,9 @@
header #banner {
position: fixed;
- top: 0;
- width: 250px;
- margin-left: auto;
- margin-right: auto;
+ top: 0px;
+ width: 33%;
+ margin-left: 33%;
+ margin-right: 33%;
}
#blog-banner {
position: relative;
@@ -58,4 +58,4 @@ section {
#blog-margin {
margin-right: 5%;
margin-left: 5%;
-} \ No newline at end of file
+}
diff --git a/view/css/choklet_edgestwo.css b/view/css/choklet_edgestwo.css
index a591a01c4..6bf2bf8be 100644
--- a/view/css/choklet_edgestwo.css
+++ b/view/css/choklet_edgestwo.css
@@ -1,9 +1,9 @@
header #banner {
position: fixed;
- top: 0;
- width: 250px;
- margin-left: auto;
- margin-right: auto;
+ top: 0px;
+ width: 33%;
+ margin-left: 33%;
+ margin-right: 33%;
}
#blog-banner {
position: relative;
@@ -57,4 +57,4 @@ section {
#blog-margin {
margin-right: 5%;
margin-left: 5%;
-} \ No newline at end of file
+}
diff --git a/view/css/choklet_full.css b/view/css/choklet_full.css
index d00178016..f1e9b10e0 100644
--- a/view/css/choklet_full.css
+++ b/view/css/choklet_full.css
@@ -52,4 +52,4 @@ section {
#blog-margin {
margin-right: 5%;
margin-left: 5%;
-} \ No newline at end of file
+}
diff --git a/view/css/choklet_three.css b/view/css/choklet_three.css
index 5a305efcf..17965084a 100644
--- a/view/css/choklet_three.css
+++ b/view/css/choklet_three.css
@@ -1,9 +1,9 @@
header #banner {
position: fixed;
- top: 0;
- width: 250px;
- margin-left: auto;
- margin-right: auto;
+ top: 0px;
+ width: 33%;
+ margin-left: 33%;
+ margin-right: 33%;
}
#blog-banner {
position: relative;
diff --git a/view/css/default.css b/view/css/default.css
index f0c89a087..bffecbb81 100644
--- a/view/css/default.css
+++ b/view/css/default.css
@@ -1,9 +1,9 @@
header #banner {
position: fixed;
- top: 0;
- width: 250px;
- margin-left: auto;
- margin-right: auto;
+ top: 0px;
+ width: 33%;
+ margin-left: 33%;
+ margin-right: 33%;
}
main {
@@ -18,7 +18,6 @@ aside {
display: table-cell;
vertical-align: top;
padding: 80px 7px 0px 7px;
-
}
section {
diff --git a/view/css/full.css b/view/css/full.css
index 05401f68c..3f9a01d24 100644
--- a/view/css/full.css
+++ b/view/css/full.css
@@ -1,9 +1,9 @@
header #banner {
position: fixed;
- top: 0;
- width: 250px;
- margin-left: auto;
- margin-right: auto;
+ top: 0px;
+ width: 33%;
+ margin-left: 33%;
+ margin-right: 33%;
}
section {
diff --git a/view/es/messages.po b/view/es/messages.po
index 044a6c49c..0272811eb 100644
--- a/view/es/messages.po
+++ b/view/es/messages.po
@@ -13,8 +13,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-09-04 00:04-0700\n"
-"PO-Revision-Date: 2015-09-08 11:08+0000\n"
+"POT-Creation-Date: 2015-09-11 00:05-0700\n"
+"PO-Revision-Date: 2015-09-14 11:47+0000\n"
"Last-Translator: Manuel Jiménez Friaza <mjfriaza@openmailbox.org>\n"
"Language-Team: Spanish (http://www.transifex.com/Friendica/red-matrix/language/es/)\n"
"MIME-Version: 1.0\n"
@@ -42,7 +42,7 @@ msgstr "Fotos de perfil"
#: ../../mod/connections.php:274 ../../mod/blocks.php:153
#: ../../mod/editpost.php:106 ../../mod/editlayout.php:133
#: ../../mod/editwebpage.php:178 ../../mod/editblock.php:134
-#: ../../mod/menu.php:103 ../../mod/settings.php:650 ../../mod/layouts.php:183
+#: ../../mod/menu.php:106 ../../mod/settings.php:650 ../../mod/layouts.php:183
msgid "Edit"
msgstr "Editar"
@@ -257,7 +257,7 @@ msgstr "Varios"
msgid "YYYY-MM-DD or MM-DD"
msgstr "AAAA-MM-DD o MM-DD"
-#: ../../include/datetime.php:235 ../../mod/events.php:649
+#: ../../include/datetime.php:235 ../../mod/events.php:672
#: ../../mod/appman.php:91 ../../mod/appman.php:92
msgid "Required"
msgstr "Obligatorio"
@@ -352,9 +352,9 @@ msgstr "Modo seguro"
#: ../../include/dir_fns.php:128 ../../include/dir_fns.php:129
#: ../../include/dir_fns.php:130 ../../mod/api.php:106
-#: ../../mod/photos.php:568 ../../mod/mitem.php:157 ../../mod/mitem.php:158
-#: ../../mod/mitem.php:229 ../../mod/mitem.php:230 ../../mod/menu.php:91
-#: ../../mod/menu.php:147 ../../mod/filestorage.php:151
+#: ../../mod/photos.php:568 ../../mod/mitem.php:159 ../../mod/mitem.php:160
+#: ../../mod/mitem.php:232 ../../mod/mitem.php:233 ../../mod/menu.php:94
+#: ../../mod/menu.php:151 ../../mod/filestorage.php:151
#: ../../mod/filestorage.php:159 ../../mod/admin.php:428
#: ../../mod/settings.php:579 ../../mod/removeme.php:60
#: ../../mod/connedit.php:647 ../../mod/connedit.php:675
@@ -365,9 +365,9 @@ msgstr "No"
#: ../../include/dir_fns.php:128 ../../include/dir_fns.php:129
#: ../../include/dir_fns.php:130 ../../mod/api.php:105
-#: ../../mod/photos.php:568 ../../mod/mitem.php:157 ../../mod/mitem.php:158
-#: ../../mod/mitem.php:229 ../../mod/mitem.php:230 ../../mod/menu.php:91
-#: ../../mod/menu.php:147 ../../mod/filestorage.php:151
+#: ../../mod/photos.php:568 ../../mod/mitem.php:159 ../../mod/mitem.php:160
+#: ../../mod/mitem.php:232 ../../mod/mitem.php:233 ../../mod/menu.php:94
+#: ../../mod/menu.php:151 ../../mod/filestorage.php:151
#: ../../mod/filestorage.php:159 ../../mod/admin.php:430
#: ../../mod/settings.php:579 ../../mod/removeme.php:60
#: ../../view/theme/redbasic/php/config.php:104
@@ -394,7 +394,7 @@ msgstr "Ver"
#: ../../include/page_widgets.php:40 ../../include/ItemObject.php:677
#: ../../include/conversation.php:1166 ../../mod/webpages.php:188
-#: ../../mod/events.php:667 ../../mod/editpost.php:143
+#: ../../mod/events.php:690 ../../mod/editpost.php:143
#: ../../mod/photos.php:982 ../../mod/editwebpage.php:214
#: ../../mod/editblock.php:170
msgid "Preview"
@@ -413,12 +413,12 @@ msgid "Title"
msgstr "Título"
#: ../../include/page_widgets.php:44 ../../mod/webpages.php:192
-#: ../../mod/blocks.php:150 ../../mod/menu.php:105 ../../mod/layouts.php:181
+#: ../../mod/blocks.php:150 ../../mod/menu.php:108 ../../mod/layouts.php:181
msgid "Created"
msgstr "Creado"
#: ../../include/page_widgets.php:45 ../../mod/webpages.php:193
-#: ../../mod/blocks.php:151 ../../mod/menu.php:106 ../../mod/layouts.php:182
+#: ../../mod/blocks.php:151 ../../mod/menu.php:109 ../../mod/layouts.php:182
msgid "Edited"
msgstr "Editado"
@@ -503,11 +503,11 @@ msgstr "Describir (opcional)"
#: ../../include/js_strings.php:22 ../../include/ItemObject.php:668
#: ../../mod/xchan.php:11 ../../mod/connect.php:93 ../../mod/thing.php:303
-#: ../../mod/thing.php:346 ../../mod/events.php:494 ../../mod/events.php:670
+#: ../../mod/thing.php:346 ../../mod/events.php:511 ../../mod/events.php:693
#: ../../mod/group.php:81 ../../mod/photos.php:577 ../../mod/photos.php:654
#: ../../mod/photos.php:941 ../../mod/photos.php:981 ../../mod/photos.php:1099
#: ../../mod/pdledit.php:58 ../../mod/import.php:592 ../../mod/chat.php:177
-#: ../../mod/chat.php:211 ../../mod/mitem.php:232 ../../mod/rate.php:167
+#: ../../mod/chat.php:211 ../../mod/mitem.php:235 ../../mod/rate.php:167
#: ../../mod/invite.php:142 ../../mod/locs.php:105 ../../mod/sources.php:104
#: ../../mod/sources.php:138 ../../mod/filestorage.php:156
#: ../../mod/fsuggest.php:108 ../../mod/poke.php:166
@@ -886,7 +886,7 @@ msgstr "eliminar del fichero"
msgid "Click to open/close"
msgstr "Pulsar para abrir/cerrar"
-#: ../../include/text.php:1661 ../../mod/events.php:457
+#: ../../include/text.php:1661 ../../mod/events.php:474
msgid "Link to Source"
msgstr "Enlazar con la entrada en su ubicación original"
@@ -911,19 +911,19 @@ msgid "Select an alternate language"
msgstr "Selecciona un idioma alternativo"
#: ../../include/text.php:1884 ../../include/diaspora.php:2119
-#: ../../include/conversation.php:120 ../../mod/like.php:346
+#: ../../include/conversation.php:120 ../../mod/like.php:349
#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
#: ../../mod/tagger.php:43
msgid "photo"
msgstr "foto"
#: ../../include/text.php:1887 ../../include/conversation.php:123
-#: ../../mod/like.php:348 ../../mod/tagger.php:47
+#: ../../mod/like.php:351 ../../mod/tagger.php:47
msgid "event"
msgstr "evento"
#: ../../include/text.php:1890 ../../include/diaspora.php:2119
-#: ../../include/conversation.php:148 ../../mod/like.php:346
+#: ../../include/conversation.php:148 ../../mod/like.php:349
#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
msgid "status"
msgstr "estado"
@@ -945,7 +945,7 @@ msgstr "Herramientas de diseño"
msgid "Blocks"
msgstr "Bloques"
-#: ../../include/text.php:2196 ../../mod/menu.php:98
+#: ../../include/text.php:2196 ../../mod/menu.php:101
msgid "Menus"
msgstr "Menús"
@@ -1018,7 +1018,7 @@ msgstr "Compartido"
#: ../../include/RedDAV/RedBrowser.php:256
#: ../../include/RedDAV/RedBrowser.php:303 ../../mod/webpages.php:180
-#: ../../mod/blocks.php:152 ../../mod/menu.php:109
+#: ../../mod/blocks.php:152 ../../mod/menu.php:112
#: ../../mod/new_channel.php:121 ../../mod/layouts.php:175
msgid "Create"
msgstr "Crear"
@@ -1253,7 +1253,7 @@ msgstr "Habilitar la muestra de entradas eligiendo colecciones"
#: ../../include/features.php:70 ../../include/widgets.php:274
msgid "Saved Searches"
-msgstr "Búsquedas Guardadas"
+msgstr "Búsquedas guardadas"
#: ../../include/features.php:70
msgid "Save search terms for re-use"
@@ -1380,7 +1380,7 @@ msgstr "Editar una aplicación personal"
#: ../../include/widgets.php:136 ../../include/widgets.php:175
#: ../../include/Contact.php:107 ../../include/conversation.php:956
-#: ../../include/identity.php:903 ../../mod/directory.php:316
+#: ../../include/identity.php:933 ../../mod/directory.php:316
#: ../../mod/match.php:64 ../../mod/suggest.php:52
msgid "Connect"
msgstr "Conectar"
@@ -1557,12 +1557,12 @@ msgid "Finishes:"
msgstr "Finaliza:"
#: ../../include/event.php:50 ../../include/bb2diaspora.php:481
-#: ../../include/identity.php:954 ../../mod/directory.php:302
-#: ../../mod/events.php:661
+#: ../../include/identity.php:984 ../../mod/directory.php:302
+#: ../../mod/events.php:684
msgid "Location:"
msgstr "Ubicación:"
-#: ../../include/event.php:535
+#: ../../include/event.php:549
msgid "This event has been added to your calendar."
msgstr "Este evento ha sido añadido a su calendario."
@@ -1660,7 +1660,7 @@ msgstr "%1$s, %2$s [zrl=%3$s]le etiquetó[/zrl]."
#: ../../include/enotify.php:238
#, php-format
msgid "[Red:Notify] %1$s poked you"
-msgstr "[Red:Aviso] %1$s ha recibido un toque"
+msgstr "[Red:Aviso] %1$s le ha dado un toque"
#: ../../include/enotify.php:239
#, php-format
@@ -1762,7 +1762,7 @@ msgid "Stored post could not be verified."
msgstr "No se han podido verificar las entradas guardadas."
#: ../../include/diaspora.php:2148 ../../include/conversation.php:164
-#: ../../mod/like.php:394
+#: ../../mod/like.php:397
#, php-format
msgid "%1$s likes %2$s's %3$s"
msgstr "a %1$s le gusta el %3$s de %2$s"
@@ -1862,7 +1862,7 @@ msgid "View all"
msgstr "Ver todo"
#: ../../include/ItemObject.php:179 ../../include/taxonomy.php:396
-#: ../../include/conversation.php:1712 ../../include/identity.php:1213
+#: ../../include/conversation.php:1712 ../../include/identity.php:1243
#: ../../mod/photos.php:1019
msgctxt "noun"
msgid "Like"
@@ -2114,7 +2114,7 @@ msgstr "Editar perfiles"
msgid "Manage/Edit profiles"
msgstr "Administrar/editar perfiles"
-#: ../../include/nav.php:95 ../../include/identity.php:926
+#: ../../include/nav.php:95 ../../include/identity.php:956
msgid "Edit Profile"
msgstr "Editar perfil"
@@ -2288,7 +2288,7 @@ msgid "Outbox"
msgstr "Bandeja de salida"
#: ../../include/nav.php:202 ../../include/apps.php:140
-#: ../../mod/events.php:486
+#: ../../mod/events.php:503
msgid "Events"
msgstr "Eventos"
@@ -2540,7 +2540,7 @@ msgstr "Modo personalizado/experto"
msgid "channel"
msgstr "canal"
-#: ../../include/conversation.php:167 ../../mod/like.php:396
+#: ../../include/conversation.php:167 ../../mod/like.php:399
#, php-format
msgid "%1$s doesn't like %2$s's %3$s"
msgstr "a %1$s no le gusta el %3$s de %2$s"
@@ -2859,13 +2859,13 @@ msgstr "Ejemplo: roberto@ejemplo.com, maría@ejemplo.com"
msgid "Set expiration date"
msgstr "Configurar fecha de caducidad"
-#: ../../include/conversation.php:1249 ../../mod/events.php:651
+#: ../../include/conversation.php:1249 ../../mod/events.php:674
#: ../../mod/editpost.php:153
msgid "OK"
msgstr "OK"
#: ../../include/conversation.php:1250 ../../mod/tagrm.php:11
-#: ../../mod/tagrm.php:134 ../../mod/events.php:650 ../../mod/fbrowser.php:82
+#: ../../mod/tagrm.php:134 ../../mod/events.php:673 ../../mod/fbrowser.php:82
#: ../../mod/fbrowser.php:117 ../../mod/editpost.php:154
#: ../../mod/settings.php:589 ../../mod/settings.php:615
msgid "Cancel"
@@ -2900,7 +2900,7 @@ msgid "Posts that mention or involve you"
msgstr "Publicaciones que le mencionan o involucran"
#: ../../include/conversation.php:1524 ../../mod/connections.php:72
-#: ../../mod/connections.php:85 ../../mod/menu.php:107
+#: ../../mod/connections.php:85 ../../mod/menu.php:110
msgid "New"
msgstr "Nuevas"
@@ -3002,7 +3002,7 @@ msgid_plural "Abstains"
msgstr[0] "se abstiene"
msgstr[1] "Se abstienen"
-#: ../../include/items.php:413 ../../mod/like.php:270
+#: ../../include/items.php:413 ../../mod/like.php:273
#: ../../mod/subthread.php:49 ../../mod/group.php:68 ../../mod/profperm.php:23
#: ../../mod/bulksetclose.php:11 ../../index.php:392
msgid "Permission denied"
@@ -3045,14 +3045,14 @@ msgstr "Visible para las conexiones permitidas."
msgid "Visible to specific connections."
msgstr "Visible para conexiones específicas."
-#: ../../include/items.php:4218 ../../mod/thing.php:74
+#: ../../include/items.php:4223 ../../mod/thing.php:74
#: ../../mod/filestorage.php:27 ../../mod/viewsrc.php:20
#: ../../mod/admin.php:167 ../../mod/admin.php:1025 ../../mod/admin.php:1225
#: ../../mod/display.php:36
msgid "Item not found."
msgstr "Elemento no encontrado."
-#: ../../include/items.php:4291 ../../include/attach.php:137
+#: ../../include/items.php:4296 ../../include/attach.php:137
#: ../../include/attach.php:184 ../../include/attach.php:247
#: ../../include/attach.php:261 ../../include/attach.php:305
#: ../../include/attach.php:319 ../../include/attach.php:350
@@ -3064,18 +3064,18 @@ msgstr "Elemento no encontrado."
#: ../../mod/thing.php:284 ../../mod/thing.php:318
#: ../../mod/profile_photo.php:264 ../../mod/profile_photo.php:277
#: ../../mod/block.php:22 ../../mod/block.php:72 ../../mod/like.php:178
-#: ../../mod/events.php:232 ../../mod/group.php:9 ../../mod/item.php:206
-#: ../../mod/item.php:214 ../../mod/item.php:978 ../../mod/network.php:12
+#: ../../mod/events.php:249 ../../mod/group.php:9 ../../mod/item.php:206
+#: ../../mod/item.php:214 ../../mod/item.php:1005 ../../mod/network.php:12
#: ../../mod/common.php:35 ../../mod/connections.php:29
#: ../../mod/blocks.php:69 ../../mod/blocks.php:76 ../../mod/editpost.php:13
#: ../../mod/photos.php:69 ../../mod/pdledit.php:21 ../../mod/authtest.php:13
#: ../../mod/editlayout.php:63 ../../mod/editlayout.php:87
-#: ../../mod/chat.php:90 ../../mod/chat.php:95 ../../mod/mitem.php:109
+#: ../../mod/chat.php:90 ../../mod/chat.php:95 ../../mod/mitem.php:111
#: ../../mod/editwebpage.php:64 ../../mod/editwebpage.php:86
#: ../../mod/editwebpage.php:101 ../../mod/editwebpage.php:125
#: ../../mod/rate.php:110 ../../mod/editblock.php:65 ../../mod/invite.php:13
#: ../../mod/invite.php:104 ../../mod/locs.php:77 ../../mod/sources.php:66
-#: ../../mod/menu.php:69 ../../mod/filestorage.php:18
+#: ../../mod/menu.php:72 ../../mod/filestorage.php:18
#: ../../mod/filestorage.php:73 ../../mod/filestorage.php:88
#: ../../mod/filestorage.php:115 ../../mod/fsuggest.php:78
#: ../../mod/poke.php:128 ../../mod/profiles.php:188
@@ -3095,38 +3095,38 @@ msgstr "Elemento no encontrado."
msgid "Permission denied."
msgstr "Acceso denegado."
-#: ../../include/items.php:4693 ../../mod/group.php:38 ../../mod/group.php:140
+#: ../../include/items.php:4700 ../../mod/group.php:38 ../../mod/group.php:140
#: ../../mod/bulksetclose.php:51
msgid "Collection not found."
msgstr "Colección no encontrada."
-#: ../../include/items.php:4709
+#: ../../include/items.php:4716
msgid "Collection is empty."
msgstr "La colección está vacía."
-#: ../../include/items.php:4716
+#: ../../include/items.php:4723
#, php-format
msgid "Collection: %s"
msgstr "Colección: %s"
-#: ../../include/items.php:4726 ../../mod/connedit.php:674
+#: ../../include/items.php:4733 ../../mod/connedit.php:674
#, php-format
msgid "Connection: %s"
msgstr "Conexión: %s"
-#: ../../include/items.php:4728
+#: ../../include/items.php:4735
msgid "Connection not found."
msgstr "Conexión no encontrada"
-#: ../../include/zot.php:666
+#: ../../include/zot.php:675
msgid "Invalid data packet"
msgstr "Paquete de datos no válido"
-#: ../../include/zot.php:682
+#: ../../include/zot.php:691
msgid "Unable to verify channel signature"
msgstr "No ha sido posible de verificar la signatura del canal"
-#: ../../include/zot.php:2133
+#: ../../include/zot.php:2142
#, php-format
msgid "Unable to verify site signature for %s"
msgstr "No ha sido posible de verificar la signatura del sitio para %s"
@@ -3223,7 +3223,7 @@ msgstr "Mostrar"
msgid "Don't show"
msgstr "No mostrar"
-#: ../../include/acl_selectors.php:248 ../../mod/events.php:668
+#: ../../include/acl_selectors.php:248 ../../mod/events.php:691
#: ../../mod/photos.php:571 ../../mod/photos.php:934 ../../mod/chat.php:209
#: ../../mod/filestorage.php:147
msgid "Permissions"
@@ -3324,11 +3324,11 @@ msgstr "No ha sido posible recuperar la identidad creada"
msgid "Default Profile"
msgstr "Perfil principal"
-#: ../../include/identity.php:706
+#: ../../include/identity.php:736
msgid "Requested channel is not available."
msgstr "El canal solicitado no está disponible."
-#: ../../include/identity.php:753 ../../mod/profile.php:16
+#: ../../include/identity.php:783 ../../mod/profile.php:16
#: ../../mod/achievements.php:11 ../../mod/webpages.php:29
#: ../../mod/connect.php:13 ../../mod/hcard.php:8 ../../mod/blocks.php:29
#: ../../mod/editlayout.php:27 ../../mod/editwebpage.php:28
@@ -3337,193 +3337,193 @@ msgstr "El canal solicitado no está disponible."
msgid "Requested profile is not available."
msgstr "El perfil solicitado no está disponible."
-#: ../../include/identity.php:916 ../../mod/profiles.php:774
+#: ../../include/identity.php:946 ../../mod/profiles.php:774
msgid "Change profile photo"
msgstr "Cambiar foto de perfil"
-#: ../../include/identity.php:922
+#: ../../include/identity.php:952
msgid "Profiles"
msgstr "Perfiles"
-#: ../../include/identity.php:922
+#: ../../include/identity.php:952
msgid "Manage/edit profiles"
msgstr "Administrar/editar perfiles"
-#: ../../include/identity.php:923 ../../mod/profiles.php:775
+#: ../../include/identity.php:953 ../../mod/profiles.php:775
msgid "Create New Profile"
msgstr "Crear nuevo perfil"
-#: ../../include/identity.php:938 ../../mod/profiles.php:786
+#: ../../include/identity.php:968 ../../mod/profiles.php:786
msgid "Profile Image"
msgstr "Imagen de perfil"
-#: ../../include/identity.php:941
+#: ../../include/identity.php:971
msgid "visible to everybody"
msgstr "visible para cualquiera"
-#: ../../include/identity.php:942 ../../mod/profiles.php:669
+#: ../../include/identity.php:972 ../../mod/profiles.php:669
#: ../../mod/profiles.php:790
msgid "Edit visibility"
msgstr "Editar visibilidad"
-#: ../../include/identity.php:958 ../../include/identity.php:1197
+#: ../../include/identity.php:988 ../../include/identity.php:1227
msgid "Gender:"
msgstr "Género:"
-#: ../../include/identity.php:959 ../../include/identity.php:1241
+#: ../../include/identity.php:989 ../../include/identity.php:1271
msgid "Status:"
msgstr "Estado:"
-#: ../../include/identity.php:960 ../../include/identity.php:1252
+#: ../../include/identity.php:990 ../../include/identity.php:1282
msgid "Homepage:"
msgstr "Página personal:"
-#: ../../include/identity.php:961
+#: ../../include/identity.php:991
msgid "Online Now"
msgstr "Ahora en línea"
-#: ../../include/identity.php:1044 ../../include/identity.php:1122
+#: ../../include/identity.php:1074 ../../include/identity.php:1152
#: ../../mod/ping.php:324
msgid "g A l F d"
msgstr "g A l d F"
-#: ../../include/identity.php:1045 ../../include/identity.php:1123
+#: ../../include/identity.php:1075 ../../include/identity.php:1153
msgid "F d"
msgstr "d F"
-#: ../../include/identity.php:1090 ../../include/identity.php:1162
+#: ../../include/identity.php:1120 ../../include/identity.php:1192
#: ../../mod/ping.php:346
msgid "[today]"
msgstr "[hoy]"
-#: ../../include/identity.php:1101
+#: ../../include/identity.php:1131
msgid "Birthday Reminders"
msgstr "Recordatorios de cumpleaños"
-#: ../../include/identity.php:1102
+#: ../../include/identity.php:1132
msgid "Birthdays this week:"
msgstr "Cumpleaños esta semana:"
-#: ../../include/identity.php:1155
+#: ../../include/identity.php:1185
msgid "[No description]"
msgstr "[Sin descripción]"
-#: ../../include/identity.php:1173
+#: ../../include/identity.php:1203
msgid "Event Reminders"
msgstr "Recordatorios de eventos"
-#: ../../include/identity.php:1174
+#: ../../include/identity.php:1204
msgid "Events this week:"
msgstr "Eventos de esta semana:"
-#: ../../include/identity.php:1187 ../../include/identity.php:1304
+#: ../../include/identity.php:1217 ../../include/identity.php:1334
#: ../../include/apps.php:138 ../../mod/profperm.php:112
msgid "Profile"
msgstr "Perfil"
-#: ../../include/identity.php:1195 ../../mod/settings.php:1056
+#: ../../include/identity.php:1225 ../../mod/settings.php:1056
msgid "Full Name:"
msgstr "Nombre completo:"
-#: ../../include/identity.php:1202
+#: ../../include/identity.php:1232
msgid "Like this channel"
msgstr "Me gusta este canal"
-#: ../../include/identity.php:1226
+#: ../../include/identity.php:1256
msgid "j F, Y"
msgstr "j F Y"
-#: ../../include/identity.php:1227
+#: ../../include/identity.php:1257
msgid "j F"
msgstr "j F"
-#: ../../include/identity.php:1234
+#: ../../include/identity.php:1264
msgid "Birthday:"
msgstr "Cumpleaños:"
-#: ../../include/identity.php:1238 ../../mod/directory.php:297
+#: ../../include/identity.php:1268 ../../mod/directory.php:297
msgid "Age:"
msgstr "Edad:"
-#: ../../include/identity.php:1247
+#: ../../include/identity.php:1277
#, php-format
msgid "for %1$d %2$s"
msgstr "por %1$d %2$s"
-#: ../../include/identity.php:1250 ../../mod/profiles.php:691
+#: ../../include/identity.php:1280 ../../mod/profiles.php:691
msgid "Sexual Preference:"
msgstr "Orientación sexual:"
-#: ../../include/identity.php:1254 ../../mod/directory.php:313
+#: ../../include/identity.php:1284 ../../mod/directory.php:313
#: ../../mod/profiles.php:693
msgid "Hometown:"
msgstr "Ciudad de origen:"
-#: ../../include/identity.php:1256
+#: ../../include/identity.php:1286
msgid "Tags:"
msgstr "Etiquetas:"
-#: ../../include/identity.php:1258 ../../mod/profiles.php:694
+#: ../../include/identity.php:1288 ../../mod/profiles.php:694
msgid "Political Views:"
msgstr "Posición política:"
-#: ../../include/identity.php:1260
+#: ../../include/identity.php:1290
msgid "Religion:"
msgstr "Religión:"
-#: ../../include/identity.php:1262 ../../mod/directory.php:315
+#: ../../include/identity.php:1292 ../../mod/directory.php:315
msgid "About:"
msgstr "Sobre mí:"
-#: ../../include/identity.php:1264
+#: ../../include/identity.php:1294
msgid "Hobbies/Interests:"
msgstr "Aficciones/Intereses:"
-#: ../../include/identity.php:1266 ../../mod/profiles.php:697
+#: ../../include/identity.php:1296 ../../mod/profiles.php:697
msgid "Likes:"
msgstr "Me gusta:"
-#: ../../include/identity.php:1268 ../../mod/profiles.php:698
+#: ../../include/identity.php:1298 ../../mod/profiles.php:698
msgid "Dislikes:"
msgstr "No me gusta:"
-#: ../../include/identity.php:1270
+#: ../../include/identity.php:1300
msgid "Contact information and Social Networks:"
msgstr "Información de contacto y redes sociales:"
-#: ../../include/identity.php:1272
+#: ../../include/identity.php:1302
msgid "My other channels:"
msgstr "Mis otros canales:"
-#: ../../include/identity.php:1274
+#: ../../include/identity.php:1304
msgid "Musical interests:"
msgstr "Intereses musicales:"
-#: ../../include/identity.php:1276
+#: ../../include/identity.php:1306
msgid "Books, literature:"
msgstr "Libros, literatura:"
-#: ../../include/identity.php:1278
+#: ../../include/identity.php:1308
msgid "Television:"
msgstr "Televisión:"
-#: ../../include/identity.php:1280
+#: ../../include/identity.php:1310
msgid "Film/dance/culture/entertainment:"
msgstr "Cine/danza/cultura/entretenimiento:"
-#: ../../include/identity.php:1282
+#: ../../include/identity.php:1312
msgid "Love/Romance:"
msgstr "Vida sentimental/amorosa:"
-#: ../../include/identity.php:1284
+#: ../../include/identity.php:1314
msgid "Work/employment:"
msgstr "Trabajo:"
-#: ../../include/identity.php:1286
+#: ../../include/identity.php:1316
msgid "School/education:"
msgstr "Estudios:"
-#: ../../include/identity.php:1306
+#: ../../include/identity.php:1336
msgid "Like this thing"
msgstr "Me gusta esto"
@@ -3997,7 +3997,7 @@ msgstr "Estado:"
msgid "Homepage: "
msgstr "Página personal:"
-#: ../../mod/directory.php:308 ../../mod/events.php:659
+#: ../../mod/directory.php:308 ../../mod/events.php:682
msgid "Description:"
msgstr "Descripción:"
@@ -4069,7 +4069,7 @@ msgstr "Búsqueda de canales"
msgid "Lookup xchan beginning with (or webbie): "
msgstr "Buscar un canal (o un \"webbie\") que comience por:"
-#: ../../mod/xchan.php:37 ../../mod/mitem.php:114 ../../mod/menu.php:156
+#: ../../mod/xchan.php:37 ../../mod/mitem.php:116 ../../mod/menu.php:160
msgid "Not found."
msgstr "No encontrado."
@@ -4339,45 +4339,45 @@ msgstr "elemento"
msgid "Channel unavailable."
msgstr "Canal no disponible."
-#: ../../mod/like.php:228
+#: ../../mod/like.php:231
msgid "Previous action reversed."
msgstr "Acción anterior revocada."
-#: ../../mod/like.php:398
+#: ../../mod/like.php:401
#, php-format
msgid "%1$s agrees with %2$s's %3$s"
msgstr "%1$s está de acuerdo con %3$s de %2$s"
-#: ../../mod/like.php:400
+#: ../../mod/like.php:403
#, php-format
msgid "%1$s doesn't agree with %2$s's %3$s"
msgstr "%1$s no está de acuerdo con %3$s de %2$s"
-#: ../../mod/like.php:402
+#: ../../mod/like.php:405
#, php-format
msgid "%1$s abstains from a decision on %2$s's %3$s"
msgstr "%1$s se abstiene en %3$s de %2$s"
-#: ../../mod/like.php:404
+#: ../../mod/like.php:407
#, php-format
msgid "%1$s is attending %2$s's %3$s"
msgstr "%1$s participará en el %3$s de %2$s"
-#: ../../mod/like.php:406
+#: ../../mod/like.php:409
#, php-format
msgid "%1$s is not attending %2$s's %3$s"
msgstr "%1$s no participará en el %3$s de %2$s"
-#: ../../mod/like.php:408
+#: ../../mod/like.php:411
#, php-format
msgid "%1$s may attend %2$s's %3$s"
msgstr "%1$s tal vez participe en el %3$s de %2$s"
-#: ../../mod/like.php:493
+#: ../../mod/like.php:507
msgid "Action completed."
msgstr "Acción completada."
-#: ../../mod/like.php:494
+#: ../../mod/like.php:508
msgid "Thank you."
msgstr "Gracias."
@@ -4405,89 +4405,89 @@ msgstr "Se requieren el título del evento y su hora de inicio."
msgid "Event not found."
msgstr "Evento no encontrado."
-#: ../../mod/events.php:409
+#: ../../mod/events.php:426
msgid "l, F j"
msgstr "l j F"
-#: ../../mod/events.php:431
+#: ../../mod/events.php:448
msgid "Edit event"
msgstr "Editar evento"
-#: ../../mod/events.php:432
+#: ../../mod/events.php:449
msgid "Delete event"
msgstr "Borrar evento"
-#: ../../mod/events.php:466
+#: ../../mod/events.php:483
msgid "calendar"
msgstr "calendario"
-#: ../../mod/events.php:487
+#: ../../mod/events.php:504
msgid "Create New Event"
msgstr "Crear Nuevo Evento"
-#: ../../mod/events.php:488 ../../mod/photos.php:839
+#: ../../mod/events.php:505 ../../mod/photos.php:839
msgid "Previous"
msgstr "Anterior"
-#: ../../mod/events.php:489 ../../mod/photos.php:848 ../../mod/setup.php:281
+#: ../../mod/events.php:506 ../../mod/photos.php:848 ../../mod/setup.php:281
msgid "Next"
msgstr "Siguiente"
-#: ../../mod/events.php:490
+#: ../../mod/events.php:507
msgid "Export"
msgstr "Exportar"
-#: ../../mod/events.php:493
+#: ../../mod/events.php:510
msgid "Import"
msgstr "Importar"
-#: ../../mod/events.php:518
+#: ../../mod/events.php:541
msgid "Event removed"
msgstr "Evento borrado"
-#: ../../mod/events.php:521
+#: ../../mod/events.php:544
msgid "Failed to remove event"
msgstr "Error al borrar el evento"
-#: ../../mod/events.php:641
+#: ../../mod/events.php:664
msgid "Event details"
msgstr "Detalles del evento"
-#: ../../mod/events.php:642
+#: ../../mod/events.php:665
msgid "Starting date and Title are required."
msgstr "Se requieren fecha y título."
-#: ../../mod/events.php:644
+#: ../../mod/events.php:667
msgid "Categories (comma-separated list)"
msgstr "Categorías (lista separada por comas)"
-#: ../../mod/events.php:646
+#: ../../mod/events.php:669
msgid "Event Starts:"
-msgstr "Inicios de eventos:"
+msgstr "Inicio del evento:"
-#: ../../mod/events.php:653
+#: ../../mod/events.php:676
msgid "Finish date/time is not known or not relevant"
msgstr "La fecha / hora de finalización no se conocen o no son relevantes"
-#: ../../mod/events.php:655
+#: ../../mod/events.php:678
msgid "Event Finishes:"
-msgstr "Eventos Terminados:"
+msgstr "Finalización del evento:"
-#: ../../mod/events.php:657 ../../mod/events.php:658
+#: ../../mod/events.php:680 ../../mod/events.php:681
msgid "Adjust for viewer timezone"
msgstr "Ajustar para obtener el visor de zona horaria"
-#: ../../mod/events.php:657
+#: ../../mod/events.php:680
msgid ""
"Important for events that happen in a particular place. Not practical for "
"global holidays."
msgstr "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales."
-#: ../../mod/events.php:663
+#: ../../mod/events.php:686
msgid "Title:"
msgstr "Título:"
-#: ../../mod/events.php:665
+#: ../../mod/events.php:688
msgid "Share this event"
msgstr "Compartir este evento"
@@ -4668,20 +4668,20 @@ msgstr "Desechada entrada vacía."
msgid "Executable content type not permitted to this channel."
msgstr "Contenido de tipo ejecutable no permitido en este canal."
-#: ../../mod/item.php:901
+#: ../../mod/item.php:914
msgid "System error. Post not saved."
msgstr "Error del sistema. Entrada no salvada."
-#: ../../mod/item.php:1119
+#: ../../mod/item.php:1146
msgid "Unable to obtain post information from database."
msgstr "No ha sido posible obtener información de la entrada en la base de datos."
-#: ../../mod/item.php:1126
+#: ../../mod/item.php:1153
#, php-format
msgid "You have reached your limit of %1$.0f top level posts."
msgstr "Ha alcanzado su límite de %1$.0f tope máximo de entradas"
-#: ../../mod/item.php:1133
+#: ../../mod/item.php:1160
#, php-format
msgid "You have reached your limit of %1$.0f webpages."
msgstr "Ha alcanzado su límite de %1$.0f páginas web."
@@ -5237,7 +5237,7 @@ msgstr "Nombre de sala de chat"
msgid "%1$s's Chatrooms"
msgstr "Sala de chat de %1$s"
-#: ../../mod/mitem.php:24 ../../mod/menu.php:134
+#: ../../mod/mitem.php:24 ../../mod/menu.php:138
msgid "Menu not found."
msgstr "Menú no encontrado"
@@ -5245,115 +5245,115 @@ msgstr "Menú no encontrado"
msgid "Unable to create element."
msgstr "Imposible crear el elemento."
-#: ../../mod/mitem.php:71
+#: ../../mod/mitem.php:72
msgid "Unable to update menu element."
msgstr "No es posible actualizar el elemento del menú."
-#: ../../mod/mitem.php:86
+#: ../../mod/mitem.php:88
msgid "Unable to add menu element."
msgstr "No es posible añadir el elemento al menú"
-#: ../../mod/mitem.php:152 ../../mod/mitem.php:223
+#: ../../mod/mitem.php:154 ../../mod/mitem.php:226
msgid "Menu Item Permissions"
msgstr "Permisos del elemento del menú"
-#: ../../mod/mitem.php:153 ../../mod/mitem.php:224 ../../mod/settings.php:1083
+#: ../../mod/mitem.php:155 ../../mod/mitem.php:227 ../../mod/settings.php:1083
msgid "(click to open/close)"
msgstr "(pulse para abrir/cerrar)"
-#: ../../mod/mitem.php:155 ../../mod/mitem.php:171
+#: ../../mod/mitem.php:157 ../../mod/mitem.php:173
msgid "Link Name"
msgstr "Nombre del enlace"
-#: ../../mod/mitem.php:156 ../../mod/mitem.php:228
+#: ../../mod/mitem.php:158 ../../mod/mitem.php:231
msgid "Link or Submenu Target"
msgstr "Destino del enlace o submenú"
-#: ../../mod/mitem.php:156
+#: ../../mod/mitem.php:158
msgid "Enter URL of the link or select a menu name to create a submenu"
msgstr "Introduzca la dirección del enlace o seleccione el nombre de un submenú"
-#: ../../mod/mitem.php:157 ../../mod/mitem.php:229
+#: ../../mod/mitem.php:159 ../../mod/mitem.php:232
msgid "Use magic-auth if available"
msgstr "Use la autenticación mágica si está disponible"
-#: ../../mod/mitem.php:158 ../../mod/mitem.php:230
+#: ../../mod/mitem.php:160 ../../mod/mitem.php:233
msgid "Open link in new window"
msgstr "Abrir el enlace en una nueva ventana"
-#: ../../mod/mitem.php:159 ../../mod/mitem.php:231
+#: ../../mod/mitem.php:161 ../../mod/mitem.php:234
msgid "Order in list"
msgstr "Orden en la lista"
-#: ../../mod/mitem.php:159 ../../mod/mitem.php:231
+#: ../../mod/mitem.php:161 ../../mod/mitem.php:234
msgid "Higher numbers will sink to bottom of listing"
msgstr "Los números más altos irán al final de la lista"
-#: ../../mod/mitem.php:160
+#: ../../mod/mitem.php:162
msgid "Submit and finish"
msgstr "Enviar y terminar"
-#: ../../mod/mitem.php:161
+#: ../../mod/mitem.php:163
msgid "Submit and continue"
msgstr "Enviar y continuar"
-#: ../../mod/mitem.php:169
+#: ../../mod/mitem.php:171
msgid "Menu:"
msgstr "Menú:"
-#: ../../mod/mitem.php:172
+#: ../../mod/mitem.php:174
msgid "Link Target"
msgstr "Destino del enlace"
-#: ../../mod/mitem.php:175
+#: ../../mod/mitem.php:177
msgid "Edit menu"
msgstr "Editar menú"
-#: ../../mod/mitem.php:178
+#: ../../mod/mitem.php:180
msgid "Edit element"
msgstr "Editar elemento"
-#: ../../mod/mitem.php:179
+#: ../../mod/mitem.php:181
msgid "Drop element"
msgstr "Eliminar el elemento"
-#: ../../mod/mitem.php:180
+#: ../../mod/mitem.php:182
msgid "New element"
msgstr "Nuevo elemento"
-#: ../../mod/mitem.php:181
+#: ../../mod/mitem.php:183
msgid "Edit this menu container"
msgstr "Modificar el contenedor del menú"
-#: ../../mod/mitem.php:182
+#: ../../mod/mitem.php:184
msgid "Add menu element"
msgstr "Añadir un elemento al menú"
-#: ../../mod/mitem.php:183
+#: ../../mod/mitem.php:185
msgid "Delete this menu item"
msgstr "Eliminar este elemento del menú"
-#: ../../mod/mitem.php:184
+#: ../../mod/mitem.php:186
msgid "Edit this menu item"
msgstr "Modificar este elemento del menú"
-#: ../../mod/mitem.php:201
+#: ../../mod/mitem.php:203
msgid "Menu item not found."
msgstr "Este elemento del menú no se ha encontrado"
-#: ../../mod/mitem.php:212
+#: ../../mod/mitem.php:215
msgid "Menu item deleted."
msgstr "Este elemento del menú ha sido borrado"
-#: ../../mod/mitem.php:214
+#: ../../mod/mitem.php:217
msgid "Menu item could not be deleted."
msgstr "Este elemento del menú no puede ser borrado."
-#: ../../mod/mitem.php:221
+#: ../../mod/mitem.php:224
msgid "Edit Menu Element"
msgstr "Editar elemento del menú"
-#: ../../mod/mitem.php:227
+#: ../../mod/mitem.php:230
msgid "Link text"
msgstr "Texto del enlace"
@@ -5632,91 +5632,91 @@ msgstr "Fuente eliminada"
msgid "Unable to remove source."
msgstr "Imposible eliminar la fuente."
-#: ../../mod/menu.php:44
+#: ../../mod/menu.php:45
msgid "Unable to update menu."
msgstr "No se puede actualizar el menú."
-#: ../../mod/menu.php:53
+#: ../../mod/menu.php:56
msgid "Unable to create menu."
msgstr "No se puede crear el menú."
-#: ../../mod/menu.php:89 ../../mod/menu.php:101
+#: ../../mod/menu.php:92 ../../mod/menu.php:104
msgid "Menu Name"
msgstr "Nombre del menú"
-#: ../../mod/menu.php:89
+#: ../../mod/menu.php:92
msgid "Unique name (not visible on webpage) - required"
msgstr "Nombre único (no será visible en la página web) - requerido"
-#: ../../mod/menu.php:90 ../../mod/menu.php:102
+#: ../../mod/menu.php:93 ../../mod/menu.php:105
msgid "Menu Title"
msgstr "Título del menú"
-#: ../../mod/menu.php:90
+#: ../../mod/menu.php:93
msgid "Visible on webpage - leave empty for no title"
msgstr "Visible en la página web - no ponga nada si no desea un título"
-#: ../../mod/menu.php:91
+#: ../../mod/menu.php:94
msgid "Allow Bookmarks"
msgstr "Permitir marcadores"
-#: ../../mod/menu.php:91 ../../mod/menu.php:147
+#: ../../mod/menu.php:94 ../../mod/menu.php:151
msgid "Menu may be used to store saved bookmarks"
msgstr "El menú se puede usar para guardar marcadores"
-#: ../../mod/menu.php:92 ../../mod/menu.php:149
+#: ../../mod/menu.php:95 ../../mod/menu.php:153
msgid "Submit and proceed"
msgstr "Enviar y proceder"
-#: ../../mod/menu.php:104
+#: ../../mod/menu.php:107
msgid "Drop"
msgstr "Eliminar"
-#: ../../mod/menu.php:108
+#: ../../mod/menu.php:111
msgid "Bookmarks allowed"
msgstr "Marcadores permitidos"
-#: ../../mod/menu.php:110
+#: ../../mod/menu.php:113
msgid "Delete this menu"
msgstr "Borrar este menú"
-#: ../../mod/menu.php:111 ../../mod/menu.php:144
+#: ../../mod/menu.php:114 ../../mod/menu.php:148
msgid "Edit menu contents"
msgstr "Editar los contenidos del menú"
-#: ../../mod/menu.php:112
+#: ../../mod/menu.php:115
msgid "Edit this menu"
msgstr "Modificar este menú"
-#: ../../mod/menu.php:126
+#: ../../mod/menu.php:130
msgid "Menu could not be deleted."
msgstr "El menú no puede ser eliminado."
-#: ../../mod/menu.php:139
+#: ../../mod/menu.php:143
msgid "Edit Menu"
msgstr "Modificar el menú"
-#: ../../mod/menu.php:143
+#: ../../mod/menu.php:147
msgid "Add or remove entries to this menu"
msgstr "Añadir o quitar entradas en este menú"
-#: ../../mod/menu.php:145
+#: ../../mod/menu.php:149
msgid "Menu name"
msgstr "Nombre del menú"
-#: ../../mod/menu.php:145
+#: ../../mod/menu.php:149
msgid "Must be unique, only seen by you"
msgstr "Debe ser único, solo será visible para usted"
-#: ../../mod/menu.php:146
+#: ../../mod/menu.php:150
msgid "Menu title"
msgstr "Título del menú"
-#: ../../mod/menu.php:146
+#: ../../mod/menu.php:150
msgid "Menu title as seen by others"
msgstr "El título del menú tal como será visto por los demás"
-#: ../../mod/menu.php:147
+#: ../../mod/menu.php:151
msgid "Allow bookmarks"
msgstr "Permitir marcadores"
@@ -7989,7 +7989,7 @@ msgstr "Usted sea etiquetado en una publicación"
#: ../../mod/settings.php:1109
msgid "You are poked/prodded/etc. in a post"
-msgstr "Haya recibido un toque o haya sido incitado, etc. en una publicación"
+msgstr "Recibir un toque o incitación en una publicación"
#: ../../mod/settings.php:1112
msgid "Show visual notifications including:"
diff --git a/view/es/strings.php b/view/es/strings.php
index 685a3417a..749562004 100644
--- a/view/es/strings.php
+++ b/view/es/strings.php
@@ -284,7 +284,7 @@ $a->strings["Search by Date"] = "Buscar por fecha";
$a->strings["Ability to select posts by date ranges"] = "Capacidad de seleccionar entradas por rango de fechas";
$a->strings["Collections Filter"] = "Filtrado de colecciones";
$a->strings["Enable widget to display Network posts only from selected collections"] = "Habilitar la muestra de entradas eligiendo colecciones";
-$a->strings["Saved Searches"] = "Búsquedas Guardadas";
+$a->strings["Saved Searches"] = "Búsquedas guardadas";
$a->strings["Save search terms for re-use"] = "Guardar términos de búsqueda para su reutilización";
$a->strings["Network Personal Tab"] = "Pestaña de red personal";
$a->strings["Enable tab to display only Network posts that you've interacted on"] = "Habilitar una pestaña en la cual se muestren solo las entradas en las que ha participado.";
@@ -376,7 +376,7 @@ $a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s
$a->strings["[Red:Notify] %s tagged you"] = "[Red:Aviso] %s le etiquetó";
$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s le etiquetó en %3\$s";
$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]le etiquetó[/zrl].";
-$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Aviso] %1\$s ha recibido un toque";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Aviso] %1\$s le ha dado un toque";
$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s le dio un toque en %3\$s";
$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]le dio un toque[/zrl].";
$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Aviso] %s etiquetó su entrada";
@@ -1052,9 +1052,9 @@ $a->strings["Failed to remove event"] = "Error al borrar el evento";
$a->strings["Event details"] = "Detalles del evento";
$a->strings["Starting date and Title are required."] = "Se requieren fecha y título.";
$a->strings["Categories (comma-separated list)"] = "Categorías (lista separada por comas)";
-$a->strings["Event Starts:"] = "Inicios de eventos:";
+$a->strings["Event Starts:"] = "Inicio del evento:";
$a->strings["Finish date/time is not known or not relevant"] = "La fecha / hora de finalización no se conocen o no son relevantes";
-$a->strings["Event Finishes:"] = "Eventos Terminados:";
+$a->strings["Event Finishes:"] = "Finalización del evento:";
$a->strings["Adjust for viewer timezone"] = "Ajustar para obtener el visor de zona horaria";
$a->strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales.";
$a->strings["Title:"] = "Título:";
@@ -1888,7 +1888,7 @@ $a->strings["Someone writes a followup comment"] = "Alguien escriba un comentari
$a->strings["You receive a private message"] = "Reciba un mensaje privado";
$a->strings["You receive a friend suggestion"] = "Reciba una sugerencia de amistad";
$a->strings["You are tagged in a post"] = "Usted sea etiquetado en una publicación";
-$a->strings["You are poked/prodded/etc. in a post"] = "Haya recibido un toque o haya sido incitado, etc. en una publicación";
+$a->strings["You are poked/prodded/etc. in a post"] = "Recibir un toque o incitación en una publicación";
$a->strings["Show visual notifications including:"] = "Mostrar notificaciones visuales que incluyan:";
$a->strings["Unseen matrix activity"] = "Actividad no vista en la red";
$a->strings["Unseen channel activity"] = "Actividad no vista en el canal";
diff --git a/view/it/messages.po b/view/it/messages.po
index 4a0117f9d..b3f40c0ab 100644
--- a/view/it/messages.po
+++ b/view/it/messages.po
@@ -4672,7 +4672,7 @@ msgstr "Il ridimensionamento dell'immagine è fallito."
msgid ""
"Shift-reload the page or clear browser cache if the new photo does not "
"display immediately."
-msgstr "Ricarica la pagina con shift+F5 o cancella la cache del browser se la nuova foto non viene mostrata immediatamente."
+msgstr "Ricarica la pagina con shift+control+r o cancella la cache del browser se la nuova foto non viene mostrata immediatamente."
#: ../../mod/profile_photo.php:233
#, php-format
diff --git a/view/php/choklet.php b/view/php/choklet.php
index 0d8b66c29..712e8b1c3 100644
--- a/view/php/choklet.php
+++ b/view/php/choklet.php
@@ -17,8 +17,8 @@
<div id="page-footer"></div>
<div id="pause"></div>
</section>
- </main>
<aside id="region_3"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
+ </main>
<div class="clear"></div>
<footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
</div>
diff --git a/view/theme/redbasic/css/align_left.css b/view/theme/redbasic/css/align_left.css
new file mode 100644
index 000000000..acb2893e3
--- /dev/null
+++ b/view/theme/redbasic/css/align_left.css
@@ -0,0 +1,8 @@
+main {
+ margin-left: 0px;
+}
+
+aside#region_3 {
+ width: auto;
+ padding: 0px 0px 0px 0px;
+}
diff --git a/view/theme/redbasic/css/converse_center.css b/view/theme/redbasic/css/converse_center.css
deleted file mode 100644
index 9b4246a5b..000000000
--- a/view/theme/redbasic/css/converse_center.css
+++ /dev/null
@@ -1,10 +0,0 @@
-main {
- margin-left: auto;
- margin-right: auto;
-}
-
-aside#region_3 {
- width: $aside_widthpx;
- min-width: $aside_widthpx;
- max-width: $aside_widthpx;
-}
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index 0446269c7..f75808eb7 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -24,13 +24,15 @@ body {
height: 100%;
}
-aside#region_1 {
+aside {
width: $aside_widthpx;
min-width: $aside_widthpx;
max-width: $aside_widthpx;
}
main {
+ margin-left: auto;
+ margin-right: auto;
max-width: $main_widthpx;
}
@@ -199,13 +201,14 @@ nav #banner #logo-text a:hover { text-decoration: none; }
.nav-channel-select { margin-left: 8px; }
header #banner {
-/* overflow: hidden; */
- text-align: center;
- font-size: 14px;
- font-family: tahoma, "Lucida Sans", sans;
- color: $banner_colour;
- font-weight: bold;
- margin-top: 14px;
+ z-index: 1040;
+ margin-top: 14px;
+ text-align: center;
+ font-size: 14px;
+ font-family: tahoma, "Lucida Sans", sans;
+ color: $banner_colour;
+ font-weight: bold;
+ whitespace: nowrap;
}
header #banner a,
@@ -213,15 +216,17 @@ header #banner a:active,
header #banner a:visited,
header #banner a:link,
header #banner a:hover {
- color: #FFF;
- text-decoration: none;
- outline: none;
- vertical-align: bottom;
+ color: $banner_colour;
+ text-decoration: none;
+ outline: none;
+ vertical-align: bottom;
}
+
header #banner #logo-img {
height: 22px;
margin-top: 5px;
}
+
header #banner #logo-text {
font-size: 22px;
}
@@ -751,8 +756,7 @@ a.rateme, div.rateme {
}
.wall-item-conv {
- padding-top: 10px;
- padding-left: 10px;
+ padding: 7px 10px;
}
@@ -1301,17 +1305,6 @@ a.rconnect:hover, a.rateme:hover, div.rateme:hover {
padding: 0;
}
-/* header */
-header {
- position: fixed;
- left: 43%;
- right: 43%;
- margin: 0px;
- padding: 0px;
- z-index: 1040;
- color: #fff;
-}
-
.notif-item a {
color: #000;
}
diff --git a/view/theme/redbasic/php/config.php b/view/theme/redbasic/php/config.php
index fe3ea9742..6bea5bddb 100644
--- a/view/theme/redbasic/php/config.php
+++ b/view/theme/redbasic/php/config.php
@@ -31,7 +31,7 @@ function theme_content(&$a) {
$arr['radius'] = get_pconfig(local_channel(),'redbasic', 'radius' );
$arr['shadow'] = get_pconfig(local_channel(),'redbasic', 'photo_shadow' );
$arr['converse_width']=get_pconfig(local_channel(),"redbasic","converse_width");
- $arr['converse_center']=get_pconfig(local_channel(),"redbasic","converse_center");
+ $arr['align_left']=get_pconfig(local_channel(),"redbasic","align_left");
$arr['nav_min_opacity']=get_pconfig(local_channel(),"redbasic","nav_min_opacity");
$arr['top_photo']=get_pconfig(local_channel(),"redbasic","top_photo");
$arr['reply_photo']=get_pconfig(local_channel(),"redbasic","reply_photo");
@@ -68,7 +68,7 @@ function theme_post(&$a) {
set_pconfig(local_channel(), 'redbasic', 'radius', $_POST['redbasic_radius']);
set_pconfig(local_channel(), 'redbasic', 'photo_shadow', $_POST['redbasic_shadow']);
set_pconfig(local_channel(), 'redbasic', 'converse_width', $_POST['redbasic_converse_width']);
- set_pconfig(local_channel(), 'redbasic', 'converse_center', $_POST['redbasic_converse_center']);
+ set_pconfig(local_channel(), 'redbasic', 'align_left', $_POST['redbasic_align_left']);
set_pconfig(local_channel(), 'redbasic', 'nav_min_opacity', $_POST['redbasic_nav_min_opacity']);
set_pconfig(local_channel(), 'redbasic', 'top_photo', $_POST['redbasic_top_photo']);
set_pconfig(local_channel(), 'redbasic', 'reply_photo', $_POST['redbasic_reply_photo']);
@@ -79,7 +79,7 @@ function theme_post(&$a) {
function redbasic_form(&$a, $arr) {
$scheme_choices = array();
- $scheme_choices["---"] = t("Light (Hubzilla default)");
+ $scheme_choices["---"] = t("Focus (Hubzilla default)");
$files = glob('view/theme/redbasic/schema/*.php');
if($files) {
foreach($files as $file) {
@@ -126,7 +126,7 @@ if(feature_enabled(local_channel(),'expert'))
'$radius' => array('redbasic_radius', t('Set radius of corners'), $arr['radius']),
'$shadow' => array('redbasic_shadow', t('Set shadow depth of photos'), $arr['shadow']),
'$converse_width' => array('redbasic_converse_width',t('Set maximum width of content region in pixel'),$arr['converse_width'], t('Leave empty for default width')),
- '$converse_center' => array('redbasic_converse_center',t('Center page content'),$arr['converse_center'], '', array(t('No'),t('Yes'))),
+ '$align_left' => array('redbasic_align_left',t('Left align page content'),$arr['align_left'], '', array(t('No'),t('Yes'))),
'$nav_min_opacity' => array('redbasic_nav_min_opacity',t('Set minimum opacity of nav bar - to hide it'),$arr['nav_min_opacity']),
'$top_photo' => array('redbasic_top_photo', t('Set size of conversation author photo'), $arr['top_photo']),
'$reply_photo' => array('redbasic_reply_photo', t('Set size of followup author photos'), $arr['reply_photo']),
diff --git a/view/theme/redbasic/php/style.php b/view/theme/redbasic/php/style.php
index f542e8e12..a0da5e302 100644
--- a/view/theme/redbasic/php/style.php
+++ b/view/theme/redbasic/php/style.php
@@ -36,7 +36,7 @@ if(! $a->install) {
$radius = get_pconfig($uid, "redbasic", "radius");
$shadow = get_pconfig($uid,"redbasic","photo_shadow");
$converse_width=get_pconfig($uid,"redbasic","converse_width");
- $converse_center=get_pconfig($uid,"redbasic","converse_center");
+ $align_left=get_pconfig($uid,"redbasic","align_left");
$nav_min_opacity=get_pconfig($uid,'redbasic','nav_min_opacity');
$top_photo=get_pconfig($uid,'redbasic','top_photo');
$reply_photo=get_pconfig($uid,'redbasic','reply_photo');
@@ -156,12 +156,12 @@ if(file_exists('view/theme/redbasic/css/style.css')) {
$aside_width = 285;
- // left aside and right aside are is 231px + converse width
- if($converse_center) {
- $main_width = (($aside_width * 2) + intval($converse_width));
+ // left aside and right aside are 285px + converse width
+ if($align_left) {
+ $main_width = (($aside_width) + intval($converse_width));
}
else {
- $main_width = (($aside_width) + intval($converse_width));
+ $main_width = (($aside_width * 2) + intval($converse_width));
}
// prevent main_width smaller than 768px
$main_width = (($main_width < 768) ? 768 : $main_width);
@@ -209,9 +209,8 @@ if($narrow_navbar && file_exists('view/theme/redbasic/css/narrow_navbar.css')) {
echo file_get_contents('view/theme/redbasic/css/narrow_navbar.css');
}
-if($converse_center && file_exists('view/theme/redbasic/css/converse_center.css')) {
- $cc = file_get_contents('view/theme/redbasic/css/converse_center.css');
- echo str_replace(array_keys($options), array_values($options), $cc);
+if($align_left && file_exists('view/theme/redbasic/css/align_left.css')) {
+ echo file_get_contents('view/theme/redbasic/css/align_left.css');
}
if($schemecss) {
diff --git a/view/theme/redbasic/schema/dark.php b/view/theme/redbasic/schema/dark.php
index 92e703325..af4b122f1 100644
--- a/view/theme/redbasic/schema/dark.php
+++ b/view/theme/redbasic/schema/dark.php
@@ -34,5 +34,8 @@
$toolicon_activecolour = '#fff';
if (! $font_colour)
$font_colour = "#ccc";
+ if (! $converse_width)
+ $converse_width = "1024";
+
diff --git a/view/theme/redbasic/schema/simple_black_on_white.php b/view/theme/redbasic/schema/simple_black_on_white.php
index 6853a0ed5..554e832f0 100644
--- a/view/theme/redbasic/schema/simple_black_on_white.php
+++ b/view/theme/redbasic/schema/simple_black_on_white.php
@@ -34,6 +34,9 @@
$comment_border_colour = "rgba(255,255,255,0.8)";
if (! $font_colour)
$font_colour = "#000";
+ if (! $converse_width)
+ $converse_width = "1024";
+
diff --git a/view/theme/redbasic/schema/simple_green_on_black.php b/view/theme/redbasic/schema/simple_green_on_black.php
index 2660624d6..8192180db 100644
--- a/view/theme/redbasic/schema/simple_green_on_black.php
+++ b/view/theme/redbasic/schema/simple_green_on_black.php
@@ -34,3 +34,5 @@
$comment_border_colour = "rgba(0,0,0,0.8)";
if (! $font_colour)
$font_colour = "#46D43F";
+ if (! $converse_width)
+ $converse_width = "1024";
diff --git a/view/theme/redbasic/schema/simple_white_on_black.php b/view/theme/redbasic/schema/simple_white_on_black.php
index a76709ac9..b64f60bbe 100644
--- a/view/theme/redbasic/schema/simple_white_on_black.php
+++ b/view/theme/redbasic/schema/simple_white_on_black.php
@@ -34,3 +34,5 @@
$comment_border_colour = "rgba(0,0,0,0.8)";
if (! $font_colour)
$font_colour = "#fff";
+ if (! $converse_width)
+ $converse_width = "1024";
diff --git a/view/theme/redbasic/tpl/theme_settings.tpl b/view/theme/redbasic/tpl/theme_settings.tpl
index 8a4fc666e..4f5b69beb 100644
--- a/view/theme/redbasic/tpl/theme_settings.tpl
+++ b/view/theme/redbasic/tpl/theme_settings.tpl
@@ -1,4 +1,7 @@
{{include file="field_select.tpl" field=$schema}}
+{{include file="field_checkbox.tpl" field=$align_left}}
+{{include file="field_checkbox.tpl" field=$narrow_navbar}}
+{{include file="field_input.tpl" field=$converse_width}}
{{if $expert}}
{{include file="field_colorinput.tpl" field=$nav_bg}}
{{include file="field_colorinput.tpl" field=$nav_gradient_top}}
@@ -26,11 +29,7 @@
{{include file="field_input.tpl" field=$shadow}}
{{include file="field_input.tpl" field=$top_photo}}
{{include file="field_input.tpl" field=$reply_photo}}
-{{/if}}
-{{include file="field_input.tpl" field=$converse_width}}
-{{include file="field_checkbox.tpl" field=$converse_center}}
-{{include file="field_checkbox.tpl" field=$narrow_navbar}}
-{{if $expert}}
+
<script>
$(function(){
$('#id_redbasic_nav_bg,#id_redbasic_nav_gradient_top,#id_redbasic_nav_gradient_bottom,#id_redbasic_nav_active_gradient_top,#id_redbasic_nav_active_gradient_bottom').colorpicker({format: 'rgba'});
diff --git a/view/tpl/admin_users.tpl b/view/tpl/admin_users.tpl
index f372911a0..8a4b772a8 100755
--- a/view/tpl/admin_users.tpl
+++ b/view/tpl/admin_users.tpl
@@ -5,8 +5,8 @@
function confirm_delete_multi(){
return confirm("{{$confirm_delete_multi}}");
}
- function selectall(cls){
- $("."+cls).attr('checked','checked');
+ function toggle_selectall(cls){
+ $("."+cls).prop("checked", !$("."+cls).prop("checked"));
return false;
}
</script>
@@ -40,7 +40,7 @@
{{/foreach}}
</tbody>
</table>
- <div class="selectall"><a href="#" onclick="return selectall('pending_ckbx');">{{$select_all}}</a></div>
+ <div class="selectall"><a href="#" onclick="return toggle_selectall('pending_ckbx');">{{$select_all}}</a></div>
<div class="submit"><input type="submit" name="page_users_deny" value="{{$deny}}"> <input type="submit" name="page_users_approve" value="{{$approve}}"></div>
{{else}}
<p>{{$no_pending}}</p>
@@ -79,10 +79,10 @@
{{/foreach}}
</tbody>
</table>
- <div class="selectall"><a href="#" onclick="return selectall('users_ckbx');">{{$select_all}}</a></div>
+ <div class="selectall"><a href="#" onclick="return toggle_selectall('users_ckbx');">{{$select_all}}</a></div>
<div class="submit"><input type="submit" name="page_users_block" value="{{$block}}/{{$unblock}}"> <input type="submit" name="page_users_delete" value="{{$delete}}" onclick="return confirm_delete_multi()"></div>
{{else}}
NO USERS?!?
{{/if}}
</form>
-</div> \ No newline at end of file
+</div>
diff --git a/view/tpl/locmanage.tpl b/view/tpl/locmanage.tpl
index 40f91a8bb..944b3c3f4 100644
--- a/view/tpl/locmanage.tpl
+++ b/view/tpl/locmanage.tpl
@@ -17,7 +17,7 @@ function drophub(id) {
{{$hub.hubloc_url}} ({{$hub.hubloc_addr}}){{if $hub.deleted}}</strike>{{/if}}</td>
<td>
-{{if $hub.primary}}<i class="icon-check"></i>{{else}}<button class="btn btn-std" onclick="primehub({{$hub.hubloc_id}}); return false;" ><i class="icon-check-empty" ></i></button>{{/if}}
+{{if $hub.primary}}<button class="btn btn-std"><i class="icon-check"></i></button>{{else}}<button class="btn btn-std" onclick="primehub({{$hub.hubloc_id}}); return false;" ><i class="icon-check-empty" ></i></button>{{/if}}
</td>
<td>{{if $hub.primary}}{{else}}{{if ! $hub.deleted}}<button class="btn btn-std" onclick="drophub({{$hub.hubloc_id}}); return false;"><i class="icon-trash"></i></button>{{/if}}{{/if}}</td>
</tr>
diff --git a/view/tpl/mail_display.tpl b/view/tpl/mail_display.tpl
index 523a9160a..062710f1d 100755
--- a/view/tpl/mail_display.tpl
+++ b/view/tpl/mail_display.tpl
@@ -1,12 +1,16 @@
-<h3>{{$prvmsg_header}}</h3>
<div class="generic-content-wrapper">
-{{foreach $mails as $mail}}
- {{include file="mail_conv.tpl"}}
-{{/foreach}}
+ <div class="section-title-wrapper">
+ <h2>{{$prvmsg_header}}</h2>
+ </div>
+ <div class="section-content-wrapper">
+ {{foreach $mails as $mail}}
+ {{include file="mail_conv.tpl"}}
+ {{/foreach}}
-{{if $canreply}}
-{{include file="prv_message.tpl"}}
-{{else}}
-{{$unknown_text}}
-{{/if}}
+ {{if $canreply}}
+ {{include file="prv_message.tpl"}}
+ {{else}}
+ {{$unknown_text}}
+ {{/if}}
+ </div>
</div>
diff --git a/view/tpl/mail_head.tpl b/view/tpl/mail_head.tpl
index 1cd7145e7..7bc854fff 100755
--- a/view/tpl/mail_head.tpl
+++ b/view/tpl/mail_head.tpl
@@ -1,3 +1,10 @@
-<h3>{{$messages}}</h3>
-
-{{$tab_content}}
+<div class="generic-content-wrapper">
+ <div class="section-title-wrapper">
+ <h2>{{$header}}</h2>
+ </div>
+ <div class="section-content-wrapper">
+ {{foreach $messages as $message}}
+ {{include file="mail_list.tpl"}}
+ {{/foreach}}
+ </div>
+</div>
diff --git a/view/tpl/mail_list.tpl b/view/tpl/mail_list.tpl
index 1d499e12f..e3f8ef75c 100755
--- a/view/tpl/mail_list.tpl
+++ b/view/tpl/mail_list.tpl
@@ -1,8 +1,6 @@
-<div class="generic-content-wrapper" id="mail-list-wrapper">
- <a href="{{$from_url}}" class ="mail-list" ><img class="mail-list-sender-photo" src="{{$from_photo}}" alt="{{$from_name}}" /></a>
- <span class="mail-list">{{$from_name}}</span>
- <span class="mail-list {{if $seen}}seen{{else}}unseen{{/if}}"><a href="mail/{{$id}}" class="mail-link">{{$subject}}</a></span>
- <span class="mail-list" title="{{$date}}">{{$date}}</span>
- <span class="mail-list mail-list-remove" class="btn btn-default btn-sm"><a href="message/dropconv/{{$id}}" onclick="return confirmDelete();" title="{{$delete}}" class="btn btn-default btn-sm" ><i class="icon-trash mail-icons drop-icons"></i></a></span>
- <div class="clear">&nbsp;</div>
-</div>
+<a href="{{$message.from_url}}" class ="mail-list" ><img class="mail-list-sender-photo" src="{{$message.from_photo}}" alt="{{$message.from_name}}" /></a>
+<span class="mail-list">{{$message.from_name}}</span>
+<span class="mail-list {{if $message.seen}}seen{{else}}unseen{{/if}}"><a href="mail/{{$message.id}}" class="mail-link">{{$message.subject}}</a></span>
+<span class="mail-list" title="{{$message.date}}">{{$message.date}}</span>
+<span class="mail-list mail-list-remove" class="btn btn-default btn-sm"><a href="message/dropconv/{{$message.id}}" onclick="return confirmDelete();" title="{{$message.delete}}" class="btn btn-default btn-sm" ><i class="icon-trash mail-icons drop-icons"></i></a></span>
+<div class="clear"></div>
diff --git a/view/tpl/photo_view.tpl b/view/tpl/photo_view.tpl
index f5ff23700..225b4f6b0 100755
--- a/view/tpl/photo_view.tpl
+++ b/view/tpl/photo_view.tpl
@@ -15,7 +15,7 @@
<i class="icon-pencil btn btn-default btn-xs" title="{{$edit.edit}}" onclick="openClose('photo-edit');"></i>
{{/if}}
{{if $lock}}
- <i id="lockview" class="icon-lock btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" title="{{$lock}}" onclick="lockview('item',{{$id}});" ></i><ul id="panel-{{$id}}" class="lockview-panel dropdown-menu"></ul>
+ <i id="lockview" class="icon-lock btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" title="{{$lock}}" onclick="lockview('photo',{{$id}});" ></i><ul id="panel-{{$id}}" class="lockview-panel dropdown-menu"></ul>
{{/if}}
</div>
<div class="btn-group btn-group">
diff --git a/view/tpl/siteinfo.tpl b/view/tpl/siteinfo.tpl
index 3b0c8841c..0b16f5602 100755
--- a/view/tpl/siteinfo.tpl
+++ b/view/tpl/siteinfo.tpl
@@ -10,6 +10,7 @@
{{if $polled}}
<p>{{$polled}} {{$lastpoll}}</p>
{{/if}}
+<p>{{$load_average}} {{$loadavg_all}}</p>
<p>{{$web_location}}</p>
<p>{{$visit}}</p>
<p>{{$bug_text}} <a href="{{$bug_link_url}}">{{$bug_link_text}}</a></p>
diff --git a/view/tpl/xrd_host.tpl b/view/tpl/xrd_host.tpl
index 57f383788..2a40dcf47 100755
--- a/view/tpl/xrd_host.tpl
+++ b/view/tpl/xrd_host.tpl
@@ -4,7 +4,7 @@
<hm:Host>{{$zhost}}</hm:Host>
- <Link rel='lrdd' template='{{$zroot}}/xrd/?uri={uri}' />
+ <Link rel='lrdd' type="application/xrd+xml" template='{{$zroot}}/xrd/?uri={uri}' />
<Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml"
href="{{$zroot}}/oexchange/xrd" />