test-releasefile-verification 6.8 KB

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