authsaslcram.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:2k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* $Id: authsaslcram.c,v 1.3 2000/06/29 01:40:18 mrsam Exp $ */
  2. /*
  3. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  4. ** distribution information.
  5. */
  6. #include "config.h"
  7. #include "random128/random128.h"
  8. #include "authsasl.h"
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #if HAVE_UNISTD_H
  12. #include <unistd.h>
  13. #endif
  14. #include <ctype.h>
  15. #include <stdio.h>
  16. #include <errno.h>
  17. int authsasl_cram(const char *method, const char *initresponse,
  18. char *(*getresp)(const char *),
  19. char **authtype,
  20. char **authdata)
  21. {
  22. const char *randtoken;
  23. char hostnamebuf[256];
  24. char *challenge;
  25. char *challenge_base64;
  26. char *response;
  27. char *chrsp;
  28. if (initresponse && *initresponse)
  29. {
  30. write(2, "authsasl_cram: invalid request.n", 32);
  31. return (AUTHSASL_ERROR);
  32. }
  33. randtoken=random128();
  34. hostnamebuf[0]=0;
  35. if (gethostname(hostnamebuf, sizeof(hostnamebuf)-1))
  36. strcpy(hostnamebuf, "cram");
  37. challenge=malloc(strlen(randtoken)+strlen(hostnamebuf)
  38. +sizeof("<@>"));
  39. if (!challenge)
  40. {
  41. perror("malloc");
  42. return (AUTHSASL_ERROR);
  43. }
  44. strcat(strcat(strcat(strcat(strcpy(challenge, "<"),
  45. randtoken), "@"), hostnamebuf), ">");
  46. challenge_base64=authsasl_tobase64(challenge, -1);
  47. free(challenge);
  48. if (!challenge_base64)
  49. {
  50. perror("malloc");
  51. return (AUTHSASL_ERROR);
  52. }
  53. response=getresp(challenge_base64);
  54. if (!response)
  55. {
  56. free(challenge_base64);
  57. return (AUTHSASL_ERROR);
  58. }
  59. if (*response == '*')
  60. {
  61. free(challenge_base64);
  62. return (AUTHSASL_ABORTED);
  63. }
  64. chrsp=malloc(strlen(challenge_base64)+strlen(response)+3);
  65. if (!chrsp)    
  66. {
  67. free(challenge_base64);
  68. free(response);
  69. perror("malloc");
  70. return (AUTHSASL_ERROR);
  71. }
  72. strcat(strcat(strcat(strcpy(chrsp, challenge_base64), "n"),
  73. response), "n");
  74. free(challenge_base64);
  75. free(response);
  76. if ( (*authtype=malloc(strlen(method)+1)) == 0)
  77. {
  78. free(chrsp);
  79. perror("malloc");
  80. return (AUTHSASL_ERROR);
  81. }
  82. strcpy( *authtype, method );
  83. *authdata=chrsp;
  84. for (chrsp= *authtype; *chrsp; chrsp++)
  85. *chrsp= tolower( (int)(unsigned char)*chrsp );
  86. return (AUTHSASL_OK);
  87. }