test; please ignore
[sfa.git] / cmdline / sfi.py
index e121444..ea2f01b 100755 (executable)
@@ -183,6 +183,42 @@ def get_slice_cred(name):
          print "Failed to get slice credential"
          sys.exit(-1)
 
+def delegate_cred(cred, hrn, type = 'authority'):
+    # the gid and hrn of the object we are delegating
+    object_gid = cred.get_gid_object()
+    object_hrn = object_gid.get_hrn()
+    cred.set_delegate(True)
+    if not cred.get_delegate():
+        raise Exception, "Error: Object credential %(object_hrn)s does not have delegate bit set" % locals()
+       
+
+    records = registry.resolve(cred, hrn)
+    records = filter_records(type, records)
+    
+    if not records:
+        raise Exception, "Error: Didn't find a %(type)s record for %(hrn)s" % locals()
+
+    # the gid of the user who will be delegated too
+    delegee_gid = records[0].get_gid_object()
+    delegee_hrn = delegee_gid.get_hrn()
+    
+    # the key and hrn of the user who will be delegating
+    user_key = Keypair(filename = get_key_file())
+    user_hrn = cred.get_gid_caller().get_hrn()
+
+    dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
+    dcred.set_gid_caller(delegee_gid)
+    dcred.set_gid_object(object_gid)
+    dcred.set_privileges(cred.get_privileges())
+    dcred.set_delegate(True)
+    dcred.set_pubkey(object_gid.get_pubkey())
+    dcred.set_issuer(user_key, user_hrn)
+    dcred.set_parent(cred)
+    dcred.encode()
+    dcred.sign()
+
+    return dcred
+
 def get_rspec_file(rspec):
    if (os.path.isabs(rspec)):
       file = rspec
@@ -219,7 +255,6 @@ def load_publickey_string(fn):
        os.remove(outfn)
 
    return key_string
-
 #
 # Generate sub-command parser
 #
@@ -390,7 +425,7 @@ def delegate(opts, args):
    records = filter_records("user", records)
 
    if not records:
-       print "Error: Didn't find a user record for", delegee_name
+       print "Error: Didn't find a user record for", args[0]
        return
 
    # the gid of the user who will be delegated too
@@ -462,17 +497,21 @@ def update(opts, args):
        if record.get_name() == user_cred.get_gid_object().get_hrn():
           cred = user_cred
        else:
-          create = get_auth_cred()
+          cred = get_auth_cred()
    elif record.get_type() in ["slice"]:
        try:
            cred = get_slice_cred(record.get_name())
        except ServerException, e:
-           if "PermissionError" in e.args[0]:
+           # XXX smbaker -- once we have better error return codes, update this
+           # to do something better than a string compare
+           if "Permission error" in e.args[0]:
                cred = get_auth_cred()
            else:
                raise
-   elif record.get_type() in ["sa", "ma", "node"]:
+   elif record.get_type() in ["authority"]:
        cred = get_auth_cred()
+   elif record.get_type() == 'node':
+        cred = get_auth_cred()
    else:
        raise "unknown record type" + record.get_type()
    return registry.update(cred, record)
@@ -519,7 +558,7 @@ def resources(opts, args):
    format = opts.format      
    display_rspec(result, format)
    if (opts.file is not None):
-      save_rspec_to_file(opts.file, result)
+      save_rspec_to_file(result, opts.file)
    return
 
 # created named slice with given rspec