Esempio n. 1
0
def sslCertView(request):
    if request.method == "POST":
        try:
            keyobj = DomainAttr.getAttrObj(item="ssl_privatekey")
            certobj = DomainAttr.getAttrObj(item="ssl_certificate")
            privkey = keyobj.value
            if not privkey:
                messages.add_message(request, messages.ERROR,
                                     u'私钥不存在,请先生成或导入!')
                return HttpResponseRedirect(reverse("ssl_maintain"))
            fileobj = request.FILES['certfile']
            certificate = fileobj.read()
            T = sslopts.checkCert(bytes(privkey), bytes(certificate))
            if not T:
                messages.add_message(request, messages.ERROR,
                                     u'证书与私钥不匹配,无法导入!')
                return HttpResponseRedirect(reverse("ssl_maintain"))
            certobj.value = certificate
            certobj.save()
            messages.add_message(request, messages.SUCCESS, u'导入证书成功!')
            return HttpResponseRedirect(reverse("ssl_maintain"))
        except BaseException as e:
            messages.add_message(request, messages.ERROR, u'无法解析证书,请检测证书文件!')
            return HttpResponseRedirect(reverse("ssl_maintain"))
    raise Http404
Esempio n. 2
0
 def loadDomainAttr(self, item, itemType=""):
     if itemType:
         value = DomainAttr.getAttrObjValue(domain_id=self.domain_id,
                                            type=itemType,
                                            item=item)
     else:
         value = DomainAttr.getAttrObjValue(domain_id=self.domain_id,
                                            item=item)
     return value
Esempio n. 3
0
 def save(self):
     for k in (u"cf_sms_conf", ):
         obj = getattr(self, k)
         DomainAttr.saveAttrObjValue(domain_id=0,
                                     type="system",
                                     item=k,
                                     value=obj.value)
     clear_redis_cache()
     redis = get_redis_connection()
     redis.rpush("task_queue:apply_setting", "postfix")
Esempio n. 4
0
 def save(self):
     DomainAttr.saveAttrObjValue(domain_id=0,
                                 type="system",
                                 item="sw_custom_kkserver_sys_token",
                                 value=self.token.value)
     DomainAttr.saveAttrObjValue(domain_id=0,
                                 type="system",
                                 item="sw_custom_kkserver_sys_open",
                                 value=self.open.value)
     clear_redis_cache()
Esempio n. 5
0
    def __init__(self, domain, *args, **kwargs):
        super(MailboxForm, self).__init__(*args, **kwargs)

        self.fields['name'].widget = forms.TextInput(attrs={
            "placeholder": _(u"邮箱名称"),
        })
        self.domain = domain
        self.domain_str = domain.domain
        self.mailbox = None
        self.fields['domain'].required = False
        self.fields['domain_str'].required = False
        self.fields['username'].required = False
        self.fields['recvsms'].required = False
        self.fields['name'].widget.attrs.update({'addon': self.domain_str})
        self.fields['quota_mailbox'].widget.attrs.update({'addon': u'MB'})
        self.fields['quota_netdisk'].widget.attrs.update({'addon': u'MB'})
        self.fields['pwd_days'].widget.attrs.update({'addon': _(u'天')})

        mailbox_size = DomainAttr.getAttrObjValue(self.domain.id, 'system',
                                                  'cf_def_mailbox_size')
        netdisk_size = DomainAttr.getAttrObjValue(self.domain.id, 'system',
                                                  'cf_def_netdisk_size')
        limit_send = DomainAttr.getAttrObjValue(self.domain.id, 'system',
                                                'limit_send')
        limit_recv = DomainAttr.getAttrObjValue(self.domain.id, 'system',
                                                'limit_recv')
        if self.instance.pk:
            limit_send = self.instance.getSendLimit
            limit_recv = self.instance.getRecvLimit
        self.is_check_passwd = True

        if mailbox_size:
            self.fields['quota_mailbox'].initial = mailbox_size
        if netdisk_size:
            self.fields['quota_netdisk'].initial = netdisk_size
        if limit_send:
            self.fields['limit_send'].initial = limit_send
        if limit_recv:
            self.fields['limit_recv'].initial = limit_recv

        self.raw_password = ""
        self.fields['use_group'].required = False
        self.fields['limit_send'].required = False
        self.fields['limit_recv'].required = False
        if self.instance.pk:
            self.raw_password = kwargs["instance"].password
            self.fields['password1'].required = False
            self.fields['password2'].required = False
            s = self.instance.size
            size = s.size if s else 0
            self.fields['quota_mailbox'].widget.attrs.update(
                {'addon': _(u'MB(已使用{}MB)').format(size)})
            self.fields['name'].widget.attrs.update({'readonly': 'readonly'})
Esempio n. 6
0
 def loadDomainAttr(self, item, itemType=""):
     key = "tmp_{}".format(item)
     if hasattr(self, key):
         return getattr(self, key)
     if itemType:
         value = DomainAttr.getAttrObjValue(domain_id=self.domain_id,
                                            type=itemType,
                                            item=item)
     else:
         value = DomainAttr.getAttrObjValue(domain_id=self.domain_id,
                                            item=item)
     setattr(self, key, value)
     return value
Esempio n. 7
0
 def save(self):
     value = {
         "server": self.server.value,
         "corp": self.corp.value,
         "service": self.service.value,
         "loginurl": self.loginurl.value,
         "open": self.open.value,
     }
     value = json.dumps(value)
     DomainAttr.saveAttrObjValue(domain_id=0,
                                 type="system",
                                 item="sw_custom_kkserver_setting",
                                 value=value)
     clear_redis_cache()
Esempio n. 8
0
 def save(self):
     value = {
         "server": self.server.value,
         "username": self.username.value,
         "password": self.password.value,
         "loginurl": self.loginurl.value,
         "open": self.open.value,
     }
     value = json.dumps(value)
     DomainAttr.saveAttrObjValue(domain_id=0,
                                 type="system",
                                 item="sw_custom_kkserver_setting2",
                                 value=value)
     clear_redis_cache()
Esempio n. 9
0
    def save(self):
        value = self.value.value
        if "open_spf" in value:
            flag = value.pop("open_spf")
            value["spf"] = "1" if flag == "1" else "-1"

        if self.instance:
            obj = self.instance
            obj.domain_id = self.domain_id
            obj.type = self.instance.type
            obj.item = self.instance.item
            obj.value = json.dumps(value)
            obj.save()
        else:
            obj = DomainAttr.objects.create(
                domain_id=self.domain_id,
                type="system",
                item="cf_antispam",
                value=json.dumps(value),
            )
        #sw_antivirus , sw_antispam 两个参数,webmail以前是修改的core_domain表的列,兼容处理
        if self.instance_domain:
            for key in ("sw_antispam", "sw_antivirus"):
                obj = getattr(self, key, None)
                if not obj:
                    continue
                if key == "sw_antispam":
                    self.instance_domain.antispam = obj.value
                else:
                    self.instance_domain.antivirus = obj.value
                self.instance_domain.save()

        for k in [
                "spam_check_local",
                "spam_check_outside",
                "spam_check_local_spam",
                "spam_check_local_virus",
                "spam_check_outside_spam",
                "spam_check_outside_virus",
        ]:
            value = getattr(self, k).value
            DomainAttr.saveAttrObjValue(domain_id=self.domain_id,
                                        type="webmail",
                                        item="sw_%s" % k,
                                        value=value)
        clear_redis_cache()
        if self.spf_old != self.spf_new:
            redis = get_redis_connection()
            redis.rpush("task_queue:apply_setting", "postfix")
Esempio n. 10
0
 def _get_domain_mailbox_limit(self, domain_id):
     return {
         'mailbox_count_limit':
         toint(
             DomainAttr.getAttrObjValue(domain_id, 'system',
                                        'cf_limit_mailbox_cnt')),
         'mailbox_size_limit':
         toint(
             DomainAttr.getAttrObjValue(domain_id, 'system',
                                        'cf_limit_mailbox_size')),
         'netdisk_size_limit':
         toint(
             DomainAttr.getAttrObjValue(domain_id, 'system',
                                        'cf_limit_netdisk_size')),
     }
Esempio n. 11
0
 def save(self):
     instance = DomainAttr.getAttrObj(domain_id=0,
                                      type="system",
                                      item=u'cf_moving_default')
     instance.value = json.dumps(self.value)
     instance.save()
     return instance
Esempio n. 12
0
def smtp(request):
    form = SmtpSetForm(initial=DomainAttr.smtpSetValuetoDict())

    if request.method == "POST":
        form = SmtpSetForm(request.POST)
        if form.is_valid():
            form.save()
            messages.add_message(request, messages.SUCCESS, u'修改设置成功!')
            return redirect('smtp_set')
    return render(request,
                  template_name="setting/smtp.html",
                  context={
                      "form": form,
                  })
Esempio n. 13
0
def cfilter_config(request):
    obj = DomainAttr.getAttrObj(domain_id=0,
                                type="system",
                                item='sw_use_cfilter_new')
    form = ExtCfilterConfigForm(instance=obj)
    if request.method == "POST":
        form = ExtCfilterConfigForm(post=request.POST)
        if form.is_valid():
            form.save()
            messages.add_message(request, messages.SUCCESS, u'修改开关成功')
            return HttpResponseRedirect(reverse("cfilter_config"))
    return render(request,
                  "setting/cfilter_config.html",
                  context={
                      "form": form,
                  })
Esempio n. 14
0
def sslPrivateView(request):
    if request.method == "POST":
        status = request.POST.get("sslkey_status", "")
        obj = DomainAttr.getAttrObj(item="ssl_privatekey")
        value = obj.value
        if status == "import":
            keywd = request.POST.get("sslkey_passwd_import", "").strip()
            keywd = keywd or None
            if value:
                messages.add_message(request, messages.ERROR, u'私钥已存在,设置私钥失败!')
                return HttpResponseRedirect(reverse("ssl_maintain"))
            else:
                try:
                    fileobj = request.FILES['sslkeyfile']
                    privkey = fileobj.read()
                    privkey = sslopts.importPrivKey(privkey, passwd=keywd)
                    obj.value = privkey
                    obj.save()
                    messages.add_message(request, messages.SUCCESS, u'导入私钥成功')
                    return HttpResponseRedirect(reverse("ssl_maintain"))
                except BaseException as e:
                    messages.add_message(request, messages.ERROR,
                                         u'导入私钥失败(保护密码错误、非密钥文件等), 请重新导入!')
                    return HttpResponseRedirect(reverse("ssl_maintain"))
        if status == "export":
            keywd = request.POST.get("sslkey_passwd_export", "").strip()
            keywd = keywd or None
            if value:
                try:
                    privkey = sslopts.exportPrivKey(bytes(value), passwd=keywd)
                    wrapper = FileWrapper(StringIO.StringIO(privkey))
                    response = HttpResponse(
                        wrapper, content_type='application/octet-stream')
                    response['Content-Length'] = sslopts.getPrivateKeySize(
                        bytes(value))
                    response[
                        'Content-Disposition'] = 'attachment; filename=%s' % "ssl_private.key"
                    return response
                except BaseException as e:
                    messages.add_message(request, messages.ERROR,
                                         u'私钥不正确,请重新生成私钥导出!')
                    return HttpResponseRedirect(reverse("ssl_maintain"))
            else:
                messages.add_message(request, messages.ERROR, u'私钥不存在,导出失败!')
                return HttpResponseRedirect(reverse("ssl_maintain"))
        return HttpResponseRedirect(reverse("ssl_maintain"))
    raise Http404
Esempio n. 15
0
def mailTransferSender(request):
    obj = DomainAttr.getAttrObj(domain_id=0,
                                type="system",
                                item='deliver_transfer_sender')
    form = MailTransferSenderForm(instance=obj)
    if request.method == "POST":
        form = MailTransferSenderForm(post=request.POST)
        if form.is_valid():
            form.save()
            messages.add_message(request, messages.SUCCESS, u'添加数据成功')
            return HttpResponseRedirect(reverse('mail_transfer_sender'))

    return render(request,
                  "setting/mail_transfer_sender.html",
                  context={
                      "form": form,
                  })
Esempio n. 16
0
    def __initialize(self):
        self.spf_old = ""
        self.spf_new = ""
        default = constants.SPAMSET_PARAM_DEFAULT
        if self.instance:
            self.domain_id = self.instance.domain_id
            value = json.loads(self.instance.value)
            if "spf" in value:
                self.spf_old = value["spf"]
            elif "open_spf" in value:
                self.spf_old = value["open_spf"]
        else:
            value = copy.copy(default)
        data = self.post if self.post else self.get
        if data:
            for k in constants.SPAMSET_PARAM_DEFAULT.keys():
                if k in data:
                    value[k] = data[k]
                elif k in value:
                    del value[k]
            self.domain_id = data.get("domain_id", 0)
        for k, v in constants.SPAMSET_PARAM_DEFAULT.items():
            if not k in value:
                value[k] = v
        if not value.get("host", "").strip() and self.request:
            value["host"] = get_client_request(self.request)

        #删除一个废弃的key
        if "open_spf" in value:
            flag = value.pop("open_spf")
            value["spf"] = "1" if flag == "1" else "-1"
        if "spf" in value:
            self.spf_new = value["spf"]
        #检测等级在 app 2.2.54 后废弃
        if "check_level" in value:
            level = value.pop("check_level")
            #兼容一下旧数据
            if level == "senior":
                value["spf"] = "1"
                value["sender_blacklist"] = "1"
                value["subject_blacklist"] = "1"
                value["content_blacklist"] = "1"
                value["high_risk_attachment"] = "1"
                value["low_risk_attachment"] = "1"
                value["dspam"] = "1"
                value["ctasd"] = "-1"
                value["spamassassin"] = "1"
            elif level == "intermediate":
                value["sender_blacklist"] = "1"
                value["subject_blacklist"] = "1"
                value["content_blacklist"] = "1"
                value["high_risk_attachment"] = "1"
                value["low_risk_attachment"] = "1"
                value["dspam"] = "1"
                value["ctasd"] = "-1"
                value["spamassassin"] = "1"
            else:
                value["dspam"] = "1"
                value["spamassassin"] = "1"
                value["sender_blacklist"] = "1"
                value["subject_blacklist"] = "1"
                value["content_blacklist"] = "1"
                value["low_risk_attachment"] = "1"
        for k, v in value.iteritems():
            self[k] = BaseFied(value=get_unicode(v), error=None)
        self.value = BaseFied(value=value, error=None)

        #sw_antispam、sw_antivirus的值保存在core_domain表中
        instance = Domain.objects.filter(id=self.domain_id).first()
        self.instance_domain = instance
        if instance:
            self.sw_antispam = BaseFied(value=get_unicode(instance.antispam),
                                        error=None)
            self.sw_antivirus = BaseFied(value=get_unicode(instance.antivirus),
                                         error=None)
        else:
            self.sw_antispam = BaseFied(value='-1', error=None)
            self.sw_antivirus = BaseFied(value='-1', error=None)
        if data:
            self.sw_antispam = BaseFied(value=data.get("sw_antispam", '-1'),
                                        error=None)
            self.sw_antivirus = BaseFied(value=data.get("sw_antivirus", '-1'),
                                         error=None)

        SPAM_TARGET_DEFAULT = {
            "spam_check_local": "-1",
            "spam_check_outside": "1",
            "spam_check_local_spam": "1",
            "spam_check_local_virus": "1",
            "spam_check_outside_spam": "1",
            "spam_check_outside_virus": "1",
        }
        for k, default in SPAM_TARGET_DEFAULT.items():
            key = item = "sw_%s" % k
            obj = DomainAttr.objects.filter(domain_id=self.domain_id,
                                            type="webmail",
                                            item=key).first()
            if not obj:
                DomainAttr.saveAttrObjValue(domain_id=self.domain_id,
                                            type="webmail",
                                            item=key,
                                            value=default)
                obj = DomainAttr.getAttrObj(domain_id=self.domain_id,
                                            type="webmail",
                                            item=key)
            setattr(self, k, BaseFied(value=obj.value, error=None))
            if data:
                if k in data:
                    setattr(self, k, BaseFied(value=data[k], error=None))
                else:
                    setattr(self, k, BaseFied(value="-1", error=None))
Esempio n. 17
0
def sslView(request):
    # ssl开关
    sslobj = CoreConfig.getFuctionObj('ssl')
    # 私钥数据
    keyobj = DomainAttr.getAttrObj(item="ssl_privatekey")
    value = keyobj.value or None
    # 签名请求数据
    sigobj = DomainAttr.getAttrObj(item="ssl_signrequest")
    # 证书
    certobj = DomainAttr.getAttrObj(item="ssl_certificate")
    if request.method == "POST":
        status = request.POST.get("status", "")
        if status == "generate":
            # 系统生成私钥
            if value:
                messages.add_message(request, messages.ERROR, u'私钥已存在,设置私钥失败!')
                return HttpResponseRedirect(reverse("ssl_maintain"))
            else:
                try:
                    privkey = sslopts.genPrivKey()
                    keyobj.value = privkey
                    keyobj.save()
                    messages.add_message(request, messages.SUCCESS, u'生成私钥成功')
                    return HttpResponseRedirect(reverse("ssl_maintain"))
                except:
                    messages.add_message(request, messages.ERROR,
                                         u'生成私钥失败,请重新生成')
                    return HttpResponseRedirect(reverse("ssl_maintain"))

        if status == "clear":
            # 清除私钥
            keyobj.value = ""
            keyobj.save()
            # 清空证书签名请求
            DomainAttr.emptyAttrObjValue(item="ssl_signrequest")
            # 清除证书
            DomainAttr.emptyAttrObjValue(item="ssl_certificate")
            messages.add_message(request, messages.SUCCESS, u'清除私钥成功')
            return HttpResponseRedirect(reverse("ssl_maintain"))

        if status == "export-signature":
            # 导出签名请求
            sigvalue = sigobj.value or None
            if not sigvalue:
                messages.add_message(request, messages.ERROR, u'签名请求 不存在')
                return HttpResponseRedirect(reverse("ssl_maintain"))
            else:
                try:
                    wrapper = FileWrapper(StringIO.StringIO(sigvalue))
                    response = HttpResponse(
                        wrapper, content_type='application/octet-stream')
                    response['Content-Length'] = len(value)
                    response[
                        'Content-Disposition'] = 'attachment; filename=%s' % "ssl_signrequest.csr"
                    return response
                except:
                    messages.add_message(request, messages.ERROR,
                                         u'导出签名请求失败,请重新导出')
                    return HttpResponseRedirect(reverse("ssl_maintain"))

        if status == "clear-signature":
            # 清除签名请求
            DomainAttr.emptyAttrObjValue(item="ssl_signrequest")
            messages.add_message(request, messages.SUCCESS, u'清除签名请求成功')
            return HttpResponseRedirect(reverse("ssl_maintain"))

        if status == "cert-export":
            # 导出证书
            certvalue = certobj.value or None
            if not certvalue:
                messages.add_message(request, messages.ERROR, u'证书 不存在')
                return HttpResponseRedirect(reverse("ssl_maintain"))
            else:
                try:
                    wrapper = FileWrapper(StringIO.StringIO(certvalue))
                    response = HttpResponse(
                        wrapper, content_type='application/octet-stream')
                    response['Content-Length'] = len(value)
                    response[
                        'Content-Disposition'] = 'attachment; filename=%s' % "ssl_certificate.crt"
                    return response
                except:
                    messages.add_message(request, messages.ERROR,
                                         u'导出证书失败,请重新导出')
                    return HttpResponseRedirect(reverse("ssl_maintain"))

        if status == "cert-clear":
            # 清除证书
            DomainAttr.emptyAttrObjValue(item="ssl_certificate")
            messages.add_message(request, messages.SUCCESS, u'清除证书成功成功')
            return HttpResponseRedirect(reverse("ssl_maintain"))

    is_verify = False
    signature = DomainAttr.getSignatureCache()
    if sigobj.value:
        is_verify, signature2 = sslopts.parseSignature(sigobj.value)
        if is_verify: signature = signature2

    is_ca = False
    cert_subject, sert_issuer = None, None
    if certobj.value:
        is_ca = True
        cert_subject, sert_issuer = sslopts.parseCert(certobj.value)

    return render(
        request,
        "maintain/ssl.html",
        context={
            "sslobj": sslobj,
            "keyValue":
            sslopts.getPrivateKeySize(bytes(value)) if value else None,
            "is_verify": is_verify,
            "signature": signature,
            "is_ca": is_ca,
            "cert_subject": cert_subject,
            "sert_issuer": sert_issuer,
        })
Esempio n. 18
0
            shutil.copy(licence_file, '{}.{}'.format(licence_file, now))
            open(licence_file, 'w').write(licence_data)
            messages.add_message(request, messages.SUCCESS, u'授权文件更新成功')
        return HttpResponseRedirect(reverse('system_licence'))

    try:
        lic = Licence(licence_file=licence_file)
        info = lic.get_licence_info()
    except:
        info = {}
        messages.add_message(request, messages.ERROR, u'授权文件格式错误,请重新导入')
    # 测试用户信息处理
    if info.get('evaluation', ''):
        # 生成试用期信息
        system_created = DomainAttr.getAttrObjValue(1, 'system', 'created')
        trial_begin = datetime.datetime.strptime(system_created,
                                                 '%Y-%m-%d %H:%M:%S')
        trial_end = trial_begin + datetime.timedelta(days=30)
        extra_module = ['all']
    else:
        # 正式用户信息处理
        trial_begin = ''
        trial_end = ''

        # 扩展模块信息
        try:
            extra_module = lic.get_available_module()
        except:
            extra_module = ''
Esempio n. 19
0
def sslSignatureView(request):
    if request.method == "POST":
        obj = DomainAttr.getAttrObj(item="ssl_signrequest")
        keyobj = DomainAttr.getAttrObj(item="ssl_privatekey")
        keyvalue = keyobj.value
        if obj.value:
            messages.add_message(request, messages.ERROR,
                                 u'证书签名请求已存在,生成证书签名请求失败!')
            return HttpResponseRedirect(reverse("ssl_maintain"))
        else:
            sig_domain = request.POST.get("sig_domain", "").strip()
            sig_organization = request.POST.get("sig_organization", "").strip()
            sig_depart = request.POST.get("sig_depart", "").strip()
            sig_province = request.POST.get("sig_province", "").strip()
            sig_locale = request.POST.get("sig_locale", "").strip()
            j = {}
            msg = []
            if not validators.check_domain(u"@{}".format(sig_domain)):
                msg.append(u"域名 填写错误")
            j.update(sig_domain=sig_domain)

            if not sig_organization:
                msg.append(u"单位/组织 不能为空")
            elif not validators.check_English(sig_organization):
                msg.append(u"单位/组织 只能填写英文字符")
            j.update(sig_organization=sig_organization)

            if sig_depart and not validators.check_English(sig_depart):
                msg.append(u"部门 只能填写英文字符")
            j.update(sig_depart=sig_depart)

            if not sig_province:
                msg.append(u"省/市/自治区 不能为空")
            elif not validators.check_English(sig_province):
                msg.append(u"省/市/自治区 只能填写英文字符")
            j.update(sig_province=sig_province)

            if not sig_locale:
                msg.append(u"所在地 不能为空")
            elif not validators.check_English(sig_locale):
                msg.append(u"所在地 只能填写英文字符")
            j.update(sig_locale=sig_locale)

            DomainAttr.saveAttrObjValue(item="ssl_signrequest_cache",
                                        value=json.dumps(j))
            if not keyvalue:
                messages.add_message(request, messages.ERROR, u'私钥不存在,请先设置私钥!')
                return HttpResponseRedirect(reverse("ssl_maintain"))
            if msg:
                messages.add_message(request, messages.ERROR, u",".join(msg))
                return HttpResponseRedirect(reverse("ssl_maintain"))
            else:
                signature = sslopts.genSignature(
                    privkey=bytes(keyvalue),
                    sig_domain=sig_domain,
                    sig_depart=sig_depart,
                    sig_organization=sig_organization,
                    sig_province=sig_province,
                    sig_locale=sig_locale)
                obj.value = signature
                obj.save()
                messages.add_message(request, messages.SUCCESS, u'生成证书签名请求成功')
                return HttpResponseRedirect(reverse("ssl_maintain"))

        return HttpResponseRedirect(reverse("ssl_maintain"))
    raise Http404
Esempio n. 20
0
        info = lic.get_licence_info()
    except Exception,err:
        print "licence error:  ",err
        lines = []
        import traceback
        for line in traceback.format_exc().strip().split('\n') : lines.append('  > ' + line)
        err_msg = '\n'.join(lines)
        print "err_msg:   ",err_msg
        return False

    now = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    #试用期用户
    try:
        if info['evaluation']:
            from app.core.models import DomainAttr
            value = DomainAttr.getAttrObjValue(domain_id=1,type='system',item='created')
            if not value:
                print "domain_attr has no created flag!!!"
                return False
            start = time.mktime(time.strptime(value,'%Y-%m-%d %H:%M:%S'))
            end = int(start) + 30*24*3600
            end = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(end))
            info["expires_time"] = datetime.datetime.strptime(end,'%Y-%m-%d %H:%M:%S')
            #print "evaluation version start: %s end: %s"%(value, end)
    except Exception,err:
        print "licence trans time error:  ",err
        return False

    #print info
    if info.get("expires_time","") and info["expires_time"].strftime('%Y%m%d%H%M%S')<=now:
        print "invalid licence expires_time:  ",info