sfax509 will run openssl x509 on all parts of a gid
[sfa.git] / clientbin / sfadump.py
1 #! /usr/bin/env python
2
3 import sys
4 import os, os.path
5 import tempfile
6 from argparse import ArgumentParser
7
8 from sfa.util.sfalogging import logger
9 from sfa.util.faults import CredentialNotVerifiable, CertMissingParent #, ChildRightsNotSubsetOfParent
10
11 from sfa.trust.certificate import Certificate
12 from sfa.trust.credential import Credential
13 from sfa.trust.gid import GID
14
15 from sfa.storage.record import Record
16
17 def determine_sfa_filekind(fn):
18
19     if fn.endswith('.gid'): return 'gid'
20     elif fn.endswith('.cert'): return 'certificate'
21     elif fn.endswith('cred'): return 'credential'
22
23     try:
24         cred=Credential(filename=fn)
25         return 'credential'
26     except: pass
27
28     try: 
29         gid=GID(filename=fn)
30         if gid.uuid: return 'gid'
31     except: pass
32
33     try:
34         cert = Certificate(filename = fn)
35         return 'certificate'
36     except: pass
37
38     # to be completed
39 #    if "gidCaller" in dict:
40 #        return "credential"
41 #
42 #    if "uuid" in dict:
43 #        return "gid"
44
45     return "unknown"
46
47 def save_gid(gid):
48    hrn = gid.get_hrn()
49    lastpart = hrn.split(".")[-1]
50    filename = lastpart + ".gid"
51
52    if os.path.exists(filename):
53        print filename, ": already exists... skipping"
54        return
55
56    print filename, ": extracting gid of", hrn
57
58    gid.save_to_file(filename, save_parents = True)
59
60 def extract_gids(cred, extract_parents):
61    gidCaller = cred.get_gid_caller()
62    if gidCaller:
63        save_gid(gidCaller)
64
65    gidObject = cred.get_gid_object()
66    if gidObject and ((gidCaller == None) or (gidCaller.get_hrn() != gidObject.get_hrn())):
67        save_gid(gidObject)
68
69    # no such method Credential.get_parent
70 #   if extract_parents:
71 #       parent = cred.get_parent()
72 #       if parent:
73 #           extract_gids(parent, extract_parents)
74
75 def verify_input_object (obj, kind, options):
76     if options.trusted_roots:
77         print "CHECKING...",
78         message= "against [" + (" + ".join(options.trusted_roots)) + "]"
79         try:
80             if kind=='credential':
81                 print "verify",message,
82                 obj.verify(options.trusted_roots)
83             elif kind in ['certificate','gid']:
84                 print "verify_chain",message,
85                 obj.verify_chain(options.trusted_roots)
86             print "--> OK"
87         except Exception as inst:
88             print "--> KO",type(inst).__name__
89
90 def handle_input (filename, options):
91     kind = determine_sfa_filekind(filename)
92
93     # dump methods current do 'print' so let's go this road for now
94     if kind=="certificate":
95         cert=Certificate (filename=filename)
96         print '--------------------',filename,'IS A',kind
97         cert.dump(show_extensions=options.show_extensions)
98         verify_input_object (cert, kind, options)
99     elif kind=="credential":
100         cred = Credential(filename = filename)
101         print '--------------------',filename,'IS A',kind
102         cred.dump(dump_parents = options.dump_parents, show_xml=options.show_xml)
103         if options.extract_gids:
104             print '--------------------',filename,'embedded GIDs'
105             extract_gids(cred, extract_parents = options.dump_parents)
106         verify_input_object (cred, kind, options)
107     elif kind=="gid":
108         gid = GID(filename = filename)
109         print '--------------------',filename,'IS A',kind
110         gid.dump(dump_parents = options.dump_parents)
111         verify_input_object (gid, kind, options)
112     else:
113         print "%s: unknown filekind '%s'"% (filename,kind)
114
115 def main():
116     usage = """%(prog)s file1 [ .. filen]
117 display info on input files"""
118     parser = ArgumentParser(usage=usage)
119
120     parser.add_argument("-g", "--extract-gids", action="store_true", dest="extract_gids", 
121                         default=False, help="Extract GIDs from credentials")
122     parser.add_argument("-p", "--dump-parents", action="store_true", dest="dump_parents", 
123                         default=False, help="Show parents")
124     parser.add_argument("-e", "--extensions", action="store_true", 
125                         dest="show_extensions", default="False", help="Show certificate extensions")
126     parser.add_argument("-v", "--verbose", action='count', 
127                         dest='verbose', default=0, help="More and more verbose")
128     parser.add_argument("-x", "--xml", action='store_true', 
129                         dest='show_xml', default=False, help="dumps xml tree (cred. only)")
130     parser.add_argument("-c", "--check", action='append', dest='trusted_roots',
131                         help="cumulative list of trusted GIDs - when provided, the input is verify'ed against these")
132     parser.add_argument("filenames",metavar='F',nargs='+',help="filenames to dump")
133     options = parser.parse_args()
134
135     logger.setLevelFromOptVerbose(options.verbose)
136     for filename in options.filenames: 
137         handle_input(filename,options)
138
139 if __name__=="__main__":
140    main()