ruby-gpgme 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/MANIFEST +1 -0
  2. data/THANKS +13 -0
  3. data/gpgme_n.c +133 -7
  4. data/lib/gpgme.rb +131 -96
  5. metadata +3 -2
data/MANIFEST CHANGED
@@ -4,6 +4,7 @@ lib/gpgme/constants.rb
4
4
  COPYING
5
5
  COPYING.LESSER
6
6
  README
7
+ THANKS
7
8
  extconf.rb
8
9
  gpgme_n.c
9
10
  examples/genkey.rb
data/THANKS ADDED
@@ -0,0 +1,13 @@
1
+ Ruby-GPGME was originally written by Daiki Ueno. Other people
2
+ contributed by reporting problems, suggesting various improvements or
3
+ submitting actual code. Here is a list of those people. Help us keep
4
+ it complete and free of errors.
5
+
6
+
7
+
8
+ Carl Corliss
9
+ Kris Nuttycombe
10
+ Marc Dequènes
11
+ Rob Pitt
12
+ Rory McKinley
13
+ Sam Hall
data/gpgme_n.c CHANGED
@@ -80,6 +80,11 @@
80
80
  #define RARRAY_PTR(a) RARRAY(a)->ptr
81
81
  #endif
82
82
 
83
+ /* RSTRING_LEN is not available in 1.8.5. */
84
+ #ifndef RSTRING_LEN
85
+ #define RSTRING_LEN(a) RSTRING(a)->len
86
+ #endif
87
+
83
88
  #define WRAP_GPGME_DATA(dh) \
84
89
  Data_Wrap_Struct(cData, 0, gpgme_data_release, dh)
85
90
  /* `gpgme_data_t' is typedef'ed as `struct gpgme_data *'. */
@@ -414,6 +419,19 @@ rb_s_gpgme_new (VALUE dummy, VALUE rctx)
414
419
  return LONG2NUM(err);
415
420
  }
416
421
 
422
+ static VALUE
423
+ rb_s_gpgme_release (VALUE dummy, VALUE vctx)
424
+ {
425
+ gpgme_ctx_t ctx;
426
+
427
+ UNWRAP_GPGME_CTX(vctx, ctx);
428
+ if (!ctx)
429
+ rb_raise (rb_eArgError, "released ctx");
430
+ gpgme_release (ctx);
431
+ DATA_PTR(vctx) = NULL;
432
+ return Qnil;
433
+ }
434
+
417
435
  static VALUE
418
436
  rb_s_gpgme_set_protocol (VALUE dummy, VALUE vctx, VALUE vproto)
419
437
  {
@@ -421,6 +439,8 @@ rb_s_gpgme_set_protocol (VALUE dummy, VALUE vctx, VALUE vproto)
421
439
  gpgme_error_t err;
422
440
 
423
441
  UNWRAP_GPGME_CTX(vctx, ctx);
442
+ if (!ctx)
443
+ rb_raise (rb_eArgError, "released ctx");
424
444
  err = gpgme_set_protocol (ctx, NUM2INT(vproto));
425
445
  return LONG2NUM(err);
426
446
  }
@@ -432,6 +452,8 @@ rb_s_gpgme_get_protocol (VALUE dummy, VALUE vctx)
432
452
  gpgme_protocol_t proto;
433
453
 
434
454
  UNWRAP_GPGME_CTX(vctx, ctx);
455
+ if (!ctx)
456
+ rb_raise (rb_eArgError, "released ctx");
435
457
  proto = gpgme_get_protocol (ctx);
436
458
  return INT2FIX(proto);
437
459
  }
@@ -442,6 +464,8 @@ rb_s_gpgme_set_armor (VALUE dummy, VALUE vctx, VALUE vyes)
442
464
  gpgme_ctx_t ctx;
443
465
 
444
466
  UNWRAP_GPGME_CTX(vctx, ctx);
467
+ if (!ctx)
468
+ rb_raise (rb_eArgError, "released ctx");
445
469
  gpgme_set_armor (ctx, NUM2INT(vyes));
446
470
 
447
471
  return Qnil;
@@ -454,6 +478,8 @@ rb_s_gpgme_get_armor (VALUE dummy, VALUE vctx)
454
478
  int yes;
455
479
 
456
480
  UNWRAP_GPGME_CTX(vctx, ctx);
481
+ if (!ctx)
482
+ rb_raise (rb_eArgError, "released ctx");
457
483
  yes = gpgme_get_armor (ctx);
458
484
  return INT2FIX(yes);
459
485
  }
@@ -464,6 +490,8 @@ rb_s_gpgme_set_textmode (VALUE dummy, VALUE vctx, VALUE vyes)
464
490
  gpgme_ctx_t ctx;
465
491
 
466
492
  UNWRAP_GPGME_CTX(vctx, ctx);
493
+ if (!ctx)
494
+ rb_raise (rb_eArgError, "released ctx");
467
495
  gpgme_set_textmode (ctx, NUM2INT(vyes));
468
496
  return Qnil;
469
497
  }
@@ -475,6 +503,8 @@ rb_s_gpgme_get_textmode (VALUE dummy, VALUE vctx)
475
503
  int yes;
476
504
 
477
505
  UNWRAP_GPGME_CTX(vctx, ctx);
506
+ if (!ctx)
507
+ rb_raise (rb_eArgError, "released ctx");
478
508
  yes = gpgme_get_textmode (ctx);
479
509
  return INT2FIX(yes);
480
510
  }
@@ -485,6 +515,8 @@ rb_s_gpgme_set_include_certs (VALUE dummy, VALUE vctx, VALUE vnr_of_certs)
485
515
  gpgme_ctx_t ctx;
486
516
 
487
517
  UNWRAP_GPGME_CTX(vctx, ctx);
518
+ if (!ctx)
519
+ rb_raise (rb_eArgError, "released ctx");
488
520
  gpgme_set_include_certs (ctx, NUM2INT(vnr_of_certs));
489
521
  return Qnil;
490
522
  }
@@ -496,6 +528,8 @@ rb_s_gpgme_get_include_certs (VALUE dummy, VALUE vctx)
496
528
  gpgme_error_t err;
497
529
 
498
530
  UNWRAP_GPGME_CTX(vctx, ctx);
531
+ if (!ctx)
532
+ rb_raise (rb_eArgError, "released ctx");
499
533
  err = gpgme_get_include_certs (ctx);
500
534
  return LONG2NUM(err);
501
535
  }
@@ -507,6 +541,8 @@ rb_s_gpgme_set_keylist_mode (VALUE dummy, VALUE vctx, VALUE vmode)
507
541
  gpgme_error_t err;
508
542
 
509
543
  UNWRAP_GPGME_CTX(vctx, ctx);
544
+ if (!ctx)
545
+ rb_raise (rb_eArgError, "released ctx");
510
546
  err = gpgme_set_keylist_mode (ctx, NUM2INT(vmode));
511
547
  return LONG2NUM(err);
512
548
  }
@@ -518,6 +554,8 @@ rb_s_gpgme_get_keylist_mode (VALUE dummy, VALUE vctx)
518
554
  int mode;
519
555
 
520
556
  UNWRAP_GPGME_CTX(vctx, ctx);
557
+ if (!ctx)
558
+ rb_raise (rb_eArgError, "released ctx");
521
559
  mode = gpgme_get_keylist_mode (ctx);
522
560
  return INT2FIX(mode);
523
561
  }
@@ -553,6 +591,8 @@ rb_s_gpgme_set_passphrase_cb (VALUE dummy, VALUE vctx, VALUE vpassfunc,
553
591
  rb_iv_set (vctx, "@passphrase_cb", vcb);
554
592
 
555
593
  UNWRAP_GPGME_CTX(vctx, ctx);
594
+ if (!ctx)
595
+ rb_raise (rb_eArgError, "released ctx");
556
596
  gpgme_set_passphrase_cb (ctx, passphrase_cb, (void*)vcb);
557
597
  return Qnil;
558
598
  }
@@ -595,6 +635,8 @@ rb_s_gpgme_set_progress_cb (VALUE dummy, VALUE vctx, VALUE vprogfunc,
595
635
  rb_iv_set (vctx, "@progress_cb", vcb);
596
636
 
597
637
  UNWRAP_GPGME_CTX(vctx, ctx);
638
+ if (!ctx)
639
+ rb_raise (rb_eArgError, "released ctx");
598
640
  gpgme_set_progress_cb (ctx, progress_cb, (void*)vcb);
599
641
 
600
642
  return Qnil;
@@ -617,6 +659,8 @@ rb_s_gpgme_set_locale (VALUE dummy, VALUE vctx, VALUE vcategory, VALUE vvalue)
617
659
  gpgme_error_t err;
618
660
 
619
661
  UNWRAP_GPGME_CTX(vctx, ctx);
662
+ if (!ctx)
663
+ rb_raise (rb_eArgError, "released ctx");
620
664
 
621
665
  err = gpgme_set_locale (ctx, NUM2INT(vcategory), StringValueCStr(vvalue));
622
666
  return LONG2NUM(err);
@@ -632,6 +676,8 @@ rb_s_gpgme_op_keylist_start (VALUE dummy, VALUE vctx, VALUE vpattern,
632
676
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
633
677
 
634
678
  UNWRAP_GPGME_CTX(vctx, ctx);
679
+ if (!ctx)
680
+ rb_raise (rb_eArgError, "released ctx");
635
681
 
636
682
  err = gpgme_op_keylist_start (ctx, NIL_P(vpattern) ? NULL :
637
683
  StringValueCStr(vpattern),
@@ -652,6 +698,8 @@ rb_s_gpgme_op_keylist_ext_start (VALUE dummy, VALUE vctx, VALUE vpattern,
652
698
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
653
699
 
654
700
  UNWRAP_GPGME_CTX(vctx, ctx);
701
+ if (!ctx)
702
+ rb_raise (rb_eArgError, "released ctx");
655
703
 
656
704
  if (!NIL_P(vpattern))
657
705
  {
@@ -763,6 +811,8 @@ rb_s_gpgme_op_keylist_next (VALUE dummy, VALUE vctx, VALUE rkey)
763
811
  CHECK_KEYLIST_IN_PROGRESS(vctx);
764
812
 
765
813
  UNWRAP_GPGME_CTX(vctx, ctx);
814
+ if (!ctx)
815
+ rb_raise (rb_eArgError, "released ctx");
766
816
 
767
817
  err = gpgme_op_keylist_next (ctx, &key);
768
818
  if (gpgme_err_code(err) == GPG_ERR_NO_ERROR)
@@ -783,6 +833,8 @@ rb_s_gpgme_op_keylist_end (VALUE dummy, VALUE vctx)
783
833
  CHECK_KEYLIST_IN_PROGRESS(vctx);
784
834
 
785
835
  UNWRAP_GPGME_CTX(vctx, ctx);
836
+ if (!ctx)
837
+ rb_raise (rb_eArgError, "released ctx");
786
838
 
787
839
  err = gpgme_op_keylist_end (ctx);
788
840
  RESET_KEYLIST_IN_PROGRESS(vctx);
@@ -798,6 +850,8 @@ rb_s_gpgme_get_key (VALUE dummy, VALUE vctx, VALUE vfpr, VALUE rkey,
798
850
  gpgme_key_t key;
799
851
 
800
852
  UNWRAP_GPGME_CTX(vctx, ctx);
853
+ if (!ctx)
854
+ rb_raise (rb_eArgError, "released ctx");
801
855
  err = gpgme_get_key (ctx, StringValueCStr(vfpr), &key, NUM2INT(vsecret));
802
856
 
803
857
  if (gpgme_err_code(err) == GPG_ERR_NO_ERROR)
@@ -820,6 +874,8 @@ rb_s_gpgme_op_genkey (VALUE dummy, VALUE vctx, VALUE vparms, VALUE vpubkey,
820
874
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
821
875
 
822
876
  UNWRAP_GPGME_CTX(vctx, ctx);
877
+ if (!ctx)
878
+ rb_raise (rb_eArgError, "released ctx");
823
879
  if (!NIL_P(vpubkey))
824
880
  UNWRAP_GPGME_DATA(vpubkey, pubkey);
825
881
  if (!NIL_P(vseckey))
@@ -840,6 +896,8 @@ rb_s_gpgme_op_genkey_start (VALUE dummy, VALUE vctx, VALUE vparms,
840
896
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
841
897
 
842
898
  UNWRAP_GPGME_CTX(vctx, ctx);
899
+ if (!ctx)
900
+ rb_raise (rb_eArgError, "released ctx");
843
901
  if (!NIL_P(vpubkey))
844
902
  UNWRAP_GPGME_DATA(vpubkey, pubkey);
845
903
  if (!NIL_P(vseckey))
@@ -860,6 +918,8 @@ rb_s_gpgme_op_export (VALUE dummy, VALUE vctx, VALUE vpattern, VALUE vreserved,
860
918
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
861
919
 
862
920
  UNWRAP_GPGME_CTX(vctx, ctx);
921
+ if (!ctx)
922
+ rb_raise (rb_eArgError, "released ctx");
863
923
  UNWRAP_GPGME_DATA(vkeydata, keydata);
864
924
 
865
925
  err = gpgme_op_export (ctx, StringValueCStr(vpattern), NUM2UINT(vreserved),
@@ -878,6 +938,8 @@ rb_s_gpgme_op_export_start (VALUE dummy, VALUE vctx, VALUE vpattern,
878
938
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
879
939
 
880
940
  UNWRAP_GPGME_CTX(vctx, ctx);
941
+ if (!ctx)
942
+ rb_raise (rb_eArgError, "released ctx");
881
943
  UNWRAP_GPGME_DATA(vkeydata, keydata);
882
944
 
883
945
  err = gpgme_op_export_start (ctx, StringValueCStr(vpattern),
@@ -895,6 +957,8 @@ rb_s_gpgme_op_import (VALUE dummy, VALUE vctx, VALUE vkeydata)
895
957
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
896
958
 
897
959
  UNWRAP_GPGME_CTX(vctx, ctx);
960
+ if (!ctx)
961
+ rb_raise (rb_eArgError, "released ctx");
898
962
  UNWRAP_GPGME_DATA(vkeydata, keydata);
899
963
 
900
964
  err = gpgme_op_import (ctx, keydata);
@@ -911,6 +975,8 @@ rb_s_gpgme_op_import_start (VALUE dummy, VALUE vctx, VALUE vkeydata)
911
975
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
912
976
 
913
977
  UNWRAP_GPGME_CTX(vctx, ctx);
978
+ if (!ctx)
979
+ rb_raise (rb_eArgError, "released ctx");
914
980
  UNWRAP_GPGME_DATA(vkeydata, keydata);
915
981
 
916
982
  err = gpgme_op_import_start (ctx, keydata);
@@ -926,6 +992,8 @@ rb_s_gpgme_op_import_result (VALUE dummy, VALUE vctx)
926
992
  VALUE vresult, vimports;
927
993
 
928
994
  UNWRAP_GPGME_CTX(vctx, ctx);
995
+ if (!ctx)
996
+ rb_raise (rb_eArgError, "released ctx");
929
997
 
930
998
  result = gpgme_op_import_result (ctx);
931
999
  vresult = rb_class_new_instance (0, NULL, cImportResult);
@@ -967,6 +1035,8 @@ rb_s_gpgme_op_delete (VALUE dummy, VALUE vctx, VALUE vkey, VALUE vallow_secret)
967
1035
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
968
1036
 
969
1037
  UNWRAP_GPGME_CTX(vctx, ctx);
1038
+ if (!ctx)
1039
+ rb_raise (rb_eArgError, "released ctx");
970
1040
  UNWRAP_GPGME_KEY(vkey, key);
971
1041
 
972
1042
  err = gpgme_op_delete (ctx, key, NUM2INT(vallow_secret));
@@ -984,6 +1054,8 @@ rb_s_gpgme_op_delete_start (VALUE dummy, VALUE vctx, VALUE vkey,
984
1054
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
985
1055
 
986
1056
  UNWRAP_GPGME_CTX(vctx, ctx);
1057
+ if (!ctx)
1058
+ rb_raise (rb_eArgError, "released ctx");
987
1059
  UNWRAP_GPGME_KEY(vkey, key);
988
1060
 
989
1061
  err = gpgme_op_delete_start (ctx, key, NUM2INT(vallow_secret));
@@ -1010,13 +1082,14 @@ rb_s_gpgme_op_edit (VALUE dummy, VALUE vctx, VALUE vkey,
1010
1082
  gpgme_ctx_t ctx;
1011
1083
  gpgme_key_t key;
1012
1084
  gpgme_data_t out = NULL;
1013
- void *hook_value = NULL;
1014
1085
  VALUE vcb;
1015
1086
  gpgme_error_t err;
1016
1087
 
1017
1088
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1018
1089
 
1019
1090
  UNWRAP_GPGME_CTX(vctx, ctx);
1091
+ if (!ctx)
1092
+ rb_raise (rb_eArgError, "released ctx");
1020
1093
  UNWRAP_GPGME_KEY(vkey, key);
1021
1094
  if (!NIL_P(vout))
1022
1095
  UNWRAP_GPGME_DATA(vout, out);
@@ -1038,13 +1111,14 @@ rb_s_gpgme_op_edit_start (VALUE dummy, VALUE vctx, VALUE vkey,
1038
1111
  gpgme_ctx_t ctx;
1039
1112
  gpgme_key_t key;
1040
1113
  gpgme_data_t out = NULL;
1041
- void *hook_value = NULL;
1042
1114
  VALUE vcb;
1043
1115
  gpgme_error_t err;
1044
1116
 
1045
1117
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1046
1118
 
1047
1119
  UNWRAP_GPGME_CTX(vctx, ctx);
1120
+ if (!ctx)
1121
+ rb_raise (rb_eArgError, "released ctx");
1048
1122
  UNWRAP_GPGME_KEY(vkey, key);
1049
1123
  if (!NIL_P(vout))
1050
1124
  UNWRAP_GPGME_DATA(vout, out);
@@ -1066,13 +1140,14 @@ rb_s_gpgme_op_card_edit (VALUE dummy, VALUE vctx, VALUE vkey,
1066
1140
  gpgme_ctx_t ctx;
1067
1141
  gpgme_key_t key;
1068
1142
  gpgme_data_t out = NULL;
1069
- void *hook_value = NULL;
1070
1143
  VALUE vcb;
1071
1144
  gpgme_error_t err;
1072
1145
 
1073
1146
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1074
1147
 
1075
1148
  UNWRAP_GPGME_CTX(vctx, ctx);
1149
+ if (!ctx)
1150
+ rb_raise (rb_eArgError, "released ctx");
1076
1151
  UNWRAP_GPGME_KEY(vkey, key);
1077
1152
  if (!NIL_P(vout))
1078
1153
  UNWRAP_GPGME_DATA(vout, out);
@@ -1094,13 +1169,14 @@ rb_s_gpgme_op_card_edit_start (VALUE dummy, VALUE vctx, VALUE vkey,
1094
1169
  gpgme_ctx_t ctx;
1095
1170
  gpgme_key_t key;
1096
1171
  gpgme_data_t out = NULL;
1097
- void *hook_value = NULL;
1098
1172
  VALUE vcb;
1099
1173
  gpgme_error_t err;
1100
1174
 
1101
1175
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1102
1176
 
1103
1177
  UNWRAP_GPGME_CTX(vctx, ctx);
1178
+ if (!ctx)
1179
+ rb_raise (rb_eArgError, "released ctx");
1104
1180
  UNWRAP_GPGME_KEY(vkey, key);
1105
1181
  if (!NIL_P(vout))
1106
1182
  UNWRAP_GPGME_DATA(vout, out);
@@ -1125,6 +1201,8 @@ rb_s_gpgme_op_trustlist_start (VALUE dummy, VALUE vctx, VALUE vpattern,
1125
1201
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1126
1202
 
1127
1203
  UNWRAP_GPGME_CTX(vctx, ctx);
1204
+ if (!ctx)
1205
+ rb_raise (rb_eArgError, "released ctx");
1128
1206
  err = gpgme_op_trustlist_start (ctx, StringValueCStr(vpattern),
1129
1207
  NUM2INT(vmax_level));
1130
1208
  return LONG2NUM(err);
@@ -1141,6 +1219,8 @@ rb_s_gpgme_op_trustlist_next (VALUE dummy, VALUE vctx, VALUE ritem)
1141
1219
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1142
1220
 
1143
1221
  UNWRAP_GPGME_CTX(vctx, ctx);
1222
+ if (!ctx)
1223
+ rb_raise (rb_eArgError, "released ctx");
1144
1224
 
1145
1225
  err = gpgme_op_trustlist_next (ctx, &item);
1146
1226
  if (gpgme_err_code(err) == GPG_ERR_NO_ERROR)
@@ -1168,6 +1248,8 @@ rb_s_gpgme_op_trustlist_end (VALUE dummy, VALUE vctx)
1168
1248
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1169
1249
 
1170
1250
  UNWRAP_GPGME_CTX(vctx, ctx);
1251
+ if (!ctx)
1252
+ rb_raise (rb_eArgError, "released ctx");
1171
1253
 
1172
1254
  err = gpgme_op_trustlist_end (ctx);
1173
1255
  return LONG2NUM(err);
@@ -1183,6 +1265,8 @@ rb_s_gpgme_op_decrypt (VALUE dummy, VALUE vctx, VALUE vcipher, VALUE vplain)
1183
1265
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1184
1266
 
1185
1267
  UNWRAP_GPGME_CTX(vctx, ctx);
1268
+ if (!ctx)
1269
+ rb_raise (rb_eArgError, "released ctx");
1186
1270
  UNWRAP_GPGME_DATA(vcipher, cipher);
1187
1271
  UNWRAP_GPGME_DATA(vplain, plain);
1188
1272
 
@@ -1201,6 +1285,8 @@ rb_s_gpgme_op_decrypt_start (VALUE dummy, VALUE vctx, VALUE vcipher,
1201
1285
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1202
1286
 
1203
1287
  UNWRAP_GPGME_CTX(vctx, ctx);
1288
+ if (!ctx)
1289
+ rb_raise (rb_eArgError, "released ctx");
1204
1290
  UNWRAP_GPGME_DATA(vcipher, cipher);
1205
1291
  UNWRAP_GPGME_DATA(vplain, plain);
1206
1292
 
@@ -1216,6 +1302,8 @@ rb_s_gpgme_op_decrypt_result (VALUE dummy, VALUE vctx)
1216
1302
  VALUE vresult;
1217
1303
 
1218
1304
  UNWRAP_GPGME_CTX(vctx, ctx);
1305
+ if (!ctx)
1306
+ rb_raise (rb_eArgError, "released ctx");
1219
1307
 
1220
1308
  result = gpgme_op_decrypt_result (ctx);
1221
1309
  vresult = rb_class_new_instance (0, NULL, cDecryptResult);
@@ -1237,6 +1325,8 @@ rb_s_gpgme_op_verify (VALUE dummy, VALUE vctx, VALUE vsig, VALUE vsigned_text,
1237
1325
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1238
1326
 
1239
1327
  UNWRAP_GPGME_CTX(vctx, ctx);
1328
+ if (!ctx)
1329
+ rb_raise (rb_eArgError, "released ctx");
1240
1330
  UNWRAP_GPGME_DATA(vsig, sig);
1241
1331
  if (!NIL_P(vsigned_text))
1242
1332
  UNWRAP_GPGME_DATA(vsigned_text, signed_text);
@@ -1258,6 +1348,8 @@ rb_s_gpgme_op_verify_start (VALUE dummy, VALUE vctx, VALUE vsig,
1258
1348
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1259
1349
 
1260
1350
  UNWRAP_GPGME_CTX(vctx, ctx);
1351
+ if (!ctx)
1352
+ rb_raise (rb_eArgError, "released ctx");
1261
1353
  UNWRAP_GPGME_DATA(vsig, sig);
1262
1354
  if (!NIL_P(vsigned_text))
1263
1355
  UNWRAP_GPGME_DATA(vsigned_text, signed_text);
@@ -1277,6 +1369,8 @@ rb_s_gpgme_op_verify_result (VALUE dummy, VALUE vctx)
1277
1369
  VALUE vverify_result, vsignatures = rb_ary_new ();
1278
1370
 
1279
1371
  UNWRAP_GPGME_CTX(vctx, ctx);
1372
+ if (!ctx)
1373
+ rb_raise (rb_eArgError, "released ctx");
1280
1374
 
1281
1375
  verify_result = gpgme_op_verify_result (ctx);
1282
1376
  vverify_result = rb_class_new_instance(0, NULL, cVerifyResult);
@@ -1329,6 +1423,8 @@ rb_s_gpgme_op_decrypt_verify (VALUE dummy, VALUE vctx, VALUE vcipher,
1329
1423
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1330
1424
 
1331
1425
  UNWRAP_GPGME_CTX(vctx, ctx);
1426
+ if (!ctx)
1427
+ rb_raise (rb_eArgError, "released ctx");
1332
1428
  UNWRAP_GPGME_DATA(vcipher, cipher);
1333
1429
  UNWRAP_GPGME_DATA(vplain, plain);
1334
1430
 
@@ -1347,6 +1443,8 @@ rb_s_gpgme_op_decrypt_verify_start (VALUE dummy, VALUE vctx, VALUE vcipher,
1347
1443
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1348
1444
 
1349
1445
  UNWRAP_GPGME_CTX(vctx, ctx);
1446
+ if (!ctx)
1447
+ rb_raise (rb_eArgError, "released ctx");
1350
1448
  UNWRAP_GPGME_DATA(vcipher, cipher);
1351
1449
  UNWRAP_GPGME_DATA(vplain, plain);
1352
1450
 
@@ -1360,6 +1458,8 @@ rb_s_gpgme_signers_clear (VALUE dummy, VALUE vctx)
1360
1458
  gpgme_ctx_t ctx;
1361
1459
 
1362
1460
  UNWRAP_GPGME_CTX(vctx, ctx);
1461
+ if (!ctx)
1462
+ rb_raise (rb_eArgError, "released ctx");
1363
1463
  gpgme_signers_clear (ctx);
1364
1464
  return Qnil;
1365
1465
  }
@@ -1372,6 +1472,8 @@ rb_s_gpgme_signers_add (VALUE dummy, VALUE vctx, VALUE vkey)
1372
1472
  gpgme_error_t err;
1373
1473
 
1374
1474
  UNWRAP_GPGME_CTX(vctx, ctx);
1475
+ if (!ctx)
1476
+ rb_raise (rb_eArgError, "released ctx");
1375
1477
  UNWRAP_GPGME_KEY(vkey, key);
1376
1478
 
1377
1479
  err = gpgme_signers_add (ctx, key);
@@ -1385,6 +1487,8 @@ rb_s_gpgme_signers_enum (VALUE dummy, VALUE vctx, VALUE vseq)
1385
1487
  gpgme_key_t key;
1386
1488
 
1387
1489
  UNWRAP_GPGME_CTX(vctx, ctx);
1490
+ if (!ctx)
1491
+ rb_raise (rb_eArgError, "released ctx");
1388
1492
 
1389
1493
  key = gpgme_signers_enum (ctx, NUM2INT(vseq));
1390
1494
  if (!key)
@@ -1403,6 +1507,8 @@ rb_s_gpgme_op_sign (VALUE dummy, VALUE vctx, VALUE vplain, VALUE vsig,
1403
1507
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1404
1508
 
1405
1509
  UNWRAP_GPGME_CTX(vctx, ctx);
1510
+ if (!ctx)
1511
+ rb_raise (rb_eArgError, "released ctx");
1406
1512
  UNWRAP_GPGME_DATA(vplain, plain);
1407
1513
  UNWRAP_GPGME_DATA(vsig, sig);
1408
1514
 
@@ -1421,6 +1527,8 @@ rb_s_gpgme_op_sign_start (VALUE dummy, VALUE vctx, VALUE vplain, VALUE vsig,
1421
1527
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1422
1528
 
1423
1529
  UNWRAP_GPGME_CTX(vctx, ctx);
1530
+ if (!ctx)
1531
+ rb_raise (rb_eArgError, "released ctx");
1424
1532
  UNWRAP_GPGME_DATA(vplain, plain);
1425
1533
  UNWRAP_GPGME_DATA(vsig, sig);
1426
1534
 
@@ -1438,6 +1546,8 @@ rb_s_gpgme_op_sign_result (VALUE dummy, VALUE vctx)
1438
1546
  VALUE vresult, vinvalid_signers, vsignatures;
1439
1547
 
1440
1548
  UNWRAP_GPGME_CTX(vctx, ctx);
1549
+ if (!ctx)
1550
+ rb_raise (rb_eArgError, "released ctx");
1441
1551
 
1442
1552
  result = gpgme_op_sign_result (ctx);
1443
1553
  vresult = rb_class_new_instance (0, NULL, cSignResult);
@@ -1486,6 +1596,8 @@ rb_s_gpgme_op_encrypt (VALUE dummy, VALUE vctx, VALUE vrecp, VALUE vflags,
1486
1596
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1487
1597
 
1488
1598
  UNWRAP_GPGME_CTX(vctx, ctx);
1599
+ if (!ctx)
1600
+ rb_raise (rb_eArgError, "released ctx");
1489
1601
  /* If RECP is `NULL', symmetric rather than public key encryption is
1490
1602
  performed. */
1491
1603
  if (!NIL_P(vrecp))
@@ -1517,6 +1629,8 @@ rb_s_gpgme_op_encrypt_start (VALUE dummy, VALUE vctx, VALUE vrecp,
1517
1629
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1518
1630
 
1519
1631
  UNWRAP_GPGME_CTX(vctx, ctx);
1632
+ if (!ctx)
1633
+ rb_raise (rb_eArgError, "released ctx");
1520
1634
  /* If RECP is `NULL', symmetric rather than public key encryption is
1521
1635
  performed. */
1522
1636
  if (!NIL_P(vrecp))
@@ -1547,6 +1661,8 @@ rb_s_gpgme_op_encrypt_result (VALUE dummy, VALUE vctx)
1547
1661
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1548
1662
 
1549
1663
  UNWRAP_GPGME_CTX(vctx, ctx);
1664
+ if (!ctx)
1665
+ rb_raise (rb_eArgError, "released ctx");
1550
1666
 
1551
1667
  result = gpgme_op_encrypt_result (ctx);
1552
1668
  vresult = rb_class_new_instance (0, NULL, cEncryptResult);
@@ -1576,6 +1692,8 @@ rb_s_gpgme_op_encrypt_sign (VALUE dummy, VALUE vctx, VALUE vrecp, VALUE vflags,
1576
1692
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1577
1693
 
1578
1694
  UNWRAP_GPGME_CTX(vctx, ctx);
1695
+ if (!ctx)
1696
+ rb_raise (rb_eArgError, "released ctx");
1579
1697
  /* If RECP is `NULL', symmetric rather than public key encryption is
1580
1698
  performed. */
1581
1699
  if (!NIL_P(vrecp))
@@ -1607,6 +1725,8 @@ rb_s_gpgme_op_encrypt_sign_start (VALUE dummy, VALUE vctx, VALUE vrecp,
1607
1725
  CHECK_KEYLIST_NOT_IN_PROGRESS(vctx);
1608
1726
 
1609
1727
  UNWRAP_GPGME_CTX(vctx, ctx);
1728
+ if (!ctx)
1729
+ rb_raise (rb_eArgError, "released ctx");
1610
1730
  /* If RECP is `NULL', symmetric rather than public key encryption is
1611
1731
  performed. */
1612
1732
  if (!NIL_P(vrecp))
@@ -1636,7 +1756,11 @@ rb_s_gpgme_wait (VALUE dummy, VALUE vctx, VALUE rstatus, VALUE vhang)
1636
1756
  /* The CTX argument can be `NULL'. In that case, `gpgme_wait' waits
1637
1757
  for any context to complete its operation. */
1638
1758
  if (!NIL_P(vctx))
1639
- UNWRAP_GPGME_CTX(vctx, ctx);
1759
+ {
1760
+ UNWRAP_GPGME_CTX(vctx, ctx);
1761
+ if (!ctx)
1762
+ rb_raise (rb_eArgError, "released ctx");
1763
+ }
1640
1764
 
1641
1765
  ret = gpgme_wait (ctx, &status, NUM2INT(vhang));
1642
1766
  if (ret)
@@ -1742,6 +1866,8 @@ Init_gpgme_n (void)
1742
1866
  /* Creating Contexts */
1743
1867
  rb_define_module_function (mGPGME, "gpgme_new",
1744
1868
  rb_s_gpgme_new, 1);
1869
+ rb_define_module_function (mGPGME, "gpgme_release",
1870
+ rb_s_gpgme_release, 1);
1745
1871
 
1746
1872
  /* Context Attributes */
1747
1873
  rb_define_module_function (mGPGME, "gpgme_set_protocol",
@@ -1809,9 +1935,9 @@ Init_gpgme_n (void)
1809
1935
  rb_define_module_function (mGPGME, "gpgme_op_edit_start",
1810
1936
  rb_s_gpgme_op_edit_start, 5);
1811
1937
  rb_define_module_function (mGPGME, "gpgme_op_card_edit",
1812
- rb_s_gpgme_op_edit, 5);
1938
+ rb_s_gpgme_op_card_edit, 5);
1813
1939
  rb_define_module_function (mGPGME, "gpgme_op_card_edit_start",
1814
- rb_s_gpgme_op_edit_start, 5);
1940
+ rb_s_gpgme_op_card_edit_start, 5);
1815
1941
 
1816
1942
  /* Trust Item Management */
1817
1943
  rb_define_module_function (mGPGME, "gpgme_op_trustlist_start",
data/lib/gpgme.rb CHANGED
@@ -123,29 +123,30 @@ def GPGME.decrypt(cipher, *args_options)
123
123
  args, options = split_args(args_options)
124
124
  plain = args[0]
125
125
 
126
- ctx = GPGME::Ctx.new(options)
127
- cipher_data = input_data(cipher)
128
- plain_data = output_data(plain)
129
- begin
130
- ctx.decrypt_verify(cipher_data, plain_data)
131
- rescue GPGME::Error::UnsupportedAlgorithm => exc
132
- exc.algorithm = ctx.decrypt_result.unsupported_algorithm
133
- raise exc
134
- rescue GPGME::Error::WrongKeyUsage => exc
135
- exc.key_usage = ctx.decrypt_result.wrong_key_usage
136
- raise exc
137
- end
138
-
139
- verify_result = ctx.verify_result
140
- if verify_result && block_given?
141
- verify_result.signatures.each do |signature|
142
- yield signature
126
+ GPGME::Ctx.new(options) do |ctx|
127
+ cipher_data = input_data(cipher)
128
+ plain_data = output_data(plain)
129
+ begin
130
+ ctx.decrypt_verify(cipher_data, plain_data)
131
+ rescue GPGME::Error::UnsupportedAlgorithm => exc
132
+ exc.algorithm = ctx.decrypt_result.unsupported_algorithm
133
+ raise exc
134
+ rescue GPGME::Error::WrongKeyUsage => exc
135
+ exc.key_usage = ctx.decrypt_result.wrong_key_usage
136
+ raise exc
137
+ end
138
+
139
+ verify_result = ctx.verify_result
140
+ if verify_result && block_given?
141
+ verify_result.signatures.each do |signature|
142
+ yield signature
143
+ end
143
144
  end
144
- end
145
145
 
146
- unless plain
147
- plain_data.seek(0, IO::SEEK_SET)
148
- plain_data.read
146
+ unless plain
147
+ plain_data.seek(0, IO::SEEK_SET)
148
+ plain_data.read
149
+ end
149
150
  end
150
151
  end
151
152
 
@@ -181,22 +182,23 @@ def GPGME.verify(sig, *args_options) # :yields: signature
181
182
  args, options = split_args(args_options)
182
183
  signed_text, plain = args
183
184
 
184
- ctx = GPGME::Ctx.new(options)
185
- sig_data = input_data(sig)
186
- if signed_text
187
- signed_text_data = input_data(signed_text)
188
- plain_data = nil
189
- else
190
- signed_text_data = nil
191
- plain_data = output_data(plain)
192
- end
193
- ctx.verify(sig_data, signed_text_data, plain_data)
194
- ctx.verify_result.signatures.each do |signature|
195
- yield signature
196
- end
197
- if !signed_text && !plain
198
- plain_data.seek(0, IO::SEEK_SET)
199
- plain_data.read
185
+ GPGME::Ctx.new(options) do |ctx|
186
+ sig_data = input_data(sig)
187
+ if signed_text
188
+ signed_text_data = input_data(signed_text)
189
+ plain_data = nil
190
+ else
191
+ signed_text_data = nil
192
+ plain_data = output_data(plain)
193
+ end
194
+ ctx.verify(sig_data, signed_text_data, plain_data)
195
+ ctx.verify_result.signatures.each do |signature|
196
+ yield signature
197
+ end
198
+ if !signed_text && !plain
199
+ plain_data.seek(0, IO::SEEK_SET)
200
+ plain_data.read
201
+ end
200
202
  end
201
203
  end
202
204
 
@@ -234,21 +236,22 @@ def GPGME.sign(plain, *args_options)
234
236
  args, options = split_args(args_options)
235
237
  sig = args[0]
236
238
 
237
- ctx = GPGME::Ctx.new(options)
238
- ctx.add_signer(*resolve_keys(options[:signers], true)) if options[:signers]
239
- mode = options[:mode] || GPGME::SIG_MODE_NORMAL
240
- plain_data = input_data(plain)
241
- sig_data = output_data(sig)
242
- begin
243
- ctx.sign(plain_data, sig_data, mode)
244
- rescue GPGME::Error::UnusableSecretKey => exc
245
- exc.keys = ctx.sign_result.invalid_signers
246
- raise exc
247
- end
239
+ GPGME::Ctx.new(options) do |ctx|
240
+ ctx.add_signer(*resolve_keys(options[:signers], true, [:sign])) if options[:signers]
241
+ mode = options[:mode] || GPGME::SIG_MODE_NORMAL
242
+ plain_data = input_data(plain)
243
+ sig_data = output_data(sig)
244
+ begin
245
+ ctx.sign(plain_data, sig_data, mode)
246
+ rescue GPGME::Error::UnusableSecretKey => exc
247
+ exc.keys = ctx.sign_result.invalid_signers
248
+ raise exc
249
+ end
248
250
 
249
- unless sig
250
- sig_data.seek(0, IO::SEEK_SET)
251
- sig_data.read
251
+ unless sig
252
+ sig_data.seek(0, IO::SEEK_SET)
253
+ sig_data.read
254
+ end
252
255
  end
253
256
  end
254
257
 
@@ -353,35 +356,36 @@ def GPGME.encrypt(recipients, plain, *args_options)
353
356
  raise ArgumentError, 'wrong number of arguments' if args_options.length > 3
354
357
  args, options = split_args(args_options)
355
358
  cipher = args[0]
356
- recipient_keys = recipients ? resolve_keys(recipients, false) : nil
357
-
358
- ctx = GPGME::Ctx.new(options)
359
- plain_data = input_data(plain)
360
- cipher_data = output_data(cipher)
361
- begin
362
- flags = 0
363
- if options[:always_trust]
364
- flags |= GPGME::ENCRYPT_ALWAYS_TRUST
365
- end
366
- if options[:sign]
367
- if options[:signers]
368
- ctx.add_signer(*resolve_keys(options[:signers], true))
359
+ recipient_keys = recipients ? resolve_keys(recipients, false, [:encrypt]) : nil
360
+
361
+ GPGME::Ctx.new(options) do |ctx|
362
+ plain_data = input_data(plain)
363
+ cipher_data = output_data(cipher)
364
+ begin
365
+ flags = 0
366
+ if options[:always_trust]
367
+ flags |= GPGME::ENCRYPT_ALWAYS_TRUST
369
368
  end
370
- ctx.encrypt_sign(recipient_keys, plain_data, cipher_data, flags)
371
- else
372
- ctx.encrypt(recipient_keys, plain_data, cipher_data, flags)
373
- end
374
- rescue GPGME::Error::UnusablePublicKey => exc
375
- exc.keys = ctx.encrypt_result.invalid_recipients
376
- raise exc
377
- rescue GPGME::Error::UnusableSecretKey => exc
378
- exc.keys = ctx.sign_result.invalid_signers
379
- raise exc
380
- end
369
+ if options[:sign]
370
+ if options[:signers]
371
+ ctx.add_signer(*resolve_keys(options[:signers], true, [:sign]))
372
+ end
373
+ ctx.encrypt_sign(recipient_keys, plain_data, cipher_data, flags)
374
+ else
375
+ ctx.encrypt(recipient_keys, plain_data, cipher_data, flags)
376
+ end
377
+ rescue GPGME::Error::UnusablePublicKey => exc
378
+ exc.keys = ctx.encrypt_result.invalid_recipients
379
+ raise exc
380
+ rescue GPGME::Error::UnusableSecretKey => exc
381
+ exc.keys = ctx.sign_result.invalid_signers
382
+ raise exc
383
+ end
381
384
 
382
- unless cipher
383
- cipher_data.seek(0, IO::SEEK_SET)
384
- cipher_data.read
385
+ unless cipher
386
+ cipher_data.seek(0, IO::SEEK_SET)
387
+ cipher_data.read
388
+ end
385
389
  end
386
390
  end
387
391
 
@@ -408,13 +412,14 @@ def GPGME.list_keys(*args_options) # :yields: key
408
412
  raise ArgumentError, 'wrong number of arguments' if args_options.length > 3
409
413
  args, options = split_args(args_options)
410
414
  pattern, secret_only = args
411
- ctx = GPGME::Ctx.new
412
- if block_given?
413
- ctx.each_key(pattern, secret_only || false) do |key|
414
- yield key
415
+ GPGME::Ctx.new do |ctx|
416
+ if block_given?
417
+ ctx.each_key(pattern, secret_only || false) do |key|
418
+ yield key
419
+ end
420
+ else
421
+ ctx.keys(pattern, secret_only || false)
415
422
  end
416
- else
417
- ctx.keys(pattern, secret_only || false)
418
423
  end
419
424
  end
420
425
 
@@ -445,12 +450,13 @@ def GPGME.export(*args_options)
445
450
  args, options = split_args(args_options)
446
451
  pattern, key = args[0]
447
452
  key_data = output_data(key)
448
- ctx = GPGME::Ctx.new(options)
449
- ctx.export_keys(pattern, key_data)
453
+ GPGME::Ctx.new(options) do |ctx|
454
+ ctx.export_keys(pattern, key_data)
450
455
 
451
- unless key
452
- key_data.seek(0, IO::SEEK_SET)
453
- key_data.read
456
+ unless key
457
+ key_data.seek(0, IO::SEEK_SET)
458
+ key_data.read
459
+ end
454
460
  end
455
461
  end
456
462
 
@@ -478,9 +484,10 @@ def GPGME.import(*args_options)
478
484
  args, options = split_args(args_options)
479
485
  key = args[0]
480
486
  key_data = input_data(key)
481
- ctx = GPGME::Ctx.new(options)
482
- ctx.import_keys(key_data)
483
- ctx.import_result
487
+ GPGME::Ctx.new(options) do |ctx|
488
+ ctx.import_keys(key_data)
489
+ ctx.import_result
490
+ end
484
491
  end
485
492
 
486
493
  module GPGME
@@ -499,14 +506,18 @@ module GPGME
499
506
  end
500
507
  module_function :split_args
501
508
 
502
- def resolve_keys(keys_or_names, secret_only)
503
- ctx = GPGME::Ctx.new
509
+ def resolve_keys(keys_or_names, secret_only, purposes = Array.new)
504
510
  keys = Array.new
505
511
  keys_or_names.each do |key_or_name|
506
512
  if key_or_name.kind_of? Key
507
513
  keys << key_or_name
508
514
  elsif key_or_name.kind_of? String
509
- keys += ctx.keys(key_or_name, secret_only)
515
+ GPGME::Ctx.new do |ctx|
516
+ key = ctx.keys(key_or_name, secret_only).find {|k|
517
+ k.usable_for?(purposes)
518
+ }
519
+ keys << key if key
520
+ end
510
521
  end
511
522
  end
512
523
  keys
@@ -904,7 +915,15 @@ module GPGME
904
915
  options[:progress_callback_value])
905
916
  end
906
917
  end
907
- ctx
918
+ if block_given?
919
+ begin
920
+ yield ctx
921
+ ensure
922
+ GPGME::gpgme_release(ctx)
923
+ end
924
+ else
925
+ ctx
926
+ end
908
927
  end
909
928
 
910
929
  # Set the <i>protocol</i> used within this context.
@@ -1246,6 +1265,14 @@ keylist_mode=#{KEYLIST_MODE_NAMES[keylist_mode]}>"
1246
1265
  caps
1247
1266
  end
1248
1267
 
1268
+ def usable_for?(purposes)
1269
+ unless purposes.kind_of? Array
1270
+ purposes = [purposes]
1271
+ end
1272
+ return false if [:revoked, :expired, :disabled, :invalid].include? trust
1273
+ return (purposes - capability).empty?
1274
+ end
1275
+
1249
1276
  def secret?
1250
1277
  @secret == 1
1251
1278
  end
@@ -1306,6 +1333,14 @@ capability=%s, subkeys=%s, uids=%s>",
1306
1333
  caps
1307
1334
  end
1308
1335
 
1336
+ def usable_for?(purposes)
1337
+ unless purposes.kind_of? Array
1338
+ purposes = [purposes]
1339
+ end
1340
+ return false if [:revoked, :expired, :disabled, :invalid].include? trust
1341
+ return (purposes - capability).empty?
1342
+ end
1343
+
1309
1344
  def secret?
1310
1345
  @secret == 1
1311
1346
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-gpgme
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daiki Ueno
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-25 00:00:00 +09:00
12
+ date: 2009-06-08 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -27,6 +27,7 @@ files:
27
27
  - MANIFEST
28
28
  - Makefile
29
29
  - README
30
+ - THANKS
30
31
  - extconf.rb
31
32
  - gpgme_n.c
32
33
  - lib/gpgme.rb