Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / authpolicy-add.py @ 38807757

History | View | Annotate | Download (4.3 kB)

1 9d20fe23 Kostas Papadimitriou
# Copyright 2012 GRNET S.A. All rights reserved.
2 9d20fe23 Kostas Papadimitriou
#
3 9d20fe23 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 9d20fe23 Kostas Papadimitriou
# without modification, are permitted provided that the following
5 9d20fe23 Kostas Papadimitriou
# conditions are met:
6 9d20fe23 Kostas Papadimitriou
#
7 9d20fe23 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 9d20fe23 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 9d20fe23 Kostas Papadimitriou
#      disclaimer.
10 9d20fe23 Kostas Papadimitriou
#
11 9d20fe23 Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 9d20fe23 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 9d20fe23 Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 9d20fe23 Kostas Papadimitriou
#      provided with the distribution.
15 9d20fe23 Kostas Papadimitriou
#
16 9d20fe23 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 9d20fe23 Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 9d20fe23 Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 9d20fe23 Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 9d20fe23 Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 9d20fe23 Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 9d20fe23 Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 9d20fe23 Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 9d20fe23 Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 9d20fe23 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 9d20fe23 Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 9d20fe23 Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 9d20fe23 Kostas Papadimitriou
#
29 9d20fe23 Kostas Papadimitriou
# The views and conclusions contained in the software and
30 9d20fe23 Kostas Papadimitriou
# documentation are those of the authors and should not be
31 9d20fe23 Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 9d20fe23 Kostas Papadimitriou
# or implied, of GRNET S.A.
33 9d20fe23 Kostas Papadimitriou
34 9d20fe23 Kostas Papadimitriou
import string
35 9d20fe23 Kostas Papadimitriou
36 9d20fe23 Kostas Papadimitriou
from optparse import make_option
37 9d20fe23 Kostas Papadimitriou
38 9d20fe23 Kostas Papadimitriou
from django.core.management.base import BaseCommand, CommandError
39 9d20fe23 Kostas Papadimitriou
40 9d20fe23 Kostas Papadimitriou
from astakos.im.models import AuthProviderPolicyProfile as Profile
41 9d20fe23 Kostas Papadimitriou
42 9d20fe23 Kostas Papadimitriou
option_list = list(BaseCommand.option_list) + [
43 9d20fe23 Kostas Papadimitriou
    make_option('--update',
44 9d20fe23 Kostas Papadimitriou
                action='store_true',
45 9d20fe23 Kostas Papadimitriou
                dest='update',
46 9d20fe23 Kostas Papadimitriou
                default=False,
47 9d20fe23 Kostas Papadimitriou
                help="Update an existing profile."),
48 9d20fe23 Kostas Papadimitriou
    make_option('--exclusive',
49 9d20fe23 Kostas Papadimitriou
                action='store_true',
50 9d20fe23 Kostas Papadimitriou
                dest='exclusive',
51 9d20fe23 Kostas Papadimitriou
                default=False,
52 9d20fe23 Kostas Papadimitriou
                help="Apply policies to all authentication providers "
53 9d20fe23 Kostas Papadimitriou
                     "except the one provided."),
54 9d20fe23 Kostas Papadimitriou
]
55 9d20fe23 Kostas Papadimitriou
56 9d20fe23 Kostas Papadimitriou
POLICIES = ['add', 'remove', 'create', 'login', 'limit', 'required',
57 9d20fe23 Kostas Papadimitriou
            'automoderate']
58 9d20fe23 Kostas Papadimitriou
59 9d20fe23 Kostas Papadimitriou
for p in POLICIES:
60 9d20fe23 Kostas Papadimitriou
    option_list.append(make_option('--unset-%s-policy' % p,
61 9d20fe23 Kostas Papadimitriou
                                   action='store_true',
62 9d20fe23 Kostas Papadimitriou
                                   dest='unset_policy_%s' % p,
63 9d20fe23 Kostas Papadimitriou
                                   help="Unset %s policy (only when --update)"
64 9d20fe23 Kostas Papadimitriou
                                   % p.title()))
65 9d20fe23 Kostas Papadimitriou
    option_list.append(make_option('--%s-policy' % p,
66 9d20fe23 Kostas Papadimitriou
                                   action='store',
67 9d20fe23 Kostas Papadimitriou
                                   dest='policy_%s' % p,
68 9d20fe23 Kostas Papadimitriou
                                   help="%s policy" % p.title()))
69 9d20fe23 Kostas Papadimitriou
70 9d20fe23 Kostas Papadimitriou
71 9d20fe23 Kostas Papadimitriou
class Command(BaseCommand):
72 9d20fe23 Kostas Papadimitriou
    args = "<name> <provider_name>"
73 9d20fe23 Kostas Papadimitriou
    help = "Create a new authentication provider policy profile"
74 9d20fe23 Kostas Papadimitriou
    option_list = option_list
75 9d20fe23 Kostas Papadimitriou
76 9d20fe23 Kostas Papadimitriou
    def handle(self, *args, **options):
77 9d20fe23 Kostas Papadimitriou
        if len(args) < 2:
78 9d20fe23 Kostas Papadimitriou
            raise CommandError("Invalid number of arguments")
79 9d20fe23 Kostas Papadimitriou
80 9d20fe23 Kostas Papadimitriou
        profile = None
81 9d20fe23 Kostas Papadimitriou
        update = options.get('update')
82 9d20fe23 Kostas Papadimitriou
        name = args[0].strip()
83 9d20fe23 Kostas Papadimitriou
        provider = args[1].strip()
84 9d20fe23 Kostas Papadimitriou
85 9d20fe23 Kostas Papadimitriou
        if Profile.objects.filter(name=name).count():
86 9d20fe23 Kostas Papadimitriou
            if update:
87 9d20fe23 Kostas Papadimitriou
                profile = Profile.objects.get(name=name)
88 9d20fe23 Kostas Papadimitriou
            else:
89 9d20fe23 Kostas Papadimitriou
                raise CommandError("Profile with the same name already exists")
90 9d20fe23 Kostas Papadimitriou
91 9d20fe23 Kostas Papadimitriou
        if not profile:
92 9d20fe23 Kostas Papadimitriou
            profile = Profile()
93 9d20fe23 Kostas Papadimitriou
94 9d20fe23 Kostas Papadimitriou
        profile.name = name
95 9d20fe23 Kostas Papadimitriou
        profile.provider = provider
96 9d20fe23 Kostas Papadimitriou
        profile.is_exclusive = options.get('exclusive')
97 9d20fe23 Kostas Papadimitriou
98 9d20fe23 Kostas Papadimitriou
        for policy, value in options.iteritems():
99 9d20fe23 Kostas Papadimitriou
            if policy.startswith('policy_') and value is not None:
100 9d20fe23 Kostas Papadimitriou
                if isinstance(value, basestring) and value[0] in string.digits:
101 9d20fe23 Kostas Papadimitriou
                    value = int(value)
102 9d20fe23 Kostas Papadimitriou
                if value == 'False' or value == '0':
103 9d20fe23 Kostas Papadimitriou
                    value = False
104 9d20fe23 Kostas Papadimitriou
                if value == 'True' or value == '1':
105 9d20fe23 Kostas Papadimitriou
                    value = True
106 9d20fe23 Kostas Papadimitriou
                setattr(profile, policy, value)
107 9d20fe23 Kostas Papadimitriou
108 9d20fe23 Kostas Papadimitriou
            if update and policy.startswith('unset_'):
109 9d20fe23 Kostas Papadimitriou
                policy = policy.replace('unset_', '')
110 9d20fe23 Kostas Papadimitriou
                setattr(profile, policy, None)
111 9d20fe23 Kostas Papadimitriou
112 9d20fe23 Kostas Papadimitriou
        profile.save()
113 9d20fe23 Kostas Papadimitriou
        if update:
114 9d20fe23 Kostas Papadimitriou
            print "Profile updated"
115 9d20fe23 Kostas Papadimitriou
        else:
116 9d20fe23 Kostas Papadimitriou
            print "Profile stored"