import repository from arizona
[raven.git] / apps / mprepo / passfile.py
1 #! /usr/bin/env python
2
3 """
4 <Program Name>
5    passfile.py
6
7 <Started>
8
9 <Author>
10
11 <Purpose>
12    A simple password file login method. It supports a password file that is
13    comprised of lines that are separated by spaces. For example,
14
15        user1 pass1 slice1 slice2 slice3
16        user2 pass2 slice2
17        ...
18        usern passn slice3
19 """
20
21 import crypt
22 import os
23 import repoconfig
24
25 ENCRYPT_INDICATOR = "encrypted-"
26
27 def encrypt(password):
28    return ENCRYPT_INDICATOR + crypt.crypt(password, "$1$stork$")
29
30 def login(username, password, passfilename):
31    if not os.path.exists(passfilename):
32       raise TypeError, "password file " + passfilename + " does not exist"
33
34    enc_password = encrypt(password)
35
36    # read the password file
37    f = open(passfilename)
38    lines = f.readlines()
39    f.close()
40
41    for line in lines:
42       if line.startswith(";") or line.startswith("#"):
43          continue
44
45       parts = line.split()
46       if len(parts) >= 2:
47          line_username = parts[0]
48          line_password = parts[1]
49
50          if (line_username == username):
51             if line_password.startswith(ENCRYPT_INDICATOR) and (line_password == enc_password):
52                # encrypted password matches
53                return
54             elif (not line_password.startswith(ENCRYPT_INDICATOR)) and (line_password == password):
55                # not-encrypted password matches
56                return
57             else:
58                raise ValueError, "incorrect password"
59
60    # we checked the whole file, and didn't find the username, so return an
61    # error
62    raise ValueError, "username not found"
63
64 def remove(username, passfilename):
65    # if a password file doesn't exist, then we have nothing to do
66    if not os.path.exists(passfilename):
67       return False
68
69    f = open(passfilename)
70    lines = f.readlines()
71    f.close()
72
73    found = False
74
75    # see if the username is already there. if so, then delete it
76    newlines = []
77    for line in lines:
78       if (not line.startswith(";")) and (not line.startswith("#")):
79          parts = line.split()
80          if len(parts) >= 2:
81             line_username = parts[0]
82             line_password = parts[1]
83
84             if line_username == username:
85                found = True
86                line = None
87
88       if line:
89          newlines.append(line)
90
91    # if a line was deleted, then write out the new password file
92    if found:
93       f = open(passfilename + ".tmp", "w")
94       f.writelines(newlines)
95       f.close()
96
97       os.rename(passfilename + ".tmp", passfilename)
98
99    return found
100
101 def add(username, password, slices, passfilename, encrypt_password=True):
102    if encrypt_password:
103       password = encrypt(password)
104
105    remove(username, passfilename)
106
107    f = open(passfilename, "a+")
108    if slices:
109       f.write(username + " " + password + " " + " ".join(slices) + "\n")
110    else:
111       f.write(username + " " + password + "\n")
112
113    f.close()
114
115
116
117
118
119
120
121
122 def get_slices(username, passfilename):
123    if not os.path.exists(passfilename):
124       raise TypeError, "password file " + passfilename + " does not exist"
125
126    # read the password file
127    f = open(passfilename)
128    lines = f.readlines()
129    f.close()
130
131    for line in lines:
132       if line.startswith(";") or line.startswith("#"):
133          continue
134
135       parts = line.split()
136       if len(parts) >= 2:
137          line_username = parts[0]
138          line_password = parts[1]
139          line_slices = parts[2:]
140
141          if (line_username == username):
142             return line_slices
143
144    # we checked the whole file, and didn't find the username, so return an
145    # error
146    raise ValueError, "username not found"
147