增加支持p12 证书导入

dependabot/npm_and_yarn/fir_admin/ws-5.2.3
youngS 4 years ago
parent b40f93a16c
commit a6f0cb0174
  1. 39
      fir_client/src/components/user/FirSuperSignBase.vue
  2. 13
      fir_ser/api/utils/app/iossignapi.py
  3. 7
      fir_ser/api/utils/app/supersignutils.py
  4. 7
      fir_ser/api/utils/apple/appleapiv3.py
  5. 21
      fir_ser/api/views/supersign.py

@ -65,13 +65,16 @@
</el-button>
<el-button v-if="isedit && editdeveloperinfo.is_actived" size="small" @click="syncdevices">同步设备信息
</el-button>
<el-button v-if="isedit && editdeveloperinfo.is_actived && !editdeveloperinfo.certid" size="small"
<el-tooltip content="发布证书只能创建两个,请谨慎操作">
<el-button v-if="isedit && editdeveloperinfo.is_actived && !editdeveloperinfo.certid"
size="small"
@click="isocertcert">手动创建发布证书
</el-button>
<el-tooltip content="发布证书只能创建两个,请谨慎操作">
</el-tooltip>
<el-tooltip content="清理发布证书,如果发布证书过期时间大于3天,将不会删除开发者发布证书,发布证书只能同时创建两个,请谨慎操作">
<el-button v-if="isedit && editdeveloperinfo.is_actived && editdeveloperinfo.certid"
size="small"
@click="isorenewcert">删除并创建新发布证书
@click="isorenewcert">删除发布证书
</el-button>
</el-tooltip>
<el-button v-if="isedit && editdeveloperinfo.is_actived" type="danger" size="small"
@ -485,7 +488,7 @@
},
methods: {
beforeAvatarUpload(file) {
const isLt2M = file.size / 1024 / 1024 < 1;
const isLt2M = file.size / 1024 / 1024 < 2;
if (file.type === 'application/x-pkcs12') {
if (isLt2M) {
this.import_cert_info.cert_content = file;
@ -495,7 +498,9 @@
developercert(data => {
if (data.code === 1000) {
this.$message.success("证书导入成功");
this.importcertDeveloperVisible = false
this.importcertDeveloperVisible = false;
this.dialogaddDeveloperVisible = false;
this.handleCurrentChange(this.pagination.currentPage)
} else {
this.$message.error("证书导入失败 " + data.msg)
}
@ -561,10 +566,22 @@
});
},
isocertcert() {
this.$confirm('此操作将要创建新的发布证书, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.iosdeveloperFun({
"methods": "PUT",
"data": {"issuer_id": this.editdeveloperinfo.issuer_id, "act": "ioscert"}
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消'
});
});
},
exportcert() {
// eslint-disable-next-line no-unused-vars
@ -572,10 +589,22 @@
}, {methods: 'FILE', data: {issuer_id: this.editdeveloperinfo.issuer_id}})
},
isorenewcert() {
this.$confirm('此操作将永久删除该发布证书, 建议先导出证书。是否继续删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.iosdeveloperFun({
"methods": "PUT",
"data": {"issuer_id": this.editdeveloperinfo.issuer_id, "act": "renewcert"}
});
}).catch(() => {
this.$message({
type: 'info',
message: '已取消'
});
});
},
activedeveloperFun(developer, act) {
this.iosdeveloperFun({"methods": "PUT", "data": {"issuer_id": developer.issuer_id, "act": act}});

@ -65,6 +65,9 @@ class ResignApp(object):
p12.set_privatekey(private_key)
with open(self.app_dev_p12, 'wb+') as f:
f.write(p12.export(password))
if password:
with open(self.app_dev_p12 + '.pwd', 'w') as f:
f.write(password)
return True, p12.get_friendlyname()
except Exception as e:
result["err_info"] = e
@ -191,8 +194,15 @@ class AppDeveloperApiV2(object):
result = {}
try:
apple_obj = AppStoreConnectApi(self.issuer_id, self.private_key_id, self.p8key)
cert_obj = apple_obj.get_certificate_by_cid(cert_id)
if cert_obj:
s_date = format_apple_date(cert_obj.expirationDate)
if s_date.timestamp() - datetime.datetime.now().timestamp() < 3600 * 24 * 3:
if apple_obj.revoke_certificate(cert_id):
logger.info("ios developer cert %s revoke result:%s" % cert_id)
logger.info("ios developer cert %s revoke" % cert_id)
return True, result
else:
logger.info("ios developer cert %s not revoke.because expire time < 3 day " % cert_id)
return True, result
except Exception as e:
logger.error("ios developer cert %s revoke Failed Exception:%s" % (cert_id, e))
@ -208,6 +218,7 @@ class AppDeveloperApiV2(object):
certificates = apple_obj.get_all_certificates()
for cert_obj in certificates:
f_date = format_apple_date(cert_obj.expirationDate)
logger.info("%s-%s - %s " % (cert_obj.id, not_after.timestamp(), f_date.timestamp()))
if not_after.timestamp() == f_date.timestamp():
return True, cert_obj
return False, result

@ -698,6 +698,8 @@ class IosUtils(object):
developer_obj.cert_expire_time = format_apple_date(cert_obj.expirationDate)
break
developer_obj.is_actived = True
else:
developer_obj.is_actived = False
developer_obj.save()
return status, result
@ -712,6 +714,8 @@ class IosUtils(object):
AppIOSDeveloperInfo.objects.filter(user_id=user_obj, issuer_id=auth.get("issuer_id")).update(
is_actived=True,
certid=cert_id, cert_expire_time=format_apple_date(result.expirationDate))
resign_app_obj = IosUtils.get_resign_obj(user_obj, developer_obj)
resign_app_obj.make_p12_from_cert(cert_id)
return status, result
@staticmethod
@ -719,7 +723,8 @@ class IosUtils(object):
auth = get_auth_form_developer(developer_obj)
app_api_obj = get_api_obj(auth)
status, result = app_api_obj.revoke_cert(developer_obj.certid)
if status:
if not status:
logger.warning('%s revoke cert failed,but i need clean cert_id %s' % (developer_obj.issuer_id, result))
AppIOSDeveloperInfo.objects.filter(user_id=user_obj, issuer_id=auth.get("issuer_id")).update(
is_actived=True,
certid=None, cert_expire_time=None)

@ -21,7 +21,10 @@ logger = logging.getLogger(__file__)
#
def request_format_log(req):
try:
logger.info("url:%s header:%s code:%s body:%s" % (req.url, req.headers, req.status_code, req.content))
except Exception as e:
logger.error(e)
return req
@ -743,6 +746,10 @@ class AppStoreConnectApi(DevicesAPI, BundleIDsAPI, BundleIDsCapabilityAPI, Profi
req = self.list_certificate()
return self.__certificates_store(req)
def get_certificate_by_cid(self, certificate_id):
req = self.list_certificate_by_certificate_id(certificate_id)
return self.__certificates_store(req)
def list_device_by_udid(self, udid):
device_obj_list = BaseInfoObj.filter(self.get_all_devices(), {"udid": udid})
if not device_obj_list:

@ -93,16 +93,17 @@ class DeveloperView(APIView):
IosUtils.clean_developer(developer_obj, request.user)
status, result = IosUtils.revoke_developer_cert(developer_obj, request.user)
if status:
status, result = IosUtils.create_developer_cert(developer_obj, request.user)
if status:
IosUtils.get_device_from_developer(developer_obj, request.user)
pass
# status, result = IosUtils.create_developer_cert(developer_obj, request.user)
# if status:
# IosUtils.get_device_from_developer(developer_obj, request.user)
# else:
# res.code = 1008
# res.msg = result.get("err_info")
# return Response(res.dict)
else:
res.code = 1008
res.msg = result.get("err_info")
return Response(res.dict)
else:
res.code = 1008
res.msg = result.get("err_info")
res.msg = result.get("err_info", '')
return Response(res.dict)
elif act == "syncdevice":
status, result = IosUtils.get_device_from_developer(developer_obj, request.user)
@ -185,6 +186,7 @@ class DeveloperView(APIView):
logger.error("user %s delete developer %s " % (
request.user, developer_obj))
IosUtils.clean_developer(developer_obj, request.user)
IosUtils.revoke_developer_cert(developer_obj, request.user)
developer_obj.delete()
return self.get(request)
@ -264,6 +266,8 @@ class SuperSignCertView(APIView):
issuer_id = request.query_params.get('issuer_id', None)
if issuer_id:
developer_obj = AppIOSDeveloperInfo.objects.filter(user_id=request.user, issuer_id=issuer_id).first()
# resign_app_obj = IosUtils.get_resign_obj(request.user, developer_obj)
# resign_app_obj.make_p12_from_cert(developer_obj.certid)
if developer_obj:
zip_file_path = IosUtils.zip_cert(request.user, developer_obj)
response = FileResponse(open(zip_file_path, 'rb'))
@ -286,6 +290,7 @@ class SuperSignCertView(APIView):
if not status:
res.code = 1002
res.msg = str(result['err_info'])
return Response(res.dict)
status, result = IosUtils.auto_get_certid_by_p12(developer_obj, request.user)
if not status:
res.code = 1003

Loading…
Cancel
Save