test-releasefile-verification 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #!/bin/sh
  2. set -e
  3. TESTDIR=$(readlink -f $(dirname $0))
  4. . $TESTDIR/framework
  5. setupenvironment
  6. configarchitecture "i386"
  7. buildaptarchive
  8. setupflataptarchive
  9. changetowebserver
  10. prepare() {
  11. local DATE="${2:-now}"
  12. if [ "$DATE" = 'now' -a "$1" = "${PKGFILE}-new" ]; then
  13. DATE='now + 6 days'
  14. fi
  15. for release in $(find rootdir/var/lib/apt/lists 2> /dev/null); do
  16. touch -d 'now - 6 hours' $release
  17. done
  18. aptget clean
  19. cp $1 aptarchive/Packages
  20. find aptarchive -name 'Release' -delete
  21. compressfile 'aptarchive/Packages'
  22. generatereleasefiles "$DATE"
  23. }
  24. installaptold() {
  25. testequal 'Reading package lists...
  26. Building dependency tree...
  27. Suggested packages:
  28. aptitude synaptic wajig dpkg-dev apt-doc bzip2 lzma python-apt
  29. The following NEW packages will be installed:
  30. apt
  31. 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
  32. After this operation, 5370 kB of additional disk space will be used.
  33. Get:1 http://localhost:8080/ apt 0.7.25.3
  34. Download complete and in download only mode' aptget install apt -dy
  35. }
  36. installaptnew() {
  37. testequal 'Reading package lists...
  38. Building dependency tree...
  39. Suggested packages:
  40. aptitude synaptic wajig dpkg-dev apt-doc bzip2 lzma python-apt
  41. The following NEW packages will be installed:
  42. apt
  43. 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
  44. After this operation, 5808 kB of additional disk space will be used.
  45. Get:1 http://localhost:8080/ apt 0.8.0~pre1
  46. Download complete and in download only mode' aptget install apt -dy
  47. }
  48. failaptold() {
  49. testequal 'Reading package lists...
  50. Building dependency tree...
  51. Suggested packages:
  52. aptitude synaptic wajig dpkg-dev apt-doc bzip2 lzma python-apt
  53. The following NEW packages will be installed:
  54. apt
  55. 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
  56. After this operation, 5370 kB of additional disk space will be used.
  57. WARNING: The following packages cannot be authenticated!
  58. apt
  59. E: There are problems and -y was used without --force-yes' aptget install apt -dy
  60. }
  61. failaptnew() {
  62. testequal 'Reading package lists...
  63. Building dependency tree...
  64. Suggested packages:
  65. aptitude synaptic wajig dpkg-dev apt-doc bzip2 lzma python-apt
  66. The following NEW packages will be installed:
  67. apt
  68. 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
  69. After this operation, 5808 kB of additional disk space will be used.
  70. WARNING: The following packages cannot be authenticated!
  71. apt
  72. E: There are problems and -y was used without --force-yes' aptget install apt -dy
  73. }
  74. # fake our downloadable file
  75. touch aptarchive/apt.deb
  76. PKGFILE="${TESTDIR}/$(echo "$(basename $0)" | sed 's#^test-#Packages-#')"
  77. runtest() {
  78. prepare ${PKGFILE}
  79. rm -rf rootdir/var/lib/apt/lists
  80. signreleasefiles 'Joe Sixpack'
  81. find aptarchive/ -name "$DELETEFILE" -delete
  82. msgtest 'Cold archive signed by' 'Joe Sixpack'
  83. aptget update 2>&1 | grep -E '^(W|E): ' > /dev/null && msgfail || msgpass
  84. testequal "$(cat ${PKGFILE})
  85. " aptcache show apt
  86. installaptold
  87. prepare ${PKGFILE}-new
  88. signreleasefiles 'Joe Sixpack'
  89. find aptarchive/ -name "$DELETEFILE" -delete
  90. msgtest 'Good warm archive signed by' 'Joe Sixpack'
  91. aptget update 2>&1 | grep -E '^(W|E): ' > /dev/null && msgfail || msgpass
  92. testequal "$(cat ${PKGFILE}-new)
  93. " aptcache show apt
  94. installaptnew
  95. prepare ${PKGFILE}
  96. rm -rf rootdir/var/lib/apt/lists
  97. cp keys/rexexpired.pub rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg
  98. signreleasefiles 'Rex Expired'
  99. find aptarchive/ -name "$DELETEFILE" -delete
  100. msgtest 'Cold archive signed by' 'Rex Expired'
  101. aptget update 2>&1 | grep -E '^W: .* KEYEXPIRED' > /dev/null && msgpass || msgfail
  102. testequal "$(cat ${PKGFILE})
  103. " aptcache show apt
  104. failaptold
  105. rm rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg
  106. prepare ${PKGFILE}
  107. rm -rf rootdir/var/lib/apt/lists
  108. signreleasefiles 'Marvin Paranoid'
  109. find aptarchive/ -name "$DELETEFILE" -delete
  110. msgtest 'Cold archive signed by' 'Marvin Paranoid'
  111. aptget update 2>&1 | grep -E '^W: .* NO_PUBKEY' > /dev/null && msgpass || msgfail
  112. testequal "$(cat ${PKGFILE})
  113. " aptcache show apt
  114. failaptold
  115. prepare ${PKGFILE}-new
  116. # weborf doesn't support If-Range
  117. for release in $(find rootdir/var/lib/apt/lists/partial/ -name '*Release'); do
  118. rm $release
  119. touch $release
  120. done
  121. signreleasefiles 'Joe Sixpack'
  122. find aptarchive/ -name "$DELETEFILE" -delete
  123. msgtest 'Bad warm archive signed by' 'Joe Sixpack'
  124. aptget update 2>&1 | grep -E '^(W|E): ' > /dev/null && msgfail || msgpass
  125. testequal "$(cat ${PKGFILE}-new)
  126. " aptcache show apt
  127. installaptnew
  128. prepare ${PKGFILE}
  129. rm -rf rootdir/var/lib/apt/lists
  130. signreleasefiles 'Joe Sixpack'
  131. find aptarchive/ -name "$DELETEFILE" -delete
  132. msgtest 'Cold archive signed by' 'Joe Sixpack'
  133. aptget update 2>&1 | grep -E '^(W|E): ' > /dev/null && msgfail || msgpass
  134. testequal "$(cat ${PKGFILE})
  135. " aptcache show apt
  136. installaptold
  137. prepare ${PKGFILE}-new
  138. signreleasefiles 'Marvin Paranoid'
  139. find aptarchive/ -name "$DELETEFILE" -delete
  140. msgtest 'Good warm archive signed by' 'Marvin Paranoid'
  141. aptget update 2>&1 | grep -E '^W: .* NO_PUBKEY' > /dev/null && msgpass || msgfail
  142. testequal "$(cat ${PKGFILE})
  143. " aptcache show apt
  144. installaptold
  145. prepare ${PKGFILE}-new
  146. cp keys/rexexpired.pub rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg
  147. signreleasefiles 'Rex Expired'
  148. find aptarchive/ -name "$DELETEFILE" -delete
  149. msgtest 'Good warm archive signed by' 'Rex Expired'
  150. aptget update 2>&1 | grep -E '^W: .* KEYEXPIRED' > /dev/null && msgpass || msgfail
  151. testequal "$(cat ${PKGFILE})
  152. " aptcache show apt
  153. installaptold
  154. rm rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg
  155. prepare ${PKGFILE}-new
  156. signreleasefiles
  157. find aptarchive/ -name "$DELETEFILE" -delete
  158. msgtest 'Good warm archive signed by' 'Joe Sixpack'
  159. aptget update 2>&1 | grep -E '^(W|E): ' > /dev/null && msgfail || msgpass
  160. testequal "$(cat ${PKGFILE}-new)
  161. " aptcache show apt
  162. installaptnew
  163. }
  164. runtest2() {
  165. prepare ${PKGFILE}
  166. rm -rf rootdir/var/lib/apt/lists
  167. signreleasefiles 'Joe Sixpack'
  168. msgtest 'Cold archive signed by' 'Joe Sixpack'
  169. aptget update 2>&1 | grep -E '^(W|E): ' > /dev/null && msgfail || msgpass
  170. # New .deb but now an unsigned archive. For example MITM to circumvent
  171. # package verification.
  172. prepare ${PKGFILE}-new
  173. find aptarchive/ -name InRelease -delete
  174. find aptarchive/ -name Release.gpg -delete
  175. msgtest 'Warm archive signed by' 'nobody'
  176. aptget update 2>&1 | grep -E '^(W|E): ' > /dev/null && msgfail || msgpass
  177. testequal "$(cat ${PKGFILE}-new)
  178. " aptcache show apt
  179. failaptnew
  180. # Unsigned archive from the beginning must also be detected.
  181. rm -rf rootdir/var/lib/apt/lists
  182. msgtest 'Cold archive signed by' 'nobody'
  183. aptget update 2>&1 | grep -E '^(W|E): ' > /dev/null && msgfail || msgpass
  184. testequal "$(cat ${PKGFILE}-new)
  185. " aptcache show apt
  186. failaptnew
  187. }
  188. runtest2
  189. DELETEFILE="InRelease"
  190. runtest
  191. DELETEFILE="Release.gpg"
  192. runtest