@@ -82,11 +82,15 @@ def __init__(self, pamh, config):
82
82
self .sslverify = cacerts
83
83
self .realm = config .get ("realm" )
84
84
self .debug = config .get ("debug" )
85
+ self .api_token = config .get ("api_token" )
85
86
self .sqlfile = config .get ("sqlfile" , "/etc/privacyidea/pam.sqlite" )
86
87
87
- def make_request (self , data , endpoint = "/validate/check" ):
88
+ def make_request (self , data , endpoint = "/validate/check" , token = None ):
88
89
# add a user-agent to be displayed in the Client Application Type
89
90
headers = {'user-agent' : 'PAM/2.15.0' }
91
+ if token :
92
+ headers ["Authorization" ] = token
93
+
90
94
response = requests .post (self .URL + endpoint , data = data ,
91
95
headers = headers , verify = self .sslverify )
92
96
@@ -97,6 +101,41 @@ def make_request(self, data, endpoint="/validate/check"):
97
101
98
102
return json_response
99
103
104
+ def enroll_user (self , user , pin ):
105
+ # Generate a new email Token with the provided pin
106
+ syslog .syslog (syslog .LOG_DEBUG ,
107
+ "%s: %s" % (__name__ , "Generating a new token" ))
108
+
109
+ data = {"user" : self .user ,
110
+ "genkey" : "1" ,
111
+ "pin" : pin ,
112
+ "type" : "email" ,
113
+ "dynamic_email" : 1 }
114
+
115
+ if self .realm :
116
+ data ["realm" ] = self .realm
117
+ json_response = self .make_request (data , endpoint = "/token/init" , token = self .api_token )
118
+
119
+ result = json_response .get ("result" )
120
+ detail = json_response .get ("detail" )
121
+
122
+ if self .debug :
123
+ syslog .syslog (syslog .LOG_DEBUG ,
124
+ "%s: result: %s" % (__name__ , result ))
125
+ syslog .syslog (syslog .LOG_DEBUG ,
126
+ "%s: detail: %s" % (__name__ , detail ))
127
+ if result .get ("status" ):
128
+ if result .get ("value" ):
129
+ message = self .pamh .Message (self .pamh .PAM_PROMPT_ECHO_OFF , "Please re-enter your PIN: " )
130
+ response = self .pamh .conversation (message )
131
+ self .pamh .authtok = response .resp
132
+ return self .authenticate (self .pamh .authtok )
133
+ else :
134
+ syslog .syslog (syslog .LOG_ERR ,
135
+ "%s: %s" % (__name__ ,
136
+ result .get ("error" ).get ("message" )))
137
+ return self .pamh .PAM_AUTH_ERR
138
+
100
139
def offline_refill (self , serial , password ):
101
140
102
141
# get refilltoken
@@ -196,16 +235,39 @@ def authenticate(self, password):
196
235
message ,
197
236
attributes )
198
237
else :
238
+ < << << << HEAD
199
239
syslog .syslog (syslog .LOG_ERR ,
200
240
"%s: %s" % (__name__ , message ))
201
241
pam_message = self .pamh .Message (self .pamh .PAM_ERROR_MSG , message )
202
242
self .pamh .conversation (pam_message )
203
243
rval = self .pamh .PAM_AUTH_ERR
244
+ == == == =
245
+ if message == 'The user has no tokens assigned' :
246
+ syslog .syslog (syslog .LOG_DEBUG ,
247
+ "%s: detail: %s" % (__name__ , len (password )))
248
+ if len (password )< 4 :
249
+ pam_message = self .pamh .Message (self .pamh .PAM_ERROR_MSG , "You must choose a 4-character minimum PIN." )
250
+ self .pamh .conversation (pam_message )
251
+ rval = self .pamh .PAM_AUTH_ERR
252
+ else :
253
+ return self .enroll_user (self .user , password )
254
+
255
+ else :
256
+ syslog .syslog (syslog .LOG_ERR ,
257
+ "%s: %s" % (__name__ , message ))
258
+ pam_message = self .pamh .Message (self .pamh .PAM_ERROR_MSG , message )
259
+ self .pamh .conversation (pam_message )
260
+ rval = self .pamh .PAM_AUTH_ERR
261
+ >> >> >> > patch_autoenroll
204
262
else :
205
263
error_msg = result .get ("error" ).get ("message" )
206
264
syslog .syslog (syslog .LOG_ERR ,
207
265
"%s: %s" % (__name__ , error_msg ))
266
+ < << << << HEAD
208
267
pam_message = self .pamh .Message (self .pamh .PAM_ERROR_MSG , error_msg )
268
+ == == == =
269
+ pam_message = self .pamh .Message (self .pamh .PAM_ERROR_MSG , str (error_msg ))
270
+ >> >> >> > patch_autoenroll
209
271
self .pamh .conversation (pam_message )
210
272
211
273
# Save history
@@ -609,6 +671,7 @@ def _create_table(c):
609
671
c .execute ("CREATE TABLE IF NOT EXISTS refilltokens (serial text, refilltoken text)" )
610
672
except sqlite3 .OperationalError :
611
673
pass
674
+ < << << << HEAD
612
675
613
676
try :
614
677
# create history table
@@ -619,3 +682,5 @@ def _create_table(c):
619
682
"ON history (user);" )
620
683
except sqlite3 .OperationalError :
621
684
pass
685
+ == == == =
686
+ >> >> >> > patch_autoenroll
0 commit comments