Merge branch 'master' into HEAD
Conflicts: public/stylesheets/application.css
This commit is contained in:
commit
ec9e180eab
312 changed files with 6834 additions and 2176 deletions
14
.gitignore
vendored
14
.gitignore
vendored
|
|
@ -1,15 +1,21 @@
|
|||
.bundle
|
||||
.DS_Store
|
||||
.idea
|
||||
.rvmrc
|
||||
*.swap
|
||||
*.swp
|
||||
*.swo
|
||||
*.swp
|
||||
*~
|
||||
.bundle
|
||||
bin/*
|
||||
config/app_config.yml
|
||||
config/fb_config.yml
|
||||
config/initializers/secret_token.rb
|
||||
db/*.sqlite3
|
||||
log/*
|
||||
tmp/**/*
|
||||
nbproject
|
||||
gpg/diaspora-development/*.gpg
|
||||
gpg/diaspora-production/*.gpg
|
||||
gpg/*/random_seed
|
||||
public/uploads/*
|
||||
.rvmrc
|
||||
public/source.tar
|
||||
tmp/**/*
|
||||
|
|
|
|||
24
COPYRIGHT
24
COPYRIGHT
|
|
@ -1 +1,23 @@
|
|||
Diaspora is copyright Diaspora Inc., 2010, and files herein are licensed under the Affero General Public License version 3, the text of which can be found in GNU-AGPL-3.0, unless otherwise noted. Components of Diaspora, including Rails, JQuery, and Devise, are licensed under the MIT/X11 license. Blueprint-CSS is licensed under a modified version of the MIT/X11 license. All unmodified files from these and other sources retain their original copyright and license notices: see the relevant individual files. Attribution information for Diaspora is contained in the AUTHORS file.
|
||||
Diaspora is copyright Diaspora Inc., 2010, and files herein are licensed
|
||||
under the Affero General Public License version 3, the text of which can
|
||||
be found in GNU-AGPL-3.0, or any later version of the AGPL, unless otherwise
|
||||
noted. Components of Diaspora, including Rails, JQuery, and Devise, are
|
||||
licensed under the MIT/X11 license. Blueprint-CSS is licensed under a
|
||||
modified version of the MIT/X11 license. All unmodified files from these
|
||||
and other sources retain their original copyright and license notices: see
|
||||
the relevant individual files. Attribution information for Diaspora is
|
||||
contained in the AUTHORS file.
|
||||
|
||||
In addition, as a special exception, the copyright holders give
|
||||
permission to link the code of portions of this program with the
|
||||
OpenSSL library under certain conditions as described in each
|
||||
individual source file, and distribute linked combinations
|
||||
including the two.
|
||||
|
||||
You must obey the GNU Affero General Public License V3 or later in all respects
|
||||
for all of the code used other than OpenSSL or the components mentioned
|
||||
above. If you modify file(s) with this exception, you may extend this
|
||||
exception to your version of the file(s), but you are not obligated to
|
||||
do so. If you do not wish to do so, delete this exception statement from your
|
||||
version. If you delete this exception statement from all source files in the
|
||||
program, then also delete it here.
|
||||
|
|
|
|||
2
Capfile
2
Capfile
|
|
@ -2,8 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
|
||||
load 'deploy' if respond_to?(:namespace) # cap2 differentiator
|
||||
Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
|
||||
|
||||
|
|
|
|||
20
Gemfile
20
Gemfile
|
|
@ -1,15 +1,13 @@
|
|||
source 'http://rubygems.org'
|
||||
|
||||
gem 'rails', '3.0.0'
|
||||
gem 'bundler', '1.0.0'
|
||||
|
||||
gem 'bundler', '>= 1.0.0'
|
||||
|
||||
#Security
|
||||
gem 'devise', :git => 'http://github.com/BadMinus/devise.git'
|
||||
|
||||
#Mongo
|
||||
gem 'mongo_mapper', '0.8.4', :git => 'http://github.com/jnunemaker/mongomapper.git'
|
||||
gem 'jnunemaker-validatable', '1.8.4', :git => 'http://github.com/jnunemaker/validatable.git'
|
||||
gem 'mongo_mapper', :branch => 'rails3', :git => 'http://github.com/jnunemaker/mongomapper.git'
|
||||
gem 'bson_ext', '1.0.7'
|
||||
gem 'bson', '1.0.7'
|
||||
|
||||
|
|
@ -21,6 +19,7 @@ gem 'will_paginate', '3.0.pre2'
|
|||
gem 'roxml', :git => 'git://github.com/Empact/roxml.git'
|
||||
gem 'addressable', :require => 'addressable/uri'
|
||||
gem 'json'
|
||||
gem 'mini_fb'
|
||||
|
||||
#Standards
|
||||
gem 'pubsubhubbub'
|
||||
|
|
@ -40,24 +39,23 @@ gem 'mini_magick'
|
|||
|
||||
group :test, :development do
|
||||
gem 'factory_girl_rails'
|
||||
gem 'ruby-debug' if RUBY_VERSION.include? "1.8"
|
||||
end
|
||||
|
||||
group :test do
|
||||
gem 'rspec', '>= 2.0.0.beta.17'
|
||||
gem 'rspec-rails', '2.0.0.beta.17'
|
||||
gem 'capybara', '~> 0.3.9'
|
||||
gem 'cucumber-rails', '0.3.2'
|
||||
gem 'rspec', '>= 2.0.0.beta.17'
|
||||
gem 'rspec-rails', '2.0.0.beta.17'
|
||||
gem 'mocha'
|
||||
gem 'webrat', '0.7.2.beta.1'
|
||||
gem 'redgreen'
|
||||
gem 'redgreen' if RUBY_VERSION.include? "1.8"
|
||||
gem 'autotest'
|
||||
gem 'database_cleaner'
|
||||
gem 'saucelabs-adapter', '= 0.8.12'
|
||||
gem 'selenium-rc'
|
||||
gem 'webmock'
|
||||
end
|
||||
|
||||
group :development do
|
||||
gem 'nifty-generators'
|
||||
gem 'ruby-debug'
|
||||
end
|
||||
|
||||
group :deployment do
|
||||
|
|
|
|||
68
Gemfile.lock
68
Gemfile.lock
|
|
@ -57,20 +57,14 @@ GIT
|
|||
|
||||
GIT
|
||||
remote: http://github.com/jnunemaker/mongomapper.git
|
||||
revision: 931dab779011aa7acf60c1a4c7ad19e1ba838345
|
||||
revision: b0eac421ef5b3bee782e15d391eca372a189d414
|
||||
branch: rails3
|
||||
specs:
|
||||
mongo_mapper (0.8.4)
|
||||
activesupport (>= 2.3.4)
|
||||
jnunemaker-validatable (~> 1.8.4)
|
||||
activemodel (~> 3.0.0)
|
||||
activesupport (~> 3.0.0)
|
||||
plucky (~> 0.3.5)
|
||||
|
||||
GIT
|
||||
remote: http://github.com/jnunemaker/validatable.git
|
||||
revision: 8d7c3ce14133760e748a0e34b99dfe6ec4d69153
|
||||
specs:
|
||||
jnunemaker-validatable (1.8.4)
|
||||
activesupport (>= 2.3.4)
|
||||
|
||||
GEM
|
||||
remote: http://rubygems.org/
|
||||
specs:
|
||||
|
|
@ -115,8 +109,24 @@ GEM
|
|||
net-sftp (>= 2.0.0)
|
||||
net-ssh (>= 2.0.14)
|
||||
net-ssh-gateway (>= 1.0.0)
|
||||
capybara (0.3.9)
|
||||
culerity (>= 0.2.4)
|
||||
mime-types (>= 1.16)
|
||||
nokogiri (>= 1.3.3)
|
||||
rack (>= 1.0.0)
|
||||
rack-test (>= 0.5.4)
|
||||
selenium-webdriver (>= 0.0.3)
|
||||
columnize (0.3.1)
|
||||
crack (0.1.8)
|
||||
cucumber (0.9.0)
|
||||
builder (~> 2.1.2)
|
||||
diff-lcs (~> 1.1.2)
|
||||
gherkin (~> 2.2.2)
|
||||
json (~> 1.4.6)
|
||||
term-ansicolor (~> 1.0.5)
|
||||
cucumber-rails (0.3.2)
|
||||
cucumber (>= 0.8.0)
|
||||
culerity (0.2.12)
|
||||
daemons (1.1.0)
|
||||
database_cleaner (0.5.2)
|
||||
diff-lcs (1.1.2)
|
||||
|
|
@ -130,18 +140,27 @@ GEM
|
|||
factory_girl_rails (1.0)
|
||||
factory_girl (~> 1.3)
|
||||
rails (>= 3.0.0.beta4)
|
||||
ffi (0.6.3)
|
||||
rake (>= 0.8.7)
|
||||
gherkin (2.2.4)
|
||||
json (~> 1.4.6)
|
||||
term-ansicolor (~> 1.0.5)
|
||||
trollop (~> 1.16.2)
|
||||
haml (3.0.18)
|
||||
hashie (0.4.0)
|
||||
highline (1.6.1)
|
||||
i18n (0.4.1)
|
||||
json (1.4.6)
|
||||
json_pure (1.4.6)
|
||||
linecache (0.43)
|
||||
lsof (0.3.0)
|
||||
mail (2.2.6.1)
|
||||
activesupport (>= 2.3.6)
|
||||
mime-types
|
||||
treetop (>= 1.4.5)
|
||||
mime-types (1.16)
|
||||
mini_fb (1.1.3)
|
||||
hashie
|
||||
rest-client
|
||||
mini_magick (2.1)
|
||||
subexec (~> 0.0.4)
|
||||
mocha (0.9.8)
|
||||
|
|
@ -203,16 +222,13 @@ GEM
|
|||
ruby-debug-base (~> 0.10.3.0)
|
||||
ruby-debug-base (0.10.3)
|
||||
linecache (>= 0.3)
|
||||
saucelabs-adapter (0.8.12)
|
||||
lsof (>= 0.3.0)
|
||||
net-ssh (>= 2.0.12)
|
||||
net-ssh-gateway (>= 1.0.1)
|
||||
rest-client (>= 1.2.0)
|
||||
selenium-client (>= 1.2.17)
|
||||
selenium-client (1.2.18)
|
||||
selenium-rc (2.2.4)
|
||||
selenium-client (>= 1.2.18)
|
||||
rubyzip (0.9.4)
|
||||
selenium-webdriver (0.0.28)
|
||||
ffi (>= 0.6.1)
|
||||
json_pure
|
||||
rubyzip
|
||||
subexec (0.0.4)
|
||||
term-ansicolor (1.0.5)
|
||||
thin (1.2.7)
|
||||
daemons (>= 1.0.9)
|
||||
eventmachine (>= 0.12.6)
|
||||
|
|
@ -220,6 +236,7 @@ GEM
|
|||
thor (0.14.0)
|
||||
treetop (1.4.8)
|
||||
polyglot (>= 0.3.1)
|
||||
trollop (1.16.2)
|
||||
tzinfo (0.3.23)
|
||||
uuidtools (2.1.1)
|
||||
warden (0.10.7)
|
||||
|
|
@ -241,20 +258,22 @@ DEPENDENCIES
|
|||
autotest
|
||||
bson (= 1.0.7)
|
||||
bson_ext (= 1.0.7)
|
||||
bundler (= 1.0.0)
|
||||
bundler (>= 1.0.0)
|
||||
capybara (~> 0.3.9)
|
||||
carrierwave!
|
||||
cucumber-rails (= 0.3.2)
|
||||
database_cleaner
|
||||
devise!
|
||||
em-http-request!
|
||||
em-websocket
|
||||
factory_girl_rails
|
||||
haml
|
||||
jnunemaker-validatable (= 1.8.4)!
|
||||
json
|
||||
magent!
|
||||
mini_fb
|
||||
mini_magick
|
||||
mocha
|
||||
mongo_mapper (= 0.8.4)!
|
||||
mongo_mapper!
|
||||
nifty-generators
|
||||
pubsubhubbub
|
||||
rails (= 3.0.0)
|
||||
|
|
@ -264,10 +283,7 @@ DEPENDENCIES
|
|||
rspec (>= 2.0.0.beta.17)
|
||||
rspec-rails (= 2.0.0.beta.17)
|
||||
ruby-debug
|
||||
saucelabs-adapter (= 0.8.12)
|
||||
selenium-rc
|
||||
sprinkle!
|
||||
thin
|
||||
webmock
|
||||
webrat (= 0.7.2.beta.1)
|
||||
will_paginate (= 3.0.pre2)
|
||||
|
|
|
|||
261
README.md
261
README.md
|
|
@ -1,241 +1,66 @@
|
|||
## Commit Guidlines
|
||||
You are welcome to contribute, add and extend Diaspora however you see fit. We will do our best to incorporate everything that meets our guidelines.
|
||||
|
||||
We need you to fill out a [contributor agreement form](https://spreadsheets.google.com/a/joindiaspora.com/viewform?formkey=dGI2cHA3ZnNHLTJvbm10LUhXRTJjR0E6MQ&theme=0AX42CRMsmRFbUy1iOGYwN2U2Mi1hNWU0LTRlNjEtYWMyOC1lZmU4ODg1ODc1ODI&ifq) before we can accept your patches. The agreement gives Diaspora joint ownership of the patch so the copyright isn't scattered. You can find it [here](https://spreadsheets.google.com/a/joindiaspora.com/viewform?formkey=dGI2cHA3ZnNHLTJvbm10LUhXRTJjR0E6MQ&theme=0AX42CRMsmRFbUy1iOGYwN2U2Mi1hNWU0LTRlNjEtYWMyOC1lZmU4ODg1ODc1ODI&ifq).
|
||||
|
||||
All commits must be tested, and after each commit, all tests should be green before a pull request is sent. Please write your tests in Rspec.
|
||||
|
||||
GEMS: We would like to keep external dependencies unduplicated. We're using Nokogiri, and Mongomapper, and EM::HttpRequest as much as possible. We have a few gems in the project we'd rather not use, but if you can, use dependencies we already have.
|
||||
|
||||
# Diaspora
|
||||
|
||||
The privacy aware, personally controlled, do-it-all, open source social network.
|
||||
The privacy aware, personally controlled, do-it-all, open source social
|
||||
network.
|
||||
|
||||
**DISCLAIMER: THIS IS PRE-ALPHA SOFTWARE AND SHOULD BE TREATED ACCORDINGLY.**
|
||||
**PLEASE, DO NOT RUN IN PRODUCTION. IT IS FUN TO GET RUNNING, BUT EXPECT THINGS TO BE BROKEN**
|
||||
**PLEASE, DO NOT RUN IN PRODUCTION. IT IS FUN TO GET RUNNING, BUT EXPECT THINGS
|
||||
TO BE BROKEN**
|
||||
|
||||
Also, we really want to continue to focus on features and improving the code base. When we think it is
|
||||
ready for general use, we will post more detailed instructions.
|
||||
Initial installation instructions are [here](http://github.com/diaspora/diaspora/wiki/Installing-and-Running-Diaspora).
|
||||
|
||||
We are continuing to build features and improve the code base.
|
||||
When we think it is ready for general use, we will post more final
|
||||
instructions.
|
||||
|
||||
## Commit Guidlines
|
||||
|
||||
These instructions are for machines running [Ubuntu](http://www.ubuntu.com/), [Fedora](http://www.fedoraproject.org) or Mac OS X. We are developing Diaspora for the latest and greatest browsers, so please update your Firefox, Chrome or Safari to the latest and greatest.
|
||||
You are welcome to contribute, add to and extend Diaspora however you see fit. We
|
||||
will do our best to incorporate everything that meets our guidelines.
|
||||
|
||||
## Preparing your system
|
||||
In order to run Diaspora, you will need to download the following dependencies (specific instructions follow):
|
||||
Please make your changes on a topic branch in your repo and submit your pull request
|
||||
from there, so that commits you don't want to submit aren't included.
|
||||
|
||||
- Build Tools - Packages needed to compile the components that follow.
|
||||
- [Ruby](http://www.ruby-lang.org) - The Ruby programming language. (We're using **1.8.7**. It comes preinstalled on Mac OS X.)
|
||||
- [MongoDB](http://www.mongodb.org) - A snappy noSQL database.
|
||||
- [OpenSSL](http://www.openssl.org/) - An encryption library. (It comes preinstalled on Mac OS X and Ubuntu.)
|
||||
- [ImageMagick](http://www.imagemagick.org/) - An Image processing library used to resize uploaded photos.
|
||||
- [Git](http://git-scm.com/) - The fast version control system.
|
||||
Please do not rebase our tree into yours.
|
||||
See [here](http://www.mail-archive.com/dri-devel@lists.sourceforge.net/msg39091.html)
|
||||
for when to rebase.
|
||||
|
||||
After you have Ruby installed on your system, you will need to get RubyGems, then install Bundler:
|
||||
All commits must be tested, and all your tests should be green
|
||||
before a pull request is sent. Please write your tests in Rspec.
|
||||
|
||||
- [RubyGems](http://rubygems.org/) - Source for Ruby gems.
|
||||
- [Bundler](http://gembundler.com/) - Gem management tool for Ruby projects.
|
||||
GEMS: We would like to keep external dependencies unduplicated. We're using
|
||||
Nokogiri, Mongomapper, and EM::HttpRequest as much as possible. We have a few
|
||||
gems in the project we'd rather not use, but if you can, use dependencies we
|
||||
already have.
|
||||
|
||||
**We suggest using a package management system to download these dependencies. Trust us, it's going to make your life a lot easier. If you're using Mac OS X, you can use [homebrew](http://mxcl.github.com/homebrew/); if you're using Ubuntu, just use [Synaptic](http://www.nongnu.org/synaptic/) (it comes pre-installed); if you're using Fedora simply use [yum](http://yum.baseurl.org/). The instructions below assume you have these installed.**
|
||||
|
||||
### Build Tools
|
||||
|
||||
To install build tools on **Ubuntu**, run the following (includes the gcc and xml parsing dependencies):
|
||||
|
||||
sudo apt-get install build-essential libxslt1.1 libxslt1-dev libxml2
|
||||
|
||||
To install build tools on **Fedora**, run the following:
|
||||
|
||||
sudo yum install libxslt libxslt-devel libxml2 libxml2-devel
|
||||
|
||||
To install build tools on **Mac OS X**, you need to download and install [Xcode](http://developer.apple.com/technologies/tools/xcode.html).
|
||||
|
||||
### Ruby
|
||||
|
||||
To install Ruby 1.8.7 on **Ubuntu**, run the following command:
|
||||
|
||||
sudo apt-get install ruby-full
|
||||
|
||||
Please note that you need to have Universe enabled in your /etc/apt/sources.list file to install ruby using apt-get.
|
||||
|
||||
At this time Fedora does not have Ruby 1.8.7. As a workaround it is possible to use [rvm](http://rvm.beginrescueend.com/) with a locally compiled Ruby installation. A semi automated method for doing this is available. It is highly recommended that you review the script before running it so you understand what will occur. The script can be executed by running the following command:
|
||||
|
||||
./script/bootstrap-fedora-diaspora.sh
|
||||
|
||||
After reviewing and executing the above script you will need to follow the "MongoDB" section and then you should skip all the way down to "Start Mongo".
|
||||
|
||||
|
||||
If you're on **Mac OS X**, you already have Ruby on your system. Yay!
|
||||
|
||||
### MongoDB
|
||||
|
||||
To install MongoDB on **Ubuntu**, add the official MongoDB repository from this link:
|
||||
|
||||
http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages
|
||||
|
||||
For Lucid, add the following line to your /etc/apt/sources.list (for other distros, see http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages):
|
||||
|
||||
deb http://downloads.mongodb.org/distros/ubuntu 10.4 10gen
|
||||
|
||||
And then run:
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
|
||||
sudo apt-get update
|
||||
sudo apt-get install mongodb-stable
|
||||
|
||||
You can also run the binary directly by doing the following:
|
||||
|
||||
If you're running a 32-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.2.tgz`. If you're running a 64-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.2.tgz`.
|
||||
|
||||
# extract
|
||||
tar xzf mongodb-linux-i686-1.4.0.tgz
|
||||
# create the required data directory
|
||||
sudo mkdir -p /data/db
|
||||
sudo chmod -Rv 777 /data/
|
||||
|
||||
|
||||
To install MongoDB on a x86_64 **Fedora** system, add the official MongoDB repository from MongoDB (http://www.mongodb.org/display/DOCS/CentOS+and+Fedora+Packages) into /etc/yum.repos.d/10gen.repo:
|
||||
|
||||
[10gen]
|
||||
name=10gen Repository
|
||||
baseurl=http://downloads.mongodb.org/distros/fedora/13/os/x86_64/
|
||||
gpgcheck=0
|
||||
enabled=1
|
||||
|
||||
|
||||
Then use yum to install the packages:
|
||||
|
||||
sudo yum install mongo-stable mongo-stable-server
|
||||
|
||||
|
||||
If you're running a 32-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.2.tgz`. If you're running a 64-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.2.tgz`.
|
||||
|
||||
# extract
|
||||
tar xzf mongodb-linux-i686-1.4.0.tgz
|
||||
# create the required data directory
|
||||
sudo mkdir -p /data/db
|
||||
sudo chmod -Rv 777 /data/
|
||||
|
||||
|
||||
To install MongoDB on **Mac OS X**, run the following:
|
||||
|
||||
brew install mongo
|
||||
sudo mkdir -p /data/db
|
||||
sudo chmod -Rv 777 /data/
|
||||
|
||||
### OpenSSL
|
||||
|
||||
If you're running either **Ubuntu**, **Fedora** or **Mac OS X** you already have OpenSSL installed!
|
||||
|
||||
### ImageMagick
|
||||
|
||||
To install ImageMagick on **Ubuntu**, run the following:
|
||||
|
||||
sudo apt-get install imagemagick libmagick9-dev
|
||||
|
||||
To install ImageMagick on **Fedora**, run the following:
|
||||
|
||||
sudo yum install ImageMagick
|
||||
|
||||
To install ImageMagick on **Mac OS X**, run the following:
|
||||
|
||||
brew install imagemagick
|
||||
|
||||
### Git
|
||||
|
||||
To install Git on **Ubuntu**, run the following:
|
||||
|
||||
sudo apt-get install git-core
|
||||
|
||||
To install Git on **Fedora**, run the following:
|
||||
|
||||
sudo yum install git
|
||||
|
||||
|
||||
To install Git on **Mac OS X**, run the following:
|
||||
|
||||
brew install git
|
||||
|
||||
|
||||
### Rubygems
|
||||
|
||||
On **Ubuntu** 10.04, run the following:
|
||||
|
||||
sudo add-apt-repository ppa:maco.m/ruby
|
||||
sudo apt-get update
|
||||
sudo apt-get install rubygems
|
||||
|
||||
This PPA is maintained by an Ubuntu Developer. For Ubuntu 10.10, this version of rubygems is in the repositories.
|
||||
|
||||
On **Fedora**, run the following:
|
||||
|
||||
sudo yum install rubygems
|
||||
|
||||
On **Mac OS X**, RubyGems comes preinstalled; however, you might need to update it for use with the latest Bundler. To update RubyGems, run `sudo gem update --system`.
|
||||
|
||||
|
||||
### Bundler
|
||||
|
||||
After RubyGems is updated, simply run `sudo gem install bundler` to get Bundler. If you're using Ubuntu repository .debs, bundler is found at /var/lib/gems/1.8/bin/bundle
|
||||
|
||||
|
||||
## Getting Diaspora
|
||||
|
||||
git clone http://github.com/diaspora/diaspora.git
|
||||
|
||||
If you have never used github before, their [help desk](http://help.github.com/) has a pretty awesome guide on getting setup.
|
||||
|
||||
|
||||
## Running Diaspora
|
||||
|
||||
### Install required gems
|
||||
To start the app server for the first time, you need to use Bundler to install Diaspora's gem depencencies. Run `bundle install` from Diaspora's root directory. Bundler will also warn you if there is a new dependency and you need to bundle install again.
|
||||
|
||||
### Start Mongo
|
||||
If you installed the Ubuntu package, MongoDB should already be running (if not, run `service mongodb start`). If you installed the binary manually, run `sudo mongod` from where mongo is installed to start mongo.
|
||||
|
||||
If you installed the Fedora package, MongoDB will need to be started via `service mongodb start`. If you installed the binary manually, run `sudo mongod` from where mongo is installed to start mongo.
|
||||
|
||||
If you installed the OsX package through "brew", MongoDB will need to be started via `sudo launchctl load /Library/LaunchDaemons/org.mongodb.mongod.plist`. (before you have to go to /Library/LaunchDaemons and add a symlink to /usr/local/Cellar/mongodb/1.6.2-x86_64/org.mongodb.mongod.plist)
|
||||
|
||||
Diaspora will not run unless mongo is running. Mongo will not run by default, and will need to be started every time you wish to use or run the test suite for Diaspora.
|
||||
|
||||
### Run the server
|
||||
`./script/server` will start both thin and the websocket server. If you want to run a different app server, you will have to run them separately. See below for instructions.
|
||||
|
||||
### Run the app server
|
||||
Once mongo is running and bundler has finished, run `bundle exec thin start` from the root Diaspora directory. This will start the app server in development mode[.](http://bit.ly/9mwtUw)
|
||||
|
||||
### Run the websocket server
|
||||
run `bundle exec ruby ./script/websocket_server` to start the websocket server on port 8080. Change the port in config/app_config.yml.
|
||||
|
||||
### Logging in
|
||||
Run `rake db:seed:tom`, then login with user `tom` and password `evankorth`. More details in db/seeds/tom.rb.
|
||||
|
||||
|
||||
### Testing
|
||||
Diaspora's test suite uses [rspec](http://rspec.info/), a behavior driven testing framework. In order to run the tests, run `bundle exec rspec spec`.
|
||||
We need you to fill out a
|
||||
[contributor agreement form](https://spreadsheets.google.com/a/joindiaspora.com/viewform?formkey=dGI2cHA3ZnNHLTJvbm10LUhXRTJjR0E6MQ&theme=0AX42CRMsmRFbUy1iOGYwN2U2Mi1hNWU0LTRlNjEtYWMyOC1lZmU4ODg1ODc1ODI&ifq)
|
||||
before we can accept your patches. The agreement gives Diaspora joint
|
||||
ownership of the patch so the copyright isn't scattered. You can find it
|
||||
[here](https://spreadsheets.google.com/a/joindiaspora.com/viewform?formkey=dGI2cHA3ZnNHLTJvbm10LUhXRTJjR0E6MQ&theme=0AX42CRMsmRFbUy1iOGYwN2U2Mi1hNWU0LTRlNjEtYWMyOC1lZmU4ODg1ODc1ODI&ifq).
|
||||
|
||||
## Resources
|
||||
|
||||
We are maintaining a [public tracker project](http://www.pivotaltracker.com/projects/61641) and a [roadmap](https://github.com/diaspora/diaspora/wiki/Roadmap). Also, you can file [bug reports](https://github.com/diaspora/diaspora/issues) right here on github.
|
||||
We are maintaining a
|
||||
[public tracker project](http://www.pivotaltracker.com/projects/61641)
|
||||
and a
|
||||
[roadmap](https://github.com/diaspora/diaspora/wiki/Roadmap). Also, you can
|
||||
file [bug reports](https://github.com/diaspora/diaspora/issues) right here on
|
||||
github.
|
||||
|
||||
Ongoing discussion:
|
||||
|
||||
- [Diaspora Developer Google Group](http://groups.google.com/group/diaspora-dev)
|
||||
- [Diaspora Discussion Google Group](http://groups.google.com/group/diaspora-discuss)
|
||||
- [Diaspora Q&A site](http://diaspora.shapado.com/)
|
||||
- [#diaspora-dev](irc://irc.freenode.net/#diaspora-dev)
|
||||
- [#diaspora-dev IRC channel](irc://irc.freenode.net/#diaspora-dev)
|
||||
([join via the web client](http://webchat.freenode.net?channels=diaspora-dev))
|
||||
|
||||
More general info and updates about the project can be found on our [blog](http://joindiaspora.com), [twitter](http://twitter.com/joindiaspora). Also, be sure to join the official [mailing list](http://http://eepurl.com/Vebk).
|
||||
|
||||
If you wish to contact us privately about any exploits in Diaspora you may find, you can email [exploits@joindiaspora.com](mailto:exploits@joindiaspora.com).
|
||||
|
||||
|
||||
## License
|
||||
Copyright 2010 Diaspora Inc.
|
||||
|
||||
Diaspora is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
|
||||
Diaspora is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License along with Diaspora. If not, see <http://www.gnu.org/licenses/>.
|
||||
More general info and updates about the project can be found on:
|
||||
[Our blog](http://joindiaspora.com),
|
||||
[and on Twitter](http://twitter.com/joindiaspora).
|
||||
Also, be sure to join the official [mailing list](http://eepurl.com/Vebk).
|
||||
|
||||
If you wish to contact us privately about any exploits in Diaspora you may
|
||||
find, you can email
|
||||
[exploits@joindiaspora.com](mailto:exploits@joindiaspora.com).
|
||||
|
|
|
|||
3
Rakefile
3
Rakefile
|
|
@ -2,12 +2,11 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
|
||||
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
||||
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
||||
|
||||
require File.expand_path('../config/application', __FILE__)
|
||||
require 'rake'
|
||||
ENV['GNUPGHOME'] = File.expand_path("../../gpg/diaspora-#{Rails.env}/", __FILE__)
|
||||
|
||||
Diaspora::Application.load_tasks
|
||||
|
|
|
|||
|
|
@ -15,9 +15,12 @@ class AlbumsController < ApplicationController
|
|||
end
|
||||
|
||||
def create
|
||||
aspect = params[:album][:to]
|
||||
@album = current_user.post(:album, params[:album])
|
||||
flash[:notice] = "You've created an album called #{@album.name}."
|
||||
aspect = params[:album][:to]
|
||||
|
||||
data = clean_hash(params[:album])
|
||||
|
||||
@album = current_user.post(:album, data)
|
||||
flash[:notice] = I18n.t 'albums.create.success', :name => @album.name
|
||||
redirect_to :action => :show, :id => @album.id, :aspect => aspect
|
||||
end
|
||||
|
||||
|
|
@ -26,34 +29,43 @@ class AlbumsController < ApplicationController
|
|||
end
|
||||
|
||||
def destroy
|
||||
@album = current_user.album_by_id params[:id]
|
||||
@album = current_user.find_visible_post_by_id params[:id]
|
||||
@album.destroy
|
||||
flash[:notice] = "Album #{@album.name} deleted."
|
||||
flash[:notice] = I18n.t 'albums.destroy.success', :name => @album.name
|
||||
respond_with :location => albums_url
|
||||
end
|
||||
|
||||
def show
|
||||
@photo = Photo.new
|
||||
@album = Album.find_by_id params[:id]
|
||||
@album = current_user.find_visible_post_by_id( params[:id] )
|
||||
@album_photos = @album.photos
|
||||
|
||||
respond_with @album
|
||||
end
|
||||
|
||||
def edit
|
||||
@album = current_user.album_by_id params[:id]
|
||||
@album = current_user.find_visible_post_by_id params[:id]
|
||||
redirect_to @album unless current_user.owns? @album
|
||||
end
|
||||
|
||||
def update
|
||||
@album = current_user.album_by_id params[:id]
|
||||
if @album.update_attributes params[:album]
|
||||
flash[:notice] = "Album #{@album.name} successfully edited."
|
||||
@album = current_user.find_visible_post_by_id params[:id]
|
||||
|
||||
data = clean_hash(params[:album])
|
||||
|
||||
if current_user.update_post( @album, data )
|
||||
flash[:notice] = I18n.t 'albums.update.success', :name => @album.name
|
||||
respond_with @album
|
||||
else
|
||||
flash[:error] = "Failed to edit album #{@album.name}."
|
||||
flash[:error] = I18n.t 'albums.update.failure', :name => @album.name
|
||||
render :action => :edit
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def clean_hash(params)
|
||||
return {
|
||||
:name => params[:name],
|
||||
:to => params[:to]
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,13 +2,13 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class ApplicationController < ActionController::Base
|
||||
|
||||
protect_from_forgery :except => :receive
|
||||
|
||||
before_filter :set_friends_and_status, :except => [:create, :update]
|
||||
before_filter :count_requests
|
||||
before_filter :fb_user_info
|
||||
|
||||
layout :layout_by_resource
|
||||
|
||||
|
|
@ -22,7 +22,9 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
def set_friends_and_status
|
||||
if current_user
|
||||
if params[:aspect] == nil || params[:aspect] == 'all'
|
||||
if params[:action] == 'public'
|
||||
@aspect = :public
|
||||
elsif params[:aspect] == nil || params[:aspect] == 'all'
|
||||
@aspect = :all
|
||||
else
|
||||
@aspect = current_user.aspect_by_id( params[:aspect])
|
||||
|
|
@ -37,4 +39,11 @@ class ApplicationController < ActionController::Base
|
|||
@request_count = Request.for_user(current_user).size if current_user
|
||||
end
|
||||
|
||||
def fb_user_info
|
||||
if current_user
|
||||
@access_token = warden.session[:access_token]
|
||||
@logged_in = @access_token.present?
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class AspectsController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
|
|
@ -15,8 +14,12 @@ class AspectsController < ApplicationController
|
|||
end
|
||||
|
||||
def create
|
||||
@aspect = current_user.aspect params[:aspect]
|
||||
flash[:notice] = "Click on the plus on the left side to tell Diaspora who can see your new aspect."
|
||||
@aspect = current_user.aspect(params[:aspect])
|
||||
if @aspect.valid?
|
||||
flash[:notice] = I18n.t('aspects.create.success')
|
||||
else
|
||||
flash[:error] = I18n.t('aspects.create.failure')
|
||||
end
|
||||
respond_with :location => aspects_manage_path
|
||||
end
|
||||
|
||||
|
|
@ -25,11 +28,11 @@ class AspectsController < ApplicationController
|
|||
end
|
||||
|
||||
def destroy
|
||||
@aspect = Aspect.find_by_id params[:id]
|
||||
@aspect = current_user.aspect_by_id params[:id]
|
||||
|
||||
begin
|
||||
current_user.drop_aspect @aspect
|
||||
flash[:notice] = "#{@aspect.name} was successfully removed."
|
||||
flash[:notice] = I18n.t 'aspects.destroy.success',:name => @aspect.name
|
||||
rescue RuntimeError => e
|
||||
flash[:error] = e.message
|
||||
end
|
||||
|
|
@ -38,22 +41,33 @@ class AspectsController < ApplicationController
|
|||
end
|
||||
|
||||
def show
|
||||
@aspect = Aspect.find_by_id params[:id]
|
||||
@aspect = current_user.aspect_by_id params[:id]
|
||||
@friends = @aspect.people
|
||||
@posts = current_user.visible_posts( :by_members_of => @aspect ).paginate :per_page => 15, :order => 'created_at DESC'
|
||||
|
||||
respond_with @aspect
|
||||
end
|
||||
|
||||
def public
|
||||
# @fb_access_url = MiniFB.oauth_url(FB_APP_ID, APP_CONFIG[:pod_url] + "services/create",
|
||||
# :scope=>MiniFB.scopes.join(","))
|
||||
|
||||
@posts = current_user.visible_posts(:person_id => current_user.person.id, :public => true).paginate :page => params[:page], :per_page => 15, :order => 'created_at DESC'
|
||||
|
||||
respond_with @aspect
|
||||
end
|
||||
|
||||
def manage
|
||||
@aspect = :manage
|
||||
@remote_requests = Request.for_user(current_user).all
|
||||
end
|
||||
|
||||
def update
|
||||
@aspect = Aspect.find_by_id(params[:id])
|
||||
@aspect.update_attributes(params[:aspect])
|
||||
flash[:notice] = "Your aspect, #{@aspect.name}, has been successfully edited."
|
||||
@aspect = current_user.aspect_by_id(params[:id])
|
||||
|
||||
data = clean_hash(params[:aspect])
|
||||
@aspect.update_attributes( data )
|
||||
flash[:notice] = I18n.t 'aspects.update.success',:name => @aspect.name
|
||||
respond_with @aspect
|
||||
end
|
||||
|
||||
|
|
@ -61,26 +75,34 @@ class AspectsController < ApplicationController
|
|||
params[:moves].each{ |move|
|
||||
move = move[1]
|
||||
unless current_user.move_friend(move)
|
||||
flash[:error] = "Aspect editing failed for friend #{Person.find_by_id( move[:friend_id] ).real_name}."
|
||||
redirect_to Aspect.first, :action => "edit"
|
||||
flash[:error] = I18n.t 'aspects.move_friends.failure', :real_name => Person.find_by_id( move[:friend_id] ).real_name
|
||||
redirect_to aspects_manage_path
|
||||
return
|
||||
end
|
||||
}
|
||||
|
||||
flash[:notice] = "Aspects edited successfully."
|
||||
redirect_to Aspect.first, :action => "edit"
|
||||
flash[:notice] = I18n.t 'aspects.move_friends.success'
|
||||
redirect_to aspects_manage_path
|
||||
end
|
||||
|
||||
def move_friend
|
||||
unless current_user.move_friend( :friend_id => params[:friend_id], :from => params[:from], :to => params[:to][:to])
|
||||
flash[:error] = "didn't work #{params.inspect}"
|
||||
flash[:error] = I18n.t 'aspects.move_friend.error',:inspect => params.inspect
|
||||
end
|
||||
if aspect = Aspect.first(:id => params[:to][:to])
|
||||
flash[:notice] = "You are now showing your friend a different aspect of yourself."
|
||||
respond_with aspect
|
||||
if aspect = current_user.aspect_by_id(params[:to][:to])
|
||||
flash[:notice] = I18n.t 'aspects.move_friend.success'
|
||||
render :nothing => true
|
||||
else
|
||||
flash[:notice] = "You are now showing your friend a different aspect of yourself."
|
||||
respond_with Person.first(:id => params[:friend_id])
|
||||
flash[:notice] = I18n.t 'aspects.move_friend.failure'
|
||||
render aspects_manage_path
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def clean_hash(params)
|
||||
return {
|
||||
:name => params[:name]
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class CommentsController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
|
|
@ -10,16 +9,11 @@ class CommentsController < ApplicationController
|
|||
respond_to :json, :only => :show
|
||||
|
||||
def create
|
||||
target = Post.find_by_id params[:comment][:post_id]
|
||||
target = current_user.find_visible_post_by_id params[:comment][:post_id]
|
||||
text = params[:comment][:text]
|
||||
|
||||
@comment = current_user.comment text, :on => target
|
||||
render :nothing => true
|
||||
end
|
||||
|
||||
def show
|
||||
@comment = Comment.find_by_id params[:id]
|
||||
respond_with @comment
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,29 +2,10 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class DevUtilitiesController < ApplicationController
|
||||
before_filter :authenticate_user!, :except => [:set_backer_number]
|
||||
include ApplicationHelper
|
||||
include RequestsHelper
|
||||
def warzombie
|
||||
render :nothing => true
|
||||
if current_user.email == "tom@tom.joindiaspora.com" && StatusMessage.where(:message => "There's a bomb in the lasagna!?").first == nil
|
||||
current_user.post(:status_message, :message => "There's a bomb in the lasagna!?")
|
||||
current_user.post(:status_message, :message => "xkcd \nhttp://xkcd.com/743/" )
|
||||
current_user.post(:status_message, :message => "I switched to Motoroi today, a Motorola Android-based phone, in Korea. Now, I am using Android phones in both the U.S. and Korea", :created_at => Time.now-930)
|
||||
current_user.post(:status_message, :message => "I had 5 hours to study for it :-( GREs on Thursday. Wunderbar.", :created_at => Time.now-43990)
|
||||
current_user.post(:status_message, :message => "Spotted in toy story 3: google maps, OSX, and windows XP. Two out of three isn't bad.", :created_at => Time.now-4390)
|
||||
current_user.post(:status_message, :message => "Reddit\nhttp://reddit.com", :created_at => Time.now-54390)
|
||||
current_user.post(:status_message, :message => "Commercials for IE make me SO MAD and my friends just don't get why.", :created_at => Time.now-30900)
|
||||
current_user.post(:status_message, :message => "Zombo.com\nhttp://zombo.com", :created_at => Time.now-9090)
|
||||
current_user.post(:status_message, :message => "Why do I have \"No More Heroes\" by Westlife on repeat all day?", :created_at => Time.now-590000)
|
||||
current_user.post(:status_message, :message => "Mmm. Friday night. Acknowledged.", :created_at => Time.now-503900)
|
||||
current_user.post(:status_message, :message => "Getting a universal remote is the epitome of laziness, I do declare.", :created_at => Time.now-4400)
|
||||
current_user.post(:status_message, :message => "Does anyone know how to merge two Skype contact entries of the same person? (i.e. one Skype ID and one mobile number)", :created_at => Time.now-400239)
|
||||
current_user.post(:status_message, :message => "A cool, cool morning for once.", :created_at => Time.now-150000)
|
||||
end
|
||||
end
|
||||
|
||||
def zombiefriends
|
||||
render :nothing => true
|
||||
|
|
@ -34,7 +15,7 @@ def warzombie
|
|||
bkr_info.each do |backer|
|
||||
backer_email = "#{backer['username']}@#{backer['username']}.joindiaspora.com"
|
||||
rel_hash = relationship_flow(backer_email)
|
||||
logger.info "Zombefriending #{backer['given_name']} #{backer['family_name']}"
|
||||
logger.info "Zombiefriending #{backer['given_name']} #{backer['family_name']}"
|
||||
logger.info "Calling send_friend_request with #{rel_hash[:friend]} and #{current_user.aspects.first}"
|
||||
current_user.send_friend_request_to(rel_hash[:friend], current_user.aspects.first)
|
||||
end
|
||||
|
|
@ -48,11 +29,6 @@ def warzombie
|
|||
}
|
||||
end
|
||||
|
||||
def backer_info
|
||||
config = YAML.load_file(File.dirname(__FILE__) + '/../../config/deploy_config.yml')
|
||||
config['servers']['backer']
|
||||
end
|
||||
|
||||
def set_backer_number
|
||||
render :nothing => true
|
||||
seed_num_hash = {:seed_number => params[:number]}
|
||||
|
|
@ -62,7 +38,6 @@ def warzombie
|
|||
end
|
||||
|
||||
def set_profile_photo
|
||||
|
||||
render :nothing => true
|
||||
album = Album.create(:person => current_user.person, :name => "Profile Photos")
|
||||
current_user.raw_visible_posts << album
|
||||
|
|
@ -71,7 +46,7 @@ def warzombie
|
|||
backer_number = YAML.load_file(Rails.root.join('config','backer_number.yml'))[:seed_number].to_i
|
||||
username = backer_info[backer_number]['username'].gsub(/ /,'').downcase
|
||||
|
||||
@fixture_name = File.dirname(__FILE__) + "/../../public/images/user/#{username}.jpg"
|
||||
@fixture_name = File.join(File.dirname(__FILE__), "..", "..", "public", "images", "user", "#{username}.jpg")
|
||||
|
||||
photo = Photo.new(:person => current_user.person, :album => album)
|
||||
photo.image.store! File.open(@fixture_name)
|
||||
|
|
@ -81,7 +56,6 @@ def warzombie
|
|||
current_user.raw_visible_posts << photo
|
||||
current_user.save
|
||||
|
||||
|
||||
current_user.update_profile(:image_url => photo.url(:thumb_medium))
|
||||
current_user.save
|
||||
end
|
||||
|
|
@ -91,4 +65,11 @@ def warzombie
|
|||
|
||||
render "shared/log"
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def backer_info
|
||||
config = YAML.load_file(File.join(File.dirname(__FILE__), "..", "..", "config", "deploy_config.yml"))
|
||||
config['servers']['backer']
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class PeopleController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
|
|
@ -22,7 +21,7 @@ class PeopleController < ApplicationController
|
|||
@profile = @person.profile
|
||||
@aspects_with_person = current_user.aspects_with_person(@person)
|
||||
@aspects_dropdown_array = current_user.aspects.collect{|x| [x.to_s, x.id]}
|
||||
@posts = current_user.visible_posts_from_others(:from => @person).paginate :page => params[:page], :order => 'created_at DESC'
|
||||
@posts = current_user.visible_posts(:person_id => @person.id).paginate :page => params[:page], :order => 'created_at DESC'
|
||||
@latest_status_message = current_user.raw_visible_posts.find_all_by__type_and_person_id("StatusMessage", params[:id]).last
|
||||
@post_count = @posts.count
|
||||
respond_with @person
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class PhotosController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
|
|
@ -10,8 +9,7 @@ class PhotosController < ApplicationController
|
|||
respond_to :json, :only => :show
|
||||
|
||||
def create
|
||||
|
||||
album = Album.find_by_id params[:album_id]
|
||||
album = current_user.find_visible_post_by_id( params[:album_id] )
|
||||
|
||||
begin
|
||||
|
||||
|
|
@ -21,9 +19,15 @@ class PhotosController < ApplicationController
|
|||
# get file content type
|
||||
att_content_type = (request.content_type.to_s == "") ? "application/octet-stream" : request.content_type.to_s
|
||||
# create temporal file
|
||||
file = Tempfile.new(file_name)
|
||||
begin
|
||||
file = Tempfile.new(file_name, {:encoding => 'BINARY'})
|
||||
file.print request.raw_post.force_encoding('BINARY')
|
||||
rescue RuntimeError => e
|
||||
raise e unless e.message.include?('cannot generate tempfile')
|
||||
file = Tempfile.new(file_name) # Ruby 1.8 compatibility
|
||||
file.print request.raw_post
|
||||
end
|
||||
# put data into this file from raw post request
|
||||
file.print request.raw_post
|
||||
|
||||
# create several required methods for this temporal file
|
||||
Tempfile.send(:define_method, "content_type") {return att_content_type}
|
||||
|
|
@ -31,24 +35,26 @@ class PhotosController < ApplicationController
|
|||
|
||||
##############
|
||||
|
||||
|
||||
params[:user_file] = file
|
||||
@photo = current_user.post(:photo, params)
|
||||
|
||||
data = clean_hash(params)
|
||||
|
||||
@photo = current_user.post(:photo, data)
|
||||
|
||||
respond_to do |format|
|
||||
format.json{render(:layout => false , :json => {"success" => true, "data" => @photo}.to_json )}
|
||||
end
|
||||
|
||||
rescue TypeError
|
||||
message = "Photo upload failed. Are you sure an image was added?"
|
||||
message = I18n.t 'photos.create.type_error'
|
||||
respond_with :location => album, :error => message
|
||||
|
||||
rescue CarrierWave::IntegrityError
|
||||
message = "Photo upload failed. Are you sure that was an image?"
|
||||
message = I18n.t 'photos.create.integrity_error'
|
||||
respond_with :location => album, :error => message
|
||||
|
||||
rescue RuntimeError => e
|
||||
message = "Photo upload failed. Are you sure that your seatbelt is fastened?"
|
||||
message = I18n.t 'photos.create.runtime_error'
|
||||
respond_with :location => album, :error => message
|
||||
raise e
|
||||
end
|
||||
|
|
@ -61,34 +67,54 @@ class PhotosController < ApplicationController
|
|||
end
|
||||
|
||||
def destroy
|
||||
@photo = Photo.find_by_id params[:id]
|
||||
@photo = current_user.find_visible_post_by_id params[:id]
|
||||
|
||||
@photo.destroy
|
||||
flash[:notice] = "Photo deleted."
|
||||
flash[:notice] = I18n.t 'photos.destroy.notice'
|
||||
respond_with :location => @photo.album
|
||||
end
|
||||
|
||||
def show
|
||||
@photo = Photo.find_by_id params[:id]
|
||||
@photo = current_user.find_visible_post_by_id params[:id]
|
||||
@album = @photo.album
|
||||
|
||||
respond_with @photo, @album
|
||||
end
|
||||
|
||||
def edit
|
||||
@photo = Photo.find_by_id params[:id]
|
||||
@photo = current_user.find_visible_post_by_id params[:id]
|
||||
@album = @photo.album
|
||||
|
||||
redirect_to @photo unless current_user.owns? @album
|
||||
end
|
||||
|
||||
def update
|
||||
@photo = Photo.find_by_id params[:id]
|
||||
if @photo.update_attributes params[:photo]
|
||||
flash[:notice] = "Photo successfully updated."
|
||||
@photo = current_user.find_visible_post_by_id params[:id]
|
||||
|
||||
data = clean_hash(params)
|
||||
|
||||
if current_user.update_post( @photo, data[:photo] )
|
||||
flash[:notice] = I18n.t 'photos.update.notice'
|
||||
respond_with @photo
|
||||
else
|
||||
flash[:error] = "Failed to edit photo."
|
||||
flash[:error] = I18n.t 'photos.update.error'
|
||||
render :action => :edit
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def clean_hash(params)
|
||||
if params[:photo]
|
||||
return {
|
||||
:photo => {
|
||||
:caption => params[:photo][:caption],
|
||||
}
|
||||
}
|
||||
else
|
||||
return{
|
||||
:album_id => params[:album_id],
|
||||
:user_file => params[:user_file]
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,15 +2,14 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class PublicsController < ApplicationController
|
||||
require 'lib/diaspora/parser'
|
||||
require File.expand_path('../../../lib/diaspora/parser', __FILE__)
|
||||
include Diaspora::Parser
|
||||
|
||||
layout false
|
||||
|
||||
def hcard
|
||||
@person = Person.find_by_id params[:id]
|
||||
puts @person
|
||||
unless @person.nil? || @person.owner.nil?
|
||||
render 'hcard'
|
||||
end
|
||||
|
|
@ -21,7 +20,7 @@ class PublicsController < ApplicationController
|
|||
end
|
||||
|
||||
def webfinger
|
||||
@person = Person.by_webfinger(params[:q], :local => true)
|
||||
@person = Person.by_webfinger(params[:q], :local => true) if params[:q]
|
||||
unless @person.nil? || @person.owner.nil?
|
||||
render 'webfinger', :content_type => 'application/xrd+xml'
|
||||
else
|
||||
|
|
@ -29,13 +28,20 @@ class PublicsController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def hub
|
||||
if params['hub.mode'] == 'subscribe' || params['hub.mode'] == 'unsubscribe'
|
||||
render :text => params['hub.challenge'], :status => 202, :layout => false
|
||||
end
|
||||
end
|
||||
|
||||
def receive
|
||||
render :nothing => true
|
||||
return unless params[:xml]
|
||||
begin
|
||||
@user = Person.first(:id => params[:id]).owner
|
||||
person = Person.first(:id => params[:id])
|
||||
@user = person.owner
|
||||
rescue NoMethodError => e
|
||||
Rails.logger.error("Received post #{params[:xml]} for nonexistent person #{params[:id]}")
|
||||
Rails.logger.error("Received post for nonexistent person #{params[:id]}")
|
||||
return
|
||||
end
|
||||
@user.receive_salmon params[:xml]
|
||||
|
|
|
|||
|
|
@ -15,9 +15,7 @@ class RegistrationsController < Devise::RegistrationsController
|
|||
flash[:error] = e.message
|
||||
end
|
||||
if user
|
||||
#set_flash_message :notice, :signed_up
|
||||
flash[:notice] = "You've joined Diaspora!"
|
||||
#redirect_to root_url
|
||||
flash[:notice] = I18n.t 'registrations.create.success'
|
||||
sign_in_and_redirect(:user, user)
|
||||
else
|
||||
redirect_to new_user_registration_path
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class RequestsController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
include RequestsHelper
|
||||
|
|
@ -13,15 +12,15 @@ class RequestsController < ApplicationController
|
|||
if params[:accept]
|
||||
if params[:aspect_id]
|
||||
@friend = current_user.accept_and_respond( params[:id], params[:aspect_id])
|
||||
flash[:notice] = "You are now friends."
|
||||
flash[:notice] = I18n.t 'requests.destroy.success'
|
||||
respond_with :location => current_user.aspect_by_id(params[:aspect_id])
|
||||
else
|
||||
flash[:error] = "Please select an aspect!"
|
||||
flash[:error] = I18n.t 'requests.destroy.error'
|
||||
respond_with :location => requests_url
|
||||
end
|
||||
else
|
||||
current_user.ignore_friend_request params[:id]
|
||||
flash[:notice] = "Ignored friend request."
|
||||
flash[:notice] = I18n.t 'requests.destroy.ignore'
|
||||
respond_with :location => requests_url
|
||||
end
|
||||
end
|
||||
|
|
@ -37,27 +36,28 @@ class RequestsController < ApplicationController
|
|||
rel_hash = relationship_flow(params[:request][:destination_url])
|
||||
rescue Exception => e
|
||||
raise e unless e.message.include? "not found"
|
||||
flash[:error] = "No diaspora seed found with this email!"
|
||||
flash[:error] = I18n.t 'requests.create.error'
|
||||
respond_with :location => aspect
|
||||
return
|
||||
end
|
||||
|
||||
# rel_hash = {:friend => params[:friend_handle]}
|
||||
Rails.logger.debug("Sending request: #{rel_hash}")
|
||||
|
||||
begin
|
||||
@request = current_user.send_friend_request_to(rel_hash[:friend], aspect)
|
||||
rescue Exception => e
|
||||
raise e unless e.message.include? "already friends"
|
||||
flash[:notice] = "You are already friends with #{params[:request][:destination_url]}!"
|
||||
raise e unless e.message.include? "already"
|
||||
flash[:notice] = I18n.t 'requests.create.already_friends', :destination_url => params[:request][:destination_url]
|
||||
respond_with :location => aspect
|
||||
return
|
||||
end
|
||||
|
||||
if @request
|
||||
flash[:notice] = "A friend request was sent to #{@request.destination_url}."
|
||||
flash[:notice] = I18n.t 'requests.create.success',:destination_url => @request.destination_url
|
||||
respond_with :location => aspect
|
||||
else
|
||||
flash[:error] = "Something went horribly wrong."
|
||||
flash[:error] = I18n.t 'requests.create.horribly_wrong'
|
||||
respond_with :location => aspect
|
||||
end
|
||||
end
|
||||
|
|
|
|||
40
app/controllers/services_controller.rb
Normal file
40
app/controllers/services_controller.rb
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
# Copyright (c) 2010, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class ServicesController < ApplicationController
|
||||
|
||||
def create
|
||||
puts 'services/create'
|
||||
p params
|
||||
|
||||
code = params['code'] # Facebooks verification string
|
||||
if code
|
||||
access_token_hash = MiniFB.oauth_access_token(FB_APP_ID, APP_CONFIG[:pod_url] + "services/create", FB_SECRET, code)
|
||||
p access_token_hash
|
||||
@access_token = access_token_hash["access_token"]
|
||||
|
||||
# TODO: This is where you'd want to store the token in your database
|
||||
# but for now, we'll just keep it in the session so we don't need a database
|
||||
warden.session[:access_token] = @access_token
|
||||
flash[:success] = "Authentication successful."
|
||||
end
|
||||
redirect_to edit_user_url current_user
|
||||
end
|
||||
|
||||
def destroy
|
||||
warden.session[:access_token] = nil
|
||||
warden.session[:user_id] = nil
|
||||
redirect_to edit_user_url current_user
|
||||
end
|
||||
|
||||
def fb_post
|
||||
id = 'me'
|
||||
type = 'feed'
|
||||
|
||||
@res = MiniFB.post(@access_token, id, :type=>type, :metadata=>true, :params=>params)
|
||||
redirect_to edit_user_url current_user
|
||||
end
|
||||
|
||||
end
|
||||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class SocketsController < ApplicationController
|
||||
include ApplicationHelper
|
||||
include SocketsHelper
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class StatusMessagesController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
|
|
@ -11,18 +10,39 @@ class StatusMessagesController < ApplicationController
|
|||
|
||||
def create
|
||||
params[:status_message][:to] = params[:aspect_ids]
|
||||
@status_message = current_user.post(:status_message, params[:status_message])
|
||||
respond_with @status_message
|
||||
|
||||
data = clean_hash params[:status_message]
|
||||
|
||||
if @logged_in && params[:status_message][:public] == 'true'
|
||||
id = 'me'
|
||||
type = 'feed'
|
||||
|
||||
Rails.logger.info("Sending a message: #{params[:status_message][:message]} to Facebook")
|
||||
@res = MiniFB.post(@access_token, id, :type=>type,
|
||||
:metadata=>true, :params=>{:message => params[:status_message][:message]})
|
||||
end
|
||||
|
||||
@status_message = current_user.post(:status_message, data)
|
||||
render :nothing => true
|
||||
end
|
||||
|
||||
def destroy
|
||||
@status_message = StatusMessage.find_by_id params[:id]
|
||||
@status_message = current_user.find_visible_post_by_id params[:id]
|
||||
@status_message.destroy
|
||||
respond_with :location => root_url
|
||||
end
|
||||
|
||||
def show
|
||||
@status_message = StatusMessage.find_by_id params[:id]
|
||||
@status_message = current_user.find_visible_post_by_id params[:id]
|
||||
respond_with @status_message
|
||||
end
|
||||
|
||||
private
|
||||
def clean_hash(params)
|
||||
return {
|
||||
:message => params[:message],
|
||||
:to => params[:to],
|
||||
:public => params[:public]
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,34 +2,83 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class UsersController < ApplicationController
|
||||
before_filter :authenticate_user!, :except => [:new, :create]
|
||||
require File.expand_path('../../../lib/diaspora/ostatus_builder', __FILE__)
|
||||
|
||||
before_filter :authenticate_user!, :except => [:new, :create, :public]
|
||||
|
||||
respond_to :html
|
||||
|
||||
def edit
|
||||
@user = current_user
|
||||
@person = @user.person
|
||||
@profile = @user.profile
|
||||
@photos = Photo.find_all_by_person_id(@person.id).paginate :page => params[:page], :order => 'created_at DESC'
|
||||
@profile = @user.person.profile
|
||||
@photos = current_user.visible_posts(:person_id => current_user.person.id, :_type => 'Photo').paginate :page => params[:page], :order => 'created_at DESC'
|
||||
|
||||
@fb_access_url = MiniFB.oauth_url(FB_APP_ID, APP_CONFIG[:pod_url] + "services/create",
|
||||
:scope=>MiniFB.scopes.join(","))
|
||||
end
|
||||
|
||||
def update
|
||||
@user = current_user
|
||||
prep_image_url(params[:user])
|
||||
data = clean_hash params[:user]
|
||||
prep_image_url(data)
|
||||
|
||||
@user.update_profile params[:user]
|
||||
respond_with(@user, :location => root_url)
|
||||
|
||||
params[:user].delete(:password) if params[:user][:password].blank?
|
||||
params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank?
|
||||
|
||||
if params[:user][:password] && params[:user][:password_confirmation]
|
||||
if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation])
|
||||
flash[:notice] = "Password Changed"
|
||||
else
|
||||
flash[:error] = "Password Change Failed"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@user.update_profile data
|
||||
redirect_to edit_user_path(@user)
|
||||
|
||||
end
|
||||
|
||||
def public
|
||||
user = User.find_by_username(params[:username])
|
||||
|
||||
if user
|
||||
director = Diaspora::Director.new
|
||||
ostatus_builder = Diaspora::OstatusBuilder.new(user)
|
||||
|
||||
render :xml => director.build(ostatus_builder), :content_type => 'application/atom+xml'
|
||||
else
|
||||
flash[:error] = "User #{params[:username]} does not exist!"
|
||||
redirect_to root_url
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def prep_image_url(params)
|
||||
url = APP_CONFIG[:pod_url].chop if APP_CONFIG[:pod_url][-1,1] == '/'
|
||||
if params[:profile][:image_url].empty?
|
||||
params[:profile].delete(:image_url)
|
||||
else
|
||||
params[:profile][:image_url] = "http://" + request.host + ":" + request.port.to_s + params[:profile][:image_url]
|
||||
if /^http:\/\// =~ params[:profile][:image_url]
|
||||
params[:profile][:image_url] = params[:profile][:image_url]
|
||||
else
|
||||
params[:profile][:image_url] = url + params[:profile][:image_url]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def clean_hash(params)
|
||||
return {
|
||||
:profile =>
|
||||
{
|
||||
:first_name => params[:profile][:first_name],
|
||||
:last_name => params[:profile][:last_name],
|
||||
:image_url => params[:profile][:image_url]
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,21 +2,20 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module AlbumsHelper
|
||||
def friends_albums_link
|
||||
if params[:friends]
|
||||
"Friends Albums"
|
||||
I18n.t('albums.helper.friends_albums')
|
||||
else
|
||||
link_to 'Friends Albums', albums_path({:friends => true})
|
||||
link_to I18n.t('albums.helper.friends_albums'), albums_path({:friends => true})
|
||||
end
|
||||
end
|
||||
|
||||
def your_albums_link
|
||||
if params[:friends]
|
||||
link_to 'Your Albums', albums_path
|
||||
link_to I18n.t('albums.helper.your_albums'), albums_path
|
||||
else
|
||||
'Your Albums'
|
||||
I18n.t('albums.helper.your_albums')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module ApplicationHelper
|
||||
|
||||
def current_aspect?(aspect)
|
||||
!@aspect.is_a?(Symbol) && @aspect.id == aspect.id
|
||||
end
|
||||
|
|
@ -28,7 +26,7 @@ module ApplicationHelper
|
|||
end
|
||||
|
||||
def how_long_ago(obj)
|
||||
"#{time_ago_in_words(obj.created_at)} ago."
|
||||
"#{time_ago_in_words(obj.created_at)} ago"
|
||||
end
|
||||
|
||||
def person_url(person)
|
||||
|
|
@ -38,16 +36,16 @@ module ApplicationHelper
|
|||
when "Person"
|
||||
person_path(person)
|
||||
else
|
||||
"unknown person"
|
||||
I18n.t('application.helper.unknown_person')
|
||||
end
|
||||
end
|
||||
|
||||
def owner_image_tag
|
||||
person_image_tag(current_user)
|
||||
person_image_tag(current_user.person)
|
||||
end
|
||||
|
||||
def owner_image_link
|
||||
person_image_link(current_user)
|
||||
person_image_link(current_user.person)
|
||||
end
|
||||
|
||||
def person_image_tag(person)
|
||||
|
|
@ -62,11 +60,15 @@ module ApplicationHelper
|
|||
end
|
||||
|
||||
def new_request(request_count)
|
||||
"new_requests" if request_count > 0
|
||||
I18n.t('application.helper.new_requests') if request_count > 0
|
||||
end
|
||||
|
||||
def post_yield_tag(post)
|
||||
(':' + post.id.to_s).to_sym
|
||||
end
|
||||
|
||||
def connected_fb_as token
|
||||
response_hash = MiniFB.get(token, 'me')
|
||||
"Connected to facebook as #{response_hash[:name]}"
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module AspectsHelper
|
||||
def link_for_aspect( aspect )
|
||||
link_to aspect.name, aspect
|
||||
|
|
@ -10,9 +9,9 @@ module AspectsHelper
|
|||
|
||||
def remove_link( aspect )
|
||||
if aspect.people.size == 0
|
||||
link_to "remove", aspect, :method => :delete
|
||||
link_to I18n.t('aspects.helper.remove'), aspect, :method => :delete
|
||||
else
|
||||
"<span class='grey' title='Aspect not empty'>remove</span>"
|
||||
"<span class='grey' title=#{I18n.t('aspects.helper.aspect_not_empty')}>#{I18n.t('aspects.helper.remove')}</span>"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,10 +2,8 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module DashboardsHelper
|
||||
|
||||
def title_for_page
|
||||
'home'
|
||||
I18n.t('dashboards.helper.home')
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,13 +2,12 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module ErrorMessagesHelper
|
||||
# Render error messages for the given objects. The :message and :header_message options are allowed.
|
||||
def error_messages_for(*objects)
|
||||
options = objects.extract_options!
|
||||
options[:header_message] ||= "Invalid Fields"
|
||||
options[:message] ||= "Correct the following errors and try again."
|
||||
options[:header_message] ||= I18n.t('error_messages.helper.invalid_fields')
|
||||
options[:message] ||= I18n.t('error_messages.helper.correct_the_following_errors_and_try_again')
|
||||
messages = objects.compact.map { |o| o.errors.full_messages }.flatten
|
||||
unless messages.empty?
|
||||
content_tag(:div, :class => "error_messages") do
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
# These helper methods can be called in your template to set variables to be used in the layout
|
||||
# This module should be included in all views globally,
|
||||
# to do so you may need to add this line to your ApplicationController
|
||||
|
|
|
|||
|
|
@ -2,14 +2,13 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module PeopleHelper
|
||||
|
||||
def search_or_index
|
||||
if params[:q]
|
||||
" results for #{params[:q]}"
|
||||
I18n.t 'people.helper.results_for',:params => params[:q]
|
||||
else
|
||||
" people on pod is aware of"
|
||||
I18n.t "people.helper.people_on_pod_are_aware_of"
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module PhotosHelper
|
||||
|
||||
def linked_scaled_photo(photo, album)
|
||||
link_to (image_tag photo.url(:scaled_full)), photo_path(album.next_photo(photo)), :rel => "prefetch"
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,14 +2,12 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module PublicsHelper
|
||||
def subscribe(opts = {})
|
||||
subscriber = Subscriber.first(:url => opts[:callback], :topic => opts[:topic])
|
||||
subscriber ||= Subscriber.new(:url => opts[:callback], :topic => opts[:topic])
|
||||
|
||||
if subscriber.save
|
||||
|
||||
if opts[:verify] == 'sync'
|
||||
204
|
||||
elsif opts[:verify] == 'async'
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module RequestsHelper
|
||||
|
||||
def subscription_mode(profile)
|
||||
if diaspora?(profile)
|
||||
:friend
|
||||
|
|
@ -39,5 +37,4 @@ module RequestsHelper
|
|||
end
|
||||
{ action => person }
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module SocketsHelper
|
||||
include ApplicationHelper
|
||||
|
||||
|
|
@ -33,7 +32,4 @@ module SocketsHelper
|
|||
|
||||
action_hash.to_json
|
||||
end
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,13 +2,12 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module StatusMessagesHelper
|
||||
def my_latest_message
|
||||
unless @latest_status_message.nil?
|
||||
return @latest_status_message.message
|
||||
else
|
||||
return "No message to display."
|
||||
return I18n.t('status_messages.helper.no_message_to_display')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class Album < Post
|
||||
|
||||
xml_reader :name
|
||||
|
|
@ -17,7 +16,6 @@ class Album < Post
|
|||
|
||||
before_destroy :destroy_photos
|
||||
|
||||
|
||||
def self.mine_or_friends(friend_param, current_user)
|
||||
friend_param ? Album.find_all_by_person_id(current_user.friend_ids) : current_user.person.albums
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class Aspect
|
||||
include MongoMapper::Document
|
||||
|
||||
|
|
@ -39,5 +38,6 @@ class Aspect
|
|||
}
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class Comment
|
||||
include MongoMapper::Document
|
||||
include ROXML
|
||||
|
|
@ -19,7 +18,6 @@ class Comment
|
|||
key :post_id, ObjectId
|
||||
key :person_id, ObjectId
|
||||
|
||||
|
||||
belongs_to :post, :class_name => "Post"
|
||||
belongs_to :person, :class_name => "Person"
|
||||
|
||||
|
|
|
|||
31
app/models/fb_status.rb
Normal file
31
app/models/fb_status.rb
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
# Copyright (c) 2010, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class FbStatus
|
||||
include MongoMapper::Document
|
||||
|
||||
key :graph_id, String
|
||||
key :author_id, String
|
||||
key :author_name, String
|
||||
key :message, String
|
||||
key :updated_time, Time
|
||||
|
||||
timestamps!
|
||||
|
||||
validates_presence_of :graph_id,:author_id,:author_name,:message,:updated_time
|
||||
|
||||
def self.from_api(hash)
|
||||
#just keeping them in memory for now
|
||||
self.new(
|
||||
:graph_id => hash['id'],
|
||||
:author_id => hash['from']['id'],
|
||||
:author_name => hash['from']['name'],
|
||||
:message => hash['message'],
|
||||
:updated_time => Time.parse(hash['updated_time'])
|
||||
)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
|
@ -2,8 +2,7 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
require 'lib/hcard'
|
||||
require File.expand_path('../../../lib/hcard', __FILE__)
|
||||
|
||||
class Person
|
||||
include MongoMapper::Document
|
||||
|
|
@ -18,7 +17,7 @@ class Person
|
|||
|
||||
key :url, String
|
||||
key :diaspora_handle, String, :unique => true
|
||||
key :serialized_key, String
|
||||
key :serialized_public_key, String
|
||||
|
||||
key :owner_id, ObjectId
|
||||
|
||||
|
|
@ -30,15 +29,13 @@ class Person
|
|||
|
||||
before_destroy :remove_all_traces
|
||||
before_validation :clean_url
|
||||
validates_presence_of :url, :profile, :serialized_key
|
||||
validates_presence_of :url, :profile, :serialized_public_key
|
||||
validates_format_of :url, :with =>
|
||||
/^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix
|
||||
|
||||
|
||||
def self.search(query)
|
||||
Person.all('$where' => "function() { return this.diaspora_handle.match(/^#{query}/i) ||
|
||||
this.profile.first_name.match(/^#{query}/i) ||
|
||||
this.profile.last_name.match(/^#{query}/i); }")
|
||||
query = Regexp.escape( query.to_s.strip )
|
||||
Person.all('profile.first_name' => /^#{query}/i) | Person.all('profile.last_name' => /^#{query}/i)
|
||||
end
|
||||
|
||||
def real_name
|
||||
|
|
@ -52,36 +49,34 @@ class Person
|
|||
"#{self.url}receive/users/#{self.id}/"
|
||||
end
|
||||
|
||||
def encryption_key
|
||||
OpenSSL::PKey::RSA.new( serialized_key )
|
||||
def public_url
|
||||
"#{self.url}public/#{self.owner.username}"
|
||||
end
|
||||
|
||||
def encryption_key= new_key
|
||||
raise TypeError unless new_key.class == OpenSSL::PKey::RSA
|
||||
serialized_key = new_key.export
|
||||
end
|
||||
|
||||
def public_key_hash
|
||||
Base64.encode64 OpenSSL::Digest::SHA256.new(self.exported_key).to_s
|
||||
end
|
||||
|
||||
def public_key
|
||||
encryption_key.public_key
|
||||
OpenSSL::PKey::RSA.new( serialized_public_key )
|
||||
end
|
||||
|
||||
def exported_key
|
||||
encryption_key.public_key.export
|
||||
serialized_public_key
|
||||
end
|
||||
|
||||
def exported_key= new_key
|
||||
raise "Don't change a key" if serialized_key
|
||||
@serialized_key = new_key
|
||||
raise "Don't change a key" if serialized_public_key
|
||||
@serialized_public_key = new_key
|
||||
end
|
||||
|
||||
def self.by_webfinger( identifier, opts = {})
|
||||
local_person = Person.first(:diaspora_handle => identifier.gsub('acct:', ''))
|
||||
#need to check if this is a valid email structure, maybe should do in JS
|
||||
local_person = Person.first(:diaspora_handle => identifier.gsub('acct:', '').to_s.downcase)
|
||||
|
||||
if local_person
|
||||
Rails.logger.info("Do not need to webfinger, found a local person #{local_person.real_name}")
|
||||
local_person
|
||||
elsif !identifier.include?("localhost") && !opts[:local]
|
||||
begin
|
||||
|
|
@ -101,11 +96,11 @@ class Person
|
|||
new_person = Person.new
|
||||
|
||||
public_key_entry = profile.links.select{|x| x.rel == 'diaspora-public-key'}
|
||||
|
||||
|
||||
return nil unless public_key_entry
|
||||
|
||||
public_key = public_key_entry.first.href
|
||||
new_person.exported_key = Base64.decode64 public_key
|
||||
|
||||
pubkey = public_key_entry.first.href
|
||||
new_person.exported_key = Base64.decode64 pubkey
|
||||
|
||||
guid = profile.links.select{|x| x.rel == 'http://joindiaspora.com/guid'}.first.href
|
||||
new_person.id = guid
|
||||
|
|
@ -115,7 +110,7 @@ class Person
|
|||
hcard = HCard.find profile.hcard.first[:href]
|
||||
|
||||
new_person.url = hcard[:url]
|
||||
new_person.profile = Profile.new(:first_name => hcard[:given_name], :last_name => hcard[:family_name])
|
||||
new_person.profile = Profile.new(:first_name => hcard[:given_name], :last_name => hcard[:family_name], :image_url => hcard[:photo])
|
||||
if new_person.save
|
||||
new_person
|
||||
else
|
||||
|
|
|
|||
|
|
@ -2,7 +2,13 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class PhotoAlbumValidator < ActiveModel::Validator
|
||||
def validate(document)
|
||||
unless document.album.person_id == document.person_id
|
||||
document.errors[:base] << "You post photos to that album"
|
||||
end
|
||||
end
|
||||
end
|
||||
class Photo < Post
|
||||
require 'carrierwave/orm/mongomapper'
|
||||
include MongoMapper::Document
|
||||
|
|
@ -22,7 +28,7 @@ class Photo < Post
|
|||
timestamps!
|
||||
|
||||
validates_presence_of :album
|
||||
validates_true_for :album_id, :logic => lambda {self.validate_album_person}
|
||||
validates_with PhotoAlbumValidator
|
||||
|
||||
before_destroy :ensure_user_picture
|
||||
|
||||
|
|
@ -36,10 +42,6 @@ class Photo < Post
|
|||
photo
|
||||
end
|
||||
|
||||
def validate_album_person
|
||||
album.person_id == person_id
|
||||
end
|
||||
|
||||
def remote_photo
|
||||
image.url.nil? ? (remote_photo_path + '/' + remote_photo_name) : image.url
|
||||
end
|
||||
|
|
@ -70,3 +72,4 @@ class Photo < Post
|
|||
{:thumb_url => url(:thumb_medium), :id => id, :album_id => album_id}
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -2,10 +2,9 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class Post
|
||||
require 'lib/diaspora/websocket'
|
||||
require 'lib/encryptable'
|
||||
require File.expand_path('../../../lib/encryptable', __FILE__)
|
||||
require File.expand_path('../../../lib/diaspora/websocket', __FILE__)
|
||||
include MongoMapper::Document
|
||||
include ApplicationHelper
|
||||
include ROXML
|
||||
|
|
@ -14,6 +13,9 @@ class Post
|
|||
|
||||
xml_accessor :_id
|
||||
xml_accessor :person, :as => Person
|
||||
xml_reader :public
|
||||
|
||||
key :public , Boolean, :default => false
|
||||
|
||||
key :person_id, ObjectId
|
||||
key :user_refs, Integer, :default => 0
|
||||
|
|
@ -33,7 +35,6 @@ class Post
|
|||
self.create params.to_hash
|
||||
end
|
||||
|
||||
|
||||
def as_json(opts={})
|
||||
{
|
||||
:post => {
|
||||
|
|
|
|||
|
|
@ -2,10 +2,9 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class Profile
|
||||
include MongoMapper::EmbeddedDocument
|
||||
require 'lib/diaspora/webhooks'
|
||||
require File.expand_path('../../../lib/diaspora/webhooks', __FILE__)
|
||||
include Diaspora::Webhooks
|
||||
include ROXML
|
||||
|
||||
|
|
|
|||
|
|
@ -2,9 +2,8 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class Request
|
||||
require 'lib/diaspora/webhooks'
|
||||
require File.expand_path('../../../lib/diaspora/webhooks', __FILE__)
|
||||
include MongoMapper::Document
|
||||
include Diaspora::Webhooks
|
||||
include ROXML
|
||||
|
|
@ -26,8 +25,8 @@ class Request
|
|||
validates_presence_of :destination_url, :callback_url
|
||||
before_validation :clean_link
|
||||
|
||||
scope :for_user, lambda{ |user| where(:destination_url => user.receive_url) }
|
||||
scope :from_user, lambda{ |user| where(:destination_url.ne => user.receive_url) }
|
||||
scope :for_user, lambda{ |user| where(:destination_url => user.person.receive_url) }
|
||||
scope :from_user, lambda{ |user| where(:destination_url.ne => user.person.receive_url) }
|
||||
|
||||
def self.instantiate(options = {})
|
||||
person = options[:from]
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class Retraction
|
||||
include ROXML
|
||||
include Diaspora::Webhooks
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class StatusMessage < Post
|
||||
|
||||
xml_name :status_message
|
||||
|
|
@ -11,16 +10,16 @@ class StatusMessage < Post
|
|||
key :message, String
|
||||
validates_presence_of :message
|
||||
|
||||
|
||||
def to_activity
|
||||
<<-XML
|
||||
<entry>
|
||||
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||
<title>#{self.message}</title>
|
||||
<link rel="alternate" type="text/html" href="#{person.url}status_messages/#{self.id}"/>
|
||||
<id>#{person.url}status_messages/#{self.id}</id>
|
||||
<published>#{self.created_at.xmlschema}</published>
|
||||
<updated>#{self.updated_at.xmlschema}</updated>
|
||||
<title>#{self.message}</title>
|
||||
<link rel="alternate" type="text/html" href="#{person.url}status_messages/#{self.id}"/>
|
||||
<id>#{person.url}status_messages/#{self.id}</id>
|
||||
<published>#{self.created_at.xmlschema}</published>
|
||||
<updated>#{self.updated_at.xmlschema}</updated>
|
||||
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
|
||||
</entry>
|
||||
XML
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,29 +2,29 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
require 'lib/diaspora/user/friending.rb'
|
||||
require 'lib/diaspora/user/querying.rb'
|
||||
require 'lib/salmon/salmon'
|
||||
require File.expand_path('../../../lib/diaspora/user/friending', __FILE__)
|
||||
require File.expand_path('../../../lib/diaspora/user/querying', __FILE__)
|
||||
require File.expand_path('../../../lib/diaspora/user/receiving', __FILE__)
|
||||
require File.expand_path('../../../lib/salmon/salmon', __FILE__)
|
||||
|
||||
class User
|
||||
include MongoMapper::Document
|
||||
include Diaspora::UserModules::Friending
|
||||
include Diaspora::UserModules::Querying
|
||||
include Diaspora::UserModules::Receiving
|
||||
include Encryptor::Private
|
||||
QUEUE = MessageHandler.new
|
||||
|
||||
devise :database_authenticatable, :registerable,
|
||||
:recoverable, :rememberable, :trackable, :validatable
|
||||
key :username, :unique => true
|
||||
key :serialized_private_key, String
|
||||
|
||||
key :friend_ids, Array
|
||||
key :pending_request_ids, Array
|
||||
key :visible_post_ids, Array
|
||||
key :visible_person_ids, Array
|
||||
|
||||
key :url, String
|
||||
|
||||
one :person, :class_name => 'Person', :foreign_key => :owner_id
|
||||
|
||||
many :friends, :in => :friend_ids, :class_name => 'Person'
|
||||
|
|
@ -36,7 +36,7 @@ class User
|
|||
|
||||
after_create :seed_aspects
|
||||
|
||||
before_validation_on_create :downcase_username
|
||||
before_validation :downcase_username, :on => :create
|
||||
|
||||
def self.find_for_authentication(conditions={})
|
||||
if conditions[:username] =~ /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i # email regex
|
||||
|
|
@ -67,12 +67,11 @@ class User
|
|||
def drop_aspect( aspect )
|
||||
if aspect.people.size == 0
|
||||
aspect.destroy
|
||||
else
|
||||
else
|
||||
raise "Aspect not empty"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def move_friend( opts = {})
|
||||
return true if opts[:to] == opts[:from]
|
||||
friend = Person.first(:_id => opts[:friend_id])
|
||||
|
|
@ -95,7 +94,6 @@ class User
|
|||
|
||||
######## Posting ########
|
||||
def post(class_name, options = {})
|
||||
|
||||
if class_name == :photo
|
||||
raise ArgumentError.new("No album_id given") unless options[:album_id]
|
||||
aspect_ids = aspects_with_post( options[:album_id] )
|
||||
|
|
@ -104,17 +102,44 @@ class User
|
|||
aspect_ids = options.delete(:to)
|
||||
end
|
||||
|
||||
aspect_ids = [aspect_ids.to_s] if aspect_ids.is_a? BSON::ObjectId
|
||||
raise ArgumentError.new("You must post to someone.") if aspect_ids.nil? || aspect_ids.empty?
|
||||
aspect_ids = validate_aspect_permissions(aspect_ids)
|
||||
|
||||
intitial_post(class_name, aspect_ids, options)
|
||||
end
|
||||
|
||||
def intitial_post(class_name, aspect_ids, options = {})
|
||||
post = build_post(class_name, options)
|
||||
|
||||
post.socket_to_uid(id, :aspect_ids => aspect_ids) if post.respond_to?(:socket_to_uid)
|
||||
push_to_aspects(post, aspect_ids)
|
||||
|
||||
post
|
||||
end
|
||||
|
||||
def update_post( post, post_hash = {} )
|
||||
if self.owns? post
|
||||
post.update_attributes(post_hash)
|
||||
end
|
||||
end
|
||||
|
||||
def validate_aspect_permissions(aspect_ids)
|
||||
if aspect_ids == "all"
|
||||
return aspect_ids
|
||||
end
|
||||
|
||||
aspect_ids = [aspect_ids.to_s] unless aspect_ids.is_a? Array
|
||||
|
||||
if aspect_ids.nil? || aspect_ids.empty?
|
||||
raise ArgumentError.new("You must post to someone.")
|
||||
end
|
||||
|
||||
aspect_ids.each do |aspect_id|
|
||||
unless self.aspects.find(aspect_id)
|
||||
raise ArgumentError.new("Cannot post to an aspect you do not own.")
|
||||
end
|
||||
end
|
||||
|
||||
aspect_ids
|
||||
end
|
||||
|
||||
def build_post( class_name, options = {})
|
||||
options[:person] = self.person
|
||||
model_class = class_name.to_s.camelize.constantize
|
||||
|
|
@ -141,26 +166,34 @@ class User
|
|||
aspect.save
|
||||
target_people = target_people | aspect.people
|
||||
}
|
||||
|
||||
push_to_hub(post) if post.respond_to?(:public) && post.public
|
||||
|
||||
push_to_people(post, target_people)
|
||||
end
|
||||
|
||||
def push_to_people(post, people)
|
||||
salmon = salmon(post)
|
||||
people.each{|person|
|
||||
salmon(post, :to => person)
|
||||
xml = salmon.xml_for person
|
||||
push_to_person( person, xml)
|
||||
}
|
||||
end
|
||||
|
||||
def push_to_person( person, xml )
|
||||
Rails.logger.debug("Adding xml for #{self} to message queue to #{url}")
|
||||
QUEUE.add_post_request( person.receive_url, person.encrypt(xml) )
|
||||
QUEUE.process
|
||||
|
||||
Rails.logger.debug("Adding xml for #{self} to message queue to #{self.url}")
|
||||
QUEUE.add_post_request( person.receive_url, xml )
|
||||
QUEUE.process
|
||||
end
|
||||
|
||||
def salmon( post, opts = {} )
|
||||
salmon = Salmon::SalmonSlap.create(self, post.to_diaspora_xml)
|
||||
push_to_person( opts[:to], salmon.to_xml)
|
||||
salmon
|
||||
def push_to_hub(post)
|
||||
Rails.logger.debug("Pushing update to pubsub server #{APP_CONFIG[:pubsub_server]} with url #{self.public_url}")
|
||||
QUEUE.add_hub_notification(APP_CONFIG[:pubsub_server], self.public_url)
|
||||
end
|
||||
|
||||
def salmon( post )
|
||||
created_salmon = Salmon::SalmonSlap.create(self, post.to_diaspora_xml)
|
||||
created_salmon
|
||||
end
|
||||
|
||||
######## Commenting ########
|
||||
|
|
@ -192,7 +225,7 @@ class User
|
|||
push_to_people comment, people_in_aspects(aspects_with_post(comment.post.id))
|
||||
elsif owns? comment
|
||||
comment.save
|
||||
salmon comment, :to => comment.post.person
|
||||
push_to_people comment, [comment.post.person]
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -217,88 +250,13 @@ class User
|
|||
end
|
||||
end
|
||||
|
||||
###### Receiving #######
|
||||
def receive_salmon ciphertext
|
||||
cleartext = decrypt( ciphertext)
|
||||
Rails.logger.info("Received a salmon: #{cleartext}")
|
||||
salmon = Salmon::SalmonSlap.parse cleartext
|
||||
if salmon.verified_for_key?(salmon.author.public_key)
|
||||
Rails.logger.info("data in salmon: #{salmon.data}")
|
||||
self.receive(salmon.data)
|
||||
end
|
||||
end
|
||||
|
||||
def receive xml
|
||||
object = Diaspora::Parser.from_xml(xml)
|
||||
Rails.logger.debug("Receiving object for #{self.real_name}:\n#{object.inspect}")
|
||||
Rails.logger.debug("From: #{object.person.inspect}") if object.person
|
||||
|
||||
if object.is_a? Retraction
|
||||
if object.type == 'Person'
|
||||
|
||||
Rails.logger.info( "the person id is #{object.post_id} the friend found is #{visible_person_by_id(object.post_id).inspect}")
|
||||
unfriended_by visible_person_by_id(object.post_id)
|
||||
else
|
||||
object.perform self.id
|
||||
aspects = self.aspects_with_person(object.person)
|
||||
aspects.each{ |aspect| aspect.post_ids.delete(object.post_id.to_id)
|
||||
aspect.save
|
||||
}
|
||||
end
|
||||
elsif object.is_a? Request
|
||||
person = Diaspora::Parser.parse_or_find_person_from_xml( xml )
|
||||
person.serialized_key ||= object.exported_key
|
||||
object.person = person
|
||||
object.person.save
|
||||
old_request = Request.first(:id => object.id)
|
||||
object.aspect_id = old_request.aspect_id if old_request
|
||||
object.save
|
||||
receive_friend_request(object)
|
||||
elsif object.is_a? Profile
|
||||
person = Diaspora::Parser.owner_id_from_xml xml
|
||||
person.profile = object
|
||||
person.save
|
||||
|
||||
elsif object.is_a?(Comment)
|
||||
object.person = Diaspora::Parser.parse_or_find_person_from_xml( xml ).save if object.person.nil?
|
||||
self.visible_people = self.visible_people | [object.person]
|
||||
self.save
|
||||
Rails.logger.debug("The person parsed from comment xml is #{object.person.inspect}") unless object.person.nil?
|
||||
object.person.save
|
||||
Rails.logger.debug("From: #{object.person.inspect}") if object.person
|
||||
raise "In receive for #{self.real_name}, signature was not valid on: #{object.inspect}" unless object.post.person == self.person || object.verify_post_creator_signature
|
||||
object.save
|
||||
unless owns?(object)
|
||||
dispatch_comment object
|
||||
end
|
||||
object.socket_to_uid(id) if (object.respond_to?(:socket_to_uid) && !self.owns?(object))
|
||||
else
|
||||
Rails.logger.debug("Saving object: #{object}")
|
||||
object.user_refs += 1
|
||||
object.save
|
||||
|
||||
self.raw_visible_posts << object
|
||||
self.save
|
||||
|
||||
aspects = self.aspects_with_person(object.person)
|
||||
aspects.each{ |aspect|
|
||||
aspect.posts << object
|
||||
aspect.save
|
||||
object.socket_to_uid(id, :aspect_ids => [aspect.id]) if (object.respond_to?(:socket_to_uid) && !self.owns?(object))
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
###Helpers############
|
||||
def self.instantiate!( opts = {} )
|
||||
hostname = opts[:url].gsub(/(https?:|www\.)\/\//, '')
|
||||
hostname.chop! if hostname[-1, 1] == '/'
|
||||
|
||||
opts[:person][:diaspora_handle] = "#{opts[:username]}@#{hostname}"
|
||||
puts opts[:person][:diaspora_handle]
|
||||
opts[:person][:serialized_key] = generate_key
|
||||
opts[:person][:diaspora_handle] = "#{opts[:username]}@#{APP_CONFIG[:terse_pod_url]}"
|
||||
opts[:person][:url] = APP_CONFIG[:pod_url]
|
||||
|
||||
opts[:serialized_private_key] = generate_key
|
||||
opts[:person][:serialized_public_key] = opts[:serialized_private_key].public_key
|
||||
User.create(opts)
|
||||
end
|
||||
|
||||
|
|
@ -306,22 +264,15 @@ else
|
|||
aspect(:name => "Family")
|
||||
aspect(:name => "Work")
|
||||
end
|
||||
|
||||
def terse_url
|
||||
terse = self.url.gsub(/(https?:|www\.)\/\//, '')
|
||||
terse = terse.chop! if terse[-1, 1] == '/'
|
||||
terse
|
||||
end
|
||||
|
||||
def diaspora_handle
|
||||
"#{self.username}@#{self.terse_url}"
|
||||
"#{self.username}@#{APP_CONFIG[:terse_pod_url]}"
|
||||
end
|
||||
|
||||
def downcase_username
|
||||
username.downcase! if username
|
||||
end
|
||||
|
||||
|
||||
def as_json(opts={})
|
||||
{
|
||||
:user => {
|
||||
|
|
@ -332,7 +283,14 @@ else
|
|||
}
|
||||
}
|
||||
end
|
||||
def self.generate_key
|
||||
OpenSSL::PKey::RSA::generate 4096
|
||||
end
|
||||
|
||||
|
||||
def self.generate_key
|
||||
OpenSSL::PKey::RSA::generate 4096
|
||||
end
|
||||
|
||||
def encryption_key
|
||||
OpenSSL::PKey::RSA.new( serialized_private_key )
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
class ImageUploader < CarrierWave::Uploader::Base
|
||||
include CarrierWave::MiniMagick
|
||||
|
||||
|
|
|
|||
|
|
@ -8,11 +8,11 @@
|
|||
|
||||
%div.time
|
||||
by
|
||||
= link_to ((current_user.person == post.person)? 'you' : post.person.real_name), person_path(post.person)
|
||||
= link_to ((current_user.person == post.person)? t('.you') : post.person.real_name), person_path(post.person)
|
||||
%br
|
||||
= link_to(how_long_ago(post), object_path(post, :aspect => @aspect))
|
||||
|
||||
%div.image_cycle
|
||||
- for photo in post.photos[0..3]
|
||||
= link_to (image_tag photo.url(:thumb_large)), album_path(post, :aspect => @aspect)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%h1 Add a new album
|
||||
%h1=t('.add_a_new_album')
|
||||
|
||||
= form_for Album.new do |f|
|
||||
= f.error_messages
|
||||
|
|
@ -11,4 +10,4 @@
|
|||
= f.label :name
|
||||
= f.text_field :name
|
||||
= f.hidden_field :to, :value => aspect
|
||||
= f.submit 'create', :class => 'button'
|
||||
= f.submit t('.create'), :class => 'button'
|
||||
|
|
|
|||
|
|
@ -2,14 +2,13 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
.back= link_to "⇧ #{@album.name}", @album
|
||||
%h1.big_text
|
||||
|
||||
= "Editing #{@album.name}"
|
||||
= "#{t('.editing')} #{@album.name}"
|
||||
|
||||
.sub_header
|
||||
="updated #{how_long_ago(@album)}"
|
||||
="#{t('.updated')} #{how_long_ago(@album)}"
|
||||
|
||||
- form_for @album do |a|
|
||||
= a.error_messages
|
||||
|
|
@ -21,12 +20,12 @@
|
|||
.photo_edit_block= image_tag photo.url(:thumb_medium)
|
||||
|
||||
#submit_block
|
||||
= link_to "Cancel", root_path
|
||||
= link_to t('.cancel'), root_path
|
||||
or
|
||||
= a.submit
|
||||
|
||||
.button.delete
|
||||
= link_to 'Delete Album', @album, :confirm => 'Are you sure?', :method => :delete
|
||||
= link_to t('.delete_album'), @album, :confirm => t('.are_you_sure'), :method => :delete
|
||||
|
||||
#content_bottom
|
||||
.back
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- content_for :head do
|
||||
:javascript
|
||||
$(document).ready(function(){
|
||||
|
|
@ -10,7 +9,7 @@
|
|||
});
|
||||
|
||||
= content_for :page_title do
|
||||
= link_to "◂ Home", aspects_path, :aspect => params[:aspect]
|
||||
= link_to "◂ #{t('.home')}", aspects_path, :aspect => params[:aspect]
|
||||
|
||||
- content_for :left_pane do
|
||||
= render "shared/aspect_friends"
|
||||
|
|
@ -19,7 +18,7 @@
|
|||
%h1
|
||||
Albums
|
||||
.right
|
||||
= link_to 'New Album', '#new_album_pane', {:class => "button", :id => "add_album_button"}
|
||||
= link_to t('.new_album'), '#new_album_pane', {:class => "button", :id => "add_album_button"}
|
||||
|
||||
.yo{:style => "display:none;" }
|
||||
#new_album_pane
|
||||
|
|
@ -34,4 +33,4 @@
|
|||
|
||||
#content_bottom
|
||||
.back
|
||||
= link_to "⇧ home", root_path
|
||||
= link_to "⇧ #{t('.home')}", root_path
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
:javascript
|
||||
$(document).ready(function(){
|
||||
$(".image_thumb img").load( function() {
|
||||
|
|
@ -11,33 +10,30 @@
|
|||
});
|
||||
|
||||
= content_for :page_title do
|
||||
= link_to "◂ Albums", albums_path(:aspect => @aspect)
|
||||
= link_to "◂ #{t('.albums')}", albums_path(:aspect => @aspect)
|
||||
|
||||
- content_for :left_pane do
|
||||
= render "shared/aspect_friends"
|
||||
|
||||
- content_for :publish do
|
||||
-if current_user.owns? @album
|
||||
.right
|
||||
=render 'photos/new_photo'
|
||||
= link_to t('.edit_album'), edit_album_path(@album), :class => 'button'
|
||||
%h1
|
||||
= @album.name
|
||||
="updated #{how_long_ago(@album)}"
|
||||
|
||||
="#{t('.updated')} #{how_long_ago(@album)}"
|
||||
|
||||
.album_id{:id => @album.id, :style => "display:hidden;"}
|
||||
|
||||
-unless current_user.owns? @album
|
||||
%h4= "by #{@album.person.real_name}"
|
||||
%h4= "#{t('.by')} #{@album.person.real_name}"
|
||||
|
||||
#thumbnails
|
||||
- for photo in @album_photos
|
||||
.image_thumb
|
||||
= link_to (image_tag photo.url(:thumb_medium)), object_path(photo)
|
||||
-if current_user.owns? @album
|
||||
=render 'photos/new_photo'
|
||||
|
||||
#content_bottom
|
||||
.back
|
||||
= link_to "⇧ albums", albums_path
|
||||
|
||||
-if current_user.owns? @album
|
||||
.right
|
||||
= link_to 'Edit Album', edit_album_path(@album), :class => 'button'
|
||||
= link_to "⇧ #{t('.albums')}", albums_path
|
||||
|
|
|
|||
|
|
@ -2,11 +2,10 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%h1 Add a new aspect
|
||||
%h1=t('.add_a_new_aspect')
|
||||
= form_for Aspect.new do |f|
|
||||
= f.error_messages
|
||||
%p
|
||||
= f.label :name
|
||||
= f.text_field :name
|
||||
= f.submit 'create', :class => 'button'
|
||||
= f.submit t('.create'), :class => 'button'
|
||||
|
|
|
|||
|
|
@ -2,10 +2,8 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- content_for :page_title do
|
||||
= link_to "photos", albums_path(:aspect => @aspect)
|
||||
|
||||
= link_to t('.photos'), albums_path(:aspect => @aspect)
|
||||
|
||||
- content_for :left_pane do
|
||||
= render "shared/aspect_friends"
|
||||
|
|
|
|||
|
|
@ -2,47 +2,48 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- content_for :head do
|
||||
- content_for :head do
|
||||
= javascript_include_tag 'jquery-ui-1.8.4.custom.min.js'
|
||||
= javascript_include_tag 'aspect-edit.js'
|
||||
|
||||
- content_for :left_pane do
|
||||
%h1
|
||||
Requests
|
||||
%h1=t('.requests')
|
||||
|
||||
.requests
|
||||
%ul.dropzone
|
||||
- for request in @remote_requests
|
||||
%li.requested_person{:id => request.person.id, :request_id => request.id}
|
||||
= person_image_tag(request.person)
|
||||
.name
|
||||
= request.person.real_name
|
||||
%h1
|
||||
Ignore/Remove
|
||||
- if @remote_requests.size < 1
|
||||
%li.grey No new requests
|
||||
- else
|
||||
- for request in @remote_requests
|
||||
%li.requested_person{:id => request.person.id, :request_id => request.id}
|
||||
= person_image_tag(request.person)
|
||||
.name
|
||||
= request.person.real_name
|
||||
%h1=t('.ignore_remove')
|
||||
|
||||
%li.remove
|
||||
%ul.dropzone
|
||||
%li.grey Drag to ignore/remove
|
||||
|
||||
- content_for :publish do
|
||||
= link_to("add a new aspect", "#add_aspect_pane", :id => "add_aspect_button", :class => "new_aspect button", :title => "Add a new aspect")
|
||||
|
||||
|
||||
= link_to(t('.add_a_new_aspect'), "#add_aspect_pane", :id => "add_aspect_button", :class => "new_aspect button", :title => t('.add_a_new_aspect'))
|
||||
|
||||
%ul#aspect_list
|
||||
- for aspect in @aspects
|
||||
%li.aspect
|
||||
|
||||
|
||||
.aspect_name
|
||||
%h1{:contenteditable => true}= aspect.name
|
||||
%span.edit_name_field
|
||||
%h1{:contenteditable => true}= aspect.name
|
||||
%span.tip click to edit
|
||||
|
||||
%ul.tools
|
||||
%li= link_to "add a new friend", "#add_request_pane_#{aspect.id}", :class => 'add_request_button'
|
||||
%li= link_to "show", aspect_path(aspect)
|
||||
%li= link_to t('.add_a_new_friend'), "#add_request_pane_#{aspect.id}", :class => 'add_request_button'
|
||||
%li= link_to t('.show'), aspect_path(aspect)
|
||||
%li!= remove_link(aspect)
|
||||
|
||||
|
||||
%ul.dropzone{:id => aspect.id}
|
||||
|
||||
|
||||
-if aspect.people.size < 1
|
||||
%li.grey Drag to add people
|
||||
|
||||
|
|
@ -52,13 +53,9 @@
|
|||
%li.person{:id => person.id, :from_aspect_id => aspect.id}
|
||||
= person_image_tag(person)
|
||||
.name
|
||||
= person.real_name
|
||||
= link_to person.real_name, person
|
||||
.yo{:style => 'display:none'}
|
||||
%div{:id => "add_request_pane_#{aspect.id}"}
|
||||
= render "requests/new_request", :aspect => aspect
|
||||
|
||||
%p
|
||||
%br
|
||||
= link_to 'Update Aspects', '#', :class => 'button', :id => "move_friends_link"
|
||||
|
||||
#content_bottom
|
||||
|
|
|
|||
24
app/views/aspects/public.html.haml
Normal file
24
app/views/aspects/public.html.haml
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
-# Copyright (c) 2010, Diaspora Inc. This file is
|
||||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- content_for :page_title do
|
||||
= link_to "photos", albums_path(:aspect => @aspect)
|
||||
|
||||
- content_for :left_pane do
|
||||
= render "shared/aspect_friends"
|
||||
|
||||
- content_for :publish do
|
||||
- if @logged_in
|
||||
= render "shared/publisher", :aspect_ids => :public
|
||||
- else
|
||||
= render "shared/publisher", :aspect_ids => :all
|
||||
|
||||
%ul#stream
|
||||
- for post in @posts
|
||||
= render type_partial(post), :post => post unless post.class == Album
|
||||
|
||||
#pagination
|
||||
= will_paginate @posts
|
||||
|
||||
|
|
@ -2,9 +2,8 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- content_for :page_title do
|
||||
= link_to "photos", albums_path(:aspect => @aspect)
|
||||
= link_to t('.photos'), albums_path(:aspect => @aspect)
|
||||
|
||||
- content_for :left_pane do
|
||||
= render "shared/aspect_friends"
|
||||
|
|
|
|||
|
|
@ -2,11 +2,10 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%li.comment{:id => post.id}
|
||||
%li.comment{:id => post.id}
|
||||
= person_image_tag(post.person)
|
||||
%span.from
|
||||
= link_to post.person.real_name, post.person
|
||||
= auto_link sanitize post.text
|
||||
= post.text
|
||||
%div.time
|
||||
= "#{time_ago_in_words(post.updated_at)} ago"
|
||||
= "#{time_ago_in_words(post.updated_at)} #{t('.ago')}"
|
||||
|
|
|
|||
|
|
@ -2,11 +2,10 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%div.comments
|
||||
%ul.comment_set{:id => post.id}
|
||||
- for comment in post.comments
|
||||
= render 'comments/comment', :post => comment
|
||||
%li.comment.show
|
||||
= render 'comments/new_comment', :post => post
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,10 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
= form_for Comment.new, :remote => true do |f|
|
||||
%p
|
||||
%label{:for => "comment_text_on_#{post.id}"} Comment
|
||||
= f.text_area :text, :rows => 1, :id => "comment_text_on_#{post.id}", :class => "comment_box"
|
||||
= f.hidden_field :post_id, :value => post.id
|
||||
%p{:style => "text-align:right;"}
|
||||
= f.submit "Comment", :class => "comment_submit button"
|
||||
= f.submit t('.comment'), :class => "comment_submit button"
|
||||
|
|
|
|||
|
|
@ -1,10 +1,16 @@
|
|||
%h1
|
||||
This is a technology preview, do not provide any private information.
|
||||
%h3
|
||||
your account may be deleted until we move into a more stable development period.
|
||||
%h3
|
||||
USE AT YOUR OWN RISK!!
|
||||
= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
|
||||
#user
|
||||
%p.username
|
||||
= f.label :username
|
||||
= f.text_field :username
|
||||
%p.user_network
|
||||
="@#{request.host}"
|
||||
="@#{APP_CONFIG[:terse_pod_url]}"
|
||||
|
||||
%p
|
||||
= f.label :password
|
||||
|
|
@ -14,6 +20,7 @@
|
|||
/ = f.check_box :remember_me
|
||||
/ = f.label :remember_me
|
||||
= f.submit "Sign in"
|
||||
= link_to "Have a problem? Find an answer here", 'http://diaspora.shapado.com/'
|
||||
%p
|
||||
= render :partial => "devise/shared/links"
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
= javascript_include_tag 'FABridge', 'swfobject', 'web_socket'
|
||||
:javascript
|
||||
WebSocket.__swfLocation = "/javascripts/WebSocketMain.swf";
|
||||
|
|
@ -19,25 +18,23 @@
|
|||
|
||||
if (obj['class']=="retractions"){
|
||||
processRetraction(obj['post_id']);
|
||||
|
||||
|
||||
}else if (obj['class']=="comments"){
|
||||
processComment(obj['post_id'], obj['html'])
|
||||
|
||||
processComment(obj['post_id'], obj['html'])
|
||||
|
||||
}else if (obj['class']=='photos' && onPageForClass('albums')){
|
||||
processPhotoInAlbum(obj['photo_hash'])
|
||||
}else{
|
||||
processPost(obj['class'], obj['html'], obj['aspect_ids'])
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
};
|
||||
ws.onclose = function() { debug("socket closed"); };
|
||||
ws.onopen = function() {
|
||||
ws.send(location.pathname);
|
||||
debug("connected...");
|
||||
};
|
||||
|
||||
|
||||
});
|
||||
function processRetraction(post_id){
|
||||
$('#' + post_id ).fadeOut(500, function(){
|
||||
|
|
@ -66,7 +63,7 @@
|
|||
$(html).fadeIn("fast", function(){
|
||||
$("#stream label:first").inFieldLabels();
|
||||
})
|
||||
);
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -77,13 +74,13 @@
|
|||
html = "<div class=\'image_thumb\' id=\'"+photoHash['id']+"\' style=\'padding-right:3px;\'> \
|
||||
<a href=\"/photos/"+ photoHash['id'] +"\"> \
|
||||
<img alt=\"New thumbnail\" src=\""+ photoHash['thumb_url'] +"\" /> \
|
||||
</a> </div>"
|
||||
</a> </div>"
|
||||
$("#thumbnails").append( $(html) )
|
||||
$("#"+ photoHash['id'] + " img").load( function() {
|
||||
$(this).fadeIn("slow");
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function onPageForClass(className){
|
||||
return (location.href.indexOf(className) != -1 );
|
||||
}
|
||||
|
|
@ -100,9 +97,9 @@
|
|||
}
|
||||
|
||||
function onPageForAspect(aspectId){
|
||||
return (location.href.indexOf(aspectId) != -1 )
|
||||
return (location.href.indexOf(aspectId) != -1 )
|
||||
}
|
||||
|
||||
|
||||
function onPageOne() {
|
||||
var c = document.location.search.charAt(document.location.search.length-1);
|
||||
return ((c =='') || (c== '1'));
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
!!!
|
||||
%html
|
||||
%head
|
||||
|
|
@ -10,24 +9,24 @@
|
|||
= "#{current_user.real_name} | diaspora" if current_user
|
||||
|
||||
%meta{"http-equiv"=>"Content-Type", :content=>"text/html; charset=utf-8"}/
|
||||
|
||||
|
||||
= stylesheet_link_tag "blueprint/screen", :media => 'screen'
|
||||
= stylesheet_link_tag "application", "ui"
|
||||
|
||||
= stylesheet_link_tag "/../javascripts/fancybox/jquery.fancybox-1.3.1"
|
||||
= stylesheet_link_tag "fileuploader"
|
||||
= stylesheet_link_tag "/../javascripts/fancybox/jquery.fancybox-1.3.1"
|
||||
= stylesheet_link_tag "fileuploader"
|
||||
|
||||
/= javascript_include_tag "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"
|
||||
= javascript_include_tag 'jquery-1.4.2.min', 'rails'
|
||||
= javascript_include_tag 'jquery.infieldlabel', 'jquery.cycle/jquery.cycle.min.js'
|
||||
|
||||
|
||||
= javascript_include_tag 'fancybox/jquery.fancybox-1.3.1.pack'
|
||||
= javascript_include_tag 'fileuploader'
|
||||
|
||||
= javascript_include_tag 'view', 'image_picker', 'stream'
|
||||
|
||||
= render 'js/websocket_js'
|
||||
|
||||
|
||||
= csrf_meta_tag
|
||||
= yield(:head)
|
||||
|
||||
|
|
@ -50,8 +49,8 @@
|
|||
= text_field_tag 'q'
|
||||
|
||||
%li= link_to current_user.real_name, current_user.person
|
||||
%li= link_to "edit profile", edit_user_path(current_user)
|
||||
%li= link_to "logout", destroy_user_session_path
|
||||
%li= link_to t('.edit_profile'), edit_user_path(current_user)
|
||||
%li= link_to t('.logout.'), destroy_user_session_path
|
||||
|
||||
= render "shared/aspect_nav"
|
||||
= render "shared/sub_header"
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
!!!
|
||||
%html
|
||||
%head
|
||||
|
|
@ -10,7 +9,7 @@
|
|||
DIASPORA | login
|
||||
%meta{"http-equiv"=>"Content-Type", :content=>"text/html; charset=utf-8"}/
|
||||
%meta{"http-equiv"=> "X-UA-Compatible", :content =>"chrome=1" }
|
||||
|
||||
|
||||
= stylesheet_link_tag "sessions"
|
||||
/= javascript_include_tag"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"
|
||||
= javascript_include_tag 'jquery142'
|
||||
|
|
@ -18,10 +17,10 @@
|
|||
|
||||
:javascript
|
||||
$(document).ready(function(){
|
||||
$("#user_username").focus();
|
||||
$("#user_username").focus();
|
||||
$("label").inFieldLabels();
|
||||
});
|
||||
|
||||
|
||||
= csrf_meta_tag
|
||||
= yield(:head)
|
||||
|
||||
|
|
@ -44,11 +43,11 @@
|
|||
</div>
|
||||
</div>
|
||||
<![endif]-->
|
||||
|
||||
|
||||
- flash.each do |name, msg|
|
||||
= content_tag :div, msg, :id => "flash_#{name}"
|
||||
%div#huge_text
|
||||
DIASPORA*
|
||||
= yield
|
||||
|
||||
|
||||
/= link_to "signup", "/signup"
|
||||
|
|
|
|||
27
app/views/people/_person.html.haml
Normal file
27
app/views/people/_person.html.haml
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
-# Copyright (c) 2010, Diaspora Inc. This file is
|
||||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
%li.message{:id => person.id}
|
||||
|
||||
= person_image_link(person)
|
||||
|
||||
.content
|
||||
%span.from
|
||||
= link_to person.real_name, person_path(person)
|
||||
|
||||
.info
|
||||
= person.diaspora_handle
|
||||
|
||||
.right{ :style => "display:inline;top:0;" }
|
||||
- if person.id == current_user.person.id
|
||||
thats you!
|
||||
- elsif current_user.friends.include?(person)
|
||||
Already friends
|
||||
- elsif current_user.pending_requests.find_by_person_id(person.id)
|
||||
= link_to =t('.pending_request'), aspects_manage_path
|
||||
- else
|
||||
= form_for Request.new do |f|
|
||||
= f.select(:aspect_id, @aspects_dropdown_array)
|
||||
= f.hidden_field :destination_url, :value => person.diaspora_handle
|
||||
= f.submit t('.add_friend')
|
||||
|
|
@ -2,50 +2,23 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- content_for :publish do
|
||||
%h1
|
||||
Search
|
||||
|
||||
=form_tag '/people', :method => "get" do
|
||||
= text_field_tag :q
|
||||
= text_field_tag :q, params[:q]
|
||||
= submit_tag "search"
|
||||
|
||||
- content_for :left_pane do
|
||||
\.
|
||||
|
||||
= (@people.count).to_s + search_or_index
|
||||
%table
|
||||
%tr
|
||||
%th real name
|
||||
%th diaspora handle
|
||||
%th url
|
||||
- for person in @people
|
||||
%tr
|
||||
- if current_user.friends.include? person
|
||||
%td= link_to person.real_name, person
|
||||
- else
|
||||
%td= person.real_name
|
||||
%h1
|
||||
search results for
|
||||
%u= params[:q]
|
||||
|
||||
%td= person.diaspora_handle
|
||||
%td= person.url
|
||||
|
||||
-if current_user.friends.include? person
|
||||
%ul#stream
|
||||
- for person in @people
|
||||
= render 'people/person', :person => person
|
||||
|
||||
- elsif person.id == current_user.person.id
|
||||
%td
|
||||
%td that's you!
|
||||
-elsif current_user.pending_requests.find_by_person_id(person.id)
|
||||
%td
|
||||
%td ^-you have a friend request from this person
|
||||
-elsif current_user.pending_requests.find_by_url(person.receive_url)
|
||||
%td
|
||||
%td friend request pending
|
||||
-else
|
||||
%td
|
||||
%td
|
||||
= form_for Request.new do |f|
|
||||
= f.select(:aspect_id, @aspects_dropdown_array)
|
||||
= f.hidden_field :destination_url, :value => person.diaspora_handle
|
||||
= f.submit "add friend"
|
||||
= will_paginate @people
|
||||
= will_paginate @people
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- title "New Person"
|
||||
- title=t('.new_person')
|
||||
|
||||
= form_for @person do |f|
|
||||
= f.error_messages
|
||||
|
|
@ -15,18 +14,17 @@
|
|||
= f.label :url
|
||||
%br
|
||||
= f.text_field :url
|
||||
|
||||
|
||||
=f.fields_for :profile do |p|
|
||||
%p
|
||||
= p.label :first_name
|
||||
%br
|
||||
= p.text_field :first_name
|
||||
|
||||
|
||||
%p
|
||||
= p.label :last_name
|
||||
%br
|
||||
= p.text_field :last_name
|
||||
= f.submit
|
||||
|
||||
|
||||
%p= link_to "Back to List", people_path
|
||||
%p= link_to t('.back_to_list'), people_path
|
||||
|
|
|
|||
|
|
@ -2,9 +2,8 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- content_for :page_title do
|
||||
= @person.real_name
|
||||
profile
|
||||
|
||||
- content_for :left_pane do
|
||||
#profile
|
||||
|
|
@ -13,22 +12,22 @@
|
|||
%ul
|
||||
-unless @posts.first.nil?
|
||||
%li
|
||||
%i= "last seen: #{how_long_ago(@posts.first)}"
|
||||
%i= t(".last_seen",:how_long_ago => how_long_ago(@posts.first))
|
||||
- if @person != current_user.person && current_user.friends.include?(@person)
|
||||
%li
|
||||
%i= "friends since: #{how_long_ago(@person)}"
|
||||
%i= t(".friends_since",:how_long_ago => how_long_ago(@person))
|
||||
%li
|
||||
= form_tag move_friend_path
|
||||
= select :to, :to, @aspects_dropdown_array, :selected => @aspects_with_person.first.id
|
||||
= hidden_field_tag :from, :from, :value => @aspects_with_person.first.id
|
||||
= hidden_field_tag :friend_id, :friend_id, :value => @person.id
|
||||
= submit_tag "save"
|
||||
= submit_tag t('.save')
|
||||
|
||||
- if @person != current_user.person && current_user.friends.include?(@person)
|
||||
= link_to 'remove friend', @person, :confirm => 'Are you sure?', :method => :delete, :class => "button"
|
||||
= link_to t('.remove_friend'), @person, :confirm => t('.are_you_sure'), :method => :delete, :class => "button"
|
||||
|
||||
.span-20.last
|
||||
|
||||
|
||||
.span-19.last
|
||||
- if @posts
|
||||
%ul#stream
|
||||
|
|
@ -36,4 +35,4 @@
|
|||
= render type_partial(post), :post => post unless post.class == Album
|
||||
= will_paginate @posts
|
||||
- else
|
||||
%h3 no posts to display!
|
||||
%h3=t('no posts to display!')
|
||||
|
|
|
|||
|
|
@ -2,16 +2,15 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
:javascript
|
||||
function createUploader(){
|
||||
function createUploader(){
|
||||
var uploader = new qq.FileUploader({
|
||||
element: document.getElementById('file-upload'),
|
||||
params: {'album_id' : "#{@album.id}"},
|
||||
allowedExtensions: ['jpg', 'jpeg', 'png'],
|
||||
allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'],
|
||||
action: "#{photos_path}"
|
||||
});
|
||||
});
|
||||
}
|
||||
window.onload = createUploader;
|
||||
window.onload = createUploader;
|
||||
|
||||
#file-upload
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%li.message{:id => post.id}
|
||||
|
||||
= person_image_tag(post.person)
|
||||
|
|
@ -11,15 +10,25 @@
|
|||
%span.from
|
||||
= link_to post.person.real_name, post.person
|
||||
%b
|
||||
posted a new photo to
|
||||
=t('.posted_a_new_photo_to')
|
||||
= link_to post.album.name, object_path(post.album)
|
||||
|
||||
%br
|
||||
= render "albums/album", :post => post.album, :current_user => current_user
|
||||
= link_to (image_tag post.url(:thumb_medium)), object_path(post)
|
||||
|
||||
|
||||
.info
|
||||
= link_to(how_long_ago(post), photo_path(post))
|
||||
\--
|
||||
= link_to "show comments (#{post.comments.count})", '#', :class => "show_post_comments"
|
||||
= render "comments/comments", :post => post
|
||||
= link_to "#{t('.show_comments')} (#{post.comments.count})", '#', :class => "show_post_comments"
|
||||
= render "comments/comments", :post => post
|
||||
|
||||
- if post.public?
|
||||
.public_aspect_tag
|
||||
public
|
||||
- else
|
||||
.aspect_tag
|
||||
%ul
|
||||
- for aspect in current_user.aspects_with_post( post.id )
|
||||
%li= aspect.name
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,10 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%h1.big_text
|
||||
.back
|
||||
= link_to "⇧ #{@album.name}", album_path(@album)
|
||||
= "Editing #{@photo.image}"
|
||||
= "#{t('.editing')} #{@photo.image}"
|
||||
|
||||
%div{:id => @photo.id}
|
||||
|
||||
|
|
@ -14,6 +13,7 @@
|
|||
= linked_scaled_photo @photo, @album
|
||||
|
||||
= form_for @photo do |p|
|
||||
= p.label :caption
|
||||
= p.text_field :caption, :value => @photo.caption
|
||||
= p.submit
|
||||
%div{:class => 'clear'}
|
||||
|
|
@ -23,5 +23,5 @@
|
|||
= link_to "⇧ #{@album.name}", album_path(@album)
|
||||
-if current_user.owns? @album
|
||||
.button.right
|
||||
= link_to 'Delete Photo', @photo, :confirm => 'Are you sure?', :method => :delete
|
||||
= link_to t('.delete_photo'), @photo, :confirm => t('.are_you_sure'), :method => :delete
|
||||
|
||||
|
|
|
|||
|
|
@ -2,13 +2,12 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- title "New Photo"
|
||||
- title t('.new_photo')
|
||||
|
||||
= form_for( @photo, :html => {:multipart => true}) do |f|
|
||||
= f.error_messages
|
||||
%p
|
||||
= f.file_field :image
|
||||
= f.submit 'post it!', :class => 'button'
|
||||
= f.submit t('.post_it'), :class => 'button'
|
||||
|
||||
%p= link_to "Back to List", photos_path
|
||||
%p= link_to t('.back_to_list'), photos_path
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
:javascript
|
||||
$(document).keydown(function(e){
|
||||
switch(e.keyCode) {
|
||||
|
|
@ -67,16 +66,15 @@
|
|||
%h1
|
||||
= @photo.image
|
||||
|
||||
= link_to "<< prev", url_to_prev(@photo, @album)
|
||||
= link_to "<< #{t('.prev')}", url_to_prev(@photo, @album)
|
||||
|
|
||||
= link_to "full size", @photo.url
|
||||
= link_to "#{t('.full_size')}", @photo.url
|
||||
|
|
||||
= link_to "next >>", url_to_next(@photo, @album)
|
||||
= link_to "#{t('.next')} >>", url_to_next(@photo, @album)
|
||||
|
||||
.right
|
||||
-if current_user.owns? @album
|
||||
= link_to 'Edit Photo', edit_photo_path(@photo), :class => "button"
|
||||
|
||||
= link_to t('.edit_photo'), edit_photo_path(@photo), :class => "button"
|
||||
|
||||
%div{:id => @photo.id}
|
||||
#show_photo
|
||||
|
|
@ -104,9 +102,9 @@
|
|||
|
||||
-if current_user.owns? @album
|
||||
.right
|
||||
= link_to 'Delete Photo', @photo, :confirm => 'Are you sure?', :method => :delete, :class => 'button'
|
||||
= link_to t('.delete_photo'), @photo, :confirm => t('.are_you_sure'), :method => :delete, :class => 'button'
|
||||
|
||||
%h4{:class => "show_post_comments"}
|
||||
= "comments (#{@photo.comments.count})"
|
||||
= "#{t('.comments')} (#{@photo.comments.count})"
|
||||
= render "comments/comments", :post => @photo
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
#debug_info
|
||||
%h5 DEBUG INFO
|
||||
#debug_more{ :style => "display:none;" }
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%ul
|
||||
%h3= link_to post.class, object_path(post)
|
||||
%h3= link_to post.class, object_path(post)
|
||||
- for field in object_fields(post)
|
||||
%li= "#{field}: #{post.attributes[field]}"
|
||||
%li= "#{field}: #{post.attributes[field]}"
|
||||
|
|
|
|||
|
|
@ -1,42 +1,48 @@
|
|||
<div id="content">
|
||||
<h1><%=@person.real_name%></h1>
|
||||
<div id="content_inner">
|
||||
<div id="i" class="entity_profile vcard author">
|
||||
<h2>User profile</h2>
|
||||
<dl class="entity_nickname">
|
||||
<dt>Nickname</dt>
|
||||
<dd>
|
||||
<a href="<%=@person.url%>" rel="me" class="nickname url uid"><%= @person.real_name%></a>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="entity_given_name">
|
||||
<dt>Full name</dt>
|
||||
<dd>
|
||||
<span class="given_name" ><%= @person.profile.first_name %></span>
|
||||
</dd>
|
||||
<div id="content">
|
||||
<h1><%=@person.real_name%></h1>
|
||||
<div id="content_inner">
|
||||
<div id="i" class="entity_profile vcard author">
|
||||
<h2>User profile</h2>
|
||||
<dl class="entity_nickname">
|
||||
<dt>Nickname</dt>
|
||||
<dd>
|
||||
<a href="<%=@person.url%>" rel="me" class="nickname url uid"><%= @person.real_name%></a>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="entity_given_name">
|
||||
<dt>Full name</dt>
|
||||
<dd>
|
||||
<span class="given_name" ><%= @person.profile.first_name %></span>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="entity_family_name">
|
||||
<dt>Full name</dt>
|
||||
<dd>
|
||||
<span class="family_name" ><%= @person.profile.last_name %></span>
|
||||
</dd>
|
||||
<dl class="entity_family_name">
|
||||
<dt>Full name</dt>
|
||||
<dd>
|
||||
<span class="family_name" ><%= @person.profile.last_name %></span>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="entity_fn">
|
||||
<dt>Full name</dt>
|
||||
<dd>
|
||||
<span class="fn" ><%= @person.real_name %></span>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="entity_url">
|
||||
<dt>URL</dt>
|
||||
<dd>
|
||||
<a href="<%= @person.url%>" rel="me" id="pod_location" class="url"><%= @person.url%></a>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="entity_note">
|
||||
<dt>Note</dt>
|
||||
<dd class="note">Diaspora is awesome! vi is better than emacs!</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<dl class="entity_fn">
|
||||
<dt>Full name</dt>
|
||||
<dd>
|
||||
<span class="fn" ><%= @person.real_name %></span>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="entity_url">
|
||||
<dt>URL</dt>
|
||||
<dd>
|
||||
<a href="<%= @person.url%>" rel="me" id="pod_location" class="url"><%= @person.url%></a>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="entity_photo">
|
||||
<dt>Photo</dt>
|
||||
<dd>
|
||||
<img class="photo avatar" src="<%= @person.profile.image_url%>" width="100" height="100"/>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="entity_note">
|
||||
<dt>Note</dt>
|
||||
<dd class="note">Diaspora is awesome! vi is better than emacs!</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
|
||||
<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
|
||||
xmlns:hm='http://host-meta.net/xrd/1.0'>
|
||||
<hm:Host><%= terse_url(root_url) %></hm:Host>
|
||||
<Link rel='lrdd'
|
||||
<Link rel='lrdd'
|
||||
template='<%= root_url %>webfinger?q={uri}'>
|
||||
<Title>Resource Descriptor</Title>
|
||||
</Link>
|
||||
|
|
|
|||
|
|
@ -5,5 +5,8 @@
|
|||
<Link rel="http://microformats.org/profile/hcard" type="text/html" href="<%=@person.url%>hcard/users/<%=@person.id%>"/>
|
||||
<Link rel="http://joindiaspora.com/seed_location" type = 'text/html' href="<%=@person.url%>"/>
|
||||
<Link rel="http://joindiaspora.com/guid" type = 'text/html' href="<%=@person.id%>"/>
|
||||
|
||||
<Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="<%=@person.public_url%>.atom"/>
|
||||
|
||||
<Link rel="diaspora-public-key" type = 'RSA' href="<%=Base64.encode64(@person.exported_key)%>"/>
|
||||
</XRD>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
= image_tag "http://needcoffee.cachefly.net/needcoffee/uploads/2009/02/predator-arnold-schwarzenegger.jpg"
|
||||
|
||||
|
||||
= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
|
||||
= f.hidden_field :url, :value => request.host
|
||||
%p
|
||||
= f.label :username
|
||||
= f.text_field :username
|
||||
|
|
@ -17,8 +15,6 @@
|
|||
= f.password_field :password_confirmation
|
||||
|
||||
= f.fields_for :person do |p|
|
||||
= p.hidden_field :url, :value => request.host
|
||||
|
||||
= p.fields_for :profile do |pr|
|
||||
%p
|
||||
= pr.label :first_name
|
||||
|
|
@ -27,5 +23,5 @@
|
|||
= pr.label :last_name
|
||||
= pr.text_field :last_name
|
||||
|
||||
= f.submit "Sign up"
|
||||
= f.submit t('.sign_up')
|
||||
= render :partial => "devise/shared/links"
|
||||
|
|
|
|||
|
|
@ -2,20 +2,19 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%h1
|
||||
Add a new friend to
|
||||
=t('.add_a_new_friend_to')
|
||||
%i= aspect.name
|
||||
|
||||
= form_for Request.new do |f|
|
||||
= f.error_messages
|
||||
|
||||
Enter a Diaspora username:
|
||||
=t('.enter_a_diaspora_username')
|
||||
%br
|
||||
%i= "Your Diaspora username is: #{current_user.diaspora_handle}"
|
||||
%i= t '.your_diaspora_username_is', :diaspora_handle => current_user.diaspora_handle
|
||||
|
||||
%p
|
||||
= f.label :destination_url, "Friend's username"
|
||||
= f.label :destination_url, t(".friends_username")
|
||||
= f.text_field :destination_url
|
||||
= f.hidden_field :aspect_id, :value => aspect.id
|
||||
= f.submit
|
||||
|
|
|
|||
|
|
@ -2,19 +2,22 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
#friend_pictures
|
||||
= owner_image_link
|
||||
- for friend in @friends
|
||||
= person_image_link(friend)
|
||||
|
||||
-unless @aspect == :all
|
||||
- if @logged_in && (@aspect == :public)
|
||||
%h3 Facebook Friends
|
||||
- @fb_friends = MiniFB.get(@access_token, 'me', :type => "friends")
|
||||
- @fb_friends[:data].each do |friend|
|
||||
= image_tag( "http://graph.facebook.com/#{friend[:id]}/picture" )
|
||||
-unless (@aspect == :all) || (@aspect == :public)
|
||||
= link_to (image_tag('add_friend_button.png', :height => "50px", :width => "50px")), "#add_request_pane", :id => 'add_request_button'
|
||||
|
||||
|
||||
.yo{:style => 'display:none'}
|
||||
#add_request_pane
|
||||
= render "requests/new_request", :aspect => @aspect
|
||||
= render "requests/new_request", :aspect => @aspect
|
||||
-else
|
||||
.clear
|
||||
= link_to "add friends", aspects_manage_path
|
||||
= link_to t('.add_friends'), aspects_manage_path
|
||||
|
||||
|
|
|
|||
|
|
@ -2,19 +2,20 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
#aspect_nav
|
||||
%ul
|
||||
%li{:class => ("selected" if @aspect == :all)}
|
||||
= link_to t('.all_aspects'), root_url
|
||||
- for aspect in @aspects
|
||||
%li{:id => aspect.id, :class => ("selected" if current_aspect?(aspect))}
|
||||
%li{:class => ("selected" if current_aspect?(aspect))}
|
||||
= link_for_aspect aspect
|
||||
|
||||
%ul{ :style => "position:absolute;right:0;bottom:0.01em;"}
|
||||
%li{:class => ("selected" if @aspect == :all)}
|
||||
= link_to "All Aspects", root_url
|
||||
%li{:class => ("selected" if @aspect == :public)}
|
||||
= link_to "Public", aspects_public_path
|
||||
|
||||
%li{ :style => "margin-right:0;", :class => ("selected" if @aspect == :manage)}
|
||||
= link_to ( (@request_count == 0)? "manage" : "manage (#{@request_count})"), {:controller => :aspects, :action => :manage}, :class => "edit_aspect_button", :class => new_request(@request_count), :title => "Manage your Aspects"
|
||||
= link_to ( (@request_count == 0)? t('.manage') : "#{t('.manage')} (#{@request_count})"), {:controller => :aspects, :action => :manage}, :class => "edit_aspect_button", :class => new_request(@request_count), :title => t('.manage_your_aspects')
|
||||
|
||||
.yo{ :style => "display:none;"}
|
||||
#add_aspect_pane
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%li.message{:id => post.id, :class => ("mine" if current_user.owns?(post))}
|
||||
= person_image_link(post.person)
|
||||
= yield post_yield_tag(post)
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
#publisher
|
||||
= owner_image_tag
|
||||
|
||||
|
|
@ -10,13 +9,14 @@
|
|||
= f.error_messages
|
||||
%p
|
||||
%label{:for => "status_message_message"} Message
|
||||
= f.text_area :message, :rows => 2
|
||||
= f.text_area :message, :rows => 2, :value => params[:prefill]
|
||||
= connected_fb_as(@access_token) if @logged_in && @aspect == :public
|
||||
= f.hidden_field( :public, :value => (params[:action] == 'public') )
|
||||
|
||||
%ul.aspect_selector{ :style => "display:none;"}
|
||||
going to...
|
||||
- for aspect in @aspects
|
||||
%li
|
||||
= check_box_tag("aspect_ids[]", aspect.id, @aspect == :all || current_aspect?(aspect) )
|
||||
= check_box_tag("aspect_ids[]", aspect.id, @aspect == :public || @aspect == :all || current_aspect?(aspect) )
|
||||
= aspect.name
|
||||
|
||||
= f.submit "Share"
|
||||
= f.submit t('.share')
|
||||
|
|
|
|||
25
app/views/shared/_reshare.haml
Normal file
25
app/views/shared/_reshare.haml
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
-# Copyright (c) 2010, Diaspora Inc. This file is
|
||||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
:javascript
|
||||
$(".reshare_button").toggle(function(e){
|
||||
e.preventDefault();
|
||||
$(this).parent(".reshare_pane").children(".reshare_box").fadeIn(200);
|
||||
}, function(e) {
|
||||
e.preventDefault();
|
||||
$(this).parent(".reshare_pane").children(".reshare_box").fadeOut(200);
|
||||
});
|
||||
|
||||
.reshare_pane
|
||||
%span.reshare_button
|
||||
= link_to "Reshare", "#"
|
||||
|
||||
%ul.reshare_box
|
||||
- for aspect in current_user.aspects_with_post( post.id )
|
||||
|
||||
%li.currently_sharing= aspect.name
|
||||
|
||||
- for aspect in current_user.aspects
|
||||
- unless aspect.posts.include? post
|
||||
%li.aspect_to_share= link_to aspect, :controller => "aspects", :action => "show", :id => aspect.id, :prefill => post.message
|
||||
|
|
@ -7,9 +7,11 @@
|
|||
- else
|
||||
%h1
|
||||
- if @aspect == :all
|
||||
= link_to "All Aspects", root_path
|
||||
= link_to t('.all_aspects'), root_path
|
||||
- elsif @aspect == :public
|
||||
= "Public"
|
||||
- elsif @aspect == :manage
|
||||
= link_to "Manage Aspects", root_path
|
||||
= link_to t('.manage_aspects'), root_path
|
||||
- else
|
||||
= link_to @aspect.name, @aspect
|
||||
|
||||
|
|
|
|||
|
|
@ -2,5 +2,4 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
= @log.to_s
|
||||
|
|
|
|||
|
|
@ -2,9 +2,8 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
= form_for StatusMessage.new, :remote => true do |f|
|
||||
= f.error_messages
|
||||
%p
|
||||
= f.text_field :message, :value => "tell me something good"
|
||||
= f.submit 'oh yeah!', :class => 'button'
|
||||
= f.text_field :message, :value => t('.tell_me_something_good')
|
||||
= f.submit t('.oh_yeah'), :class => 'button'
|
||||
|
|
|
|||
|
|
@ -2,24 +2,33 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%li.message{:id => post.id, :class => ("mine" if current_user.owns?(post))}
|
||||
|
||||
= person_image_link(post.person)
|
||||
|
||||
.content
|
||||
%span.from
|
||||
= link_to post.person.real_name, post.person
|
||||
= auto_link sanitize post.message
|
||||
|
||||
= link_to post.person.real_name, post.person
|
||||
= post.message
|
||||
|
||||
.info
|
||||
= link_to(how_long_ago(post), object_path(post))
|
||||
%span.time= link_to(how_long_ago(post), object_path(post))
|
||||
\--
|
||||
= link_to "show comments (#{post.comments.count})", '#', :class => "show_post_comments"
|
||||
|
||||
= render "comments/comments", :post => post
|
||||
= link_to "#{t('.show_comments')} (#{post.comments.count})", '#', :class => "show_post_comments"
|
||||
|
||||
= render "comments/comments", :post => post
|
||||
|
||||
- if current_user.owns?(post)
|
||||
.destroy_link
|
||||
= link_to 'Delete', status_message_path(post), :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "delete"
|
||||
= link_to t('.delete'), status_message_path(post), :confirm => t('.are_you_sure'), :method => :delete, :remote => true, :class => "delete"
|
||||
= render "shared/reshare", :post => post, :current_user => current_user
|
||||
|
||||
- if post.public?
|
||||
.public_aspect_tag
|
||||
public
|
||||
- else
|
||||
.aspect_tag
|
||||
%ul
|
||||
- for aspect in current_user.aspects_with_post( post.id )
|
||||
%li= aspect.name
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,10 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%h1.big_text status messages
|
||||
= render "status_messages/new_status_message", :status_message => @status_message
|
||||
%ul#stream
|
||||
|
||||
|
||||
- for status_message in @status_messages
|
||||
= render "status_message", :post => status_message
|
||||
#pagination
|
||||
|
|
|
|||
|
|
@ -2,21 +2,14 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
- title "Status Message"
|
||||
|
||||
%p
|
||||
%strong Message:
|
||||
%h1
|
||||
= link_to @status_message.person.real_name, @status_message.person
|
||||
= @status_message.message
|
||||
|
||||
%p
|
||||
%strong Owner:
|
||||
= @status_message.person.real_name
|
||||
|
||||
%h4= "comments (#{@status_message.comments.count})"
|
||||
%h4= "#{t('.comments')} (#{@status_message.comments.count})"
|
||||
|
||||
= render "comments/comments", :post => @status_message
|
||||
|
||||
%p
|
||||
= link_to "Destroy", @status_message, :confirm => 'Are you sure?', :method => :delete
|
||||
|
|
||||
= link_to "View All", status_messages_path
|
||||
- if current_user.owns? @status_message
|
||||
= link_to t('.destroy'), @status_message, :confirm => t('are_you_sure?'), :method => :delete
|
||||
|
|
|
|||
66
app/views/users/_profile.haml
Normal file
66
app/views/users/_profile.haml
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
-# Copyright (c) 2010, Diaspora Inc. This file is
|
||||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%h2 Profile
|
||||
|
||||
= form_for @user do |f|
|
||||
= f.error_messages
|
||||
|
||||
= f.fields_for :profile do |p|
|
||||
|
||||
%h3="#{t('.picture')}"
|
||||
%div#image_picker
|
||||
= p.hidden_field :image_url, :value => (@profile.image_url if @profile.image_url), :id => 'image_url_field'
|
||||
|
||||
- unless @photos.nil? || @photos.empty?
|
||||
- for photo in @photos
|
||||
- if @profile.image_url && @profile.image_url.include?(photo.url(:thumb_medium))
|
||||
%div.small_photo{:id => photo.url(:thumb_medium), :class=>'selected'}
|
||||
= check_box_tag 'checked_photo', true, true
|
||||
= link_to image_tag(photo.url(:thumb_medium)), "#"
|
||||
- else
|
||||
%div.small_photo{:id => photo.url(:thumb_medium)}
|
||||
= check_box_tag 'checked_photo'
|
||||
= link_to image_tag(photo.url(:thumb_medium)), "#"
|
||||
|
||||
- else
|
||||
=t('.you_dont_have_any_photos')
|
||||
= link_to t('.albums'), albums_path(:aspect => 'all')
|
||||
=t('.page_to_upload_some')
|
||||
|
||||
=will_paginate @photos
|
||||
|
||||
%br
|
||||
|
||||
%h3="#{t('.info')}"
|
||||
|
||||
%p
|
||||
%b
|
||||
="#{t('.diaspora_username')}:"
|
||||
= @user.diaspora_handle
|
||||
|
||||
%p
|
||||
= p.label :first_name
|
||||
= p.text_field :first_name, :value => @profile.first_name
|
||||
%p
|
||||
= p.label :last_name
|
||||
= p.text_field :last_name, :value => @profile.last_name
|
||||
%p
|
||||
= f.label :password
|
||||
= f.password_field :password
|
||||
%p
|
||||
= f.label :password_confirmation
|
||||
= f.password_field :password_confirmation
|
||||
|
||||
|
||||
#submit_block
|
||||
= link_to t('.cancel'), root_path
|
||||
= t('.or')
|
||||
= f.submit t('.update_profile')
|
||||
|
||||
#content_bottom
|
||||
.back
|
||||
= link_to "⇧ #{t('.home')}", root_path
|
||||
|
||||
25
app/views/users/_services.haml
Normal file
25
app/views/users/_services.haml
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
-# Copyright (c) 2010, Diaspora Inc. This file is
|
||||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
%h2 Services
|
||||
|
||||
- if FACEBOOK
|
||||
%h3 Facebook
|
||||
%p
|
||||
- if @logged_in
|
||||
= connected_fb_as(@access_token)
|
||||
|
||||
%p
|
||||
- @fb_friends = MiniFB.get(@access_token, 'me', :type => "friends")
|
||||
- @fb_friends[:data].each do |friend|
|
||||
= image_tag( "http://graph.facebook.com/#{friend[:id]}/picture" )
|
||||
|
||||
= link_to "Disconnect from Facebook", services_destroy_path
|
||||
- else
|
||||
= link_to "Connect to Facebook (DO NOT USE WITH A REAL ACCOUNT)", @fb_access_url
|
||||
|
||||
#content_bottom
|
||||
.back
|
||||
= link_to "⇧ home", root_path
|
||||
|
|
@ -2,66 +2,29 @@
|
|||
-# licensed under the Affero General Public License version 3. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
:javascript
|
||||
$("#settings_nav li > a").click( function() {
|
||||
var target = "#"+$(this).attr('class');
|
||||
if( !$(target).is(":visible") ) {
|
||||
$(".settings_pane").fadeOut(200, function() {
|
||||
$(target).delay(200).fadeIn(200);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
- content_for :publish do
|
||||
%h1
|
||||
Editing profile
|
||||
%h1="#{t('.editing_profile')}"
|
||||
|
||||
- content_for :left_pane do
|
||||
\.
|
||||
%ul#settings_nav
|
||||
%li=link_to 'Profile', '#', :class => 'profile'
|
||||
%li=link_to 'Services', '#', :class => 'services'
|
||||
|
||||
= form_for @user do |f|
|
||||
= f.error_messages
|
||||
#profile.settings_pane{:style=>"display:block;"}
|
||||
= render 'users/profile'
|
||||
|
||||
= f.fields_for :profile do |p|
|
||||
#services.settings_pane
|
||||
= render 'users/services'
|
||||
|
||||
%h3 Picture
|
||||
%div#image_picker
|
||||
= p.hidden_field :image_url, :value => (@profile.image_url.sub(@user.url,'/') if @profile.image_url), :id => 'image_url_field'
|
||||
|
||||
- unless @photos.nil? || @photos.empty?
|
||||
- for photo in @photos
|
||||
- if @profile.image_url && (photo.url(:thumb_medium) == @profile.image_url.sub(@user.url,'/'))
|
||||
%div.small_photo{:id => photo.url(:thumb_medium), :class=>'selected'}
|
||||
= check_box_tag 'checked_photo', true, true
|
||||
= link_to image_tag(photo.url(:thumb_medium)), "#"
|
||||
- else
|
||||
%div.small_photo{:id => photo.url(:thumb_medium)}
|
||||
= check_box_tag 'checked_photo'
|
||||
= link_to image_tag(photo.url(:thumb_medium)), "#"
|
||||
|
||||
- else
|
||||
You don't have any photos! Go to the
|
||||
= link_to "albums", albums_path(:aspect => 'all')
|
||||
page to upload some.
|
||||
|
||||
=will_paginate @photos
|
||||
|
||||
%br
|
||||
|
||||
%h3 Info
|
||||
|
||||
%p
|
||||
%b
|
||||
DIASPORA USERNAME:
|
||||
= @user.diaspora_handle
|
||||
|
||||
%p
|
||||
= p.label :first_name
|
||||
= p.text_field :first_name, :value => @profile.first_name
|
||||
%p
|
||||
= p.label :last_name
|
||||
= p.text_field :last_name, :value => @profile.last_name
|
||||
|
||||
%p
|
||||
= f.label :email
|
||||
= f.text_field :email
|
||||
|
||||
#submit_block
|
||||
= link_to "Cancel", root_path
|
||||
or
|
||||
= f.submit "Update Profile"
|
||||
|
||||
#content_bottom
|
||||
.back
|
||||
= link_to "⇧ home", root_path
|
||||
|
|
|
|||
|
|
@ -2,6 +2,5 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
Autotest.add_discovery { "rails" }
|
||||
Autotest.add_discovery { "rspec2" }
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
|
||||
# This file is used by Rack-based servers to start the application.
|
||||
|
||||
require ::File.expand_path('../config/environment', __FILE__)
|
||||
|
|
|
|||
|
|
@ -2,23 +2,21 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
|
||||
development:
|
||||
default:
|
||||
pod_url: "http://example.org/"
|
||||
debug: false
|
||||
socket_debug : false
|
||||
socket_host: 0.0.0.0
|
||||
socket_port: 8080
|
||||
socket_collection_name: 'websocket'
|
||||
pubsub_server: 'https://pubsubhubbub.appspot.com/'
|
||||
mongo_host: 'localhost'
|
||||
mongo_port: 27017
|
||||
|
||||
development:
|
||||
|
||||
test:
|
||||
debug: false
|
||||
socket_debug : false
|
||||
pod_url: "http://example.org/"
|
||||
socket_port: 8081
|
||||
pubsub_server: 'https://pubsubhubbub.appspot.com/'
|
||||
|
||||
production:
|
||||
debug: false
|
||||
socket_debug : false
|
||||
socket_port: 8080
|
||||
pubsub_server: 'https://pubsubhubbub.appspot.com/'
|
||||
|
|
@ -2,8 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
|
||||
require File.expand_path('../boot', __FILE__)
|
||||
|
||||
require 'action_controller/railtie'
|
||||
|
|
@ -13,7 +11,7 @@ require 'active_resource/railtie'
|
|||
# you've limited to :test, :development, or :production.
|
||||
Bundler.require(:default, Rails.env) if defined?(Bundler)
|
||||
|
||||
require 'lib/mongo_mapper/bson_id'
|
||||
require File.expand_path('../../lib/mongo_mapper/bson_id', __FILE__)
|
||||
module Diaspora
|
||||
class Application < Rails::Application
|
||||
# Settings in config/environments/* take precedence over those specified here.
|
||||
|
|
@ -51,5 +49,6 @@ module Diaspora
|
|||
|
||||
# Configure sensitive parameters which will be filtered from the log file.
|
||||
config.filter_parameters += [:password]
|
||||
config.filter_parameters += [:xml]
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
|
||||
require 'rubygems'
|
||||
|
||||
# Set up gems listed in the Gemfile.
|
||||
|
|
|
|||
8
config/cucumber.yml
Normal file
8
config/cucumber.yml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<%
|
||||
rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
|
||||
rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
|
||||
std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} --strict --tags ~@wip"
|
||||
%>
|
||||
default: <%= std_opts %> features
|
||||
wip: --tags @wip:3 --wip features
|
||||
rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
|
||||
|
|
@ -2,8 +2,6 @@
|
|||
# licensed under the Affero General Public License version 3. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
|
||||
config = YAML.load_file(File.dirname(__FILE__) + '/deploy_config.yml')
|
||||
all = config['cross_server']
|
||||
|
||||
|
|
@ -53,6 +51,16 @@ namespace :deploy do
|
|||
run "ln -s -f #{shared_path}/bundle #{current_path}/vendor/bundle"
|
||||
end
|
||||
|
||||
task :symlink_config do
|
||||
run "touch #{shared_path}/app_config.yml"
|
||||
run "ln -s -f #{shared_path}/app_config.yml #{current_path}/config/app_config.yml"
|
||||
end
|
||||
|
||||
task :symlink_fb_config do
|
||||
run "touch #{shared_path}/fb_config.yml"
|
||||
run "ln -s -f #{shared_path}/fb_config.yml #{current_path}/config/fb_config.yml"
|
||||
end
|
||||
|
||||
task :start do
|
||||
start_mongo
|
||||
start_thin
|
||||
|
|
@ -103,7 +111,6 @@ namespace :deploy do
|
|||
run 'gem install bundler'
|
||||
end
|
||||
|
||||
|
||||
task :migrate do
|
||||
end
|
||||
end
|
||||
|
|
@ -135,7 +142,7 @@ namespace :db do
|
|||
end
|
||||
|
||||
task :backer_seed, :roles => :backer do
|
||||
(0..10).each { |n|
|
||||
(0..2).each { |n|
|
||||
run "curl -silent http://localhost/set_backer_number?number=#{n}", :only => {:number => n}
|
||||
}
|
||||
run "cd #{current_path} && bundle exec rake db:seed:backer --trace RAILS_ENV=#{rails_env}"
|
||||
|
|
@ -145,9 +152,9 @@ namespace :db do
|
|||
purge
|
||||
backer_seed
|
||||
tom_seed
|
||||
deploy::restart
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
after "deploy:symlink", "deploy:symlink_images", "deploy:symlink_bundle"
|
||||
after "deploy:symlink", "deploy:symlink_images", "deploy:symlink_bundle", 'deploy:symlink_config', 'deploy:symlink_fb_config'
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue