Merge branch 'master' into HEAD

Conflicts:
	public/stylesheets/application.css
This commit is contained in:
Raphael 2010-10-07 13:58:06 -07:00
commit ec9e180eab
312 changed files with 6834 additions and 2176 deletions

14
.gitignore vendored
View file

@ -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/**/*

View file

@ -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.

View file

@ -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
View file

@ -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

View file

@ -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
View file

@ -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).

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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]

View file

@ -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

View file

@ -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

View 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

View file

@ -2,7 +2,6 @@
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
class SocketsController < ApplicationController
include ApplicationHelper
include SocketsHelper

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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'

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
View 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

View file

@ -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

View file

@ -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

View file

@ -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 => {

View file

@ -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

View file

@ -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]

View file

@ -2,7 +2,6 @@
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
class Retraction
include ROXML
include Diaspora::Webhooks

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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'

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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'

View file

@ -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"

View file

@ -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

View 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

View file

@ -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"

View file

@ -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')}"

View file

@ -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

View file

@ -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"

View file

@ -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"

View file

@ -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'));

View file

@ -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"

View file

@ -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"

View 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')

View file

@ -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

View file

@ -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

View file

@ -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!')

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;" }

View file

@ -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]}"

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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')

View 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

View file

@ -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

View file

@ -2,5 +2,4 @@
-# licensed under the Affero General Public License version 3. See
-# the COPYRIGHT file.
= @log.to_s

View file

@ -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'

View file

@ -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

View file

@ -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

View file

@ -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

View 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

View 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

View file

@ -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

View file

@ -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" }

View file

@ -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__)

View 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/'

View file

@ -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

View file

@ -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
View 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

View file

@ -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