From nobody Fri Apr 19 12:41:13 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1525790284419533.1535262873147; Tue, 8 May 2018 07:38:04 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 795CC80469; Tue, 8 May 2018 14:38:03 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6A8C7600C8; Tue, 8 May 2018 14:38:03 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 54D5A180BADB; Tue, 8 May 2018 14:38:03 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w48Ec2RG005856 for ; Tue, 8 May 2018 10:38:02 -0400 Received: by smtp.corp.redhat.com (Postfix) id 7E78A608F2; Tue, 8 May 2018 14:38:02 +0000 (UTC) Received: from mx1.redhat.com (ext-mx11.extmail.prod.ext.phx2.redhat.com [10.5.110.40]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 73B11608F4 for ; Tue, 8 May 2018 14:37:58 +0000 (UTC) Received: from mail-wm0-f50.google.com (mail-wm0-f50.google.com [74.125.82.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 82FE93004871 for ; Tue, 8 May 2018 14:37:46 +0000 (UTC) Received: by mail-wm0-f50.google.com with SMTP id w194so19159933wmf.2 for ; Tue, 08 May 2018 07:37:46 -0700 (PDT) Received: from donizetti.lan (dynamic-adsl-78-12-189-60.clienti.tiscali.it. [78.12.189.60]) by smtp.gmail.com with ESMTPSA id d18-v6sm14409399edb.97.2018.05.08.07.37.43 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 08 May 2018 07:37:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lGo6l4AeYr/OP0oP7vKEewIaU4rcg2K4lGN2geC+tbE=; b=Sed9Tv8hzi48pDcF7GmL3MbYRXLkY508MsQMYBJI6Rjbmfv+VG8aFIUGkzutyn/FQA qPONhN+uvhWhZ98kzjkdf3sJzlk238KF0qBCG9fyvLVbigzPeP3QP8px7VE2zVExHLgE /D7CCbSs4oEwaI9rTb/V6Vwh9g2vCofXj9DWyrzJnfMm18rhsciwiMAmiJlbVtqzxytd eetOQhyEBDT4KgJwoh8QH2bkDw/BdlHWsKoMatyy6aV/4nBju9alzZVDJdU2Msm77bMY QZmy2xaSQsSS7p80NhWilXnYn3TtkpcXJ/RWHRhcSTLeCUhyLEi2Ac7SzYndnbxSR7/8 Ay9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=lGo6l4AeYr/OP0oP7vKEewIaU4rcg2K4lGN2geC+tbE=; b=OqvPrydSWZgIOxHSu6BOP7xiKG3BrAprhRQ1R++0gjEczSdAYJ0hcrRxBpRsvQin4v wrliJFp5xFzWNlUfCPeMevKOw1dafHWwbSz3dJbrRHIlbiWvzIVW9iqqdK8Pr78eJEnj vITvvQutGKSIZJetkr/ikjRxDPMEHnS/RFWaoRmhPUg0jQfXO1CpyXRMJ24KLQGH1jUF XWvDeWYwppd3RT/iB3/VDxc48uX6utvaPiuTCBkEtuGWiqC+3kAs7xT9rYdAZNNZHS92 fpnX1za+0fgHZAJ1cDT8IuGAQttJbbYkpVkmOCDq1ZPnahTdruzrfz1Vc7Csgnp/l8sf k9PA== X-Gm-Message-State: ALQs6tCDwLJhcmsXRExPwwMmewUFGhJb1OegvU1wWYkChZQNuApEZdbc U/5n9zzTuRF8JDa4zyq+umlaPOlJ X-Google-Smtp-Source: AB8JxZqW6GOtiOaywpv5mc5Ksd7HK10pa/cWUVHtYgAsxpK9JetmdLbBD8YTUU4EddvKACacl1sZBA== X-Received: by 2002:a50:a1a5:: with SMTP id 34-v6mr56395980edk.273.1525790264606; Tue, 08 May 2018 07:37:44 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Tue, 8 May 2018 16:37:39 +0200 Message-Id: <20180508143740.28409-2-pbonzini@redhat.com> In-Reply-To: <20180508143740.28409-1-pbonzini@redhat.com> References: <20180508143740.28409-1-pbonzini@redhat.com> MIME-Version: 1.0 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Tue, 08 May 2018 14:37:47 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Tue, 08 May 2018 14:37:47 +0000 (UTC) for IP:'74.125.82.50' DOMAIN:'mail-wm0-f50.google.com' HELO:'mail-wm0-f50.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.6 (DKIM_SIGNED, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, SPF_PASS, T_DKIM_INVALID) 74.125.82.50 mail-wm0-f50.google.com 74.125.82.50 mail-wm0-f50.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.84 on 10.5.110.40 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: patchew-devel@redhat.com Cc: Shubham Jain Subject: [Patchew-devel] [PATCH 1/2] test: move sample POST body to a data file X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 08 May 2018 14:38:03 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Avoid including the huge data blob in the Python source code. This can also come in handy later when writing more MboxMessage tests. --- tests/data/0022-another-simple-patch.json.gz | Bin 0 -> 3730 bytes tests/test_rest.py | 148 +------------------ 2 files changed, 4 insertions(+), 144 deletions(-) create mode 100644 tests/data/0022-another-simple-patch.json.gz diff --git a/tests/data/0022-another-simple-patch.json.gz b/tests/data/0022= -another-simple-patch.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..bea48cd8e023e762762c61ec4e2= 6562973eeb632 GIT binary patch literal 3730 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\nReceived: from lists.gnu.org (208.118.235.= 17 [208.118.235." - "17]) by mx.zohomail.com\n\twith SMTPS id 15087900= 23478635.2925706" - "919272; Mon, 23 Oct 2017 13:20:23 -0700 (PDT)\nRe= ceived: from loc" - "alhost ([::1]:40414 helo=3Dlists.gnu.org)\n\tby l= ists.gnu.org with " - "esmtp (Exim 4.71)\n\t(envelope-from )\n\tid 1e6jCo-0007Cr-Ed\n= \tfor importer@p" - "atchew.org; Mon, 23 Oct 2017 16:20:14 -0400\nRece= ived: from eggs." - "gnu.org ([2001:4830:134:3::10]:46254)\n\tby lists= .gnu.org with es" - "mtp (Exim 4.71)\n\t(envelope-from ) id " - "1e6j4M-0000Ia-AF\n\tfor qemu-devel@nongnu.org; Mo= n, 23 Oct 2017 1" - "6:11:32 -0400\nReceived: from Debian-exim by eggs= .gnu.org with sp" - "am-scanned (Exim 4.71)\n\t(envelope-from ) id 1e6j4L-0002WU-ES\n\tfor qemu-devel@nongnu.= org; Mon, 23 Oct" - " 2017 16:11:30 -0400\nReceived: from mail-pf0-x24= 1.google.com ([2" - "607:f8b0:400e:c00::241]:47361)\n\tby eggs.gnu.org= with esmtps (TL" - "S1.0:RSA_AES_128_CBC_SHA1:16)\n\t(Exim 4.71) (env= elope-from )\n\tid 1e6j4J-0002VQ-5h; Mo= n, 23 Oct 2017 1" - "6:11:27 -0400\nReceived: by mail-pf0-x241.google.= com with SMTP id" - " z11so17896780pfk.4;\n\tMon, 23 Oct 2017 13:11:27= -0700 (PDT)\nRe" - "ceived: from squirtle.westlake.spaceflightindustr= ies.com ([173.22" - "6.206.194])\n\tby smtp.gmail.com with ESMTPSA id\= n\tj1sm15181623p" - "fj.108.2017.10.23.13.11.24\n\t(version=3DTLS1_2 c= ipher=3DECDHE-RSA-CH" - "ACHA20-POLY1305 bits=3D256/256);\n\tMon, 23 Oct 2= 017 13:11:25 -0700" - " (PDT)\nDKIM-Signature: v=3D1; a=3Drsa-sha256; c= =3Drelaxed/relaxed; d=3Dg" - "mail.com; s=3D20161025;\n\th=3Dfrom:to:cc:subject= :date:message-id:in-" - "reply-to:references\n\t:mime-version:content-tran= sfer-encoding;\n" - "\tbh=3DzmFol33kPLVHCkj7Ro+lVg1LTAQod/G9dNqJXtckib= I=3D;\n\tb=3DD49+KCtse" - "bdshdA2kxqNqCWLEOTSRXI61CbfBrS3YYbGspt/3vTIRCLSKN= hICr2UOc\n\t7BhL" - "XRtMKhn2gomHPqqSHOSp+hB5XtMmBNpBpkQyXMHoGkgmjg0II= F02Vzn4i2QzP8C9" - "\n\t0SDZb6VYnz70J5HY0KZwVfQ+Rc5qgJEfcTHzuzZ4qHcbX= xPHYCGYo1yDG6bEU" - "LNp2sRB\n\tGekoCKine5V1Uc+8aKmIeQA3zTXj2BLYqIQFi3= UdiEemj94Gs3UFkE" - "kV3kTtCBwBVYep\n\tCvtbjBMI4Kb2Rcyb7taNS1PwjoXo4nz= yPqSftf5CtxE3FYQ" - "6pSHkU8H1cqi4os4RgACQ\n\t6rrA=3D=3D\nX-Google-DKI= M-Signature: v=3D1; a=3D" - "rsa-sha256; c=3Drelaxed/relaxed;\n\td=3D1e100.net= ; s=3D20161025;\n\th=3Dx" - "-gm-message-state:from:to:cc:subject:date:message= -id:in-reply-to" - "\n\t:references:mime-version:content-transfer-enc= oding;\n\tbh=3DzmF" - "ol33kPLVHCkj7Ro+lVg1LTAQod/G9dNqJXtckibI=3D;\n\tb= =3DkG94Z4+JpBMpVNtWI" - "ASASHAaqcxeUgqF149vlfmPjsUsUZoE69zK/Xq8lz25p+TskP= \n\tu+sFtsuT//gI" - "M/gFEeFYPBUEECFh+cSu6vYqjvy7W+o1dt0CkQS0K4sG2a6PD= eXTc7Dw\n\tYOmEE" - "gzEW+JtEp27yE8L5Yiur7k9cMnq6AGsLtrNa4leHN8KfnBLpZ= DJ1w2BTVAST/Mt\n" - "\tp5OmcBALM2s2PfVxV2AqFIC03+BUkFo78Yl0dJkT95uUWQv= XOrYnhrJGikBOpxf" - "e2GEl\n\tdX/N0knNvw1ILQigiiD7mTg2pWBXXdi9ncxWFbWG= av3NFgMuMj9Le7dh" - "Merg+f0Pqzqq\n\tuMRw=3D=3D\nX-Gm-Message-State: A= MCzsaVtdnaUNbjj5huOS" - "I8ibhSVAiVnF57PiIS4oVle1IVoBcH6i/W4\n\tsAtvFi/nF5= bYIYfQxgZMU93rvm" - "Mn\nX-Google-Smtp-Source: ABhQp+Tw1GtSPaSw51tZkI3= AfiuyluStPI8C5/3" - "esBqFkirOMfsjtlRNoBcr8lgEf/55RwhQLiI5mQ=3D=3D\nX-= Received: by 10.98.6" - "5.218 with SMTP id g87mr14269292pfd.105.150878948= 6104;\n\tMon, 23" - " Oct 2017 13:11:26 -0700 (PDT)\nFrom: Andrey Smir= nov \nTo: qemu-arm@nongnu.org\nDate: Mo= n, 23 Oct 2017 1" - "3:10:38 -0700\nMessage-Id: <20171023201055.21973-= 11-andrew.smirno" - "v@gmail.com>\nX-Mailer: git-send-email 2.13.5\nIn= -Reply-To: <2017" - "1023201055.21973-1-andrew.smirnov@gmail.com>\nRef= erences: <201710" - "23201055.21973-1-andrew.smirnov@gmail.com>\nMIME-= Version: 1.0\nCo" - "ntent-Type: text/plain; charset=3D\"utf-8\"\nCont= ent-Transfer-Encod" - "ing: base64\nX-detected-operating-system: by eggs= .gnu.org: Genre " - "and OS details not\n\trecognized.\nX-Received-Fro= m: 2607:f8b0:400" - "e:c00::241\nSubject: [Qemu-devel] [PATCH v2 10/27= ] imx_fec: Reser" - "ve full 4K page for the\n register file\nX-BeenTh= ere: qemu-devel@" - "nongnu.org\nX-Mailman-Version: 2.1.21\nPrecedence= : list\nList-Id:" - " \nList-Unsubscribe: ,\n\t\nList-Archive: <= http://lists.nongn" - "u.org/archive/html/qemu-devel/>\nList-Post: \nList-Help: \nList-Subscribe: ,\n\t\nCc: Peter Maydell ,\n\tAnd" - "rey Smirnov ,\n\tJason = Wang ,\n\t=3D?UTF-8?q?Philippe=3D20Mathieu-D= aud=3DC3=3DA9?=3D ,\n\tqemu-devel@nongnu.org, yurovsky@gma= il.com\nErrors-T" - "o: qemu-devel-bounces+importer=3Dpatchew.org@nong= nu.org\nSender: \"" - "Qemu-devel\" " - "\nX-ZohoMail-DKIM: fail (Header signature does no= t verify)\nX-Zoh" - "oMail: RDKM_2 RSF_6 Z_629925259 SPT_0\n\nU29tZS= BpLk1YIFNvQ3MgKG" - "UuZy4gaS5NWDcpIGhhdmUgRkVDIHJlZ2lzdGVycyBnb2luZyB= hcyBm\nYXIgYXMgb" - "2Zmc2V0CjB4NjE0LCBzbyB0byBhdm9pZCBnZXR0aW5nIGFib3= J0cyB3aGVuIGFjY2" - "Vz\nc2luZyB0aG9zZSBvbiBRRU1VLCBleHRlbmQKdGhlIHJlZ= 2lzdGVyIGZpbGUgd" - "G8gY292ZXIgNEtC\nIG9mIGFkZHJlc3Mgc3BhY2UgaW5zdGVh= ZCBvZiBqdXN0IDFL" - "LgoKQ2M6IFBldGVyIE1heWRlbGwg\nPHBldGVyLm1heWRlbGx= AbGluYXJvLm9yZz4" - "KQ2M6IEphc29uIFdhbmcgPGphc293YW5nQHJlZGhh\ndC5jb2= 0+CkNjOiBQaGlsaX" - "BwZSBNYXRoaWV1LURhdWTDqSA8ZjRidWdAYW1zYXQub3JnPgp= DYzog\ncWVtdS1kZ" - "XZlbEBub25nbnUub3JnCkNjOiBxZW11LWFybUBub25nbnUub3= JnCkNjOiB5dXJvdn" - "Nr\neUBnbWFpbC5jb20KU2lnbmVkLW9mZi1ieTogQW5kcmV5I= FNtaXJub3YgPGFuZ" - "HJldy5zbWlybm92\nQGdtYWlsLmNvbT4KLS0tCiBody9uZXQv= aW14X2ZlYy5jIHwg" - "MiArLQogMSBmaWxlIGNoYW5nZWQs\nIDEgaW5zZXJ0aW9uKCs= pLCAxIGRlbGV0aW9" - "uKC0pCgpkaWZmIC0tZ2l0IGEvaHcvbmV0L2lteF9m\nZWMuYy= BiL2h3L25ldC9pbX" - "hfZmVjLmMKaW5kZXggNDhkMDEyY2FkNi4uZTIzNmJjOTMzYyA= xMDA2\nNDQKLS0tI" - "GEvaHcvbmV0L2lteF9mZWMuYworKysgYi9ody9uZXQvaW14X2= ZlYy5jCkBAIC0xMj" - "Uy\nLDcgKzEyNTIsNyBAQCBzdGF0aWMgdm9pZCBpbXhfZXRoX= 3JlYWxpemUoRGV2a" - "WNlU3RhdGUgKmRl\ndiwgRXJyb3IgKiplcnJwKQogICAgIFN5= c0J1c0RldmljZSAq" - "c2JkID0gU1lTX0JVU19ERVZJQ0Uo\nZGV2KTsKIAogICAgIG1= lbW9yeV9yZWdpb25" - "faW5pdF9pbygmcy0+aW9tZW0sIE9CSkVDVChkZXYp\nLCAmaW= 14X2V0aF9vcHMsIH" - "MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfSU1= YX0ZF\nQywgMHg0M" - "DApOworICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX0= lNWF9GRUMsIDB4MT" - "Aw\nMCk7CiAgICAgc3lzYnVzX2luaXRfbW1pbyhzYmQsICZzL= T5pb21lbSk7CiAgI" - "CAgc3lzYnVzX2lu\naXRfaXJxKHNiZCwgJnMtPmlycVswXSk7= CiAgICAgc3lzYnVz" - "X2luaXRfaXJxKHNiZCwgJnMtPmly\ncVsxXSk7Ci0tIAoyLjE= zLjUKCgo=3D\n\n" - } - =20 - resp =3D self.api_client.post(self.PROJECT_BASE + "messages/", jso= n.dumps(data), content_type=3D'application/json') + dp =3D self.get_data_path("0022-another-simple-patch.json.gz") + with open(dp, "r") as f: + data =3D f.read() + resp =3D self.api_client.post(self.PROJECT_BASE + "messages/", dat= a, content_type=3D'application/json') self.assertEqual(resp.status_code, 201) resp_get =3D self.api_client.get(self.PROJECT_BASE + "messages/201= 71023201055.21973-11-andrew.smirnov@gmail.com/") self.assertEqual(resp_get.status_code, 200) --=20 2.17.0 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel From nobody Fri Apr 19 12:41:13 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1525790283247362.2913833274398; Tue, 8 May 2018 07:38:03 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5E99213A8F; Tue, 8 May 2018 14:38:02 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4DC515D9C6; Tue, 8 May 2018 14:38:02 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 36E53180BAD3; Tue, 8 May 2018 14:38:02 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w48Ec1rb005846 for ; Tue, 8 May 2018 10:38:01 -0400 Received: by smtp.corp.redhat.com (Postfix) id A908630BAAC6; Tue, 8 May 2018 14:38:01 +0000 (UTC) Received: from mx1.redhat.com (ext-mx15.extmail.prod.ext.phx2.redhat.com [10.5.110.44]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9D37B30BAAC4 for ; Tue, 8 May 2018 14:37:58 +0000 (UTC) Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 78AD330023F0 for ; Tue, 8 May 2018 14:37:47 +0000 (UTC) Received: by mail-wm0-f43.google.com with SMTP id j4so19262439wme.1 for ; Tue, 08 May 2018 07:37:47 -0700 (PDT) Received: from donizetti.lan (dynamic-adsl-78-12-189-60.clienti.tiscali.it. [78.12.189.60]) by smtp.gmail.com with ESMTPSA id d18-v6sm14409399edb.97.2018.05.08.07.37.44 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 08 May 2018 07:37:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=J+EGqueFeOgFRbGS82qHEHyUao3zOvbGdXukT2HJRL8=; b=ZRuiiQV1jzQfzLxf5BPGvqQRkcJqH7b9tGShckm/6R5jtk9vs0jFrXQSEIaC6ksA3N yjojVp98NhITKTg8+O8qIqexUVKuYCWdg1FgHC+g8zLxfD8KTOjzuIIiVAe76GVBqnm/ L5AHkmoo5wZMGv01LoSK80ALLUtdw6DEyHDhvtWUauNu2keuOIfpMSU/J5cvF2bPMijg ba7XmCLko93WHtSM0WxHgRmVeTjdsG1IRTVYd4T9TYjidfC2G+hCVbXxZWLy+dqqx8Hh D3YtbLCUnGc96zgDVsRXe1rsaNnpVaXg447o5iUH6HzTqIKXoC8h/qxfzk/WwKfrK2ds KiNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=J+EGqueFeOgFRbGS82qHEHyUao3zOvbGdXukT2HJRL8=; b=BXTrifw/mL5fJcXR9OF7d5swIKrO2T0DTENHU0TbU5nHsixhY1WFCd8yLtNO0ve5Xr 7v22Q3N/8bQit1mLza8DMr1g0l34p7bUo6B/ZpLU72Absa8FCm/TxIWUHHYza30IrjbN k8HUzasePTWLPW+FPlPmwlzC1qGOZgbL/1Jisnk4ISo+Z+D/HdKbT96quwjx9KRbH6Ji tj9WcwVv7BQpQmnG5fCnDf2BghpR+MHu5iApNyqDFLsrc2WsOoAtlahMgKYhxkCu4u6d w5z9sq1TIEdLDE1KikoLdD6eBWYfKTq0Hl4WSdCjmrw6kpN+ZhMpblJL2t1djWSyvpRy n5Jg== X-Gm-Message-State: ALQs6tDng70XWzXAXlBeji3f0aeLHJyNoxi2XmfdOSlPFvnCy76FoeYP +zg1EWLti8MRPwUcHIifd+TNHe3K X-Google-Smtp-Source: AB8JxZrdWL/t2fZqSq8k0DxUfRHMBrFl68khztE6nOxguggMa/P+hTozecMfRjGkBNR2NAFfj69yDQ== X-Received: by 2002:aa7:d60f:: with SMTP id c15-v6mr55642234edr.301.1525790265789; Tue, 08 May 2018 07:37:45 -0700 (PDT) From: Paolo Bonzini To: patchew-devel@redhat.com Date: Tue, 8 May 2018 16:37:40 +0200 Message-Id: <20180508143740.28409-3-pbonzini@redhat.com> In-Reply-To: <20180508143740.28409-1-pbonzini@redhat.com> References: <20180508143740.28409-1-pbonzini@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Tue, 08 May 2018 14:37:47 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Tue, 08 May 2018 14:37:47 +0000 (UTC) for IP:'74.125.82.43' DOMAIN:'mail-wm0-f43.google.com' HELO:'mail-wm0-f43.google.com' FROM:'paolo.bonzini@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.6 (DKIM_SIGNED, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, SPF_PASS, T_DKIM_INVALID) 74.125.82.43 mail-wm0-f43.google.com 74.125.82.43 mail-wm0-f43.google.com X-RedHat-Possible-Forgery: Paolo Bonzini X-Scanned-By: MIMEDefang 2.84 on 10.5.110.44 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.26 X-loop: patchew-devel@redhat.com Cc: Shubham Jain Subject: [Patchew-devel] [PATCH 2/2] rest: introduce generic permission framework X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 08 May 2018 14:38:02 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Until now, the REST API didn't really have a good permission system. In particular, it did not know about user groups. We will need to allow the "importer" group to add messages to any project, so it's time to improve the permissions. Similar to the old API, all the knowledge of permissions is encapsulated in one class, in this case a DRF Permission subclass. The new class replaces the old IsAdminUserOrReadOnly and IsMaintainerUserOrReadOnly permissions. The hierarchy is: - safe requests, or requests from superusers, are always allowed - group membership grants authorization for an operation on any project, but only if the view allows those groups - maintainership grants authorization for an operation on maintained projec= ts --- api/rest.py | 67 ++++++++++++++++++++++++++++++++++------------ tests/test_rest.py | 10 +++++++ 2 files changed, 60 insertions(+), 17 deletions(-) diff --git a/api/rest.py b/api/rest.py index ed40a10..3e9a4a6 100644 --- a/api/rest.py +++ b/api/rest.py @@ -28,23 +28,46 @@ SEARCH_PARAM =3D 'q' =20 # patchew-specific permission classes =20 -class IsAdminUserOrReadOnly(permissions.BasePermission): +class PatchewPermission(permissions.BasePermission): """ - Allows access only to admin users. + Generic code to lookup for permissions based on message and project ob= jects. + The nested router's "project_pk" keyword is taken as a hint that the v= iew + also has a "project" property that returns a Django object. has_permi= ssion + then checks that property too. """ + + allowed_groups =3D () + + def is_superuser(self, request): + return request.user and request.user.is_superuser + + def has_project_permission(self, request, view, obj): + return obj.maintained_by(request.user) + + def has_group_permission(self, request, view): + for grp in request.user.groups.all(): + if grp.name in self.allowed_groups: + return True + return False + + def has_generic_permission(self, request, view): + return (request.method in permissions.SAFE_METHODS) or \ + self.is_superuser(request) or \ + self.has_group_permission(request, view) + def has_permission(self, request, view): - return request.method in permissions.SAFE_METHODS or \ - (request.user and request.user.is_superuser) + return self.has_generic_permission(request, view) or \ + ('projects_pk' in view.kwargs and \ + self.has_project_permission(request, view, view.project)) =20 -class IsMaintainerOrReadOnly(permissions.BasePermission): - """ - Allows access only to admin users or maintainers. - """ def has_object_permission(self, request, view, obj): if isinstance(obj, Message): obj =3D obj.project - return request.method in permissions.SAFE_METHODS or \ - obj.maintained_by(request.user) + return self.has_generic_permission(request, view) or \ + self.has_project_permission(request, view, obj) + +class ImportPermission(PatchewPermission): + allowed_groups =3D ('importers',) =20 # pluggable field for plugin support =20 @@ -85,7 +108,7 @@ class UserSerializer(serializers.HyperlinkedModelSeriali= zer): class UsersViewSet(viewsets.ModelViewSet): queryset =3D User.objects.all().order_by('id') serializer_class =3D UserSerializer - permission_classes =3D (IsAdminUserOrReadOnly,) + permission_classes =3D (PatchewPermission,) =20 # Projects =20 @@ -108,7 +131,7 @@ class ProjectSerializer(serializers.HyperlinkedModelSer= ializer): class ProjectsViewSet(viewsets.ModelViewSet): queryset =3D Project.objects.all().order_by('id') serializer_class =3D ProjectSerializer - permission_classes =3D (IsMaintainerOrReadOnly,) + permission_classes =3D (PatchewPermission,) =20 # Common classes for series and messages =20 @@ -153,7 +176,7 @@ class BaseMessageSerializer(serializers.ModelSerializer= ): class BaseMessageViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): serializer_class =3D BaseMessageSerializer queryset =3D Message.objects.all() - permission_classes =3D () + permission_classes =3D (ImportPermission,) lookup_field =3D 'message_id' lookup_value_regex =3D '[^/]+' =20 @@ -162,11 +185,21 @@ class ProjectMessagesViewSetMixin(mixins.RetrieveMode= lMixin): def get_queryset(self): return self.queryset.filter(project=3Dself.kwargs['projects_pk']) =20 - def get_serializer_context(self): + @property + def project(self): + if hasattr(self, '__project'): + return self.__project try: - return {'project': Project.objects.get(id=3Dself.kwargs['proje= cts_pk']), 'request': self.request} - except:=20 + self.__project =3D Project.objects.get(id=3Dself.kwargs['proje= cts_pk']) + except: + self.__project =3D None + return self.__project + + def get_serializer_context(self): + if self.project is None: return Http404 + return {'project': self.project, 'request': self.request} + # Series =20 class ReplySerializer(BaseMessageSerializer): @@ -249,7 +282,6 @@ class SeriesViewSet(BaseMessageViewSet): queryset =3D Message.objects.filter(is_series_head=3DTrue).order_by('-= last_reply_date') filter_backends =3D (PatchewSearchFilter,) search_fields =3D (SEARCH_PARAM,) - permission_classes =3D (IsMaintainerOrReadOnly,) =20 =20 class ProjectSeriesViewSet(ProjectMessagesViewSetMixin, @@ -362,6 +394,7 @@ class ResultSerializerFull(ResultSerializer): class ResultsViewSet(viewsets.ViewSet, generics.GenericAPIView): lookup_field =3D 'name' lookup_value_regex =3D '[^/]+' + permission_classes =3D (PatchewPermission,) =20 def get_serializer_class(self, *args, **kwargs): if self.lookup_field in self.kwargs: diff --git a/tests/test_rest.py b/tests/test_rest.py index 3baadd5..ace58ab 100755 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -78,10 +78,18 @@ class RestTest(PatchewTestCase): self.assertEquals(resp.data['mailing_list'], "qemu-block@nongnu.or= g") self.assertEquals(resp.data['parent_project'], self.PROJECT_BASE) =20 + def test_project_post_no_login(self): + data =3D { + 'name': 'keycodemapdb', + } + resp =3D self.api_client.post(self.REST_BASE + 'projects/', data= =3Ddata) + self.assertEquals(resp.status_code, 403) + def test_project_post_minimal(self): data =3D { 'name': 'keycodemapdb', } + self.api_client.login(username=3Dself.user, password=3Dself.passwo= rd) resp =3D self.api_client.post(self.REST_BASE + 'projects/', data= =3Ddata) self.assertEquals(resp.status_code, 201) self.assertEquals(resp.data['resource_uri'].startswith(self.REST_B= ASE + 'projects/'), True) @@ -91,6 +99,7 @@ class RestTest(PatchewTestCase): self.assertEquals(resp.data['name'], data['name']) =20 def test_project_post(self): + self.api_client.login(username=3Dself.user, password=3Dself.passwo= rd) data =3D { 'name': 'keycodemapdb', 'mailing_list': 'qemu-devel@nongnu.org', @@ -261,6 +270,7 @@ class RestTest(PatchewTestCase): dp =3D self.get_data_path("0022-another-simple-patch.json.gz") with open(dp, "r") as f: data =3D f.read() + self.api_client.login(username=3Dself.user, password=3Dself.passwo= rd) resp =3D self.api_client.post(self.PROJECT_BASE + "messages/", dat= a, content_type=3D'application/json') self.assertEqual(resp.status_code, 201) resp_get =3D self.api_client.get(self.PROJECT_BASE + "messages/201= 71023201055.21973-11-andrew.smirnov@gmail.com/") --=20 2.17.0 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel