Exemple #1
0
def main():
    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
    dct = {
        "aligned": 0,
        "sigflags": 3,
        "sigflagsft": 132,
        "sigpage": 0,
        "sigbutton": True,
        "sigfield": "Signature1",
        "sigandcertify": True,
        "signaturebox": (470, 840, 570, 640),
        "signature": "Dokument podpisany cyfrowo ąćęłńóśżź",
        #        "signature_img": "signature_test.png",
        "contact": "*****@*****.**",
        "location": "Szczecin",
        "signingdate": date,
        "reason": "Dokument podpisany cyfrowo aą cć eę lł nń oó sś zż zź",
        "password": "******",
    }
    with open("demo2_user1.p12", "rb") as fp:
        p12 = pkcs12.load_key_and_certificates(fp.read(), b"1234",
                                               backends.default_backend())
    fname = "pdf.pdf"
    if len(sys.argv) > 1:
        fname = sys.argv[1]
    datau = open(fname, "rb").read()
    datas = cms.sign(datau, dct, p12[0], p12[1], p12[2], "sha256")
    fname = fname.replace(".pdf", "-signed-cms.pdf")
    with open(fname, "wb") as fp:
        fp.write(datau)
        fp.write(datas)
Exemple #2
0
def main():
    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
    dct = {
        "sigflags": 3,
        'signature_img': 'sign.png',
        "sigbutton": True,
        "signaturebox": (470, 0, 570, 100),
        # "signature": "This Document is digitally signed.",
        #        "signature_img": "signature_test.png",
        "contact": "*****@*****.**",
        "location": "India",
        "signingdate": date,
        "reason": "This Document is digitally signed.",
        "password": "******",

        # b'sigpage': 0,
    }
    with open("Key.p12", "rb") as fp:
        p12 = pkcs12.load_key_and_certificates(fp.read(), b"Sky@76445",
                                               backends.default_backend())
    fname = "combine.pdf"
    if len(sys.argv) > 1:
        fname = sys.argv[1]
    datau = open(fname, "rb").read()
    datas = cms.sign(datau, dct, p12[0], p12[1], p12[2], "sha256")
    fname = 'combineupload.pdf'
    with open(fname, "wb") as fp:
        fp.write(datau)
        fp.write(datas)
Exemple #3
0
def sign_pdf(original_pdf: bytes):
    """
    Takes raw bytes of a PDF file and adds a new page with a digital signature.
    Relies on a p12 file specified in CERTIFICATE_PATH & CERTIFICATE_PASSWORD.
    Also uses SIGNING_EMAIL, SIGNING_LOCATION & SIGNING_REASON as key data in the signing process.
    """
    if DOCUMENT_SIGNING_ENABLED:
        from endesive.pdf.cms import sign  # noqa

        date = timezone.localtime()
        # Specify signing metadata
        signing_metadata = {
            "sigandcertify": True,
            "signaturebox": SIGNATURE_POSITIONING,
            "signature_img": _get_signature_image(_get_signature_text(date)),
            "contact": SIGNING_EMAIL,
            "location": SIGNING_LOCATION,
            "signingdate": date.strftime("D:%Y%m%d%H%M%S+00'00'"),
            "reason": SIGNING_REASON,
        }

        # Load key & certificate
        key, cert, othercerts = _load_certificate_and_key()

        # Add a blank page to the end
        pdf, num_pages = _add_blank_page(original_pdf)

        # Add the signature to the last page
        signing_metadata["sigpage"] = num_pages - 1
        signature = sign(pdf, signing_metadata, key, cert, othercerts,
                         "sha256")

        return pdf + signature

    return original_pdf
def main():
    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
    dct = {
        "aligned": 0,
        "sigflags": 3,
        "sigflagsft": 132,
        "sigpage": 0,
        "auto_sigfield": True,
        #"sigandcertify": False,
        "signaturebox": (72, 396, 360, 468),
        "signform": False,
        "sigfield": "Signature",

        # Text will be in the default font
        # Fields in the list display will be included in the text listing
        # Icon and background can both be set to images by having their
        #   value be a path to a file or a PIL Image object
        # If background is a list it is considered to be an opaque RGB colour
        # Outline is the colour used to draw both the border and the text
        "signature_appearance": {
            'background': [0.75, 0.8, 0.95],
            'icon': '../signature_test.png',
            'outline': [0.2, 0.3, 0.5],
            'border': 2,
            'labels': True,
            'display': 'CN,DN,date,contact,reason,location'.split(','),
        },
        "contact": "*****@*****.**",
        "location": "Szczecin",
        "signingdate": date,
        "reason": "Dokument podpisany cyfrowo aą cć eę lł nń oó sś zż zź",
        "password": "******",
    }
    with open("../demo2_user1.p12", "rb") as fp:
        p12 = pkcs12.load_key_and_certificates(fp.read(), b"1234",
                                               backends.default_backend())
    fname = "../pdf_forms/blank_form.pdf"
    if len(sys.argv) > 1:
        fname = sys.argv[1]
    datau = open(fname, "rb").read()
    datas = cms.sign(datau, dct, p12[0], p12[1], p12[2], "sha256")
    fname = fname.replace(".pdf", "-signature_appearance.pdf")
    with open(fname, "wb") as fp:
        fp.write(datau)
        fp.write(datas)
Exemple #5
0
def main():

    keyfile = sys.argv[1]
    password = sys.argv[2]
    pdffile = sys.argv[3]

    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
    dct = {
        "aligned": 0,
        "sigflags": 3,
        "sigflagsft": 132,
        "sigpage": -1,
        "sigbutton": True,
        "sigfield": "Signature1",
        "sigandcertify": True,
        "signaturebox": (80, 140, 530, 340),
        # The library removes the signature text if the signature_img is specified
        "signature": "No ets capaç",
        #"signature_img": "logo-somenergia-stamp.png",
        "contact": "*****@*****.**",
        "location": "Càdiz".encode('utf8'),
        "signingdate": date,
        "reason": "Caña".encode('utf8'),
        #        "password": "******", # required when the pdf is encrypted
    }
    (
        privkey,
        cert,
        extracerts,
    ) = pkcs12.load_key_and_certificates(
        Path(keyfile).read_bytes(),
        password.encode('utf8'),
        backends.default_backend(),
    )
    originalData = Path(pdffile).read_bytes()
    signatureData = cms.sign(
        originalData,
        dct,
        key=privkey,
        cert=cert,
        othercerts=extracerts,
        algomd="sha256",
    )
    outputFile = Path(pdffile.replace(".pdf", "-signed.pdf"))
    outputFile.write_bytes(originalData + signatureData)
Exemple #6
0
async def sign_pdf(filecert: UploadFile = File(...),
                   filepdf: UploadFile = File(...),
                   sigflags: str = Form(...),
                   contact: str = Form(...),
                   location: str = Form(...),
                   reason: str = Form(...)):

    try:
        suffix = Path(filecert.filename).suffix
        with NamedTemporaryFile(delete=False, suffix=suffix) as tmp:
            shutil.copyfileobj(filecert.file, tmp)
            cert_tmp_path = Path(tmp.name)
    finally:
        filecert.file.close()

    try:
        suffix = Path(filepdf.filename).suffix
        with NamedTemporaryFile(delete=False, suffix=suffix) as tmp:
            shutil.copyfileobj(filepdf.file, tmp)
            pdf_tmp_path = Path(tmp.name)
    finally:
        filepdf.file.close()

    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime('%Y%m%d%H%M%S+00\'00\'')

    dct = {
        'sigflags': sigflags,
        'contact': contact,
        'location': location,
        'signingdate': date,
        'reason': reason,
    }

    with open(cert_tmp_path, 'rb') as fp:
        p12 = pkcs12.load_key_and_certificates(fp.read(), b'1234', backends.default_backend())

    datau = open(pdf_tmp_path, 'rb').read()
    datas = cms.sign(datau, dct, p12[0], p12[1], p12[2], "sha256")

    with open(pdf_tmp_path, 'wb') as fp:
        fp.write(datau)
        fp.write(datas)

    return FileResponse(path=pdf_tmp_path, filename=pdf_tmp_path.name)
Exemple #7
0
def main():
    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
    dct = {
        "aligned": 0,
        "sigflags": 3,
        "sigflagsft": 132,
        "sigpage": 0,
        #"auto_sigfield": False,
        #"sigandcertify": False,
        #"signaturebox": (0, 0, 590, 155),
        "signform": True,
        "sigfield": "Signature",
        #             Text will be in the default font
        "signature": 'Signed field!',

        # default configuration for the text appearance
        "text": {
            'wraptext': True,
            'fontsize': 12,
            'textalign': 'left',
            'linespacing': 1.2,
        },
        "contact": "*****@*****.**",
        "location": "Szczecin",
        "signingdate": date,
        "reason": "Dokument podpisany cyfrowo aą cć eę lł nń oó sś zż zź",
        "password": "******",
    }
    with open("../demo2_user1.p12", "rb") as fp:
        p12 = pkcs12.load_key_and_certificates(fp.read(), b"1234",
                                               backends.default_backend())
    fname = "../pdf_forms/blank_form.pdf"
    if len(sys.argv) > 1:
        fname = sys.argv[1]
    datau = open(fname, "rb").read()
    datas = cms.sign(datau, dct, p12[0], p12[1], p12[2], "sha256")
    fname = fname.replace(".pdf", "-signature.pdf")
    with open(fname, "wb") as fp:
        fp.write(datau)
        fp.write(datas)
Exemple #8
0
def main():
    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
    dct = {
        "aligned": 0,
        "sigflags": 3,
        "sigflagsft": 132,
        "sigpage": 0,
        #"auto_sigfield": False,
        #"sigandcertify": False,
        #"signaturebox": (0, 0, 590, 155),
        "signform": True,
        "sigfield": "Signature",
        #                PIL Image object or path to image file
        #                Image will be resized to fit bounding box
        "signature_img": '../signature_test.png',
        "signature_img_distort": False,  # default True
        "signature_img_centred": False,  # default True
        "contact": "*****@*****.**",
        "location": "Szczecin",
        "signingdate": date,
        "reason": "Dokument podpisany cyfrowo aą cć eę lł nń oó sś zż zź",
        "password": "******",
    }
    with open("../demo2_user1.p12", "rb") as fp:
        p12 = pkcs12.load_key_and_certificates(fp.read(), b"1234",
                                               backends.default_backend())
    fname = "../pdf_forms/blank_form.pdf"
    if len(sys.argv) > 1:
        fname = sys.argv[1]
    datau = open(fname, "rb").read()
    datas = cms.sign(datau, dct, p12[0], p12[1], p12[2], "sha256")
    fname = fname.replace(".pdf", "-signature_img.pdf")
    with open(fname, "wb") as fp:
        fp.write(datau)
        fp.write(datas)
Exemple #9
0
def signPDF(docdata, page, email, name, shape, style, font, region, x1,y1,x2,y2):
  try:
    res = getHankoImage(name, shape, style, font)
    if "Message" in res[0]: 
      return res
    else: 
      _fr, fname = tempfile.mkstemp(".pdf")

    one_day = datetime.timedelta(1, 0, 0)
    private_key = rsa.generate_private_key(
      public_exponent=65537,
      key_size=2048,
      backend=default_backend()
    )
    public_key = private_key.public_key()
    builder = x509.CertificateBuilder()
    builder = builder.subject_name(x509.Name([
      x509.NameAttribute(NameOID.COMMON_NAME, name),
    ]))
    builder = builder.issuer_name(x509.Name([
      x509.NameAttribute(NameOID.COMMON_NAME, u'inkantan'),
    ]))
    builder = builder.not_valid_before(datetime.datetime.today() - one_day)
    builder = builder.not_valid_after(datetime.datetime.today() + (one_day * 365))
    builder = builder.serial_number(x509.random_serial_number())
    builder = builder.public_key(public_key)
    builder = builder.add_extension(
      x509.SubjectAlternativeName(
          [x509.DNSName("@inkantan")]
      ),
      critical=False
    )
    builder = builder.add_extension(
      x509.BasicConstraints(ca=False, path_length=None), critical=True,
    )
    certificate = builder.sign(
      private_key=private_key, algorithm=hashes.SHA256(),
      backend=default_backend()
    )
    p12 = pkcs12.serialize_key_and_certificates(b'test', private_key, certificate, [certificate], serialization.BestAvailableEncryption(b'1234'))
    y = pkcs12.load_key_and_certificates(p12, b'1234', default_backend())

    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
    dct = {
        "aligned": 0,
        "sigflags": 1,
        "sigflagsft": 132,
        "sigpage": int(page)-1,
        "sigbutton": True,
        "sigfield": "Signature1",
        "sigandcertify": True,
        "signaturebox": (0,0,0,0), #(x1, y1, x2, y2),
        "signature": "Contract with Hanko seal applied",
        "contact": email,
        "location": region,
        "signingdate": date,
        "reason": "To execute/formalize/affirm the contract", #目的:契約書に署名する 
        "password": "******",
    }

    with open(fname, 'wb') as fx: 
      fx.write(docdata)
    img_rect = fitz.Rect(min(x1,x2), min(y1,y2), max(x1,x2), max(y1,y2))
    document = fitz.open(fname)
    pg = document[int(page)-1]
    pg.insertImage(img_rect, filename=res[0])
    if document.can_save_incrementally():
      document.save(fname, garbage=0, deflate=True, incremental=True, encryption=0)
      document.close()
    else:
      os.close(res[1])
      os.remove(res[0])
      os.close(_fr)
      os.remove(fname)
      return ["Fitz Issue: Cannot incrementally save document", "Continuing may lead to loss of data"]

    datau = open(fname, "rb").read()
    try:
      datas = cms.sign(datau, dct, y[0], y[1], y[2], "sha256")
    except Exception as x:
      return errHandler(x, [res[0], fname], [res[1], _fr])
      
    with open(fname, "wb") as fp:
        fp.write(datau)
        fp.write(datas)
    os.close(res[1])
    os.remove(res[0])
    os.close(_fr)
    return fname
  except Exception as e:
    return errHandler(e, [res[0], fname], [res[1], _fr])
def digital_sign_pdf(pdf_data_in: bytes, config: dict, language: str) -> bytes:
    """Create a digital signature of a PDF file byte array.

    Args:
        pdf_data_in (bytes): The byte array of the PDF file to be digital sign
        config (dict): A configuration dictionary like:
            {
                CERTIFICATE_P12: ./digital_signature_dev/sign-pdf.dev.nau.fccn.pt.p12
                SIGNATURE_BOX: 742,30,810,60
                CONTACT: [email protected]
                LOCATION: Lisboa
                REASON: 
                    pt-pt: Certificado de curso assinado digitalmente por NAU
                    en: Digitally signed course certificate by NAU
            }
        language (str): The language code 'pt-pt' or 'en'

    Returns:
        bytes: The PDF byte array digital signed
    """
    def _signature_img_path(language: str):
        signature_img_base_path = "./static/images/digital_sign/digital_signature_"
        signature_img_path: str = None
        if language:
            signature_img_path = signature_img_base_path + language + ".png"
        if not signature_img_path or not path.exists(signature_img_path):
            signature_img_path = signature_img_base_path + "en.png"
        return signature_img_path

    def _get_config_value(config, language: str, default_value):
        if type(config) is str:
            return config
        if type(config) is dict:
            by_lang = config.get(language)
            if type(by_lang) is not str:
                logger.warn(
                    "Incorrect configuration on the digital signature configuration"
                )
                return default_value
            return by_lang
        return default_value

    def _signaturebox(config):
        signature_box_config_value = _get_config_value(config, language,
                                                       "50,50,100,100")
        signature_box_strs = signature_box_config_value.split(",")
        signature_box_ints = [int(i) for i in signature_box_strs]
        return tuple(signature_box_ints)

    signature_img_path = _signature_img_path(language)
    signaturebox = _signaturebox(config.get("signaturebox"))
    contact = _get_config_value(config.get("contact"), language,
                                "*****@*****.**")
    location = _get_config_value(config.get("location"), language, "Some city")
    reason = _get_config_value(config.get("reason"), language,
                               "Digitally signed course certificate")
    date = (datetime.datetime.utcnow() -
            datetime.timedelta(hours=12)).strftime('%Y%m%d%H%M%S+00\'00\'')

    dct = {
        "sigflags": 3,
        "sigpage": 0,
        "signaturebox": signaturebox,
        "signature_img": signature_img_path,
        "contact": contact,
        "location": location,
        "reason": reason,
        "signingdate": date,
        "signature_img_distort": False,
    }

    p12_certificate_path = config.get('CERTIFICATE_P12_PATH')
    p12_password_as_bytes = str.encode(config.get("CERTIFICATE_P12_PASSWORD"))
    algorithm = config.get('SIGNATURE_ALGORITHM', "sha256")

    with open(p12_certificate_path, "rb") as fp:
        p12 = pkcs12.load_key_and_certificates(fp.read(),
                                               p12_password_as_bytes,
                                               backends.default_backend())

    certificate_private_key = p12[0]
    certificate = p12[1]
    othercerts = p12[2]

    pdf_signature = cms.sign(pdf_data_in, dct, certificate_private_key,
                             certificate, othercerts, algorithm)
    pdf = pdf_data_in + pdf_signature
    return pdf
Exemple #11
0
def kirim(request, *args, **kwargs):
    if request.method == 'POST':
        fruits = request.POST.getlist('cek')
        mode = ""
        user = User.objects.all()
        ala = "C:/pln/Program Aktual/media_cdn/"
        if 'kirimMutasi' in request.POST:
            model = mutasi
            template = 'mutasi/pdf_mutasi.html'
            filename = "mutasi.pdf"
            mode = "kirim"
            tipe = "email"
            redirek = 'mutasi:index'
            judul = "SK Mutasi"
            alamat = ala + 'back up mutasi/'

        elif 'kirimPLT' in request.POST:
            model = plt
            template = 'mutasi/pdf_plt.html'
            filename = "plt.pdf"
            mode = "kirim"
            tipe = "email"
            redirek = 'mutasi:plt'
            judul = "Surat Penugasan PLT"
            alamat = ala + 'back up PLT/'

        elif 'kirimAPS' in request.POST:
            model = aps
            template = 'mutasi/pdf_aps.html'
            filename = "aps.pdf"
            mode = "kirim"
            tipe = "email"
            redirek = 'mutasi:aps'
            judul = "Surat Keputusan APS"
            alamat = ala + 'back up APS/'

        elif 'kirimTalenta' in request.POST:
            model = talenta
            template = 'talenta/pdf_talenta.html'
            filename = "talenta.pdf"
            mode = "kirim"
            tipe = "email"
            redirek = 'talenta:index'
            judul = "SK Kenaikan Grade/Level"
            alamat = ala + 'back up talenta/'

        elif 'kirimKriteriaTalenta' in request.POST:
            model = kriteriaTalenta
            template = 'talenta/pdf_kriteriaTalenta.html'
            filename = "kriteriaTalenta.pdf"
            mode = "kirim"
            tipe = "email"
            redirek = 'talenta:kriteria'
            judul = "Kriteria Talenta"
            alamat = ala + 'back up kriteria talenta/'

        elif 'kirimPhDP' in request.POST:
            model = PhDP
            template = 'talenta/pdf_PhDP.html'
            filename = "PhDP.pdf"
            mode = "kirim"
            redirek = 'talenta:PhDP'
            judul = "PhDP"
            tipe = "email"
            alamat = ala + 'back up PhDP/'

        elif 'kirimMutasiWa' in request.POST:
            model = mutasi
            template = 'mutasi/pdf_mutasi.html'
            filename = "mutasi.pdf"
            mode = "kirim"
            tipe = "wa"
            redirek = 'mutasi:index'
            judul = "SK Mutasi"
            alamat = ala + 'back up mutasi/'

        elif 'kirimPLTWa' in request.POST:
            model = plt
            template = 'mutasi/pdf_plt.html'
            filename = "plt.pdf"
            mode = "kirim"
            tipe = "wa"
            redirek = 'mutasi:plt'
            judul = "Surat Penugasan PLT"
            alamat = ala + 'back up PLT/'

        elif 'kirimAPSWa' in request.POST:
            model = aps
            template = 'mutasi/pdf_aps.html'
            filename = "aps.pdf"
            mode = "kirim"
            tipe = "wa"
            redirek = 'mutasi:aps'
            judul = "Surat Keputusan APS"
            alamat = ala + 'back up APS/'

        elif 'kirimTalentaWa' in request.POST:
            model = talenta
            template = 'talenta/pdf_talenta.html'
            filename = "talenta.pdf"
            mode = "kirim"
            tipe = "wa"
            redirek = 'talenta:index'
            judul = "SK Kenaikan Grade/Level"
            alamat = ala + 'back up talenta/'

        elif 'kirimphdpTalentaWa' in request.POST:
            model = PhDP
            template = 'talenta/pdf_PhDP.html'
            filename = "PhDP.pdf"
            mode = "kirim"
            tipe = "wa"
            redirek = 'talenta:PhDP'
            judul = "PhDP"
            alamat = ala + 'back up PhDP/'

        elif 'kirimKriteriaTalentaWa' in request.POST:
            model = kriteriaTalenta
            template = 'talenta/pdf_kriteriaTalenta.html'
            filename = "kriteriaTalenta.pdf"
            mode = "kirim"
            tipe = "wa"
            redirek = 'talenta:kriteria'
            judul = "Kriteria Talenta"
            alamat = ala + 'back up kriteria talenta/'

        elif 'hapusMutasi' in request.POST:
            model = mutasi
            mode = "hapus"
            redirek = 'mutasi:index'

        elif 'hapusPLT' in request.POST:
            model = plt
            mode = "hapus"
            redirek = 'mutasi:plt'

        elif 'hapusTalenta' in request.POST:
            model = talenta
            mode = "hapus"
            redirek = 'talenta:index'

        elif 'hapusPensiun' in request.POST:
            model = pensiun
            mode = "hapus"
            redirek = 'pensiun:index'

        if mode == "kirim":
            connection = mail.get_connection()
            connection.open()

            if tipe == "wa":
                whatsapp_login()
            pesanE = 0
            pesanW = 0
            emailGagal = 0
            waGagal = 0
            nipegEmailGagal = []
            nipegWaGagal = []
            for mu in fruits:
                try:
                    mutate = model.objects.get(nipeg=mu)
                    if mutate.peg:
                        context = {
                            'sesuatu': mutate,
                        }
                        if judul == "SK Mutasi" or judul == "Surat Penugasan PLT" or judul == "Surat Keputusan APS":
                            imail = mutate.email
                            hp = mutate.noHp
                            nip = mutate.nipeg
                            nam = mutate.nama
                        elif judul == "Kriteria Talenta":
                            imail = mutate.peg.email
                            hp = mutate.peg.noHp
                            nip = mutate.peg.nipeg
                            nam = mutate.peg.nama
                            context = {
                                'sesuatu':
                                mutate,
                                'tglAwal':
                                tglKriteria.objects.get(posisi="awal"),
                                'tglAkhir':
                                tglKriteria.objects.get(posisi="akhir"),
                            }
                        else:
                            imail = mutate.peg.email
                            hp = mutate.peg.noHp
                            nip = mutate.peg.nipeg
                            nam = mutate.peg.nama
                        print("Mengirim Email ke " + str(imail) + "...")
                        response = PDFTemplateResponse(
                            request=request,
                            template=template,
                            filename=filename,
                            context=context,
                            show_content_in_browser=True,
                            cmd_options={
                                'margin-top': 0,
                            })

                        with open(filename, 'wb') as f:
                            f.write(response.rendered_content)

                        date = datetime.datetime.utcnow() - datetime.timedelta(
                            hours=12)
                        date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
                        dct = {
                            "aligned": 0,
                            "sigflags": 3,
                            "sigflagsft": 132,
                            "sigpage": 0,
                            "sigbutton": True,
                            "sigfield": "Signature1",
                            "sigandcertify": True,
                            "signaturebox": (370, -100, 570, 640),
                            "signature": "",
                            "signature_img":
                            "c:/pln3/aktual/static/image/ttd.jpg",
                            "contact": "*****@*****.**",
                            "location": "UID JATIM",
                            "signingdate": date,
                            "reason": judul,
                            "password": "",
                        }
                        with open("selfsigned.pfx", "rb") as fp:
                            p12 = pkcs12.load_key_and_certificates(
                                fp.read(), b"", backends.default_backend())
                        datau = open(filename, "rb").read()
                        datas = cms.sign(datau, dct, p12[0], p12[1], p12[2],
                                         "sha512")
                        with open(filename, "wb") as fp:
                            fp.write(datau)
                            fp.write(datas)
                        attachment = open(filename, 'rb')
                        if (tipe == "email"
                                and mail) or mutate.terkirim == False:
                            try:
                                if (judul == "Kriteria Talenta"):
                                    message = EmailMessage(
                                        judul + " " + nip,
                                        "Yth. Bapak/Ibu " + nam + " NIP " +
                                        nip +
                                        " \nPegawai PT PLN (Persero) Unit Induk Distribusi Jawa Timur \n\nDalam rangka mendukung proses efisiensi, efektifitas dan ketepatan dalam penyampaian Surat Keputusan (SK) \nmaka mulai tahun 2020 SK disampaikan melalui soft file kepada pegawai melalui email masing-masing \npegawai. \n\nTerlampir disampaikan Surat Keputusan tentang "
                                        + judul + " " + mutate.tglPeriode +
                                        " atas nama bapak/ibu " + nam +
                                        ".\n Bilamana terdapat hal yang perlu dikonfirmasi dapat menghubungi pengelola SDM Unit Pelaksana setempat.\n\nEmail ini dikirim melalui sistem e-statement otomatis, mohon untuk tidak membalas. \n\nDemikian dan atas perhatian Bapak/Ibu diucapkan terima kasih. \n\n\n\nSalam, \n\nSub Bidang Administrasi SDM \nBidang SDM \nPT PLN (Persero) UID Jawa Timur \n",
                                        "SDM", [imail],
                                        connection=connection)

                                else:
                                    message = EmailMessage(
                                        judul + " " + nip,
                                        "Yth. Bapak/Ibu " + nam + " NIP " +
                                        nip +
                                        " \nPegawai PT PLN (Persero) Unit Induk Distribusi Jawa Timur \n\nDalam rangka mendukung proses efisiensi, efektifitas dan ketepatan dalam penyampaian Surat Keputusan (SK) \nmaka mulai tahun 2020 SK disampaikan melalui soft file kepada pegawai melalui email masing-masing \npegawai. \n\nTerlampir disampaikan Surat Keputusan tentang "
                                        + judul + " atas nama bapak/ibu " +
                                        nam +
                                        ".\n Bilamana terdapat hal yang perlu dikonfirmasi dapat menghubungi pengelola SDM Unit Pelaksana setempat.\n\nEmail ini dikirim melalui sistem e-statement otomatis, mohon untuk tidak membalas. \n\nDemikian dan atas perhatian Bapak/Ibu diucapkan terima kasih. \n\n\n\nSalam, \n\nSub Bidang Administrasi SDM \nBidang SDM \nPT PLN (Persero) UID Jawa Timur \n",
                                        "SDM", [imail],
                                        connection=connection)

                                message.attach(filename, attachment.read(),
                                               'application/pdf')
                                message.send()
                                mutate.terkirim = True
                                mutate.save()
                                print("berhasil mengirim Email ke : " +
                                      str(imail))
                                pesanE += 1
                                shutil.copy(filename,
                                            alamat + mutate.peg.nipeg + ".pdf")
                            except:
                                print("Pengiriman Email gagal")
                                emailGagal += 1
                                nipegEmailGagal.append(nip)

                        if tipe == "wa" and hp:
                            print("Mengirim wa nipeg : " + str(nip) +
                                  " dengan nomor HP : " + str(hp) + "...")
                            try:
                                if (judul == "Kriteria Talenta"):
                                    send_message_to_unsavaed_contact(
                                        hp,
                                        "Yth Bapak/Ibu,\n\nSurat Keputusan tentang "
                                        + judul + " " + mutate.tglPeriode +
                                        " dengan NIP : " + nip +
                                        " telah dikirim melalui Email : " +
                                        imail +
                                        ".\nDemikian sebagai informasi.\nTerima kasih.\n\nSalam,\nSub Bidang Administrasi SDM\nBidang SDM\nPT PLN (Persero) UID Jawa Timur",
                                        1)
                                else:
                                    send_message_to_unsavaed_contact(
                                        hp,
                                        "Yth Bapak/Ibu,\n\nSurat Keputusan tentang "
                                        + judul + " dengan NIP : " + nip +
                                        " telah dikirim melalui Email : " +
                                        imail +
                                        ".\nDemikian sebagai informasi.\nTerima kasih.\n\nSalam,\nSub Bidang Administrasi SDM\nBidang SDM\nPT PLN (Persero) UID Jawa Timur",
                                        1)
                                pesanW += 1
                                print("berhasil mengirim wa nipeg : " +
                                      str(nip) + " dengan nomor HP : " +
                                      str(hp))
                            except:
                                print("Pengiriman WA gagal")
                                waGagal += 1
                                nipegWaGagal.append(nip)
                    else:
                        messages.error(
                            request, 'pegawai dengan nipeg ' + mutate.nipeg +
                            ' tidak memiliki email, pengiriman gagal')
                        connection.close()
                except:
                    print("Pengiriman Gagal")
                    return redirect(redirek)

            if pesanE > 0:
                print("telah mengirim email ke " + str(pesanE) + " pegawai")
                messages.success(
                    request, 'Pesan Email telah terkirim ke ' + str(pesanE) +
                    ' pegawai')

            if pesanW > 0:
                print("telah mengirim pesan WA ke " + str(pesanW) + " pegawai")
                messages.success(
                    request,
                    'Pesan WA telah terkirim ke ' + str(pesanW) + ' pegawai')

            if emailGagal > 0:
                messages.error(
                    request,
                    "Pengiriman Email gagal ke pegawai dengan nipeg : " +
                    listToString(nipegEmailGagal))
            if waGagal > 0:
                messages.error(
                    request, "Pengiriman WA gagal ke pegawai dengan nipeg : " +
                    listToString(nipegWaGagal))

            connection.close()
            if tipe == "wa":
                tutup()

        elif mode == "hapus":
            pesanH = 0
            for mu in fruits:
                mutate = model.objects.get(nipeg=mu)
                mutate.delete()
                pesanH += 1
            if pesanH > 0:
                messages.success(
                    request, 'Sebanyak ' + str(pesanH) + ' SK telah dihapus')

    return redirect(redirek)
Exemple #12
0
def invoke_certificate():
    print(request.json)

    staff = (db.session.query(User).filter(
        Staff.staff_id_no == session.get('user_rollno')).first())

    staff_id = (db.session.query(Staff.id).filter(
        Staff.staff_id_no == session.get('user_rollno')).first())

    default_sign_filename = (db.session.query(
        DigitalSignature.filename).filter(
            DigitalSignature.staff_id == staff_id).filter(
                DigitalSignature.is_default == True).first())
    print(default_sign_filename[0])

    root_path = os.path.dirname(app.instance_path)
    professor_media_path = root_path + '/media/' + Config.PROFESSOR_CERTIFICATE_FOLDER + '/' + session.get(
        'user_rollno') + '/' + default_sign_filename[0]

    post_data = request.json

    student_id = (db.session.query(
        User.id).filter(User.rollno == post_data["rollno"]).first())
    course_id = (db.session.query(Course.id).filter(
        Course.course_code == post_data["course_code"]).first())

    course_media_path = root_path + '/media/' + Config.COURSE_CERTIFICATE_FOLDER + '/' + post_data[
        'course_code'] + '/' + post_data['course_code'] + ".pdf"

    keys_path = root_path + '/media/keys'

    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
    dct = {
        "aligned": 0,
        "sigflags": 3,
        "sigflagsft": 132,
        "sigpage": 0,
        "sigbutton": True,
        "sigfield": "Signature1",
        "auto_sigfield": True,
        "sigandcertify": True,
        "signaturebox": (470, 840, 570, 640),
        # "signature": "Document SIgning",
        "signature_img": professor_media_path,
        "contact": staff.emailid,
        "location": "Coimbatore",
        "signingdate": date,
        "reason": "Course Completion",
        "password": "******",
    }
    with open(keys_path + "/my_pkcs12.p12", "rb") as fp:
        p12 = pkcs12.load_key_and_certificates(fp.read(), b"123456654321",
                                               backends.default_backend())
    fname = course_media_path

    datau = open(fname, "rb").read()
    datas = cms.sign(datau, dct, p12[0], p12[1], p12[2], "sha256")

    student_media_path = root_path + '/media/' + Config.STUDENT_CERTIFICATE_FOLDER + '/' + post_data[
        "rollno"] + "/"

    signed_file_name = student_media_path + post_data["course_code"] + ".pdf"
    with open(signed_file_name, "wb") as fp:
        fp.write(datau)
        fp.write(datas)

    result = db.session.execute(
        'Update user_course set is_course_completed=True Where user_id = :student_id and course_id = :course_id',
        {
            'student_id': student_id,
            "course_id": course_id
        })
    db.session.commit()

    return jsonify({"data": "invoked"})
Exemple #13
0
def main():
    date = datetime.datetime.utcnow() - datetime.timedelta(hours=12)
    date = date.strftime("D:%Y%m%d%H%M%S+00'00'")
    dct = {
        "aligned":
        0,
        "sigflags":
        3,
        "sigflagsft":
        132,
        "sigpage":
        0,
        #"auto_sigfield": False,
        #"sigandcertify": False,
        #"signaturebox": (0, 0, 590, 155),
        "signform":
        True,
        "sigfield":
        "Signature",
        "signature_manual": [
            #                R     G     B
            ['fill_colour', 0.95, 0.95, 0.95],

            #            *[bounding box]
            ['rect_fill', 0, 0, 270, 18],

            #                  R    G    B
            ['stroke_colour', 0.8, 0.8, 0.8],

            #          key  *[bounding box]
            ['image', 'sig0', 0, 0, 59, 15],

            #        inset
            ['border', 2],

            #         font     fs
            ['font', 'default', 7],
            #               R  G  B
            ['fill_colour', 0, 0, 0],

            #            text
            [
                'text_box',
                'signed using endesive\ndate: {}'.format(date),
                # font  *[bounding box], fs, wrap, align, baseline
                'default',
                0,
                2,
                270,
                18,
                7,
                True,
                'right',
                'top'
            ],
        ],
        #   key: name used in image directives
        # value: PIL Image object or path to image file
        "manual_images": {
            'sig0': '../signature_test.png'
        },
        #   key: name used in font directives
        # value: path to TTF Font file
        "manual_fonts": {},
        "contact":
        "*****@*****.**",
        "location":
        "Szczecin",
        "signingdate":
        date,
        "reason":
        "Dokument podpisany cyfrowo aą cć eę lł nń oó sś zż zź",
        "password":
        "******",
    }
    with open("../demo2_user1.p12", "rb") as fp:
        p12 = pkcs12.load_key_and_certificates(fp.read(), b"1234",
                                               backends.default_backend())
    fname = "../pdf_forms/blank_form.pdf"
    if len(sys.argv) > 1:
        fname = sys.argv[1]
    datau = open(fname, "rb").read()
    datas = cms.sign(datau, dct, p12[0], p12[1], p12[2], "sha256")
    fname = fname.replace(".pdf", "-signed-cms.pdf")
    with open(fname, "wb") as fp:
        fp.write(datau)
        fp.write(datas)
    def DoSign(self, pdfPath, dct):
        try:
            # load certificate
            certData = open(self.txtCertPath.text(), 'rb').read()
            p12Data = pkcs12.load_key_and_certificates(
                certData, str.encode(self.txtCertPassword.text()),
                backends.default_backend())

            # check certificate
            if (p12Data[1] != None
                    and p12Data[1].not_valid_after < datetime.datetime.now()):
                msg = QMessageBox()
                msg.setIcon(QMessageBox.Warning)
                msg.setWindowTitle(
                    QApplication.translate('SimpleSigner',
                                           'Certificate Warning'))
                msg.setText(
                    QApplication.translate(
                        'SimpleSigner',
                        'Your certificate expired on %s. Continue?') %
                    str(p12Data[1].not_valid_after))
                msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
                if (msg.exec_() == QMessageBox.Cancel): return

            # load source PDF
            pdfData = open(pdfPath, 'rb').read()

            # sign
            signData = cms.sign(pdfData, dct, p12Data[0], p12Data[1],
                                p12Data[2], 'sha256')

            # save signed target PDF
            with open(self.signedPdfPath, 'wb') as fp:
                fp.write(pdfData)
                fp.write(signData)

                # success message
                msg = QMessageBox()
                msg.setIcon(QMessageBox.Information)
                msg.setWindowTitle('😇')
                msg.setText(
                    QApplication.translate('SimpleSigner',
                                           'Successfully saved as »%s«.') %
                    self.signedPdfPath)
                msg.setStandardButtons(QMessageBox.Ok)
                btnOpen = msg.addButton(
                    QApplication.translate('SimpleSigner', 'Open Directory'),
                    QMessageBox.ActionRole)
                btnOpen.clicked.connect(self.OnClickOpenSignedInFileManager)
                btnOpen = msg.addButton(
                    QApplication.translate('SimpleSigner', 'Open Signed PDF'),
                    QMessageBox.ActionRole)
                btnOpen.clicked.connect(self.OnClickOpenSigned)
                retval = msg.exec_()

        except Exception as e:
            # error message
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setWindowTitle('😕')
            msg.setText(str(e))
            msg.setStandardButtons(QMessageBox.Ok)
            retval = msg.exec_()