source: tools/policy/window.py @ 52a3fac

gec13
Last change on this file since 52a3fac was 52a3fac, checked in by Ted Faber <faber@…>, 12 years ago

Add principals

  • Property mode set to 100644
File size: 8.2 KB
Line 
1#!?usr/local/bin/python
2
3import gtk
4import ConfigParser
5import os.path
6import re
7import Creddy
8
9from policy import policy
10
11from principal_tree import principal_issued_tree, \
12        principal_assigned_tree, principal_attribute_tree
13
14from new_credential import add_credential_dialog, add_principal_dialog
15
16class window(gtk.Window):
17
18    ui_def = '''
19    <ui>
20        <menubar>
21            <menu action="FileMenu">
22                <menuitem name="New" action="FileNew"/>
23                <menuitem name="Load" action="FileLoad"/>
24                <menuitem name="Save" action="FileSave"/>
25                <menuitem name="Quit" action="FileQuit"/>
26            </menu>
27            <menu action="EditMenu">
28                <menuitem action="EditAddCred"/>
29                <menuitem action="EditAddPrincipal"/>
30            </menu>
31            <menu action="ViewMenu">
32                <menu action="Translation">
33                    <menuitem name="ViewSet" action="ViewSet"/>
34                    <menuitem name="ViewRole description" action="ViewRole"/>
35                    <menuitem name="ViewNames" action="ViewName"/>
36                    <menuitem name="ViewRaw" action="ViewRaw"/>
37                </menu>
38            </menu>
39        </menubar>
40    </ui>
41    '''
42    cfg_path = os.path.join(os.path.expanduser('~'), '.abac_policy_tool.cfg')
43
44    @staticmethod
45    def wrapit(widget):
46        sw = gtk.ScrolledWindow()
47        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
48        sw.add(widget)
49        return sw
50
51    def report_error(self, message):
52        md = gtk.MessageDialog(self, gtk.DIALOG_MODAL, 
53                gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 
54                message)
55        md.run()
56        md.destroy()
57
58    def __init__(self, policy):
59        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
60        self.policy = policy
61        self.set_title('test')
62        self.connect('destroy', self.quit)
63        self.connect('show', self.shown)
64        self.connect('configure-event', self.changed)
65        self.pos = (0,0)
66        self.size = (500, 500)
67        self.pages = [ ]
68        self.translated = [ ]
69
70        self.read_config()
71
72        nb = gtk.Notebook()
73        p = principal_issued_tree(policy)
74        nb.append_page(self.wrapit(p), gtk.Label("Credentials Issued"))
75        self.pages.append(p)
76
77        p = principal_assigned_tree(policy)
78        nb.append_page(self.wrapit(p), gtk.Label("Attributes Assigned"))
79        self.pages.append(p)
80
81        p = principal_attribute_tree(policy)
82        nb.append_page(self.wrapit(p), gtk.Label("All Attributes"))
83        self.pages.append(p)
84        self.translated.append(p)
85
86        ui = gtk.UIManager()
87        ag = gtk.ActionGroup('action')
88        ag.add_actions((
89            ('FileMenu', None, 'File'),
90            ('FileNew', gtk.STOCK_NEW, None, None, None, self.new),
91            ('FileLoad', gtk.STOCK_OPEN, None, None, None, self.load),
92            ('FileSave', gtk.STOCK_SAVE, None, None, None, self.save),
93            ('FileQuit', gtk.STOCK_QUIT, None, None, None, self.quit),
94            ('EditMenu', None, 'Edit'),
95            ('EditAddCred', None, "Add Credential", None, None, self.add_cred),
96            ('EditAddPrincipal', None, "Add Principal", None, None, 
97                self.add_principal),
98            ('ViewMenu', None, 'View'),
99            ('Translation', None, 'Translate Credentials'),
100            ))
101        ag.add_radio_actions([
102            ('ViewSet', None, 'Set based descriptions', None, None, 0), 
103            ('ViewRole', None, 'Role based descriptions', None, None, 1), 
104            ('ViewName', None, 'ABAC with symbolic names', None, None, 2), 
105            ('ViewRaw', None, 'Raw ABAC', None, None, 3),], 
106            2, self.translation_change)
107
108        ui.insert_action_group(ag, -1)
109        ui.add_ui_from_string(window.ui_def)
110
111        mb = ui.get_widget('ui/menubar')
112        vb = gtk.VBox()
113        vb.pack_start(mb, False, False, 0)
114        vb.pack_start(nb, True, True, 0)
115
116        self.add(vb)
117        self.show_all()
118   
119    def quit(self, widget=None, data=None):
120        self.save_config()
121        gtk.main_quit()
122
123    def save(self, widget=None, data=None):
124        d = gtk.FileChooserDialog('Save file as', self, 
125                gtk.FILE_CHOOSER_ACTION_SAVE, (
126            gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
127            gtk.STOCK_OK, gtk.RESPONSE_OK))
128        fil = gtk.FileFilter()
129        fil.set_name('Zip files')
130        fil.add_pattern('*.zip')
131        d.set_select_multiple(False)
132        d.set_current_folder('.')
133        d.set_do_overwrite_confirmation(True)
134        d.add_filter(fil)
135        if self.policy.filename is not None:
136            d.set_filename(self.policy.filename)
137        rv = d.run()
138        d.hide()
139        if rv == gtk.RESPONSE_OK:
140            self.policy.write_zip(d.get_filename())
141        d.destroy()
142
143    def new(self, widget=None, data=None):
144        d = gtk.MessageDialog(self, gtk.DIALOG_MODAL, 
145                gtk.MESSAGE_ERROR, gtk.BUTTONS_OK_CANCEL, 
146                "Clear this policy?")
147        rv = d.run()
148        if rv == gtk.RESPONSE_OK:
149            self.policy.clear()
150            for p in self.pages:
151                p.recalc()
152        d.destroy()
153
154    def load(self, widget=None, data=None):
155        d = gtk.FileChooserDialog('Save file as', self, 
156                gtk.FILE_CHOOSER_ACTION_OPEN, (
157            gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
158            gtk.STOCK_OK, gtk.RESPONSE_OK))
159        fil = gtk.FileFilter()
160        fil.set_name('Zip files')
161        fil.add_pattern('*.zip')
162        d.set_select_multiple(False)
163        d.set_current_folder('.')
164        d.set_do_overwrite_confirmation(True)
165        d.add_filter(fil)
166        if self.policy.filename is not None:
167            d.set_filename(self.policy.filename)
168        rv = d.run()
169        d.hide()
170        if rv == gtk.RESPONSE_OK:
171            self.policy.read_zip(d.get_filename())
172            for p in self.pages:
173                p.recalc()
174        d.destroy()
175
176    def add_principal(self, widget=None, data=None):
177        while True:
178            d = add_principal_dialog(self)
179            rv = d.run()
180            d.hide()
181            if rv == gtk.RESPONSE_OK:
182                name = d.pname.get_text() 
183                if name not in self.policy.principal_names():
184                    try:
185                        cid = Creddy.ID(name, 5 * 3600 * 24 * 365)
186                    except RuntimeError, e:
187                        self.report_error('Cannot create principal: %s' % e)
188                        continue
189                    self.policy.add_identity(cid)
190                    for p in self.pages:
191                        p.recalc()
192                    d.destroy()
193                    return
194                else:
195                    d.destroy()
196                    self.report_error('Cannot overwrite name: %s' % name)
197            elif rv == gtk.RESPONSE_CANCEL:
198                d.destroy()
199                return
200
201    def add_cred(self, widget=None, data=None):
202        d = add_credential_dialog(self, self.policy)
203        rv = d.run()
204        d.hide()
205        if rv == gtk.RESPONSE_OK:
206            iname = d.issuer.get_active_text()
207            issuer = self.policy.issuers[self.policy.name_to_keyid(iname)]
208            role = re.sub('\.', '_', d.role.get_text())
209            cred = None
210            try: 
211                cred = Creddy.Attribute(issuer, role, 5 * 365 * 3600 * 24)
212            except RuntimeError, e:
213                print e
214                pass
215
216            if cred is None:
217                self.report_error("Missing or invalid role")
218                d.destroy()
219                return
220
221            mode = d.mechanism.get_active_text()
222            p = d.subject_principal.get_text()
223            p = self.policy.name_to_keyid(p)
224            if p is None:
225                self.report_error("Missing or invalid subject principal")
226                d.destroy()
227                return
228            if mode == 'Direct delegation' or mode == 'Delegation to role':
229                r = d.subject_role.get_text()
230                if r is None or r == '':
231                    self.report_error("Missing or invalid subject role")
232                    d.destroy()
233                    return
234            if mode == 'Delegation to role':
235                l = d.subject_link.get_text()
236                if l is None or l == '':
237                    self.report_error("Missing or invalid subject linking role")
238                    d.destroy()
239                    return
240
241            if mode == 'Direct assignment': cred.principal(p)
242            elif mode == 'Direct delegation': cred.role(p, r)
243            else: cred.linking_role(p, l, r)
244
245            try:
246                cred.bake()
247            except:
248                self.report_error("Could not create credential?!")
249                d.destroy()
250                return
251            self.policy.add_credential(cred)
252            for p in self.pages:
253                p.recalc()
254            d.destroy()
255
256    def shown(self, w):
257        self.move(*self.pos)
258        self.resize(*self.size)
259
260    def changed(self, w, e):
261        self.pos = self.get_position()
262        self.size = self.get_size()
263
264    def translation_change(self, ra, c, user=None):
265        cv = c.get_current_value()
266        if cv == 0: self.policy.translate = 'sets'
267        elif cv == 1: self.policy.translate = 'roles'
268        elif cv == 2: self.policy.translate = 'keyids'
269        elif cv == 3: self.policy.translate = 'none'
270        else: print >>sys.stderr, 'Unknown translation type!?'
271
272        for p in self.translated:
273            p.recalc()
274
275    def get_intpair(self, sect, opt):
276        if not self.cfg.has_section(sect):
277            self.cfg.add_section(sect)
278
279        if self.cfg.has_option(sect, opt):
280            try:
281                return [int(x) for x in self.cfg.get(sect, opt).split(',', 1)]
282            except ValueError:
283                return None
284        else:
285            return None
286
287    def read_config(self):
288        self.cfg = ConfigParser.SafeConfigParser()
289        self.cfg.read(window.cfg_path)
290
291        self.pos = self.get_intpair('geom', 'pos') or ( 0, 0)
292        self.size = self.get_intpair('geom', 'size') or ( 500, 500)
293
294
295    def save_config(self):
296        self.cfg.set('geom', 'pos', '%d,%d' % self.pos)
297        self.cfg.set('geom', 'size', '%d,%d' % self.size)
298        try:
299            f = open(window.cfg_path, 'w')
300            self.cfg.write(f)
301            f.close()
302        except EnvironmentError, e:
303            pass
Note: See TracBrowser for help on using the repository browser.