需要将dictionary.rfc2865放在运行的同级目录下
#_*_coding:utf-8_*_
from tkinter import *
from tkinter.ttk import *
from tkinter import scrolledtext
from tkinter import messagebox
import time
import os
import re
import socket
import threading
from os import environ
from os.path import join, exists
#from ico import img
#import base64
from pyrad import packet
import pyrad.dictionary
import pyrad.host
import random
import string
CHALLENGE_LEN = 6
CHALLENGE_TYPE = 6
CHALLENGE = "BAdPassw0d"
FilterId = ""
class RadiusServer(pyrad.host.Host):
def __init__(self):
dict = pyrad.dictionary.Dictionary("dictionary.rfc2865") #从freeradius中搞一个通用的字典使用
pyrad.host.Host.__init__(self, dict=dict)
def get_challenge(self):
if CHALLENGE_TYPE == 1:
return (''.join(random.choice(string.ascii_letters) for _ in range(CHALLENGE_LEN))).upper()
if CHALLENGE_TYPE == 2:
return (''.join(random.choice(string.ascii_letters) for _ in range(CHALLENGE_LEN))).lower()
if CHALLENGE_TYPE == 4:
return ''.join(random.choice(string.ascii_letters) for _ in range(CHALLENGE_LEN))
if CHALLENGE_TYPE == 6:
return ''.join(random.choice(string.digits) for _ in range(CHALLENGE_LEN))
if CHALLENGE_TYPE == 8:
return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(CHALLENGE_LEN))
def check_pap_pass(self, radpkt):
global CHALLENGE
if radpkt.PwCrypt(CHALLENGE) == radpkt["User-Password"][0]:
radpkt.code = packet.AccessAccept
if(len(FilterId)>0):
radpkt['Filter-Id'] = FilterId
radpkt['Class'] = FilterId #安盟使用的安全组信息
return("用户名:%-16s 状态:挑战码认证通过" % radpkt["User-Name"][0])
elif radpkt.PwCrypt("Authpasswd") == radpkt["User-Password"][0]:
radpkt.code = packet.AccessChallenge
CHALLENGE = self.get_challenge()
radpkt['Reply-Message'] = "Enter Token Code"
radpkt['State'] = ("CHALLENGE=%s" % CHALLENGE).encode()
return("用户名:%-16s 状态:待挑战认证 挑战码:%s" % (radpkt["User-Name"][0],CHALLENGE))
elif radpkt.PwCrypt("password") == radpkt["User-Password"][0]:
radpkt.code = packet.AccessAccept
if(len(FilterId)>0):
radpkt['Filter-Id'] = FilterId
return("用户名:%-16s 状态:认证通过" % radpkt["User-Name"][0])
# elif radpkt.PwCrypt(PIN+"password") == radpkt["User-Password"][0]:
# radpkt.code = packet.AccessAccept
# return("用户名:%-16s 状态:PIN认证通过" % radpkt["User-Name"][0])
else:
radpkt.code = packet.AccessReject
return("用户名:%-16s 状态:认证失败" % radpkt["User-Name"][0])
def get_pkt(self, pkt):
get_pw = None
get_name = None
radpkt = self.CreateAuthPacket(packet=pkt) #解析请求报文
radpkt.secret = b"sharepasswd"
#radpkt.secret = bytes(secret, encoding = "utf8")
for key in radpkt.keys():
print(key, radpkt[key])
print("="*60)
info = ""
radpkt.code = packet.AccessAccept
if "User-Password" in radpkt.keys():
info = self.check_pap_pass(radpkt)
else:
info = "用户名:%-16s 状态:CHAP通过 IP:%s" % (radpkt['User-Name'][0],radpkt['NAS-IP-Add