externalsignature.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. """external signature requests
  2. @contact: Debian FTP Master <ftpmaster@debian.org>
  3. @copyright: 2018 Ansgar Burchardt <ansgar@debian.org>
  4. @license: GNU General Public License version 2 or later
  5. """
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17. import json
  18. import sqlalchemy.sql as sql
  19. # TODO [sqlalchemy >= 1.1]: use `ON CONFLICT DO NOTHING`
  20. # import sqlalchemy.dialects.postgresql as pgsql
  21. import daklib.gpg
  22. from daklib.config import Config
  23. from daklib.dbconn import DBConn
  24. def export_external_signature_requests(session, path):
  25. tbl_arch = DBConn().tbl_architecture
  26. tbl_ba = DBConn().tbl_bin_associations
  27. tbl_bin = DBConn().tbl_binaries
  28. tbl_esr = DBConn().tbl_external_signature_requests
  29. tbl_suite = DBConn().tbl_suite
  30. query = sql.select([tbl_bin.c.package, tbl_suite.c.suite_name, tbl_suite.c.codename, tbl_arch.c.arch_string, sql.func.max(tbl_bin.c.version)]) \
  31. .select_from(tbl_esr.join(tbl_suite).join(tbl_ba, tbl_ba.c.id == tbl_esr.c.association_id).join(tbl_bin).join(tbl_arch)) \
  32. .group_by(tbl_bin.c.package, tbl_suite.c.suite_name, tbl_suite.c.codename, tbl_arch.c.arch_string)
  33. requests = session.execute(query)
  34. data = {
  35. 'packages': [
  36. {
  37. 'package': row[0],
  38. 'suite': row[1],
  39. 'codename': row[2],
  40. 'architecture': row[3],
  41. 'version': row[4],
  42. }
  43. for row in requests],
  44. }
  45. with open(path, 'w') as fh:
  46. json.dump(data, fh, indent=2)
  47. def sign_external_signature_requests(session, path, keyids, args={}):
  48. outpath = '{}.gpg'.format(path)
  49. with open(path, 'r') as infile, open(outpath, 'w') as outfile:
  50. daklib.gpg.sign(infile, outfile, keyids, inline=False, **args)
  51. def add_external_signature_request(session, target_suite, suite, binary):
  52. tbl_ba = DBConn().tbl_bin_associations
  53. tbl_esr = DBConn().tbl_external_signature_requests
  54. # TODO [sqlalchemy >= 1.1]: use `ON CONFLICT DO NOTHING`
  55. #select = sql.select([tbl_ba.c.id, target_suite.suite_id]).where((tbl_ba.c.suite == suite.suite_id) & (tbl_ba.c.bin == binary.binary_id))
  56. #insert = pgsql.insert(tbl_esr).from_select([tbl_esr.c.association_id, tbl_esr.c.suite_id], select).on_conflict_do_nothing()
  57. #session.execute(insert)
  58. ba_id = session.execute(sql.select([tbl_ba.c.id]).where((tbl_ba.c.suite == suite.suite_id) & (tbl_ba.c.bin == binary.binary_id))).scalar()
  59. exists = session.execute(sql.select([tbl_esr]).where(tbl_esr.c.association_id == ba_id).where(tbl_esr.c.suite_id == target_suite.suite_id)).first()
  60. if exists is None:
  61. insert = sql.insert(tbl_esr).values(association_id=ba_id, suite_id=target_suite.suite_id)
  62. session.execute(insert)
  63. def check_upload_for_external_signature_request(session, target_suite, suite, binary):
  64. if 'External-Signature-Requests' not in Config():
  65. return
  66. config = Config().subtree('External-Signature-Requests')
  67. config_sources = config.subtree('Sources')
  68. source = binary.source
  69. if source.source not in config_sources:
  70. return
  71. src_config = config_sources.subtree(source.source)
  72. if binary.package not in src_config.value_list('Packages'):
  73. return
  74. suites = config.value_list('Default-Suites')
  75. if 'Suites' in src_config:
  76. suites = src_config.value_list('Suites')
  77. if target_suite.suite_name not in suites:
  78. return
  79. archs = config.value_list('Default-Architectures')
  80. if 'Architectures' in src_config:
  81. archs = src_config.value_list('Architectures')
  82. if binary.architecture.arch_string not in archs:
  83. return
  84. add_external_signature_request(session, target_suite, suite, binary)