⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crypt.c

📁 mutt-1.5.12 源代码。linux 下邮件接受的工具。
💻 C
📖 第 1 页 / 共 2 页
字号:
      if (t && m->badsig) t |= BADSIGN;    }  }  else if ((WithCrypto & APPLICATION_PGP) && m->type == TYPETEXT)  {    t |= mutt_is_application_pgp (m);    if (t && m->goodsig)      t |= GOODSIGN;  }    if (m->type == TYPEMULTIPART)  {    t |= mutt_is_multipart_encrypted(m);    t |= mutt_is_multipart_signed (m);    if (t && m->goodsig)       t |= GOODSIGN;  }  if (m->type == TYPEMULTIPART || m->type == TYPEMESSAGE)  {    BODY *p;    int u, v, w;        u = m->parts ? 0xffffffff : 0;	/* Bits set in all parts */    w = 0;				/* Bits set in any part  */     for (p = m->parts; p; p = p->next)    {      v  = crypt_query (p);      u &= v; w |= v;    }    t |= u | (w & ~GOODSIGN);        if ((w & GOODSIGN) && !(u & GOODSIGN))      t |= PARTSIGN;  }  return t;}int crypt_write_signed(BODY *a, STATE *s, const char *tempfile){  FILE *fp;  int c;  short hadcr;  size_t bytes;  if (!WithCrypto)    return -1;  if (!(fp = safe_fopen (tempfile, "w")))  {    mutt_perror (tempfile);    return -1;  }        fseeko (s->fpin, a->hdr_offset, 0);  bytes = a->length + a->offset - a->hdr_offset;  hadcr = 0;  while (bytes > 0)  {    if ((c = fgetc (s->fpin)) == EOF)      break;        bytes--;        if  (c == '\r')      hadcr = 1;    else     {      if (c == '\n' && !hadcr)	fputc ('\r', fp);            hadcr = 0;    }        fputc (c, fp);      }  fclose (fp);  return 0;}void convert_to_7bit (BODY *a){  if (!WithCrypto)    return;  while (a)  {    if (a->type == TYPEMULTIPART)    {      if (a->encoding != ENC7BIT)      {        a->encoding = ENC7BIT;	convert_to_7bit(a->parts);      }      else if ((WithCrypto & APPLICATION_PGP) && option (OPTPGPSTRICTENC))	convert_to_7bit (a->parts);    }     else if (a->type == TYPEMESSAGE &&	     ascii_strcasecmp(a->subtype, "delivery-status"))    {      if(a->encoding != ENC7BIT)	mutt_message_to_7bit (a, NULL);    }    else if (a->encoding == ENC8BIT)      a->encoding = ENCQUOTEDPRINTABLE;    else if (a->encoding == ENCBINARY)      a->encoding = ENCBASE64;    else if (a->content && a->encoding != ENCBASE64 &&	     (a->content->from || (a->content->space && 				   option (OPTPGPSTRICTENC))))      a->encoding = ENCQUOTEDPRINTABLE;    a = a->next;  }}void crypt_extract_keys_from_messages (HEADER * h){  int i;  char tempfname[_POSIX_PATH_MAX], *mbox;  ADDRESS *tmp = NULL;  FILE *fpout;  if (!WithCrypto)    return;  mutt_mktemp (tempfname);  if (!(fpout = safe_fopen (tempfname, "w")))  {    mutt_perror (tempfname);    return;  }  if ((WithCrypto & APPLICATION_PGP))    set_option (OPTDONTHANDLEPGPKEYS);  if (!h)  {    for (i = 0; i < Context->vcount; i++)    {      if (Context->hdrs[Context->v2r[i]]->tagged)      {	mutt_parse_mime_message (Context, Context->hdrs[Context->v2r[i]]);	if (Context->hdrs[Context->v2r[i]]->security & ENCRYPT &&	    !crypt_valid_passphrase (Context->hdrs[Context->v2r[i]]->security))	{	  fclose (fpout);	  break;	}	if ((WithCrypto & APPLICATION_PGP)            && (Context->hdrs[Context->v2r[i]]->security & APPLICATION_PGP))	{	  mutt_copy_message (fpout, Context, Context->hdrs[Context->v2r[i]], 			     M_CM_DECODE|M_CM_CHARCONV, 0);	  fflush(fpout);	  	  mutt_endwin (_("Trying to extract PGP keys...\n"));	  crypt_pgp_invoke_import (tempfname);	}	if ((WithCrypto & APPLICATION_SMIME)            && (Context->hdrs[Context->v2r[i]]->security & APPLICATION_SMIME))	{	  if (Context->hdrs[Context->v2r[i]]->security & ENCRYPT)	    mutt_copy_message (fpout, Context, Context->hdrs[Context->v2r[i]],			       M_CM_NOHEADER|M_CM_DECODE_CRYPT                               |M_CM_DECODE_SMIME, 0);	  else	    mutt_copy_message (fpout, Context,			       Context->hdrs[Context->v2r[i]], 0, 0);	  fflush(fpout);          if (Context->hdrs[Context->v2r[i]]->env->from)	    tmp = mutt_expand_aliases (Context->hdrs[Context->v2r[i]]->env->from);	  else if (Context->hdrs[Context->v2r[i]]->env->sender)	    tmp = mutt_expand_aliases (Context->hdrs[Context->v2r[i]]                                                    ->env->sender);          mbox = tmp ? tmp->mailbox : NULL;	  if (mbox)	  {	    mutt_endwin (_("Trying to extract S/MIME certificates...\n"));	    crypt_smime_invoke_import (tempfname, mbox);	    tmp = NULL;	  }	}	rewind (fpout);      }    }  }  else  {    mutt_parse_mime_message (Context, h);    if (!(h->security & ENCRYPT && !crypt_valid_passphrase (h->security)))    {      if ((WithCrypto & APPLICATION_PGP)          && (h->security & APPLICATION_PGP))      {	mutt_copy_message (fpout, Context, h, M_CM_DECODE|M_CM_CHARCONV, 0);	fflush(fpout);	mutt_endwin (_("Trying to extract PGP keys...\n"));	crypt_pgp_invoke_import (tempfname);      }      if ((WithCrypto & APPLICATION_SMIME)          && (h->security & APPLICATION_SMIME))      {	if (h->security & ENCRYPT)	  mutt_copy_message (fpout, Context, h, M_CM_NOHEADER                                                |M_CM_DECODE_CRYPT                                                |M_CM_DECODE_SMIME, 0);	else	  mutt_copy_message (fpout, Context, h, 0, 0);	fflush(fpout);	if (h->env->from) tmp = mutt_expand_aliases (h->env->from);	else if (h->env->sender)  tmp = mutt_expand_aliases (h->env->sender); 	mbox = tmp ? tmp->mailbox : NULL;	if (mbox) /* else ? */	{	  mutt_message (_("Trying to extract S/MIME certificates...\n"));	  crypt_smime_invoke_import (tempfname, mbox);	}      }    }  }        fclose (fpout);  if (isendwin())    mutt_any_key_to_continue (NULL);  mutt_unlink (tempfname);  if ((WithCrypto & APPLICATION_PGP))    unset_option (OPTDONTHANDLEPGPKEYS);}int crypt_get_keys (HEADER *msg, char **keylist){  /* Do a quick check to make sure that we can find all of the encryption   * keys if the user has requested this service.   */  if (!WithCrypto)    return 0;  if ((WithCrypto & APPLICATION_PGP))    set_option (OPTPGPCHECKTRUST);  *keylist = NULL;  if (msg->security & ENCRYPT)  {     if ((WithCrypto & APPLICATION_PGP)         && (msg->security & APPLICATION_PGP))     {       if ((*keylist = crypt_pgp_findkeys (msg->env->to, msg->env->cc,      			       msg->env->bcc)) == NULL)           return (-1);       unset_option (OPTPGPCHECKTRUST);     }     if ((WithCrypto & APPLICATION_SMIME)         && (msg->security & APPLICATION_SMIME))     {       if ((*keylist = crypt_smime_findkeys (msg->env->to, msg->env->cc,      				             msg->env->bcc)) == NULL)           return (-1);     }  }      return (0);}static void crypt_fetch_signatures (BODY ***signatures, BODY *a, int *n){  if (!WithCrypto)    return;  for (; a; a = a->next)  {    if (a->type == TYPEMULTIPART)      crypt_fetch_signatures (signatures, a->parts, n);    else    {      if((*n % 5) == 0)	safe_realloc (signatures, (*n + 6) * sizeof (BODY **));      (*signatures)[(*n)++] = a;    }  }}/* * This routine verifies a  "multipart/signed"  body. */int mutt_signed_handler (BODY *a, STATE *s){  char tempfile[_POSIX_PATH_MAX];  char *protocol;  int protocol_major = TYPEOTHER;  char *protocol_minor = NULL;    BODY *b = a;  BODY **signatures = NULL;  int sigcnt = 0;  int i;  short goodsig = 1;  int rc = 0;  if (!WithCrypto)    return -1;  protocol = mutt_get_parameter ("protocol", a->parameter);  a = a->parts;  /* extract the protocol information */    if (protocol)  {    char major[STRING];    char *t;    if ((protocol_minor = strchr (protocol, '/'))) protocol_minor++;        strfcpy (major, protocol, sizeof(major));    if((t = strchr(major, '/')))      *t = '\0';        protocol_major = mutt_check_mime_type (major);  }  /* consistency check */  if (!(a && a->next && a->next->type == protocol_major &&       !mutt_strcasecmp (a->next->subtype, protocol_minor)))  {    state_attach_puts (_("[-- Error: "                         "Inconsistent multipart/signed structure! --]\n\n"),                       s);    return mutt_body_handler (a, s);  }    if ((WithCrypto & APPLICATION_PGP)      && protocol_major == TYPEAPPLICATION      && !ascii_strcasecmp (protocol_minor, "pgp-signature"))    ;  else if ((WithCrypto & APPLICATION_SMIME)           && protocol_major == TYPEAPPLICATION	   && !(ascii_strcasecmp (protocol_minor, "x-pkcs7-signature")	       && ascii_strcasecmp (protocol_minor, "pkcs7-signature")))    ;  else if (protocol_major == TYPEMULTIPART	   && !ascii_strcasecmp (protocol_minor, "mixed"))    ;  else  {    state_printf (s, _("[-- Error: "                       "Unknown multipart/signed protocol %s! --]\n\n"),                  protocol);    return mutt_body_handler (a, s);  }    if (s->flags & M_DISPLAY)  {        crypt_fetch_signatures (&signatures, a->next, &sigcnt);        if (sigcnt)    {      mutt_mktemp (tempfile);      if (crypt_write_signed (a, s, tempfile) == 0)      {	for (i = 0; i < sigcnt; i++)	{	  if ((WithCrypto & APPLICATION_PGP)              && signatures[i]->type == TYPEAPPLICATION 	      && !ascii_strcasecmp (signatures[i]->subtype, "pgp-signature"))	  {	    if (crypt_pgp_verify_one (signatures[i], s, tempfile) != 0)	      goodsig = 0;	    	    continue;	  }	  if ((WithCrypto & APPLICATION_SMIME)              && signatures[i]->type == TYPEAPPLICATION 	      && (!ascii_strcasecmp(signatures[i]->subtype, "x-pkcs7-signature")		  || !ascii_strcasecmp(signatures[i]->subtype, "pkcs7-signature")))	  {	    if (crypt_smime_verify_one (signatures[i], s, tempfile) != 0)	      goodsig = 0;	    	    continue;	  }	  state_printf (s, _("[-- Warning: "                             "We can't verify %s/%s signatures. --]\n\n"),			  TYPE(signatures[i]), signatures[i]->subtype);	}      }            mutt_unlink (tempfile);      b->goodsig = goodsig;      b->badsig  = !goodsig;            /* Now display the signed body */      state_attach_puts (_("[-- The following data is signed --]\n\n"), s);      FREE (&signatures);    }    else      state_attach_puts (_("[-- Warning: Can't find any signatures. --]\n\n"), s);  }    rc = mutt_body_handler (a, s);    if (s->flags & M_DISPLAY && sigcnt)    state_attach_puts (_("\n[-- End of signed data --]\n"), s);    return rc;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -