Merge branch 'master' of github.com:diaspora/diaspora

This commit is contained in:
danielvincent 2010-10-17 10:25:38 -07:00
commit 7160e9f85b
16 changed files with 354 additions and 138 deletions

View file

@ -122,6 +122,7 @@ GEM
selenium-webdriver (>= 0.0.3)
childprocess (0.0.7)
ffi (~> 0.6.3)
columnize (0.3.1)
crack (0.1.8)
cucumber (0.9.2)
builder (~> 2.1.2)
@ -162,6 +163,7 @@ GEM
i18n (0.4.1)
json (1.4.6)
json_pure (1.4.6)
linecache (0.43)
mail (2.2.7)
activesupport (>= 2.3.6)
mime-types
@ -223,6 +225,11 @@ GEM
rspec-expectations (= 2.0.0)
rspec-rails (2.0.0)
rspec (= 2.0.0)
ruby-debug (0.10.3)
columnize (>= 0.1)
ruby-debug-base (~> 0.10.3.0)
ruby-debug-base (0.10.3)
linecache (>= 0.3)
rubyzip (0.9.4)
selenium-webdriver (0.0.29)
childprocess (>= 0.0.7)
@ -280,6 +287,7 @@ DEPENDENCIES
roxml!
rspec (>= 2.0.0)
rspec-rails (>= 2.0.0)
ruby-debug
sprinkle!
thin
webmock

View file

@ -3,21 +3,18 @@
# the COPYRIGHT file.
class RegistrationsController < Devise::RegistrationsController
def new
super
end
def create
begin
user = User.instantiate!(params[:user])
rescue MongoMapper::DocumentNotValid => e
user = nil
flash[:error] = e.message
redirect_to new_user_registration_path
end
if user
if user.save
flash[:notice] = I18n.t 'registrations.create.success'
sign_in_and_redirect(:user, user)
else
flash[:error] = user.errors.full_messages.join(', ')
redirect_to new_user_registration_path
end
end

View file

@ -10,4 +10,14 @@ module StatusMessagesHelper
return I18n.t('status_messages.helper.no_message_to_display')
end
end
def make_links(message)
# If there should be some kind of bb-style markup, email/diaspora highlighting, it could go here.
# next line is important due to XSS! (h is rail's make_html_safe-function)
message = h(message).html_safe
message.gsub!(/( |^)(www\.[^ ]+\.[^ ])/, '\1http://\2');
return message.gsub(/(http|ftp):\/\/([^ ]+)/, '<a target="_blank" href="\1://\2">\2</a>');
end
end

View file

@ -17,16 +17,18 @@ end
class User
include MongoMapper::Document
plugin MongoMapper::Devise
include Diaspora::UserModules
include Encryptor::Private
plugin MongoMapper::Devise
QUEUE = MessageHandler.new
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
key :username, :unique => true
key :serialized_private_key, String
key :username
key :serialized_private_key, String
key :invites, Integer, :default => 5
key :invitation_token, String
key :invitation_sent_at, DateTime
@ -36,6 +38,13 @@ class User
key :visible_post_ids, Array
key :visible_person_ids, Array
before_validation :strip_username, :on => :create
validates_presence_of :username
validates_uniqueness_of :username, :case_sensitive => false
validates_format_of :username, :without => /\s/
validates_with InvitedUserValidator
one :person, :class_name => 'Person', :foreign_key => :owner_id
many :inviters, :in => :inviter_ids, :class_name => 'User'
@ -43,21 +52,21 @@ class User
many :visible_people, :in => :visible_person_ids, :class_name => 'Person' # One of these needs to go
many :pending_requests, :in => :pending_request_ids, :class_name => 'Request'
many :raw_visible_posts, :in => :visible_post_ids, :class_name => 'Post'
many :aspects, :class_name => 'Aspect'
after_create :seed_aspects
before_validation :downcase_username, :on => :create
validates_with InvitedUserValidator
before_destroy :unfriend_everyone, :remove_person
def strip_username
if username.present?
username.strip!
end
end
def self.find_for_authentication(conditions={})
if conditions[:username] =~ /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i # email regex
conditions[:email] = conditions.delete(:username)
else
conditions[:username].downcase!
end
super
end
@ -356,10 +365,6 @@ class User
"#{self.username}@#{APP_CONFIG[:terse_pod_url]}"
end
def downcase_username
username.downcase! if username
end
def as_json(opts={})
{
:user => {

View file

@ -23,7 +23,7 @@
= render "shared/reshare", :post => post, :current_user => current_user
= link_to t('.delete'), status_message_path(post), :confirm => t('.are_you_sure'), :method => :delete, :remote => true, :class => "delete"
= post.message
= make_links(post.message)
.info
%span.time= link_to(how_long_ago(post), object_path(post))

View file

@ -6,6 +6,15 @@
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
en:
activemodel:
errors:
models:
user:
attributes:
username:
taken: "is already taken"
email:
taken: "is already taken"
hello: "Hello world"
application:
helper:

View file

@ -1,8 +1,6 @@
## Diaspora RPM tools
NOTE: This does not work ATM, see discussions on Gemfile.lock in
attached to a commit 12/10 (yea, I know, you calll it 10/12, but you
are wrong ;)
NOTE: This does not work ATM, see http://bugs.joindiaspora.com/issues/372
Creates diaspora source tarballs and RPM packages
@ -89,6 +87,19 @@ The source tarball is as retrieved from diaspora with following differences:
- The file .bundle/config is patched. Remove before doing
*bundle install*
./make-dist.sh bundle|source occasionally fails on bad Gemfile.lock. The
root cause is a bad Gemfile in the git repo. Possible fixes includes
using a older version known to work:
% ./make-dist.sh -c c818885b6 bundle
% ./make-dist.sh -c c818885b6 source
or forcing a complete update of Gemfile.lock using 'bundle update' (a
potential problematic operation):
% ./make-dist.sh -f bundle
Routines uses last available version from master branch at github. The
version contains a time stamp and an abbreviated git commit id.
Using -c, a specific commit can be used for source build.

View file

@ -73,7 +73,7 @@ pushd bundle/ruby/1.8/
chmod 755 gems/thin-1.2.7/example/async_tailer.ru
chmod 644 gems/i18n-0.4.1/MIT-LICENSE
chmod 755 gems/abstract-1.0.0/abstract.gemspec
chmod 644 gems/mini_magick-2.1/MIT-LICENSE
chmod 644 gems/mini_magick-2.1/MIT-LICENSE || :
chmod 755 gems/thin-1.2.7/lib/thin/controllers/service.sh.erb
chmod 644 gems/treetop-1.4.8/spec/compiler/test_grammar.tt
popd
@ -201,8 +201,8 @@ pushd bundle/ruby/1.8/gems/selenium-webdriver-0.0.28/lib/selenium/webdriver/
popd
}
mkdir -p $RPM_BUILD_ROOT/%{_libdir}/diaspora-bundle/master/vendor
cp -ar bundle $RPM_BUILD_ROOT/%{_libdir}/diaspora-bundle/master/vendor
mkdir -p $RPM_BUILD_ROOT/%{_libdir}/diaspora-bundle/
cp -ar bundle $RPM_BUILD_ROOT/%{_libdir}/diaspora-bundle/
find %{buildroot}/%{_libdir}/diaspora-bundle \
-type d -fprintf dirs '%%%dir "%%p"\n'
@ -220,7 +220,7 @@ cat files >> dirs && cp dirs files
%files -f files
%defattr(-, diaspora, diaspora, 0755)
%doc COPYRIGHT Gemfile AUTHORS GNU-AGPL-3.0
%doc COPYRIGHT Gemfile Gemfile.lock AUTHORS GNU-AGPL-3.0
%files -f dev-files devel
%defattr(-, root, root, 0644)

View file

@ -1,5 +1,9 @@
# Turn off the brp-python-bytecompile script
%global __os_install_post %(echo '%{__os_install_post}' | \
sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
%global debug_package %{nil}
%define git_release 1010092232_b313272
%define git_release HEAD
Summary: A social network server
Name: diaspora
@ -19,13 +23,24 @@ BuildRoot: %{_rmpdir}/not-used-in-fedora/
Requires: mongodb-server
Requires: ruby(abi) = 1.8
Requires: diaspora-bundle = 0.0-1.1010081636_d1a4ee0.fc13
Requires: diaspora-bundle = %{version}
%description
A privacy aware, personally controlled, do-it-all and
open source social network server.
%package wsd
Summary: Sys V init script for diaspora websocket daemon
Group: Applications/Communications
Requires: %{name} = %{version}
%description wsd
Tools to use the diaspora websocket daemon as a service e. g., when
using papche passenger or system-wide installed thin server to run
diaspora.
%prep
%setup -q -n %{name}-%{version}-%{git_release}
@ -34,12 +49,13 @@ find . -perm /u+x -type f -exec \
%build
rm -rf master/vendor/bundle
mkdir master/tmp || :
%install
rm -fr $RPM_BUILD_ROOT
sed -i \
'/BUNDLE_PATH/s|:.*|: %{_libdir}/diaspora-bundle/master/vendor/bundle|' \
'/BUNDLE_PATH/s|:.*|: %{_libdir}/diaspora-bundle/bundle|' \
master/.bundle/config
cp master/GNU-AGPL-3.0 master/COPYRIGHT master/README.md master/AUTHORS .
@ -55,6 +71,9 @@ cp %SOURCE3 $RPM_BUILD_ROOT/%{_sysconfdir}/logrotate.d/diaspora
mkdir -p $RPM_BUILD_ROOT/%{_datadir}/diaspora
cp -ar master $RPM_BUILD_ROOT/%{_datadir}/diaspora
cp -ar master/.bundle $RPM_BUILD_ROOT/%{_datadir}/diaspora/master
mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/uploads
mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/tmp
cp %SOURCE2 $RPM_BUILD_ROOT/%{_datadir}/diaspora
mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/log/diaspora
@ -79,11 +98,10 @@ sed -i -e '\|.*/master/config.ru"$|d' \
files
%post
/sbin/chkconfig --add diaspora-wsd
%post wsd
/sbin/chkconfig --add diaspora-wsd || :
%preun
%preun wsd
if [ $1 -eq 0 ] ; then
service diaspora-wsd stop &>/dev/null || :
/sbin/chkconfig --del diaspora-wsd
@ -102,15 +120,19 @@ rm -fr $RPM_BUILD_ROOT
%attr(-, diaspora, diaspora) %{_localstatedir}/log/diaspora
%attr(-, diaspora, diaspora) %{_localstatedir}/lib/diaspora/uploads
%attr(-, diaspora, diaspora) %{_localstatedir}/lib/diaspora/tmp
%{_datadir}/diaspora/master/tmp
%{_datadir}/diaspora/master/public/uploads
%{_datadir}/diaspora/master/log
%config(noreplace) %{_sysconfdir}/logrotate.d/diaspora
%files wsd
%defattr(-, root, root, 0755)
%{_sysconfdir}/init.d/diaspora-wsd
%changelog
* Fri Sep 24 2010 Alec Leamas <leamas.alec@gmail.com> 0.0-1.1010092232_b313272.fc13
* Fri Sep 24 2010 Alec Leamas <leamas.alec@gmail.com> 0.0-1.1009280542_859ec2d
- Initial attempt to create a spec fi+le
# rubygem-term-ansicolor in repo (1.0.5)

View file

@ -126,7 +126,8 @@ function checkout()
git clone --quiet $GIT_REPO;
(
cd diaspora;
git remote add upstream $GIT_REPO
git remote add upstream \
git://github.com/diaspora/diaspora.git
for p in ../../*.patch; do
git apply --whitespace=fix $p > /dev/null
done &> /dev/null || :
@ -166,9 +167,6 @@ function make_src
find $PWD -name .git\* | xargs rm -rf
rm -rf .bundle
/usr/bin/patch -p1 -s <../../../add-bundle.diff
for p in ../../../*.patch; do
/usr/bin/patch -p1 -s < $p
done &> /dev/null || :
)
tar czf ${RELEASE_DIR}.tar.gz ${RELEASE_DIR} && \
rm -rf ${RELEASE_DIR}
@ -183,6 +181,7 @@ function make_bundle()
# Usage: make_bundle [ commit, defaults to HEAD]
#
{
set -x
checkout ${1:-'HEAD'} >/dev/null
bundle_id=$( git_id dist/diaspora/Gemfile)
bundle_name="diaspora-bundle-$VERSION-$bundle_id"
@ -192,11 +191,14 @@ function make_bundle()
rm -rf $bundle_name
mkdir -p $bundle_name/bundle
pushd diaspora > /dev/null
if [ "$BUNDLE_FIX" = 'yes' ]; then
bundle update
fi
bundle install --deployment \
--path="../$bundle_name/bundle" \
--without=test rdoc
cp -ar AUTHORS Gemfile GNU-AGPL-3.0 COPYRIGHT \
cp -ar AUTHORS Gemfile Gemfile.lock GNU-AGPL-3.0 COPYRIGHT \
"../$bundle_name"
popd > /dev/null
tar czf $bundle_name.tar.gz $bundle_name
@ -204,7 +206,6 @@ function make_bundle()
cd ..
}
echo
echo "Repo: $GIT_REPO"
echo "Bundle: dist/$bundle_name.tar.gz"
}
@ -269,6 +270,8 @@ function usage()
-r release Mark with specified release, defaults to 1.
-u uri Git repository URI, defaults to
$GIT_REPO.
-f For bundle, fix dependencies by running 'bundle update'
before 'bundle install'
source Build a diaspora application tarball.
bundle Build a bundler(1) bundle for diaspora.
@ -280,8 +283,10 @@ function usage()
EOF
}
commit='HEAD'
while getopts ":r:c:u:h" opt
BUNDLE_FIX='no'
while getopts ":r:c:fh" opt
do
case $opt in
u) GIT_REPO="$OPTARG"
@ -290,6 +295,8 @@ do
;;
r) RELEASE="$OPTARG:"
;;
f) BUNDLE_FIX='yes'
;;
h) usage
exit 0
;;
@ -300,7 +307,7 @@ do
done
shift $(($OPTIND - 1))
typeset -r GIT_REPO RELEASE
typeset -r GIT_REPO RELEASE BUNDLE_FIX
export LANG=C
test $# -gt 1 -o $# -eq 0 && {
@ -310,7 +317,7 @@ test $# -gt 1 -o $# -eq 0 && {
case $1 in
"bundle") make_bundle $commit
"bundle") make_bundle $commit $BUNDLE_FIX
;;
'source') make_src $commit
;;

View file

@ -1,9 +1,6 @@
## Package-oriented install for ubuntu.
NOTE: This does not work ATM, see discussions on Gemfile.lock in
attached to a commit 12/10 (yea, I know, you calll it 10/12, but you
are wrong ;)
NOTE: This does not work ATM, see http://bugs.joindiaspora.com/issues/372
Here are somediaspora-installdiaspora-install scripts to install diaspora on Ubuntu. They are designed to
work as a first step towards packaging, but should be usable as is.
@ -52,6 +49,16 @@ OK to use. If it's not, it will build a new.
### Notes
./make-dist.sh bundle|source occasionally fails on bad Gemfile.lock. The
root cause is a bad Gemfile.lock in the git repo. Possible fixes includes
using a older version known to work:
% ./make-dist.sh -c c818885b6 bundle
% ./make-dist.sh -c c818885b6 source
or forcing a complete update of Gemfile.lock using 'bundle update' (a
potential problematic operation):
% ./make-dist.sh -f bundle
The application lives in /usr/share/diaspora/master. All writable areas
(log, uploads, tmp) are links to /var/lib/diaspora. The config file lives
in /etc/diaspora. All files in /usr/share are read-only, owned by root.
@ -59,7 +66,7 @@ in /etc/diaspora. All files in /usr/share are read-only, owned by root.
The bundle lives in /usr/lib/diaspora-bundle, readonly, owned by root.
Application finds it through the patched .bundle/config in root dir.
Once diaspora ins installed ,makedist.sh et. al. are available in
Once diaspora is installed, makedist.sh et. al. are available in
/usr/share/diaspora/master/pkg/ubuntu, so there's no need to checkout
the stuff using git in this case.

View file

@ -2,7 +2,7 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require File.join(Rails.root, "spec", "spec_helper")
require File.join(File.dirname(__FILE__), "..", "spec_helper")
describe DevUtilitiesController do
render_views

View file

@ -0,0 +1,56 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require File.join(File.dirname(__FILE__), "..", "spec_helper")
describe RegistrationsController do
include Devise::TestHelpers
render_views
before do
request.env["devise.mapping"] = Devise.mappings[:user]
@valid_params = {"user" => {"username" => "jdoe",
"email" => "jdoe@example.com",
"password" => "password",
"password_confirmation" => "password",
"person" => {
"profile" => {
"first_name" => "John",
"last_name" => "Doe"}}}}
end
describe "#create" do
context "with valid parameters" do
it "creates a user" do
lambda { get :create, @valid_params }.should change(User, :count).by(1)
end
it "sets the flash" do
get :create, @valid_params
flash[:notice].should_not be_empty
end
it "redirects to the root path" do
get :create, @valid_params
response.should redirect_to root_path
end
end
context "with invalid parameters" do
before do
@valid_params["user"].delete("username")
@invalid_params = @valid_params
end
it "does not create a user" do
lambda { get :create, @invalid_params }.should_not change(User, :count)
end
it "sets the flash error" do
get :create, @invalid_params
flash[:error].should_not be_blank
end
it "goes back to the form" do
get :create, @invalid_params
response.should redirect_to new_user_registration_path
end
end
end
end

View file

@ -32,7 +32,7 @@ Factory.define :user do |u|
u.password_confirmation "bluepin7"
u.serialized_private_key OpenSSL::PKey::RSA.generate(1024).export
u.after_build do |user|
user.person = Factory(:person, :owner_id => user._id,
user.person = Factory.build(:person, :owner_id => user._id,
:serialized_public_key => user.encryption_key.public_key.export,
:diaspora_handle => "#{user.username}@#{APP_CONFIG[:pod_url].gsub(/(https?:|www\.)\/\//, '').chop!}")
end

View file

@ -0,0 +1,43 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require 'spec_helper'
describe StatusMessagesHelper do
it "should not allow basic XSS/HTML" do
make_links("<script>alert('XSS is evil')</script>").should == "&lt;script&gt;alert('XSS is evil')&lt;/script&gt;"
end
it "should recognize basic http links (1/3)" do
proto="http"
url="bugs.joindiaspora.com/issues/332"
make_links(proto+"://"+url).should == "<a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a>"
end
it "should recognize basic http links (2/3)" do
proto="http"
url="www.youtube.com/watch?v=b15yaPYNDRU"
make_links(proto+"://"+url).should == "<a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a>"
end
it "should recognize basic http links (3/3)" do
proto="http"
url="127.0.0.1:3000/users/sign_in"
make_links(proto+"://"+url).should == "<a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a>"
end
it "should recognize basic ftp links" do
proto="ftp"
url="ftp.uni-kl.de/CCC/26C3/mp4/26c3-3540-en-a_hackers_utopia.mp4"
# I did not watch that one, but the title sounds nice :P
make_links(proto+"://"+url).should == "<a target=\"_blank\" href=\""+proto+"://"+url+"\">"+url+"</a>"
end
it "should recognize www links" do
url="www.joindiaspora.com"
make_links(url).should == "<a target=\"_blank\" href=\"http://"+url+"\">"+url+"</a>"
end
end

View file

@ -12,29 +12,70 @@ describe User do
let(:user3) { Factory(:user) }
let(:aspect3) { user3.aspect(:name => 'stuff') }
describe "validations" do
it "downcases the username" do
user = Factory.build(:user, :username => "ALLUPPERCASE")
user.valid?
user.username.should == "alluppercase"
user = Factory.build(:user, :username => "someUPPERCASE")
user.valid?
user.username.should == "someuppercase"
describe "validation" do
describe "of passwords" do
it "fails if password doesn't match confirmation" do
user = Factory.build(:user, :password => "password", :password_confirmation => "nope")
user.should_not be_valid
end
it "confirms the password" do
pending "I cannot figure out why this doesn't work. --Raphael"
user = User.instantiate!(
:email => "tom@tom.joindiaspora.com",
:username => "tom",
:password => "evankorth",
:password_confirmation => "potatoes",
:person => Person.new(
:profile => Profile.new( :first_name => "Alexander", :last_name => "Hamiltom" ))
)
user.created_at.should be_nil
user.valid?.should be_false
it "succeeds if password matches confirmation" do
user = Factory.build(:user, :password => "password", :password_confirmation => "password")
user.should be_valid
end
end
describe "of username" do
it "requires presence" do
user = Factory.build(:user, :username => nil)
user.should_not be_valid
end
it "requires uniqueness" do
duplicate_user = Factory.build(:user, :username => user.username)
duplicate_user.should_not be_valid
end
it "keeps the original case" do
user = Factory.build(:user, :username => "WeIrDcAsE")
user.should be_valid
user.username.should == "WeIrDcAsE"
end
it "fails if the requested username is only different in case from an existing username" do
duplicate_user = Factory.build(:user, :username => user.username.upcase)
duplicate_user.should_not be_valid
end
it "strips leading and trailing whitespace" do
user = Factory.build(:user, :username => " janie ")
user.should be_valid
user.username.should == "janie"
end
it "fails if there's whitespace in the middle" do
user = Factory.build(:user, :username => "bobby tables")
user.should_not be_valid
end
end
describe "of email" do
it "requires email address" do
user = Factory.build(:user, :email => nil)
user.should_not be_valid
end
it "requires a unique email address" do
duplicate_user = Factory.build(:user, :email => user.email)
duplicate_user.should_not be_valid
end
end
end
describe ".find_for_authentication" do
it "preserves case" do
User.find_for_authentication(:username => user.username).should == user
User.find_for_authentication(:username => user.username.upcase).should be_nil
end
end