Friday, December 16, 2011
tofigureout: Django apps prefix
It seems like I can do this only with sys.path or PYTHONPATH, which applies to all the django projects in the environment. This doesn't seem like a satisfactory solution. ... my summer project MozSecWorld didn't have this problem, I wonder what magic the setup for that did.
Setting up new Django project (with virtualenv(wrapper))
1.
cd /usr/local/lib
, mkdir django-1.3.1
and cd into it2a.
wget http://www.djangoproject.com/download/1.3.1/tarball/ -O Django-1.3.1.tar.gz
, got this step from here2b.
cd Django-1.3.1.tar.gz
2c.
sudo python setup.py install
So my Django path is:
/usr/local/lib/django-1.3.1/Django-1.3.1
In user:
1.
mkvirtualenv --no-site-packages vocab
this is virtualenvwrapper setting up a new environment. Setup is logged in this old post.$ mkvirtualenv --no-site-packages vocab New python executable in vocab/bin/python Installing setuptools............done. Installing pip...............done. virtualenvwrapper.user_scripts creating /home/my_username/.virtualenvs/vocab/bin/predeactivate virtualenvwrapper.user_scripts creating /home/my_username/.virtualenvs/vocab/bin/postdeactivate virtualenvwrapper.user_scripts creating /home/my_username/.virtualenvs/vocab/bin/preactivate virtualenvwrapper.user_scripts creating /home/my_username/.virtualenvs/vocab/bin/postactivate virtualenvwrapper.user_scripts creating /home/my_username/.virtualenvs/vocab/bin/get_env_details mkdir: cannot create directory `/home/my_username/Projects/vocab': No such file or directory -bash: cd: /home/my_username/Projects/vocab: No such file or directory Searching for readline Reading http://pypi.python.org/simple/readline/ Reading http://www.python.org/ Reading http://github.com/ludwigschwardt/python-readline Best match: readline 6.2.1 Downloading http://pypi.python.org/packages/source/r/readline/readline-6.2.1.tar.gz#md5=9604527863378512247fcaf938100797 Processing readline-6.2.1.tar.gz Running readline-6.2.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-9h67Mv/readline-6.2.1/egg-dist-tmp-nNoSrj /usr/bin/ld: cannot find -lncurses collect2: ld returned 1 exit status error: Setup script exited with error: command 'gcc' failed with exit status 1 Downloading/unpacking Jinja2==2.3.1 Downloading Jinja2-2.3.1.tar.gz (428Kb): 428Kb downloaded Running setup.py egg_info for package Jinja2 warning: no previously-included files matching '*' found under directory 'docs/_build/doctrees' Downloading/unpacking MySQL-python==1.2.3c1 Downloading MySQL-python-1.2.3c1.tar.gz (89Kb): 89Kb downloaded Running setup.py egg_info for package MySQL-python Downloading/unpacking lxml==2.2.6 Downloading lxml-2.2.6.tar.gz (2.9Mb): 2.9Mb downloaded Running setup.py egg_info for package lxml Building lxml version 2.2.6. NOTE: Trying to build without Cython, pre-generated 'src/lxml/lxml.etree.c' needs to be available. ERROR: /bin/sh: xslt-config: not found ** make sure the development packages of libxml2 and libxslt are installed ** Using build configuration of libxslt warning: no previously-included files found matching '*.py' Downloading/unpacking PIL Downloading PIL-1.1.7.tar.gz (506Kb): 506Kb downloaded Running setup.py egg_info for package PIL WARNING: '' not a valid package name; please use only.-separated package names in setup.py Obtaining check from git+git://github.com/jbalogh/check.git#egg=check Cloning git://github.com/jbalogh/check.git to /home/my_username/.virtualenvs/vocab/src/check Running setup.py egg_info for package check Downloading/unpacking pyflakes (from check) Downloading pyflakes-0.5.0.tar.gz Running setup.py egg_info for package pyflakes Downloading/unpacking pep8 (from check) Downloading pep8-0.6.1.tar.gz Running setup.py egg_info for package pep8 Downloading/unpacking path.py (from check) Errorwhile getting http://pypi.python.org/packages/source/p/path.py/path.py-2.2.2.tar.gz#md5=3a3262b9049d294ddbd6f7453d45e699 (from http://pypi.python.org/simple/path.py/) Exception: Traceback (most recent call last): File "/home/my_username/.virtualenvs/vocab/local/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg/pip/basecommand.py", line 126, in main self.run(options, args) File "/home/my_username/.virtualenvs/vocab/local/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg/pip/commands/install.py", line 223, in run requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle) File "/home/my_username/.virtualenvs/vocab/local/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg/pip/req.py", line 961, in prepare_files self.unpack_url(url, location, self.is_download) File "/home/my_username/.virtualenvs/vocab/local/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg/pip/req.py", line 1079, in unpack_url return unpack_http_url(link, location, self.download_cache, only_download) File "/home/my_username/.virtualenvs/vocab/local/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg/pip/download.py", line 429, in unpack_http_url resp = _get_response_from_url(target_url, link) File "/home/my_username/.virtualenvs/vocab/local/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg/pip/download.py", line 465, in _get_response_from_url resp = urlopen(target_url) File "/home/my_username/.virtualenvs/vocab/local/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg/pip/download.py", line 84, in __call__ response = urllib2.urlopen(self.get_request(url)) File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File "/usr/lib/python2.7/urllib2.py", line 391, in open response = self._open(req, data) File "/usr/lib/python2.7/urllib2.py", line 409, in _open '_open', req) File "/usr/lib/python2.7/urllib2.py", line 369, in _call_chain result = func(*args) File "/usr/lib/python2.7/urllib2.py", line 1185, in http_open return self.do_open(httplib.HTTPConnection, req) File "/usr/lib/python2.7/urllib2.py", line 1160, in do_open raise URLError(err) URLError: Storing complete log in /home/my_username/.pip/pip.log
2. Since I installed with no-site-packages, I need to add Django to the virtualenv
add2virtualenv /usr/local/lib/django-1.3.1/Django-1.3.1
3. follow the Django tutorial
3b. In
python manage.py sql app_name
I got this error:... raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e) django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdbso I did
pip install MySQL-python
3c. I installed my app inside an "apps" folder, so here is what I did:
mkdir apps; touch apps/__init__.py
python manage.py startapp app_name
mv app_name apps
vim settings.py
and add into INSTALLED_APPS 'apps.apps_name'
python manage.py sql app_name
Note that you should have 'apps.app_name' in INSTALLED_APPS or else it's not going to find it and give you this error instead:
Error: No module named app_name
Friday, November 11, 2011
Linux show total lines of files in a directory (sorted by line numbers)
wc -l *
Even better, you can have the results sorted by line numbers:
wc -l * | sort -n -k1
-n compare according to string numerical value
-k# define start position
Monday, November 7, 2011
Make colored git graph command
git log --graph --color
Friday, October 21, 2011
Deploying Django
TODO, suggested by mark:
with apache in front, mod_wsgi handles the processes for you
.. and standard server config takes care of the apache stuff
----
SSL .. Django admin through port forwarding?
Setting up MSW on Rackspace
./manage.py shell
In root install:
pip install mysql-python
. If you I got another error ...
pymemcompat.h:10:20: fatal error: Python.h: No such file or directory
compilation terminated.
error: command 'gcc' failed with exit status 1
sudo apt-get install python-dev
(I searched for solutions for a long time, trying to find my "/usr/local/mysql" on ubuntu, but I don't have it (even though I have mysql).)
Now
./manage.py shell
haspip install pyopenssl
Now
./manage.py shell
haspip install py-bcrypt
AND THEN I GOT MANAGE.PY SHELL!!!
import django! works on it too!!!!!!!!
$ ./manage.py shell Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) [GCC 4.5.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> import django
Whoa I can even run it on my rackspace IP! :D Even though it crashes, at least it can get the request!
$ ./manage.py runserver 50.57.147.82:8000
Validating models...
0 errors found
Django version 1.3.1, using settings 'MozSecWorld.settings_local'
Development server is running at http://50.57.147.82:8000/
Quit the server with CONTROL-C.
[21/Oct/2011 03:23:36] "GET / HTTP/1.1" 301 0
Traceback (most recent call last):
...
TemplateSyntaxError: Caught ImportError while rendering: No module named jinja2
[21/Oct/2011 03:23:37] "GET /msw/ HTTP/1.1" 500 2909
So I did, from root, pip install jinja2
AND MOZSECWORLD IS UP at http://50.57.147.82:8000/!!!!!!!! :D:D:D
Setting up more Django on a clean Ubuntu server
On root account:
1.
sudo apt-get install python-setuptools
2.
sudo easy_install virtualenv
3.
virtualenv ve_msw
New python executable in ve_msw/bin/python
Installing setuptools............done.
Installing pip...............done.
4.
easy_install pip
(I could also have done "pip install virtualenv" or "easy_install virtualenvwrapper"5.
pip install virtualenvwrapper
On user account:
6.
mkdir ~/.virtualenvs
7. Add to end of ~/.bashrc:
export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh
8.
$ mkvirtualenv ve_msw
New python executable in ve_msw/bin/python
Installing setuptools............done.
Installing pip...............done.
virtualenvwrapper.user_scripts creating /home/haoqili/.virtualenvs/ve_msw/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/haoqili/.virtualenvs/ve_msw/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/haoqili/.virtualenvs/ve_msw/bin/preactivate
virtualenvwrapper.user_scripts creating /home/haoqili/.virtualenvs/ve_msw/bin/postactivate
virtualenvwrapper.user_scripts creating /home/haoqili/.virtualenvs/ve_msw/bin/get_env_details
9. Added to ~/.virtualenvs/postmkvirtualenv
proj_name=$(echo $VIRTUAL_ENV|awk -F'/' '{print $NF}') mkdir $HOME/Projects/$proj_name add2virtualenv $HOME/Projects/$proj_name cd $HOME/Projects/$proj_name easy_install readline ipython pip install -e git://github.com/jbalogh/check.git#egg=check Jinja2==2.3.1 \ MySQL-python==1.2.3c1 lxml==2.2.6 PIL
10. Now I can call
workon ve_msw
MSW already have playdoh set up at the very beginning
11. To set up where virtualenvwrapper's "workon" takes us to add this to
~/.virtualenvs/ve_msw/bin/postactivate
cd ~/path/to/mswdir
Thursday, October 20, 2011
Set up new mysql user
CREATE USER 'new_username'@'localhost' IDENTIFIED BY 'password_for_new_username';
GRANT ALL ON *.* TO 'new_username'@'localhost';
source
rackspace todo
show alex ssh. :D
Linux add user
adduser username
useradd username
Story:
######## Stage 1. Stuck & Confused ############
I'm was trying to set up my Rackspace server and I ran into some questions during my created user account.
From root, I added a user with "useradd alice". When I discovered that
~/
failed, I had to sudo mkdir /home/alice.Q0: It's so strange that the user home dir has to be manually created
Then I logged in as alice, but found that the prompt is not customized and lacks color. Since useradd copied /etc/skel/.bashrc from root to alice, I thought that I can just "cp /etc/skel/.bashrc ~/.bashrc", but when I did that (with sudo), "echo $PS1" still shows the old original prompt settings.
Q1: How come the ~/.bashrc, identical in root and user alice, does not work in alice?
I even uncommented out "force_color_prompt=yes", but its still not working.
Q2: How come user alice needs sudo to edit ~/.bashrc in the first place when its permissions are (from ls -l):
alice@simba:~$ ls -l ~/.bashrc
-rw-r--r-- 1 root root 141 2011-10-20 05:19 /home/alice/.bashrc
Answer: Because the user and group of /home/alice/.bashrc are both set to "root" (The user is the one that matters here)
Then I tried to "sudo chown alice:alice ~/.bashrc", but was denied permission because I was on alice.
######### Stage 2. Found good resource ############
Then I read this informative article and learned:
useradd -D
shows the defaults of useradd. You can change the shell to bash by specifying useradd -D -s /bin/bash
. Then you can use useradd alice
followed by passwd alice
to set its password. BUT!! This still doesn't automatically make /home/alice for you######## Stage 3. Problems solved! ################
adduser alice
worked beautifully0: home dir created automatically :D
1: bashrc and xterm-color both work :D
2: home dir's files are automatically made with alice as the user
# adduser alice Adding user `alice' ... Adding new group `alice' (1001) ... Adding new user `alice' (1001) with group `alice' ... Creating home directory `/home/alice' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for alice Enter the new value, or press ENTER for the default Full Name []: Alice P Hacker Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y... Why does it care about the room number? haha
Wednesday, October 19, 2011
Give user sudo
So I do
visudo
but it takes me to the nano editor.I want vim instead! So I did
export EDITOR="vim"
, which if you want to be your default editor, add this line to ~/.bashrc.Copy and modify
root ALL=(ALL:ALL) ALL
Thursday, October 13, 2011
Setting up rackspace server
Anyways ... the things I did/learned from setting up my first Rackspace server:
1. Setting up apache for Python. I do want to run some Django apps, so I followed steps 1 and 2 of a previous setup.
2. DNS ... When I set up a domain name inside rackspace, it's going to be an internal lookup. I'll give my registered domain on name.com the general rackspace name. Then rackspace is going to do an internal lookup to find my specific machine that hosts the domain name.
3. History is found in
~/.bash_history
I created a user from root. How come the user only has sh shell but not the better bash shell like root?
Edit: I think there is more to it: useradd -D --shell <shell-to-set>
4. Check the shell with
ps
or echo $SHELL
5. Check the shell a particular user is running in /etc/passwd, or view it like
grep username /etc/passwd
6. So I changed my user's entry in
/etc/passwd
from /bin/sh to /bin/bash7. Move /bin/bash to the top of
/etc/shells
Now my user has bash, but it doesn't have .bashrc. There is more to it.
8. Copy root's
/etc/skel
directory. "The /etc/skel directory contains files and directories that are automatically copied over to a new user's home directory when such user is created by the useradd program." ~ source It turns out that I do have them copied, but I have to manually copy them again into ~/, which I'll have to create first, but I need sudo powers for my user, see next post.
Friday, September 30, 2011
Git resolve merge conflicts
$git merge repo Auto-merging path/to/file1 Auto-merging path/to/file2 CONFLICT (content): Merge conflict in path/to/file3 Auto-merging path/to/file4 CONFLICT (content): Merge conflict in path/to/file5 Automatic merge failed; fix conflicts and then commit the result.
To fix:
For all files with conflicts, do:
1.vim path/to/file3
and then compare the text
<<<<<<< =======
with
====== >>>>>>>Make sure you delete those indicator lines too.
2. git update-index [path/to/file3]
Sunday, September 25, 2011
Github as the second remote
1.
$ cp -r repo repo_backup
2.
$ cd repo_backup
and then vim .git/config
delete the old
[remote "origin"]
3.
$ git remote add origin git@github.com:username/repo_name
. Now you should see its corresponding lines in .git/config4. I want to push my local branch "b1" to a branch on github named "branch1", so I did
git push -u origin b1:refs/heads/branch1
multiple git remotes
==============
.git/config's remote fetch = +refs/heads ...
explained here
Finally,
fetch = +refs/heads/*:refs/remotes/origin/*
That means if you dogit fetch origin
It will actually do:git fetch origin +refs/heads/*:refs/remotes/origin/*
Which means a remote heads/foobar will be local remotes/origin/foobar, and the plus sign means they'll be updated even if they are not fast-forward.answered by felipec
================
http://stackoverflow.com/questions/849308/pull-push-from-multiple-remote-locations/849960#849960
Thursday, September 15, 2011
error: expected expression before ')' token
C programming compare pointers to numbers
If the pointer is of uint32_t* type, trying to make an address in in uint32_t might throw you this error: error: this decimal constant is unsigned only in ISO C90.
Here is what you can do:
uint32_t* ptr; ptr = get_it_some_how(); cprintf(" get the int of address: %08d \n", ptr); int* target = (int *) -267296968; // this is the int you copy from the printout above if( ptr == (uint32_t*) target ) // look! a cast! cprintf(" yay the pointer is at target!\n"); else cprintf(" noo! the pointer is not at target\n");
Friday, September 9, 2011
git edit commit message and push to github
Steps to edit a git commit message and also have it show up to Githb:
1. To edit your last commit message:
2. Edit your commit message on top. If you're using vim, to save and quit, do esc+":wq"
3. Push to Github:
Note that if you don't have the "--force", you'll get this error message:
$ git push To git@github.com:your/repo.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@github.com:your/repo.git' To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes (e.g. 'git pull') before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details.So remember to
git push --force
!
Friday, August 5, 2011
scp command
scp [-r] source destination scp -r path/to/src-dir/ username@machine-to-go-to-IP:/path/to/dest-dir
git branch
git fetch origin git co branchname
Wednesday, August 3, 2011
Django vendor-local adding package
playdoh (master)$ pip install --no-install --build=vendor-local/packages --src=vendor-local/src -I django-csp
Downloading/unpacking django-csp
Downloading django_csp-1.0.2.tar.gz
Running setup.py egg_info for package django-csp
which installed django-csp into vendor-local/packages
and then I added the path to vendor-local/vendor.pth:
packages/django-csp
FYI, the contents:
playdoh/vendor-local/packages/django-csp (master)$ ls -R PKG-INFO django_csp.egg-info setup.cfg csp pip-egg-info setup.py ./csp: __init__.py decorators.py middleware.py urls.py views.py ./django_csp.egg-info: PKG-INFO dependency_links.txt SOURCES.txt top_level.txt ./pip-egg-info: django_csp.egg-info ./pip-egg-info/django_csp.egg-info: PKG-INFO dependency_links.txt SOURCES.txt top_level.txt
The Resource
Tuesday, August 2, 2011
stick something on the bottom right
#stick-me-to-bottom-right {
position: fixed;
bottom: 0;
right: 0;
}
x-frame-options old notes
What to do
Add in this line to your HTTP Response Headers: X-Frame-Options: deny
How to check
Firefox's Firebug or Chrome's "Inspect Elements": Go to "Net" option, refresh page, and click on the link that shows up, select "Headers" and you should see "X-Frame-Options: DENY" under "Response Headers"
Terminal: >telnet [insert IP-address of your site] 8000
Press enter and put in GET /en-US/msw/ HTTP/1.1
Press enter twice, and scroll to the very top of the output, should see "x-frame-options: DENY".
What I did
Playdoh automatically sets the "X-Frame-Options" to "deny". But if you want to set it automatically in Django, use response['x-frame-options'] = 'DENY'
In views.py:
# X-Frame-Options def xfo_deny(request): html = " ... my html stuff ... " response = HttpResponse(html) response['x-frame-options'] = 'DENY' return response
Notes on how Django does x-frame-options
In vendor/src/commonware/commonware/response/middleware.py:
from django.conf import settings class FrameOptionsHeader(object): """ Set an X-Frame-Options header. Default to DENY. Set response['x-frame-options'] = 'SAMEORIGIN' to override. """ def process_response(self, request, response): if hasattr(response, 'no_frame_options'): return response if not 'x-frame-options' in response: response['x-frame-options'] = 'DENY'
In vendor/src/commonware/commonware/response/decorators.py:
from functools import wraps from django.utils.decorators import available_attrs def xframe_sameorigin(view_fn): @wraps(view_fn, assigned=available_attrs(view_fn)) def _wrapped_view(request, *args, **kwargs): response = view_fn(request, *args, **kwargs) response['x-frame-options'] = 'SAMEORIGIN' return response return _wrapped_view def xframe_allow(view_fn): @wraps(view_fn, assigned=available_attrs(view_fn)) def _wrapped_view(request, *args, **kwargs): response = view_fn(request, *args, **kwargs) response.no_frame_options = True return response return _wrapped_view def xframe_deny(view_fn): @wraps(view_fn, assigned=available_attrs(view_fn)) def _wrapped_view(request, *args, **kwargs): response = view_fn(request, *args, **kwargs) response['x-frame-options'] = 'DENY' return response return _wrapped_view
Thursday, July 28, 2011
Wildcard in CSP
More details
Wednesday, July 27, 2011
discovered ~/.bash_aliases :) bash command shortcuts
Python Check.py!
pip install -e git://github.com/jbalogh/check.git#egg=check
Pip Install Django Debug Toolbar
pip install django-debug-toolbar
So you get to do
python manage.py debugsqlshell
and have a debug sidebar.It's awesome
Pypi
Tuesday, July 26, 2011
Randomizing in Django QuerySet and Python List
my_queryset.order_by('?')
Python List:
import random random.shuffle(my_list)
And then you can use slice to just keep n elements, e.g.
n = 5 my_queryset.order_by('?')[:n]
Monday, July 25, 2011
Django "MultipleObjectsReturned: get() returned more than one" fix with filter()
Sunday, July 24, 2011
Django get user object in views.py
def index(request): # get user try: the_user = User.objects.get(username = request.user) except User.DoesNotExist: return HttpResponse("Invalid username")
Saturday, July 23, 2011
How adopted-kitsune Django upload works.
1. views.py
for fileupload page if request.method == 'POST':
form = forms.ImageAttachmentUploadForm(request.POST, request.FILES)
if form.is_valid()
2. playdoh/vendor/src/django/django/forms/fields.py
class ImageField(FileField):
def to_python(self, data):
"""
Checks that the file-upload field data contains a valid image (GIF, JPG,
PNG, possibly others -- whatever the Python Imaging Library supports).
"""
Thursday, July 21, 2011
Cannot shutdown Ubuntu, always restarts
sudo shutdown -h now
MySQL Dump Database
1.
mysqldump -u root -p database_name > db_backup.sql
2. somehow get db_backup.sql to the machine where you want to dump, and make sure you can see db_backup.sql from
ls
3.
mysql -u root -p
4.
use database_you_want_to_dump_name
5.
source db_backup.sql
6.
show tables;
Yay!
source
Ubuntu pip install record
MozSecWorld$ sudo pip install -r requirements/compiled.txt Downloading/unpacking py-bcrypt==0.2 (from -r requirements/compiled.txt (line 7)) Running setup.py egg_info for package py-bcrypt Downloading/unpacking hashlib==20081119 (from -r requirements/compiled.txt (line 6)) Running setup.py egg_info for package hashlib Using OpenSSL version 0x009080ff from Headers: /usr/include Library: /usr/lib/libssl.so no previously-included directories found matching 'build' no previously-included directories found matching 'dist' no previously-included directories found matching 'RCS' no previously-included directories found matching 'CVS' no previously-included directories found matching '.svn' Downloading/unpacking Jinja2==2.5.5 (from -r requirements/compiled.txt (line 2)) Running setup.py egg_info for package Jinja2 warning: no previously-included files matching '*' found under directory 'docs/_build' warning: no previously-included files matching '*.pyc' found under directory 'jinja2' warning: no previously-included files matching '*.pyc' found under directory 'docs' warning: no previously-included files matching '*.pyo' found under directory 'jinja2' warning: no previously-included files matching '*.pyo' found under directory 'docs' Downloading/unpacking MySQL-python==1.2.3c1 (from -r requirements/compiled.txt (line 1)) Running setup.py egg_info for package MySQL-python sh: mysql_config: not found Traceback (most recent call last): File "", line 14, in File "/home/haoqili/Desktop/MozSecWorld/build/MySQL-python/setup.py", line 15, in metadata, options = get_config() File "setup_posix.py", line 43, in get_config libs = mysql_config("libs_r") File "setup_posix.py", line 24, in mysql_config raise EnvironmentError("%s not found" % (mysql_config.path,)) EnvironmentError: mysql_config not found Complete output from command python setup.py egg_info: sh: mysql_config: not found Traceback (most recent call last): File " ", line 14, in File "/home/haoqili/Desktop/MozSecWorld/build/MySQL-python/setup.py", line 15, in metadata, options = get_config() File "setup_posix.py", line 43, in get_config libs = mysql_config("libs_r") File "setup_posix.py", line 24, in mysql_config raise EnvironmentError("%s not found" % (mysql_config.path,)) EnvironmentError: mysql_config not found ---------------------------------------- Command python setup.py egg_info failed with error code 1 Storing complete log in /home/haoqili/.pip/pip.log
and then
python manage.py runserver
still gives "ImportError: No module named bcrypt" error.so
sudo pip install py-bcrypt
worked
Set up SSH
sudo aptitude install openssh-server openssh-client
Wednesday, July 20, 2011
Preparing to Set up MozSecWorld on Linux
1. Install libapache2-mod-wsgi. This is a Python apache!
sudo apt-get install libapache2-mod-wsgi
2. Install Apache2.
/etc/init.d/apache2 status
should say that "Apache2 is running"3. Configure Apache2.
4. clone repository
git clone https://github.com/haoqili/MozSecWorld
5. Get the vendor.
cd MozSecWorld/vendor
and then git clone --recursive git://github.com/mozilla/playdoh-lib.git .
follow the Setup Section until
python manage.py runserver
does not complain about any missing modules
Getting Image Upload to work on Django
haoqili: how can I tell if a package needs to be recompiled on the VM or not?
r1cky: hmm, that is a good question. if it is only .py source files then it doesnt need compiling
r1cky: but some libraries have C in them
r1cky: the ones that we use that need compiling are
r1cky: MySQL-python, Jinja2, PIL, lxml
r1cky: and the jpeg one
r1cky: those are installed separately (not copied into the repository)
1. Install PIL into my vendor-local
playdoh (master)$ pip install -I --install-option="--home=`pwd`/vendor-local" pil Downloading/unpacking pil Downloading PIL-1.1.7.tar.gz (506Kb): 506Kb downloaded Running setup.py egg_info for package pil WARNING: '' not a valid package name; please use only.-separated package names in setup.py WARNING: '' not a valid package name; please use only.-separated package names in setup.py Installing collected packages: pil Running setup.py install for pil WARNING: '' not a valid package name; please use only.-separated package names in setup.py WARNING: '' not a valid package name; please use only.-separated package names in setup.py --- using frameworks at /System/Library/Frameworks building '_imaging' extension /usr/bin/cc -fno-strict-aliasing -O3 -w -pipe -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DHAVE_LIBZ -I/System/Library/Frameworks/Tcl.framework/Headers -I/System/Library/Frameworks/Tk.framework/Headers -IlibImaging -I/Users/haoqili/.virtualenvs/playdoh/include -I/usr/local/include -I/usr/include -I/usr/local/Cellar/python/2.7.1/include/python2.7 -c _imaging.c -o build/temp.macosx-10.4-x86_64-2.7/_imaging.o ... /usr/bin/cc -L/usr/local/Cellar/readline/6.2.1/lib -bundle -undefined dynamic_lookup -L/usr/local/Cellar/readline/6.2.1/lib build/temp.macosx-10.4-x86_64-2.7/_imagingmath.o -L/usr/local/lib -L/Users/haoqili/.virtualenvs/playdoh/lib -L/usr/lib -o build/lib.macosx-10.4-x86_64-2.7/_imagingmath.so -------------------------------------------------------------------- PIL 1.1.7 SETUP SUMMARY -------------------------------------------------------------------- version 1.1.7 platform darwin 2.7.1 (r271:86832, Jun 6 2011, 13:57:48) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] -------------------------------------------------------------------- --- TKINTER support available *** JPEG support not available --- ZLIB (PNG/ZIP) support available *** FREETYPE2 support not available *** LITTLECMS support not available -------------------------------------------------------------------- To add a missing option, make sure you have the required library, and set the corresponding ROOT variable in the setup.py script. To check the build, run the selftest.py script. changing mode of build/scripts-2.7/pilconvert.py from 644 to 755 changing mode of build/scripts-2.7/pildriver.py from 644 to 755 changing mode of build/scripts-2.7/pilfile.py from 644 to 755 changing mode of build/scripts-2.7/pilfont.py from 644 to 755 changing mode of build/scripts-2.7/pilprint.py from 644 to 755 changing mode of /Users/haoqili/dev/playdoh/playdoh/playdoh/vendor-local/bin/pilconvert.py to 755 changing mode of /Users/haoqili/dev/playdoh/playdoh/playdoh/vendor-local/bin/pildriver.py to 755 changing mode of /Users/haoqili/dev/playdoh/playdoh/playdoh/vendor-local/bin/pilfile.py to 755 changing mode of /Users/haoqili/dev/playdoh/playdoh/playdoh/vendor-local/bin/pilfont.py to 755 changing mode of /Users/haoqili/dev/playdoh/playdoh/playdoh/vendor-local/bin/pilprint.py to 755 Successfully installed pil Cleaning up...
2. Trying to get JPEG to be supported:
playdoh/vendor-local (master)$ brew install jpeg Warning: Xcode is not installed! Builds may fail! ==> Downloading http://www.ijg.org/files/jpegsrc.v8c.tar.gz ######################################################################## 100.0% ==> ./configure --prefix=/usr/local/Cellar/jpeg/8c --disable-dependency-tracking ==> make install /usr/local/Cellar/jpeg/8c: 17 files, 1.6M, built in 13 seconds
3. Rebuild PIL
)$ pip install PIL==1.1.7 --upgrade Downloading/unpacking PIL==1.1.7 Downloading PIL-1.1.7.tar.gz (506Kb): 506Kb downloaded Running setup.py egg_info for package PIL WARNING: '' not a valid package name; please use only.-separated package names in setup.py WARNING: '' not a valid package name; please use only.-separated package names in setup.py Installing collected packages: PIL Found existing installation: PIL 1.1.7 Uninstalling PIL: Successfully uninstalled PIL Running setup.py install for PIL WARNING: '' not a valid package name; please use only.-separated package names in setup.py WARNING: '' not a valid package name; please use only.-separated package names in setup.py --- using frameworks at /System/Library/Frameworks building '_imaging' extension /usr/bin/cc -fno-strict-aliasing -O3 -w -pipe -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DHAVE_LIBJPEG -DHAVE_LIBZ -I/System/Library/Frameworks/Tcl.framework/Headers -I/System/Library/Frameworks/Tk.framework/Headers -IlibImaging -I/Users/haoqili/.virtualenvs/playdoh/include -I/usr/local/include -I/usr/include -I/usr/local/Cellar/python/2.7.1/include/python2.7 -c _imaging.c -o build/temp.macosx-10.4-x86_64-2.7/_imaging.o ... /usr/bin/cc -L/usr/local/Cellar/readline/6.2.1/lib -bundle -undefined dynamic_lookup -L/usr/local/Cellar/readline/6.2.1/lib build/temp.macosx-10.4-x86_64-2.7/_imagingmath.o -L/usr/local/lib -L/Users/haoqili/.virtualenvs/playdoh/lib -L/usr/lib -o build/lib.macosx-10.4-x86_64-2.7/_imagingmath.so -------------------------------------------------------------------- PIL 1.1.7 SETUP SUMMARY -------------------------------------------------------------------- version 1.1.7 platform darwin 2.7.1 (r271:86832, Jun 6 2011, 13:57:48) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] -------------------------------------------------------------------- --- TKINTER support available --- JPEG support available --- ZLIB (PNG/ZIP) support available *** FREETYPE2 support not available *** LITTLECMS support not available -------------------------------------------------------------------- To add a missing option, make sure you have the required library, and set the corresponding ROOT variable in the setup.py script. To check the build, run the selftest.py script. changing mode of build/scripts-2.7/pilconvert.py from 644 to 755 changing mode of build/scripts-2.7/pildriver.py from 644 to 755 changing mode of build/scripts-2.7/pilfile.py from 644 to 755 changing mode of build/scripts-2.7/pilfont.py from 644 to 755 changing mode of build/scripts-2.7/pilprint.py from 644 to 755 changing mode of /Users/haoqili/.virtualenvs/playdoh/bin/pilconvert.py to 755 changing mode of /Users/haoqili/.virtualenvs/playdoh/bin/pildriver.py to 755 changing mode of /Users/haoqili/.virtualenvs/playdoh/bin/pilfile.py to 755 changing mode of /Users/haoqili/.virtualenvs/playdoh/bin/pilfont.py to 755 changing mode of /Users/haoqili/.virtualenvs/playdoh/bin/pilprint.py to 755 Successfully installed PIL Cleaning up...
Tuesday, July 19, 2011
My Project's Packages
1. update my own vendor with
git clone --recursive git://github.com/mozilla/playdoh-lib.git ./vendor
from playdoh doc2. clean up my imports
3. clean up my vendor-local from virutal enviorments below from
/Users/haoqili/.virtualenvs/playdoh/lib/python2.7/site-packages
haoqili@host-3-248:15:44:10:~/.virtualenvs/playdoh/lib/python2.7/site-packages$ ls -l total 1016 drwxr-xr-x 11 haoqili staff 374 Jun 15 10:39 Crypto drwxr-xr-x 4 haoqili staff 136 Jun 30 09:41 Django-1.3-py2.7.egg drwxr-xr-x 10 haoqili staff 340 Jun 6 14:58 Jinja2-2.5.5-py2.7.egg-info drwxr-xr-x 7 haoqili staff 238 Jun 6 14:58 MySQL_python-1.2.3c1-py2.7.egg-info drwxr-xr-x 15 haoqili staff 510 Jun 6 14:58 MySQLdb drwxr-xr-x 12 haoqili staff 408 Jun 15 11:44 OpenSSL drwxr-xr-x 4 haoqili staff 136 Jun 15 10:09 Twisted-11.0.0_r32122-py2.7-macosx-10.4-x86_64.egg -rwxr-xr-x 1 haoqili staff 18328 Jun 6 14:58 _hashlib.so -rwxr-xr-x 1 haoqili staff 70072 Jun 6 14:58 _mysql.so -rw-r--r-- 1 haoqili staff 2306 Jun 6 14:57 _mysql_exceptions.py -rw-r--r-- 1 haoqili staff 4559 Jun 6 14:58 _mysql_exceptions.pyc drwxr-xr-x 5 haoqili staff 170 Jun 14 16:40 backports drwxr-xr-x 7 haoqili staff 238 Jun 14 16:40 backports.ssl_match_hostname-3.2a3-py2.7.egg-info drwxr-xr-x 5 haoqili staff 170 Jun 6 14:54 bcrypt -rw-r--r-- 1 haoqili staff 48 Jun 13 12:00 bleach.egg-link -rw-r--r-- 1 haoqili staff 6032 Jul 6 13:44 django_csp-1.0.1-py2.7.egg -rw-r--r-- 1 haoqili staff 6854 Jun 30 09:41 django_ratelimit-0.1-py2.7.egg drwxr-xr-x 7 haoqili staff 238 Jun 29 19:46 django_registration-0.7-py2.7.egg-info -rw-r--r-- 1 haoqili staff 509 Jul 6 13:44 easy-install.pth drwxr-xr-x 7 haoqili staff 238 Jun 6 14:58 hashlib-20081119-py2.7.egg-info -rw-r--r-- 1 haoqili staff 4993 Jun 6 14:58 hashlib.py -rw-r--r-- 1 haoqili staff 4452 Jun 6 14:58 hashlib.pyc drwxr-xr-x 9 haoqili staff 306 Jun 6 14:58 hmac-20101005-py2.7.egg-info -rw-r--r-- 1 haoqili staff 4531 Jun 6 14:57 hmac.py -rw-r--r-- 1 haoqili staff 4892 Jun 6 14:58 hmac.pyc drwxr-xr-x 24 haoqili staff 816 Jun 13 12:00 html5lib drwxr-xr-x 7 haoqili staff 238 Jun 13 12:00 html5lib-0.90-py2.7.egg-info drwxr-xr-x 49 haoqili staff 1666 Jun 6 14:58 jinja2 drwxr-xr-x 4 haoqili staff 136 Jun 6 14:23 pip-1.0.1-py2.7.egg drwxr-xr-x 8 haoqili staff 272 Jun 15 11:44 pyOpenSSL-0.12-py2.7.egg-info drwxr-xr-x 7 haoqili staff 238 Jun 6 14:54 py_bcrypt-0.2-py2.7.egg-info -rw-r--r-- 1 haoqili staff 629 Jun 15 10:46 pycrypto-2.0.1-py2.7.egg-info -rw-r--r-- 1 haoqili staff 8399 Jun 29 20:31 recaptcha_client-1.0.6-py2.7.egg drwxr-xr-x 18 haoqili staff 612 Jun 29 19:46 registration -rw-r--r-- 1 haoqili staff 332005 Jun 6 14:12 setuptools-0.6c11-py2.7.egg -rw-r--r-- 1 haoqili staff 30 Jun 15 10:09 setuptools.pth drwxr-xr-x 4 haoqili staff 136 Jun 15 10:09 zope.interface-3.6.3-py2.7-macosx-10.4-x86_64.egg
Regex Combine lines
:%s/\s*$\n\s*/ /g
Django Playdoh Package Locations
jsocol clarified:
/packages is old-and-busted, use lib/python for non-git things
but you can't put any libraries with compiled components into the vendor lib (it means vendor can't contain anything with c/c++ components)
it's just a question of installing via git (or, well, pip install vcs+vcs://) or using PyPI and the name (e.g. "pip install foo")
pip install foo
gives vendor-local/lib/python/foo
using git to install foo
gives vendor-local/src/foo
This is what I did, with help from groovecoder. :D
playdoh (master)$ pip install --no-install --build=vendor-local/packages --src=vendor-local/src -I cef Downloading/unpacking cef Downloading cef-0.2.tar.gz Running setup.py egg_info for package cef Successfully downloaded cef
And then I found that cef is inside vendor-local/packages. :D
Now I need to add this path to vendor.pth. Groovecoder told me that "*.pth files are automatically included by the python interpreter"
playdoh/vendor-local (master)$ cat vendor.pth packages/cef
Now I can use cef!
playdoh (master)$ python manage.py shell ... >>> from cef import log_cef >>>
I could also have done
/playdoh (master)$ pip install -I --install-option="--home=`pwd`/vendor-local" cef Downloading/unpacking cef Downloading cef-0.2.tar.gz Running setup.py egg_info for package cef Installing collected packages: cef Running setup.py install for cef Successfully installed cef Cleaning up...and have
playdoh/vendor-local/lib/python (master)$ ls cef-0.2-py2.7.egg-info cef.py cef.pyc
Django urls, best practice
template html:
<a href="/msw/{{ page.slug }}/">back</a><
Second iteration:
template html:
<a href="{{ url('detail', 'richtext_and_safe_url') }}">back</a>with
urls.py:
url(r'^(?P<input_slug>\w+)/$', views.detail, name='detail')
Third (best) iteration
template html:
<h1><a href="{{ page.reverse_url() }}">back</a></h1>in models.py:
class Page(models.Model): slug = models.SlugField() # another way .... def reverse:_url(self): return reverse('detail', args=[self.slug]) #return reverse('detail', args=['richtext_and_safe_url']) # hard coded waybe sure to pass in "page" in your views.py
inspiration
Sunday, July 17, 2011
jQuery hosting
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
I am tired of going to my site every time and get it from its source.
Friday, July 15, 2011
MySQL Update
update table_name set col_name='val_new' where col_name='val_indicator';
Where MySQL .frm files are located
2. mysql>
SHOW VARIABLES LIKE 'datadir';
go to the location of the value and cd into your database as the directory
Or you can use find!!
find -name . *.frm
Read more
Thursday, July 14, 2011
MySQL Add Column
alter table table_name add column `column_name` integer NOT NULL default '0';
You need to customize it.
Django debug
import pdb; pdb.set_trace()
Django preview database query/queries before they are performed
python manage.py sqlall [app name]
MySQL Delete Row
delete from table_name where id=2;
Wednesday, July 13, 2011
Django shell add user permissions and group permissions
1. Start the shell, go to your maange.py
>>> python manage.py shell
2. Get the user
Either load one ...
>>> from django.contrib.auth import authenticate >>> user = authenticate(username="johndoe", password="yourpw")
Or create one ...
>>> from django.contrib.auth.models import User >>> user = User.objects.create_user(username='johndoe', email="", password="yourpw")Django should silently automatically save it, and you should see it under Users in your admin page. But if you want save it yourself, do:
>>> user.is_staff = False >>> user.save
3. Check the user's permissions
user.get_all_permissions()or
user.user_permissions.all()
1. Start the shell, go to your maange.py
>>> python manage.py shell
2. Create the group
>>> from django.contrib.auth.models import Group >>> group = Group(name="GroupName") >>> group.save()
NOTE that Django pre-made permissions are only suggestions, they only go as far as their string names. YOU have to implement them if you want to use them.
Monday, July 11, 2011
Django reference/link to media/js from apps/myapp/views.py
f = open('media/js/my.js', 'r+')
.See a live demo of this here.
Google recaptcha with CSP, hosting javascript locally
1. So I saved my domain's equivalent of the RecaptchaState javascript medai/js/google/recState.js.
2. Refresh this file in views.py's by calling this function:
def recaptchaRefresh(): # get the Recaptcha state. url = "https://www.google.com/recaptcha/api/challenge?k=%s" % settings.RECAPTCHA_PUBLIC_KEY resock = urllib.urlopen(url) data = resock.read() resock.close() # extract the recaptcha state part of the string docloc = data.find("document.write") recaptchaState = data[:docloc] f = open('media/js/google/recState.js', 'r+') f.write(recaptchaState) f.close()
3. Copy paste recaptcha.js and make the following changes for CSP compatibility:
3.1 CSP blocks setIntervals that takes string parameters, so change it into a function:
//Recaptcha.timer_id = setInterval("Recaptcha.reload('t');", (a.timeout - 300) * 1E3) // --> Recaptcha.timer_id = setInterval( function() {Recaptcha.reload('t'); }, (a.timeout - 300) * 1E3)
3.2 CSP blocks in-body javascript, host it externally
//} else document.write('<div id="recaptcha_widget_div" style="display:none"></div>'), document.write('<script>Recaptcha.widget = Recaptcha.$("recaptcha_widget_div"); Recaptcha.challenge_callback();<\/script>'); // --> } else document.write('<div id="recaptcha_widget_div" style="display:none"></div>'), document.write('<script src="http://haoqili.scripts.mit.edu/js/test3.js"><\/script>'); where http://haoqili.scripts.mit.edu/js/test3.js has "Recaptcha.widget = Recaptcha.$("recaptcha_widget_div"); Recaptcha.challenge_callback();"
4. and in your template.html include the javascript from step 2 and 3.
5. Change your settings.py's CSP policies to have "http[s]://www.google.com" allowed in many places. See example
Recaptcha Hunt
--> don't assume anything. I could have figured out the CSP_REPORT_ONLY if I actually tried amo's settings word by word.
--> copy paste the entire chunk
--> read and try to make sence of error messages. think about them.
Vim comment/uncomment block of lines with commands
working on lines 24 to 314
comment:
:24,314s/^/#/g
uncomment:
:24,314s/^#//g
Javascript comma!
as seen in Google recaptcha's js:
if (RecaptchaOptions.theme == "custom") {
if (RecaptchaOptions.custom_theme_widget) Recaptcha.widget = Recaptcha.$(RecaptchaOptions.custom_theme_widget);
Recaptcha.challenge_callback()
} else
document.write('<div id="recaptcha_widget_div" style="display:none"></div>'),
document.write('<script>Recaptcha.widget = Recaptcha.$("recaptcha_widget_div"); Recaptcha.challenge_callback();<\/script>');
Sunday, July 10, 2011
How ReCaptcha should not work with in-body script
Skip to solution
How an In-Body Javascript is ultimately introduced in Google Recaptcha:
1. Your Django Form has ReCaptchaField. e.g. File: apps/users/forms.py
import captcha.fields class UserRegisterForm(happyforms.ModelForm, PasswordMixin): passwords ... recaptcha = captcha.fields.ReCaptchaField() ... irrelevent stuff ...
2. captcha.fields.ReCaptchaField() in zamboni/vendors (not shown on zamboni github), but it's on Mozilla's django-recaptcha
from django.conf import settings from django import forms from django.utils.encoding import smart_unicode from django.utils.translation import ugettext_lazy as _ from recaptcha.client import captcha from captcha.widgets import ReCaptcha class ReCaptchaField(forms.CharField): default_error_messages = { 'captcha_invalid': _(u'Invalid captcha') } def __init__(self, *args, **kwargs): self.widget = ReCaptcha self.required = True super(ReCaptchaField, self).__init__(*args, **kwargs) def clean(self, values): super(ReCaptchaField, self).clean(values[1]) recaptcha_challenge_value = smart_unicode(values[0]) recaptcha_response_value = smart_unicode(values[1]) check_captcha = captcha.submit(recaptcha_challenge_value, recaptcha_response_value, settings.RECAPTCHA_PRIVATE_KEY, {}) if not check_captcha.is_valid: raise forms.util.ValidationError( self.error_messages['captcha_invalid']) return values[0]
from django import forms from django.utils.safestring import mark_safe from django.conf import settings from recaptcha.client import captcha class ReCaptcha(forms.widgets.Widget): recaptcha_challenge_name = 'recaptcha_challenge_field' recaptcha_response_name = 'recaptcha_response_field' def render(self, name, value, attrs=None): use_ssl = False if 'RECAPTCHA_USE_SSL' in settings.__members__: use_ssl = settings.RECAPTCHA_USE_SSL return mark_safe(u'%s' % captcha.displayhtml(settings.RECAPTCHA_PUBLIC_KEY, use_ssl=use_ssl)) ...
4. from recaptcha.client (which is from Python's recaptcha client) import captcha
API_SSL_SERVER="https://api-secure.recaptcha.net" API_SERVER="http://api.recaptcha.net" def displayhtml (public_key, use_ssl = False, error = None): """Gets the HTML to display for reCAPTCHA public_key -- The public api key use_ssl -- Should the request be sent over ssl? error -- An error message to display (from RecaptchaResponse.error_code)""" error_param = '' if error: error_param = '&error=%s' % error if use_ssl: server = API_SSL_SERVER else: server = API_SERVER return """<script type="text/javascript" src="%(ApiServer)s/challenge?k=%(PublicKey)s%(ErrorParam)s"></script> # this src contains in-body script!! <noscript> <iframe src="%(ApiServer)s/noscript?k=%(PublicKey)s%(ErrorParam)s" height="300" width="500" frameborder="0"></iframe><br /> <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea> <input type='hidden' name='recaptcha_response_field' value='manual_challenge' /> </noscript> """ % { 'ApiServer' : server, 'PublicKey' : public_key, 'ErrorParam' : error_param, }
5. The src directs to (key varies for host, content is the same) https://www.google.com/recaptcha/api/challenge?k=6LcCCsYSAAAAACm9eF4n2ttYMU4TFbDMXMO-Bw2q
6. Which then directs to https://www.google.com/recaptcha/api/js/recaptcha.js that contains an in-body script:
document.write('<script>Recaptcha.widget = Recaptcha.$("recaptcha_widget_div"); Recaptcha.challenge_callback();<\/script>');
BT1: change into amo register's custom RecaptchaOptions to avoid in-body script.
BT2: have to allow setInterval like 'CSP_OPTIONS = ("eval-script",)'.
Q1: How come amo register does not have "setInterval blocked by CSP" problem even without CSP_OPTIONS?
BT1: In-body script is skipped with a custom RecaptchaOptions
as seen in Google recaptcha's js, note the javascript comma:
if (RecaptchaOptions.theme == "custom") { if (RecaptchaOptions.custom_theme_widget) Recaptcha.widget = Recaptcha.$(RecaptchaOptions.custom_theme_widget); Recaptcha.challenge_callback() } else document.write('<div id="recaptcha_widget_div" style="display:none"></div>'), document.write('<script>Recaptcha.widget = Recaptcha.$("recaptcha_widget_div"); Recaptcha.challenge_callback();<\/script>');So the entire "else", which contains the in-body javascript, is skipped!
BT2: Make CSP policy allow setInterval
add
CSP_OPTIONS = ("eval-script",)
into settings.pysolves the "call to setInterval blocked by CSP" issue (seen in Firebug).
Q1: Why doesn't amo have this issue?
Solved: because amo has CSP_REPORT_ONLY, meaning that CSP is not actually enforced, but only reported!
---------
Have to get around setInterval(). CSP only blocks setInterval if it's called with a string argument.
So let's call it with a function!
Continued on this post.
How Add-ons Mozilla does ReCaptcha
Code comments are potentially mine.
1. def register in apps/users/views.py
@anonymous_csrf def register(request): if request.user.is_authenticated(): messages.info(request, _("You are already logged in to an account.")) form = None elif request.method == 'POST': form = forms.UserRegisterForm(request.POST) # Always have recaptcha if form.is_valid(): # is_valid() does all the form clean() ... [save form stuff] ... else: form = forms.UserRegisterForm() return jingo.render(request, 'users/register.html', {'form': form, })
2. UserRegisterForm has ReCaptchaField. File: apps/users/forms.py
import captcha.fields class UserRegisterForm(happyforms.ModelForm, PasswordMixin): passwords ... recaptcha = captcha.fields.ReCaptchaField() ... irrelevent stuff ...
3. captcha.fields.ReCaptchaField() in zamboni/vendors (not shown on zamboni github), but it's on Mozilla's django-recaptcha
from django.conf import settings from django import forms from django.utils.encoding import smart_unicode from django.utils.translation import ugettext_lazy as _ from recaptcha.client import captcha from captcha.widgets import ReCaptcha class ReCaptchaField(forms.CharField): default_error_messages = { 'captcha_invalid': _(u'Invalid captcha') } def __init__(self, *args, **kwargs): self.widget = ReCaptcha self.required = True super(ReCaptchaField, self).__init__(*args, **kwargs) def clean(self, values): super(ReCaptchaField, self).clean(values[1]) recaptcha_challenge_value = smart_unicode(values[0]) recaptcha_response_value = smart_unicode(values[1]) check_captcha = captcha.submit(recaptcha_challenge_value, recaptcha_response_value, settings.RECAPTCHA_PRIVATE_KEY, {}) if not check_captcha.is_valid: raise forms.util.ValidationError( self.error_messages['captcha_invalid']) return values[0]
Which, btw is exactly what I have for my ReCaptchaField. The ReCaptcha widget will ultimately introduce an in-body javascript.
Click to read more about ReCaptcha and In-Line Javascript / CSP
So the only difference in reCaptcha is how it's displayed on the html page. Let's investigate.
4. Register page template: apps/users/templates/users/register.html, taken from step 1 views.py
{% block js %}{% include("amo/recaptcha_js.html") %}{% endblock %} ... {% if settings.RECAPTCHA_PRIVATE_KEY %} {{ recaptcha(form) }} {% else %} <p> Welcome Robots, ReCaptcha has been disabled for your convenience. Spam at Wil. </p> {% endif %}The apps/amo/templates/amo/recaptcha_js.html has:
{% if request.user.is_anonymous() %} <script type="text/javascript" src="{{ settings.RECAPTCHA_URL }}"></script> {% endif %}where
# in settings.py RECAPTCHA_PUBLIC_KEY = "blah" RECAPTCHA_PRIVATE_KEY = "blah" RECAPTCHA_URL = ('https://www.google.com/recaptcha/api/challenge?k=%s' % RECAPTCHA_PUBLIC_KEY)
Unless you have the private key (which bots don't), you can see the recaptcha form.
5. def recaptcha() in apps/amo/helpers.py
Read about the inclusion_tag
@register.inclusion_tag('amo/recaptcha.html') @jinja2.contextfunction def recaptcha(context, form): d = dict(context.items()) d.update(form=form) return d
6. recaptcha.html lives in apps/amo/templates/amo/recaptcha.hhtml"
{% from 'includes/forms.html' import required %} <label for="recaptcha_response_field"> {{ _('Are you human?') }} {{ required() }} </label> {% trans %} <p> Please enter <strong>both words</strong> below, <strong>separated by a space</strong>. </p> <p> If this is hard to read, you can <a href="#" id="recaptcha_different">try different words</a> or <a href="#" id="recaptcha_audio">listen to something</a> instead. </p> {% endtrans %} <div id="recaptcha_image"></div> <p> <input type="text" name="recaptcha_response_field" id="recaptcha_response_field" size="30" /> </p> <p><a href="#" id="recaptcha_help">{{ _("What's this?") }}</a></p> {{ form.recaptcha.errors }}
7. div ids link to function in javascript here: media/js/zamboni/users.js
// Recaptcha var RecaptchaOptions = { theme : 'custom' }; $('#recaptcha_different').click(function(e) { e.preventDefault(); Recaptcha.reload(); }); $('#recaptcha_audio').click(function(e) { e.preventDefault(); Recaptcha.switch_type('audio'); }); $('#recaptcha_help').click(function(e) { e.preventDefault(); Recaptcha.showhelp(); });These Recaptcha's functions are defined in Google's recaptcha.
Saturday, July 9, 2011
Find where a module is
Import captcha.fields
help(captcha.fields)
or captcha.__file__
or captcha.fields
shown belowIn [3]: import captcha.fields In [4]: captcha.fields? Type: module Base Class: <type 'module'> String Form: <module 'captcha.fields' from '/Users/jbalogh/dev/zamboni/vendor/src/django-recaptcha/captcha/fields.pyc'> Namespace: Interactive File: /Users/uname/dev/zamboni/vendor/src/django-recaptcha/captcha/fields.py Docstring: <no docstring>
It's actually here: django-recaptcha already done before!!, not here. I wish I had know that the django-recaptcha existed before I did this.
Friday, July 8, 2011
Where to see CSP Policy
and then go to www.domain.name/path/to/poloice
How Django form calls clean() method
Validation of a Form is split into several steps ... [calls]
- [1] to_python()
- [2] validate()
- [3] run_validators()
- [4] clean()
- [5] clean_
This is how these things work in the source code:
1. each field's clean() method takes care of the first 3 items
# src/django/django/forms/fields.py, comments mine class Field(object): ... def clean(self, value): """ Validates the given value and returns its "cleaned" value as an appropriate Python object. Raises ValidationError for any errors. """ value = self.to_python(value) # [1] self.validate(value) # [2] self.run_validators(value) # [3] return value
2. aoeu
# src/django/django/forms/fields.py, comments mine
class BaseForm(StrAndUnicode):
...
def full_clean(self):
"""
Cleans all of self.data and populates self._errors and
self.cleaned_data.
"""
self._errors = ErrorDict()
if not self.is_bound: # Stop further processing.
return
self.cleaned_data = {}
# If the form is permitted to be empty, and none of the form data has
# changed from the initial data, short circuit any validation.
if self.empty_permitted and not self.has_changed():
return
self._clean_fields()
self._clean_form()
self._post_clean()
if self._errors:
del self.cleaned_data
def _clean_fields(self):
for name, field in self.fields.items():
# value_from_datadict() gets the data from the data dictionaries.
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several HTML fields.
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
initial = self.initial.get(name, field.initial)
# calls step 1's stuff
value = field.clean(value, initial)
else:
value = field.clean(value)
self.cleaned_data[name] = value
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
self.cleaned_data[name] = value
except ValidationError, e:
self._errors[name] = self.error_class(e.messages)
if name in self.cleaned_data:
del self.cleaned_data[name]
... calls some alias ...
figure it out yourself
Thursday, July 7, 2011
HTML 5 Data Attribute
http://html5doctor.com/html5-custom-data-attributes/
Wednesday, July 6, 2011
When you can't onclick() in html
<button onclick="myFunction()">Click me</button>
To one of:
way 1 with .onclick with anonymous function
<body> <button id="myButton">Click me</button> <script>document.getElementById("myButton").onclick = function(){ stuff };</script> </body>
way 2 with .onclick with named function
<body> <button id="myButton">Click me</button> <script>function myFunction() { stuff }; document.getElementById("myButton").onclick = myFunction;</script> </body>
way 3 with .addEventListener() with named function
<body> <button id="myButton">Click me</button> <script>document.getElementById("myButton").addEventListener('click', myFunction, false);</script> </body>
Remember to put the addEventListener script after you have created the button. If you have to put it in the head, put the line of script inside a jQuery ready like
<!-- try not to do this though --> <head> <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> <script type="text/javascript"> $(document).ready(function() { document.getElementById("myButton").addEventListener('click', myFunction, false); } </script> </head> <body> <button id="checkButton">Click me</button> </body>
But it's better practice to put js right before the closing of the body tag.
If your function has arguments...
Change:
<button onclick="myFunction('arg1')">Click me</button>
To
<body> <button id="myButton">Click me</button> <script>document.getElementById("myButton").addEventListener('click', function(){ myFunction('arg1') }, false);</script> </body>
Where to put JS
Tuesday, July 5, 2011
SQL Query for Top 500 Passwords
insert into table_name (password_column) values ("123456"),("porsche"),("firebird"),("prince"),("rosebud"),("password"),("guitar"),("butter"),("beach"),("jaguar"),("12345678"),("chelsea"),("united"),("amateur"),("great"),("1234"),("black"),("turtle"),("7777777"),("cool"),("pussy"),("diamond"),("steelers"),("muffin"),("cooper"),("12345"),("nascar"),("tiffany"),("redsox"),("1313"),("dragon"),("jackson"),("zxcvbn"),("star"),("scorpio"),("qwerty"),("cameron"),("tomcat"),("testing"),("mountain"),("696969"),("654321"),("golf"),("shannon"),("madison"),("mustang"),("computer"),("bond007"),("murphy"),("987654"),("letmein"),("amanda"),("bear"),("frank"),("brazil"),("baseball"),("wizard"),("tiger"),("hannah"),("lauren"),("master"),("xxxxxxxx"),("doctor"),("dave"),("japan"),("michael"),("money"),("gateway"),("eagle1"),("naked"),("football"),("phoenix"),("gators"),("11111"),("squirt"),("shadow"),("mickey"),("angel"),("mother"),("stars"),("monkey"),("bailey"),("junior"),("nathan"),("apple"),("abc123"),("knight"),("thx1138"),("raiders"),("alexis"),("pass"),("iceman"),("porno"),("steve"),("aaaa"),("fuckme"),("tigers"),("badboy"),("forever"),("bonnie"),("6969"),("purple"),("debbie"),("angela"),("peaches"),("jordan"),("andrea"),("spider"),("viper"),("jasmine"),("harley"),("horny"),("melissa"),("ou812"),("kevin"),("ranger"),("dakota"),("booger"),("jake"),("matt"),("iwantu"),("aaaaaa"),("1212"),("lovers"),("qwertyui"),("jennifer"),("player"),("flyers"),("suckit"),("danielle"),("hunter"),("sunshine"),("fish"),("gregory"),("beaver"),("fuck"),("morgan"),("porn"),("buddy"),("4321"),("2000"),("starwars"),("matrix"),("whatever"),("4128"),("test"),("boomer"),("teens"),("young"),("runner"),("batman"),("cowboys"),("scooby"),("nicholas"),("swimming"),("trustno1"),("edward"),("jason"),("lucky"),("dolphin"),("thomas"),("charles"),("walter"),("helpme"),("gordon"),("tigger"),("girls"),("cumshot"),("jackie"),("casper"),("robert"),("booboo"),("boston"),("monica"),("stupid"),("access"),("coffee"),("braves"),("midnight"),("shit"),("love"),("xxxxxx"),("yankee"),("college"),("saturn"),("buster"),("bulldog"),("lover"),("baby"),("gemini"),("1234567"),("ncc1701"),("barney"),("cunt"),("apples"),("soccer"),("rabbit"),("victor"),("brian"),("august"),("hockey"),("peanut"),("tucker"),("mark"),("3333"),("killer"),("john"),("princess"),("startrek"),("canada"),("george"),("johnny"),("mercedes"),("sierra"),("blazer"),("sexy"),("gandalf"),("5150"),("leather"),("cumming"),("andrew"),("spanky"),("doggie"),("232323"),("hunting"),("charlie"),("winter"),("zzzzzz"),("4444"),("kitty"),("superman"),("brandy"),("gunner"),("beavis"),("rainbow"),("asshole"),("compaq"),("horney"),("bigcock"),("112233"),("fuckyou"),("carlos"),("bubba"),("happy"),("arthur"),("dallas"),("tennis"),("2112"),("sophie"),("cream"),("jessica"),("james"),("fred"),("ladies"),("calvin"),("panties"),("mike"),("johnson"),("naughty"),("shaved"),("pepper"),("brandon"),("xxxxx"),("giants"),("surfer"),("1111"),("fender"),("tits"),("booty"),("samson"),("austin"),("anthony"),("member"),("blonde"),("kelly"),("william"),("blowme"),("boobs"),("fucked"),("paul"),("daniel"),("ferrari"),("donald"),("golden"),("mine"),("golfer"),("cookie"),("bigdaddy"),("king"),("summer"),("chicken"),("bronco"),("fire"),("racing"),("heather"),("maverick"),("penis"),("sandra"),("5555"),("hammer"),("chicago"),("voyager"),("pookie"),("eagle"),("yankees"),("joseph"),("rangers"),("packers"),("hentai"),("joshua"),("diablo"),("birdie"),("einstein"),("newyork"),("maggie"),("sexsex"),("trouble"),("dolphins"),("little"),("biteme"),("hardcore"),("white"),("0"),("redwings"),("enter"),("666666"),("topgun"),("chevy"),("smith"),("ashley"),("willie"),("bigtits"),("winston"),("sticky"),("thunder"),("welcome"),("bitches"),("warrior"),("cocacola"),("cowboy"),("chris"),("green"),("sammy"),("animal"),("silver"),("panther"),("super"),("slut"),("broncos"),("richard"),("yamaha"),("qazwsx"),("8675309"),("private"),("fucker"),("justin"),("magic"),("zxcvbnm"),("skippy"),("orange"),("banana"),("lakers"),("nipples"),("marvin"),("merlin"),("driver"),("rachel"),("power"),("blondes"),("michelle"),("marine"),("slayer"),("victoria"),("enjoy"),("corvette"),("angels"),("scott"),("asdfgh"),("girl"),("bigdog"),("fishing"),("2222"),("vagina"),("apollo"),("cheese"),("david"),("asdf"),("toyota"),("parker"),("matthew"),("maddog"),("video"),("travis"),("qwert"),("121212"),("hooters"),("london"),("hotdog"),("time"),("patrick"),("wilson"),("7777"),("paris"),("sydney"),("martin"),("butthead"),("marlboro"),("rock"),("women"),("freedom"),("dennis"),("srinivas"),("xxxx"),("voodoo"),("ginger"),("fucking"),("internet"),("extreme"),("magnum"),("blowjob"),("captain"),("action"),("redskins"),("juice"),("nicole"),("bigdick"),("carter"),("erotic"),("abgrtyu"),("sparky"),("chester"),("jasper"),("dirty"),("777777"),("yellow"),("smokey"),("monster"),("ford"),("dreams"),("camaro"),("xavier"),("teresa"),("freddy"),("maxwell"),("secret"),("steven"),("jeremy"),("arsenal"),("music"),("dick"),("viking"),("11111111"),("access14"),("rush2112"),("falcon"),("snoopy"),("bill"),("wolf"),("russia"),("taylor"),("blue"),("crystal"),("nipple"),("scorpion"),("111111"),("eagles"),("peter"),("iloveyou"),("rebecca"),("131313"),("winner"),("pussies"),("alex"),("tester"),("123123"),("samantha"),("cock"),("florida"),("mistress"),("bitch"),("house"),("beer"),("eric"),("phantom"),("hello"),("miller"),("rocket"),("legend"),("billy"),("scooter"),("flower"),("theman"),("movie"),("6666"),("please"),("jack"),("oliver"),("success"),("albert");
ReCaptcha on Django
1. Get your public and private recaptcha keys
2. Add keys to your settings: settings_local.py, or settings.py if you don't have your code in public
RECAPTCHA_PRIVATE_KEY = 'insert your private key'
3. Download Python's Recaptcha-client
1. cd to the directory, e.g. recaptcha-client-x.x.x
2.
python setup.py install
4. don't copy anything
5. all the same except the line
from your_app.captcha import submit, displayhtml
is changed into
from captcha import submit, displayhtml
4. Copy captcha.py to your app folder:
cp recaptcha-client-x.x.x/recaptcha/client/captcha.py path_to_your_django/apps/your_app
So now you should see that this exists: path_to_your_django/apps/your_app/captcha.py5. Add ReCaptchaField into your forms Differences to marcofucci's step 4 are highlighted.
#add to path_to_your_django/apps/your_app/forms.py from django.conf import settings from django import forms from django.utils.encoding import smart_unicode from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe from your_app.captcha import submit, displayhtml class ReCaptchaField(forms.CharField): default_error_messages = { 'captcha_invalid': _(u'Invalid captcha') } def __init__(self, *args, **kwargs): self.widget = ReCaptcha self.required = True super(ReCaptchaField, self).__init__(*args, **kwargs) def clean(self, values): super(ReCaptchaField, self).clean(values[1]) recaptcha_challenge_value = smart_unicode(values[0]) recaptcha_response_value = smart_unicode(values[1]) check_captcha = submit(recaptcha_challenge_value, recaptcha_response_value, settings.RECAPTCHA_PRIVATE_KEY, {}) if not check_captcha.is_valid: raise forms.util.ValidationError(self.error_messages['captcha_invalid']) return values[0] class ReCaptcha(forms.widgets.Widget): recaptcha_challenge_name = 'recaptcha_challenge_field' recaptcha_response_name = 'recaptcha_response_field' def render(self, name, value, attrs=None): return mark_safe(u'%s' % displayhtml(settings.RECAPTCHA_PUBLIC_KEY)) def value_from_datadict(self, data, files, name): return [data.get(self.recaptcha_challenge_name, None), data.get(self.recaptcha_response_name, None)]
6. Put it in my form! In contrast to, marcifucci's version, I use the built-in forms.
#add to path_to_your_django/apps/your_app/forms.py from django.contrib.auth import forms as auth_forms class UserCreationForm(auth_forms.UserCreationForm): recaptcha = ReCaptchaField(label="I'm a human") class AuthenticationForm(auth_forms.AuthenticationForm): recaptcha = ReCaptchaField(label="I'm a human")
7. See my examples on github:
- step 4 copied in captcha.py
- step 5, 6 forms.py
8. If you have more questions, feel free to email me.
Monday, July 4, 2011
Great Git resources
Sunday, July 3, 2011
Django Authentication / Login
Examples:
- TODO: insert my simple example here
- zabmoni's users
Tutorial:
Django Book's big chapter on Authentication, Users and Registration. A little bit of everything. I would consider this to be a good intro, if you have the patience to read through it all thoroughly.
Django User Authentication
- user fields
- user methods
- built-in forms
- group and permission stuff.
Django Sessions
- important SESSIONS settings (see this blog post about my bad session experience)
- session (dictionary) methods
---
The Django Book's Forms.
Solved - Django "Your Web browser doesn't appear to have cookies enabled."
Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in.
and you have made sure that your browser DOES have cookies enabled, then you should check your settings.py's SESSION_* configurations very carefully.
Maybe you have the SESSION_COOKIE_SECURE set to True accidentally when you don't have SSL.
Maybe you have the SESSION_COOKIE_DOMAIN set to a domain that's actually not your domain.
# If not SSL, should be false
SESSION_COOKIE_SECURE = False
# Check other SESSION_* settings too
bashrc improvements for git
git auto complete
source /usr/local/etc/bash_completion.d/git-completion.bash
Friday, July 1, 2011
PHP concat variable name with str/string
The Shorter version
<?php // setting every $nvar* to ":)" $nameArray = array("Alice", "Bob", "Charlie"); foreach ($nameArray as $name) { ${ "nvar" . $name } = ":)"; } ?>
and
The Longer version
<?php // setting every $nvar* to ":)" $nameArray = array("Alice", "Bob", "Charlie"); foreach ($nameArray as $name) { $nameVar = "nvar" . $name; ${ $nameVar } = ":)"; } ?>
are the same as
The Brute-force version
<?php // setting every $nvar* to ":)" $nvarAlice = ":)"; $nvarBob = ":)"; $nvarCharlie = ":)"; ?>
Read documentations here.
Thursday, June 30, 2011
install jsocol's ratelimit
python setup.py install
running bdist_egg
running egg_info
creating django_ratelimit.egg-info
writing requirements to django_ratelimit.egg-info/requires.txt
writing django_ratelimit.egg-info/PKG-INFO
writing top-level names to django_ratelimit.egg-info/top_level.txt
writing dependency_links to django_ratelimit.egg-info/dependency_links.txt
writing requirements to django_ratelimit.egg-info/requires.txt
writing django_ratelimit.egg-info/PKG-INFO
writing top-level names to django_ratelimit.egg-info/top_level.txt
writing dependency_links to django_ratelimit.egg-info/dependency_links.txt
writing manifest file 'django_ratelimit.egg-info/SOURCES.txt'
reading manifest file 'django_ratelimit.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'django_ratelimit.egg-info/SOURCES.txt'
installing library code to build/bdist.macosx-10.4-x86_64/egg
running install_lib
running build_py
creating build
creating build/lib
creating build/lib/ratelimit
copying ratelimit/__init__.py -> build/lib/ratelimit
copying ratelimit/decorators.py -> build/lib/ratelimit
creating build/lib/ratelimit/backends
copying ratelimit/backends/__init__.py -> build/lib/ratelimit/backends
copying ratelimit/backends/cachebe.py -> build/lib/ratelimit/backends
creating build/bdist.macosx-10.4-x86_64
creating build/bdist.macosx-10.4-x86_64/egg
creating build/bdist.macosx-10.4-x86_64/egg/ratelimit
copying build/lib/ratelimit/__init__.py -> build/bdist.macosx-10.4-x86_64/egg/ratelimit
creating build/bdist.macosx-10.4-x86_64/egg/ratelimit/backends
copying build/lib/ratelimit/backends/__init__.py -> build/bdist.macosx-10.4-x86_64/egg/ratelimit/backends
copying build/lib/ratelimit/backends/cachebe.py -> build/bdist.macosx-10.4-x86_64/egg/ratelimit/backends
copying build/lib/ratelimit/decorators.py -> build/bdist.macosx-10.4-x86_64/egg/ratelimit
byte-compiling build/bdist.macosx-10.4-x86_64/egg/ratelimit/__init__.py to __init__.pyc
byte-compiling build/bdist.macosx-10.4-x86_64/egg/ratelimit/backends/__init__.py to __init__.pyc
byte-compiling build/bdist.macosx-10.4-x86_64/egg/ratelimit/backends/cachebe.py to cachebe.pyc
byte-compiling build/bdist.macosx-10.4-x86_64/egg/ratelimit/decorators.py to decorators.pyc
creating build/bdist.macosx-10.4-x86_64/egg/EGG-INFO
copying django_ratelimit.egg-info/PKG-INFO -> build/bdist.macosx-10.4-x86_64/egg/EGG-INFO
copying django_ratelimit.egg-info/SOURCES.txt -> build/bdist.macosx-10.4-x86_64/egg/EGG-INFO
copying django_ratelimit.egg-info/dependency_links.txt -> build/bdist.macosx-10.4-x86_64/egg/EGG-INFO
copying django_ratelimit.egg-info/requires.txt -> build/bdist.macosx-10.4-x86_64/egg/EGG-INFO
copying django_ratelimit.egg-info/top_level.txt -> build/bdist.macosx-10.4-x86_64/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating dist
creating 'dist/django_ratelimit-0.1-py2.7.egg' and adding 'build/bdist.macosx-10.4-x86_64/egg' to it
removing 'build/bdist.macosx-10.4-x86_64/egg' (and everything under it)
Processing django_ratelimit-0.1-py2.7.egg
Copying django_ratelimit-0.1-py2.7.egg to /Users/haoqili/.virtualenvs/playdoh/lib/python2.7/site-packages
Adding django-ratelimit 0.1 to easy-install.pth file
Installed /Users/haoqili/.virtualenvs/playdoh/lib/python2.7/site-packages/django_ratelimit-0.1-py2.7.egg
Processing dependencies for django-ratelimit==0.1
Searching for django
Reading http://pypi.python.org/simple/django/
Reading http://www.djangoproject.com/
Best match: Django 1.3
Downloading http://media.djangoproject.com/releases/1.3/Django-1.3.tar.gz
Processing Django-1.3.tar.gz
Running Django-1.3/setup.py -q bdist_egg --dist-dir /var/folders/yl/yltlIu+3EZy3rSMmgXn6yE+++TI/-Tmp-/easy_install-TVy96n/Django-1.3/egg-dist-tmp-MUK8NL
zip_safe flag not set; analyzing archive contents...
django.conf.__init__: module references __file__
django.conf.project_template.manage: module references __file__
django.contrib.admindocs.views: module references __file__
django.contrib.auth.tests.views: module references __file__
django.contrib.flatpages.tests.csrf: module references __file__
django.contrib.flatpages.tests.middleware: module references __file__
django.contrib.flatpages.tests.templatetags: module references __file__
django.contrib.flatpages.tests.views: module references __file__
django.contrib.formtools.tests.__init__: module references __file__
django.contrib.gis.geometry.test_data: module references __file__
django.contrib.gis.tests.geo3d.tests: module references __file__
django.contrib.gis.tests.geogapp.tests: module references __file__
django.contrib.gis.tests.layermap.tests: module references __file__
django.contrib.sitemaps.tests.basic: module references __file__
django.contrib.staticfiles.storage: module references __file__
django.core.management.__init__: module references __file__
django.core.management.__init__: module references __path__
django.core.management.base: module references __path__
django.core.management.sql: module references __file__
django.core.management.commands.loaddata: module references __file__
django.core.management.commands.loaddata: module references __path__
django.core.management.commands.makemessages: module references __file__
django.core.servers.basehttp: module references __path__
django.db.utils: module references __file__
django.db.models.loading: module references __file__
django.template.loaders.app_directories: module references __file__
django.test._doctest: module references __file__
django.test._doctest: module MAY be using inspect.getsourcefile
django.test.simple: module references __file__
django.utils.autoreload: module references __file__
django.utils.module_loading: module references __path__
django.utils.version: module references __path__
django.utils.translation.__init__: module references __file__
django.utils.translation.trans_real: module references __file__
django.utils.unittest.collector: module references __file__
django.utils.unittest.loader: module references __file__
django.views.i18n: module references __file__
Adding Django 1.3 to easy-install.pth file
Installing django-admin.py script to /Users/haoqili/.virtualenvs/playdoh/bin
Installed /Users/haoqili/.virtualenvs/playdoh/lib/python2.7/site-packages/Django-1.3-py2.7.egg
Finished processing dependencies for django-ratelimit==0.1