Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / userdata / views.py @ 1efe6159

History | View | Annotate | Download (3.6 kB)

1 49f50673 Vangelis Koukis
#
2 49f50673 Vangelis Koukis
# Copyright 2011 GRNET S.A. All rights reserved.
3 49f50673 Vangelis Koukis
#
4 49f50673 Vangelis Koukis
# Redistribution and use in source and binary forms, with or
5 49f50673 Vangelis Koukis
# without modification, are permitted provided that the following
6 49f50673 Vangelis Koukis
# conditions are met:
7 49f50673 Vangelis Koukis
#
8 49f50673 Vangelis Koukis
#   1. Redistributions of source code must retain the above
9 49f50673 Vangelis Koukis
#      copyright notice, this list of conditions and the following
10 49f50673 Vangelis Koukis
#      disclaimer.
11 49f50673 Vangelis Koukis
#
12 49f50673 Vangelis Koukis
#   2. Redistributions in binary form must reproduce the above
13 49f50673 Vangelis Koukis
#      copyright notice, this list of conditions and the following
14 49f50673 Vangelis Koukis
#      disclaimer in the documentation and/or other materials
15 49f50673 Vangelis Koukis
#      provided with the distribution.
16 49f50673 Vangelis Koukis
#
17 49f50673 Vangelis Koukis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 49f50673 Vangelis Koukis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 49f50673 Vangelis Koukis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 49f50673 Vangelis Koukis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 49f50673 Vangelis Koukis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 49f50673 Vangelis Koukis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 49f50673 Vangelis Koukis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 49f50673 Vangelis Koukis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 49f50673 Vangelis Koukis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 49f50673 Vangelis Koukis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 49f50673 Vangelis Koukis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 49f50673 Vangelis Koukis
# POSSIBILITY OF SUCH DAMAGE.
29 49f50673 Vangelis Koukis
#
30 49f50673 Vangelis Koukis
# The views and conclusions contained in the software and
31 49f50673 Vangelis Koukis
# documentation are those of the authors and should not be
32 49f50673 Vangelis Koukis
# interpreted as representing official policies, either expressed
33 49f50673 Vangelis Koukis
# or implied, of GRNET S.A.
34 49f50673 Vangelis Koukis
35 eee0487e Kostas Papadimitriou
from django import http
36 eee0487e Kostas Papadimitriou
from django.template import RequestContext, loader
37 eee0487e Kostas Papadimitriou
from django.utils import simplejson as json
38 4264d385 Kostas Papadimitriou
from django.conf import settings
39 eee0487e Kostas Papadimitriou
40 26bade45 Kostas Papadimitriou
from synnefo.ui.userdata import rest
41 26bade45 Kostas Papadimitriou
from synnefo.ui.userdata.models import PublicKeyPair
42 8bf3a249 Kostas Papadimitriou
from synnefo.ui.userdata.util import exportKey
43 3ec71573 Kostas Papadimitriou
from synnefo.lib.astakos import get_user
44 330cf867 Kostas Papadimitriou
45 330cf867 Kostas Papadimitriou
SUPPORT_GENERATE_KEYS = True
46 330cf867 Kostas Papadimitriou
try:
47 7469ff7d Kostas Papadimitriou
    from paramiko import rsakey
48 7469ff7d Kostas Papadimitriou
    from paramiko.message import Message
49 330cf867 Kostas Papadimitriou
except ImportError, e:
50 330cf867 Kostas Papadimitriou
    SUPPORT_GENERATE_KEYS = False
51 330cf867 Kostas Papadimitriou
52 4264d385 Kostas Papadimitriou
import base64
53 4264d385 Kostas Papadimitriou
54 eee0487e Kostas Papadimitriou
class PublicKeyPairResourceView(rest.UserResourceView):
55 eee0487e Kostas Papadimitriou
    model = PublicKeyPair
56 eee0487e Kostas Papadimitriou
    exclude_fields = ["user"]
57 eee0487e Kostas Papadimitriou
58 eee0487e Kostas Papadimitriou
class PublicKeyPairCollectionView(rest.UserCollectionView):
59 eee0487e Kostas Papadimitriou
    model = PublicKeyPair
60 eee0487e Kostas Papadimitriou
    exclude_fields = ["user"]
61 4264d385 Kostas Papadimitriou
62 3548024c Kostas Papadimitriou
SSH_KEY_LENGTH = getattr(settings, 'USERDATA_SSH_KEY_LENGTH', 2048)
63 4264d385 Kostas Papadimitriou
def generate_key_pair(request):
64 4264d385 Kostas Papadimitriou
    """
65 4264d385 Kostas Papadimitriou
    Response to generate private/public RSA key pair
66 4264d385 Kostas Papadimitriou
    """
67 386481eb Kostas Papadimitriou
68 3ec71573 Kostas Papadimitriou
    get_user(request, settings.ASTAKOS_URL)
69 3ec71573 Kostas Papadimitriou
70 386481eb Kostas Papadimitriou
    if request.method != "POST":
71 386481eb Kostas Papadimitriou
        return http.HttpResponseNotAllowed(["POST"])
72 386481eb Kostas Papadimitriou
73 330cf867 Kostas Papadimitriou
    if not SUPPORT_GENERATE_KEYS:
74 330cf867 Kostas Papadimitriou
        raise Exception("Application does not support ssh keys generation")
75 330cf867 Kostas Papadimitriou
76 c72a830d Kostas Papadimitriou
    if PublicKeyPair.user_limit_exceeded(request.user):
77 c72a830d Kostas Papadimitriou
        raise http.HttpResponseServerError("SSH keys limit exceeded");
78 c72a830d Kostas Papadimitriou
79 c72a830d Kostas Papadimitriou
80 3548024c Kostas Papadimitriou
    # generate RSA key
81 386481eb Kostas Papadimitriou
    from Crypto import Random
82 386481eb Kostas Papadimitriou
    Random.atfork()
83 386481eb Kostas Papadimitriou
84 7469ff7d Kostas Papadimitriou
    key = rsakey.RSA.generate(SSH_KEY_LENGTH);
85 4264d385 Kostas Papadimitriou
86 3548024c Kostas Papadimitriou
    # get PEM string
87 8bf3a249 Kostas Papadimitriou
    pem = exportKey(key, 'PEM')
88 7469ff7d Kostas Papadimitriou
89 7469ff7d Kostas Papadimitriou
    public_data = Message()
90 7469ff7d Kostas Papadimitriou
    public_data.add_string('ssh-rsa')
91 7469ff7d Kostas Papadimitriou
    public_data.add_mpint(key.key.e)
92 7469ff7d Kostas Papadimitriou
    public_data.add_mpint(key.key.n)
93 4264d385 Kostas Papadimitriou
94 4264d385 Kostas Papadimitriou
    # generate public content
95 7469ff7d Kostas Papadimitriou
    public = str("ssh-rsa %s" % base64.b64encode(str(public_data)))
96 4264d385 Kostas Papadimitriou
97 4264d385 Kostas Papadimitriou
    data = {'private': pem, 'public': public}
98 4264d385 Kostas Papadimitriou
    return http.HttpResponse(json.dumps(data), mimetype="application/json")
99 3548024c Kostas Papadimitriou
100 3548024c Kostas Papadimitriou
def download_private_key(request):
101 3548024c Kostas Papadimitriou
    """
102 3548024c Kostas Papadimitriou
    Return key contents
103 3548024c Kostas Papadimitriou
    """
104 3548024c Kostas Papadimitriou
    data = request.POST.get("data")
105 3548024c Kostas Papadimitriou
    name = request.POST.get("name", "key")
106 3548024c Kostas Papadimitriou
107 3548024c Kostas Papadimitriou
    response = http.HttpResponse(mimetype='application/x-pem-key')
108 1efe6159 Kostas Papadimitriou
    response['Content-Disposition'] = 'attachment; filename=%s' % name
109 3548024c Kostas Papadimitriou
    response.write(data)
110 3548024c Kostas Papadimitriou
    return response