Blame tests/unittests/test_sshutil.py

Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
from collections import namedtuple
Packit Service 9bfd13
from unittest.mock import patch
Packit Service a04d08
Packit Service a04d08
from cloudinit import ssh_util
Packit Service a04d08
from cloudinit.tests import helpers as test_helpers
Packit Service a04d08
from cloudinit import util
Packit Service a04d08
Packit Service a04d08
# https://stackoverflow.com/questions/11351032/
Packit Service a04d08
FakePwEnt = namedtuple(
Packit Service a04d08
    'FakePwEnt',
Packit Service a04d08
    ['pw_dir', 'pw_gecos', 'pw_name', 'pw_passwd', 'pw_shell', 'pwd_uid'])
Packit Service a04d08
FakePwEnt.__new__.__defaults__ = tuple(
Packit Service a04d08
    "UNSET_%s" % n for n in FakePwEnt._fields)
Packit Service a04d08
Packit Service a04d08
Packit Service 9bfd13
# Do not use these public keys, most of them are fetched from
Packit Service 9bfd13
# the testdata for OpenSSH, and their private keys are available
Packit Service 9bfd13
# https://github.com/openssh/openssh-portable/tree/master/regress/unittests/sshkey/testdata
Packit Service a04d08
VALID_CONTENT = {
Packit Service a04d08
    'dsa': (
Packit Service a04d08
        "AAAAB3NzaC1kc3MAAACBAIrjOQSlSea19bExXBMBKBvcLhBoVvNBjCppNzllipF"
Packit Service a04d08
        "W4jgIOMcNanULRrZGjkOKat6MWJNetSbV1E6IOFDQ16rQgsh/OvYU9XhzM8seLa"
Packit Service a04d08
        "A21VszZuhIV7/2DE3vxu7B54zVzueG1O1Deq6goQCRGWBUnqO2yluJiG4HzrnDa"
Packit Service a04d08
        "jzRAAAAFQDMPO96qXd4F5A+5b2f2MO7SpVomQAAAIBpC3K2zIbDLqBBs1fn7rsv"
Packit Service a04d08
        "KcJvwihdlVjG7UXsDB76P2GNqVG+IlYPpJZ8TO/B/fzTMtrdXp9pSm9OY1+BgN4"
Packit Service a04d08
        "REsZ2WNcvfgY33aWaEM+ieCcQigvxrNAF2FTVcbUIIxAn6SmHuQSWrLSfdHc8H7"
Packit Service a04d08
        "hsrgeUPPdzjBD/cv2ZmqwZ1AAAAIAplIsScrJut5wJMgyK1JG0Kbw9JYQpLe95P"
Packit Service a04d08
        "obB069g8+mYR8U0fysmTEdR44mMu0VNU5E5OhTYoTGfXrVrkR134LqFM2zpVVbE"
Packit Service a04d08
        "JNDnIqDHxTkc6LY2vu8Y2pQ3/bVnllZZOda2oD5HQ7ovygQa6CH+fbaZHbdDUX/"
Packit Service a04d08
        "5z7u2rVAlDw=="
Packit Service a04d08
    ),
Packit Service a04d08
    'ecdsa': (
Packit Service a04d08
        "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBITrGBB3cgJ"
Packit Service a04d08
        "J7fPxvtMW9H3oRisNpJ3OAslxZeyP7I0A9BPAW0RQIwHVtVnM7zrp4nI+JLZov/"
Packit Service a04d08
        "Ql7lc2leWL7CY="
Packit Service a04d08
    ),
Packit Service a04d08
    'rsa': (
Packit Service a04d08
        "AAAAB3NzaC1yc2EAAAABIwAAAQEA3I7VUf2l5gSn5uavROsc5HRDpZdQueUq5oz"
Packit Service a04d08
        "emNSj8T7enqKHOEaFoU2VoPgGEWC9RyzSQVeyD6s7APMcE82EtmW4skVEgEGSbD"
Packit Service a04d08
        "c1pvxzxtchBj78hJP6Cf5TCMFSXw+Fz5rF1dR23QDbN1mkHs7adr8GW4kSWqU7Q"
Packit Service a04d08
        "7NDwfIrJJtO7Hi42GyXtvEONHbiRPOe8stqUly7MvUoN+5kfjBM8Qqpfl2+FNhT"
Packit Service a04d08
        "YWpMfYdPUnE7u536WqzFmsaqJctz3gBxH9Ex7dFtrxR4qiqEr9Qtlu3xGn7Bw07"
Packit Service a04d08
        "/+i1D+ey3ONkZLN+LQ714cgj8fRS4Hj29SCmXp5Kt5/82cD/VN3NtHw=="
Packit Service a04d08
    ),
Packit Service 9bfd13
    'ed25519': (
Packit Service 9bfd13
        "AAAAC3NzaC1lZDI1NTE5AAAAIA1J77+CrJ8p6/vWCEzuylqJNMHUP/XmeYyGVWb"
Packit Service 9bfd13
        "8lnDd"
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ecdsa-sha2-nistp256-cert-v01@openssh.com': (
Packit Service 9bfd13
        "AAAAKGVjZHNhLXNoYTItbmlzdHAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20AAAA"
Packit Service 9bfd13
        "gQIfwT/+UX68/hlKsdKuaOuAVB6ftTg03SlP/uH4OBEwAAAAIbmlzdHAyNTYAAA"
Packit Service 9bfd13
        "BBBEjA0gjJmPM6La3sXyfNlnjilvvGY6I2M8SvJj4o3X/46wcUbPWTaj4RF3EXw"
Packit Service 9bfd13
        "HvNxplYBwdPlk2zEecvf9Cs2BMAAAAAAAAAAAAAAAEAAAAYa2V5cy9lY2RzYS1z"
Packit Service 9bfd13
        "aGEyLW5pc3RwMjU2AAAAAAAAAAAAAAAA//////////8AAAAAAAAAggAAABVwZXJ"
Packit Service 9bfd13
        "taXQtWDExLWZvcndhcmRpbmcAAAAAAAAAF3Blcm1pdC1hZ2VudC1mb3J3YXJkaW"
Packit Service 9bfd13
        "5nAAAAAAAAABZwZXJtaXQtcG9ydC1mb3J3YXJkaW5nAAAAAAAAAApwZXJtaXQtc"
Packit Service 9bfd13
        "HR5AAAAAAAAAA5wZXJtaXQtdXNlci1yYwAAAAAAAAAAAAAAaAAAABNlY2RzYS1z"
Packit Service 9bfd13
        "aGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQRH6Y9Q1+ocQ8ETKW3LjQqtxg7"
Packit Service 9bfd13
        "OuSSDacxmmQatQVaIawwjCbmntyEAqmVj3v9ElDSXnO5m7TyYMBQu4+vsh76RAA"
Packit Service 9bfd13
        "AAZQAAABNlY2RzYS1zaGEyLW5pc3RwMjU2AAAASgAAACEA47Cl2MMhr+glPGuxx"
Packit Service 9bfd13
        "2tM3QXkDcwdP0SxSEW5yy4XV5oAAAAhANNMm1cdVlAt3hmycQgdD82zPlg5YvVO"
Packit Service 9bfd13
        "iN0SQTbgVD8i"
Packit Service 9bfd13
    ),
Packit Service a04d08
    'ecdsa-sha2-nistp256': (
Packit Service 9bfd13
        "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEjA0gjJmPM"
Packit Service 9bfd13
        "6La3sXyfNlnjilvvGY6I2M8SvJj4o3X/46wcUbPWTaj4RF3EXwHvNxplYBwdPlk"
Packit Service 9bfd13
        "2zEecvf9Cs2BM="
Packit Service 751c4a
    ),
Packit Service 9bfd13
    'ecdsa-sha2-nistp384-cert-v01@openssh.com': (
Packit Service 9bfd13
        "AAAAKGVjZHNhLXNoYTItbmlzdHAzODQtY2VydC12MDFAb3BlbnNzaC5jb20AAAA"
Packit Service 9bfd13
        "grnSvDsK1EnCZndO1IyGWcGkVgVSkPWi/XO2ybPFyLVUAAAAIbmlzdHAzODQAAA"
Packit Service 9bfd13
        "BhBAaYSQs+8TT0Tzciy0dorwhur6yzOGUrYQ6ueUQYWbE7eNdHmhsVrlpGPgSaY"
Packit Service 9bfd13
        "ByhXtAJiPOMqLU5h0eb3sCtM3ek4NvjXFTGTqPrrxJI6q0OsgrtkGE7UM9ZsfMm"
Packit Service 9bfd13
        "7q6BOAAAAAAAAAAAAAAAAQAAABhrZXlzL2VjZHNhLXNoYTItbmlzdHAzODQAAAA"
Packit Service 9bfd13
        "AAAAAAAAAAAD//////////wAAAAAAAACCAAAAFXBlcm1pdC1YMTEtZm9yd2FyZG"
Packit Service 9bfd13
        "luZwAAAAAAAAAXcGVybWl0LWFnZW50LWZvcndhcmRpbmcAAAAAAAAAFnBlcm1pd"
Packit Service 9bfd13
        "C1wb3J0LWZvcndhcmRpbmcAAAAAAAAACnBlcm1pdC1wdHkAAAAAAAAADnBlcm1p"
Packit Service 9bfd13
        "dC11c2VyLXJjAAAAAAAAAAAAAACIAAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAA"
Packit Service 9bfd13
        "IbmlzdHAzODQAAABhBLWbubcMzcWc7lMTCMGVXZlaVvUOHLjpr6SOOScFFrd8K9"
Packit Service 9bfd13
        "Gl8nYELST5HZ1gym65m+MG6/tbrUWIY/flLWNIe+WtqxrdPPGdIhFruCwNw2peZ"
Packit Service 9bfd13
        "SbQOa/o3AGnJ/vO6EKEGAAAAIQAAAATZWNkc2Etc2hhMi1uaXN0cDM4NAAAAGkA"
Packit Service 9bfd13
        "AAAxAL10JHd5bvnbpD+fet/k1YE1BEIrqGXaoIIJ9ReE5H4nTK1uQJzMD7+wwGK"
Packit Service 9bfd13
        "RVYqYQgAAADAiit0UCMDAUbjD+R2x4LvU3x/t8G3sdqDLRNfMRpjZpvcS8AwC+Y"
Packit Service 9bfd13
        "VFVSQNn0AyzW0="
Packit Service 751c4a
    ),
Packit Service b1601c
    'ecdsa-sha2-nistp384': (
Packit Service 9bfd13
        "AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBAaYSQs+8TT"
Packit Service 9bfd13
        "0Tzciy0dorwhur6yzOGUrYQ6ueUQYWbE7eNdHmhsVrlpGPgSaYByhXtAJiPOMqL"
Packit Service 9bfd13
        "U5h0eb3sCtM3ek4NvjXFTGTqPrrxJI6q0OsgrtkGE7UM9ZsfMm7q6BOA=="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ecdsa-sha2-nistp521-cert-v01@openssh.com': (
Packit Service 9bfd13
        "AAAAKGVjZHNhLXNoYTItbmlzdHA1MjEtY2VydC12MDFAb3BlbnNzaC5jb20AAAA"
Packit Service 9bfd13
        "gGmRzkkMvRFk1V5U3m3mQ2nfW20SJVXk1NKnT5iZGDcEAAAAIbmlzdHA1MjEAAA"
Packit Service 9bfd13
        "CFBAHosAOHAI1ZkerbKYQ72S6uit1u77PCj/OalZtXgsxv0TTAZB273puG2X94C"
Packit Service 9bfd13
        "Q8yyNHcby87zFZHdv5BSKyZ/cyREAAeiAcSakop9VS3+bUfZpEIqwBZXarwUjnR"
Packit Service 9bfd13
        "nxprkcQ0rfCCdagkGZr/OA7DemK2D8tKLTHsKoEEWNImo6/pXDkFxAAAAAAAAAA"
Packit Service 9bfd13
        "AAAAAAQAAABhrZXlzL2VjZHNhLXNoYTItbmlzdHA1MjEAAAAAAAAAAAAAAAD///"
Packit Service 9bfd13
        "///////wAAAAAAAACCAAAAFXBlcm1pdC1YMTEtZm9yd2FyZGluZwAAAAAAAAAXc"
Packit Service 9bfd13
        "GVybWl0LWFnZW50LWZvcndhcmRpbmcAAAAAAAAAFnBlcm1pdC1wb3J0LWZvcndh"
Packit Service 9bfd13
        "cmRpbmcAAAAAAAAACnBlcm1pdC1wdHkAAAAAAAAADnBlcm1pdC11c2VyLXJjAAA"
Packit Service 9bfd13
        "AAAAAAAAAAACsAAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAA"
Packit Service 9bfd13
        "CFBAC6hFVXM1XEg/7qKkp5sLZuANGQVW88b5pPn2ZcK0td9IQstLH6BwWuZ6MPE"
Packit Service 9bfd13
        "ogiDlvx9HD1BaKGBBfkxgOY8NGFzQHbjU9eTWH3gt0RATDbZsij1pSkFPnAXdU9"
Packit Service 9bfd13
        "SjfogYloI2xdHaTCgWp3zgsUV+BBQ0QGGv2MqqcOmrF0f5YEJeOffAAAAKcAAAA"
Packit Service 9bfd13
        "TZWNkc2Etc2hhMi1uaXN0cDUyMQAAAIwAAABCAT+vSOYPuYVTDopDW08576d5Sb"
Packit Service 9bfd13
        "edXQMOu1op4CQIm98VKtAXvu5dfioi5VYAqpte8M+UxEMOMiQWJp+U9exYf6LuA"
Packit Service 9bfd13
        "AAAQgEzkIpX3yKXPaPcK17mNx40ujEDitm4ARmbhAge0sFhZtf7YIgI55b6vkI8"
Packit Service 9bfd13
        "JvMJkzQCBF1cpNOaIpVh1nFZNBphMQ=="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ecdsa-sha2-nistp521': (
Packit Service 9bfd13
        "AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAHosAOHAI1"
Packit Service 9bfd13
        "ZkerbKYQ72S6uit1u77PCj/OalZtXgsxv0TTAZB273puG2X94CQ8yyNHcby87zF"
Packit Service 9bfd13
        "ZHdv5BSKyZ/cyREAAeiAcSakop9VS3+bUfZpEIqwBZXarwUjnRnxprkcQ0rfCCd"
Packit Service 9bfd13
        "agkGZr/OA7DemK2D8tKLTHsKoEEWNImo6/pXDkFxA=="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'sk-ecdsa-sha2-nistp256-cert-v01@openssh.com': (
Packit Service 9bfd13
        "AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIIxzuxl4z3u"
Packit Service 9bfd13
        "wAIslne8Huft+1n1IhHAlNbWZkQyyECCGAAAAIFOG6kY7Rf4UtCFvPwKgo/BztX"
Packit Service 9bfd13
        "ck2xC4a2WyA34XtIwZAAAAAAAAAAgAAAACAAAABmp1bGl1cwAAABIAAAAFaG9zd"
Packit Service 9bfd13
        "DEAAAAFaG9zdDIAAAAANowB8AAAAABNHmBwAAAAAAAAAAAAAAAAAAAAMwAAAAtz"
Packit Service 9bfd13
        "c2gtZWQyNTUxOQAAACBThupGO0X+FLQhbz8CoKPwc7V3JNsQuGtlsgN+F7SMGQA"
Packit Service 9bfd13
        "AAFMAAAALc3NoLWVkMjU1MTkAAABABGTn+Bmz86Ajk+iqKCSdP5NClsYzn4alJd"
Packit Service 9bfd13
        "0V5bizhP0Kumc/HbqQfSt684J1WdSzih+EjvnTgBhK9jTBKb90AQ=="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'sk-ecdsa-sha2-nistp256@openssh.com': (
Packit Service 9bfd13
        "AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHA"
Packit Service 9bfd13
        "yNTYAAABBBIELQJ2DgvaX1yQlKFokfWM2suuaCFI2qp0eJodHyg6O4ifxc3XpRK"
Packit Service 9bfd13
        "d1OS8dNYQtE/YjdXSrA+AOnMF5ns2Nkx4AAAAEc3NoOg=="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'sk-ssh-ed25519-cert-v01@openssh.com': (
Packit Service 9bfd13
        "AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIIxzuxl4z3u"
Packit Service 9bfd13
        "wAIslne8Huft+1n1IhHAlNbWZkQyyECCGAAAAIFOG6kY7Rf4UtCFvPwKgo/BztX"
Packit Service 9bfd13
        "ck2xC4a2WyA34XtIwZAAAAAAAAAAgAAAACAAAABmp1bGl1cwAAABIAAAAFaG9zd"
Packit Service 9bfd13
        "DEAAAAFaG9zdDIAAAAANowB8AAAAABNHmBwAAAAAAAAAAAAAAAAAAAAMwAAAAtz"
Packit Service 9bfd13
        "c2gtZWQyNTUxOQAAACBThupGO0X+FLQhbz8CoKPwc7V3JNsQuGtlsgN+F7SMGQA"
Packit Service 9bfd13
        "AAFMAAAALc3NoLWVkMjU1MTkAAABABGTn+Bmz86Ajk+iqKCSdP5NClsYzn4alJd"
Packit Service 9bfd13
        "0V5bizhP0Kumc/HbqQfSt684J1WdSzih+EjvnTgBhK9jTBKb90AQ=="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'sk-ssh-ed25519@openssh.com': (
Packit Service 9bfd13
        "AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAICFo/k5LU8863u66YC9"
Packit Service 9bfd13
        "eUO2170QduohPURkQnbLa/dczAAAABHNzaDo="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ssh-dss-cert-v01@openssh.com': (
Packit Service 9bfd13
        "AAAAHHNzaC1kc3MtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgdTlbNU9Hn9Qng3F"
Packit Service 9bfd13
        "HxwH971bxCIoq1ern/QWFFDWXgmYAAACBAPqS600VGwdPAQC/p3f0uGyrLVql0c"
Packit Service 9bfd13
        "Fn1zYd/JGvtabKnIYjLaYprje/NcjwI3CZFJiz4Dp3S8kLs+X5/1DMn/Tg1Y4D4"
Packit Service 9bfd13
        "yLB+6vCtHcJF7rVBFhvw/KZwc7G54ez3khyOtsg82fzpyOc8/mq+/+C5TMKO7DD"
Packit Service 9bfd13
        "jMF0k5emWKCsa3ZfAAAAFQCjA/+dKkMu4/CWjJPtfl7YNaStNQAAAIEA7uX1BVV"
Packit Service 9bfd13
        "tJKjLmWrpw62+l/xSXA5rr7MHBuWjiCYV3VHBfXJaQDyRDtGuEJKDwdzqYgacpG"
Packit Service 9bfd13
        "ApGWL/cuBtJ9nShsUl6GRG0Ra03g+Hx9VR5LviJBsjAVB4qVgciU1NGga0Bt2Le"
Packit Service 9bfd13
        "cd1X4EGQRBzVXeuOpiqGM6jP/I2yDMs0Pboet0AAACBAOdXpyfmobEBaOqZAuvg"
Packit Service 9bfd13
        "j1P0uhjG2P31Ufurv22FWPBU3A9qrkxbOXwE0LwvjCvrsQV/lrYhJz/tiys40Ve"
Packit Service 9bfd13
        "ahulWZE5SAHMXGIf95LiLSgaXMjko7joot+LK84ltLymwZ4QMnYjnZSSclf1Uuy"
Packit Service 9bfd13
        "QMcUtb34+I0u9Ycnyhp2mSFsQtAAAAAAAAAAYAAAACAAAABmp1bGl1cwAAABIAA"
Packit Service 9bfd13
        "AAFaG9zdDEAAAAFaG9zdDIAAAAANowB8AAAAABNHmBwAAAAAAAAAAAAAAAAAAAA"
Packit Service 9bfd13
        "MwAAAAtzc2gtZWQyNTUxOQAAACBThupGO0X+FLQhbz8CoKPwc7V3JNsQuGtlsgN"
Packit Service 9bfd13
        "+F7SMGQAAAFMAAAALc3NoLWVkMjU1MTkAAABAh/z1LIdNL1b66tQ8t9DY9BTB3B"
Packit Service 9bfd13
        "QKpTKmc7ezyFKLwl96yaIniZwD9Ticdbe/8i/Li3uCFE3EAt8NAIv9zff8Bg=="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ssh-dss': (
Packit Service 9bfd13
        "AAAAB3NzaC1kc3MAAACBAPqS600VGwdPAQC/p3f0uGyrLVql0cFn1zYd/JGvtab"
Packit Service 9bfd13
        "KnIYjLaYprje/NcjwI3CZFJiz4Dp3S8kLs+X5/1DMn/Tg1Y4D4yLB+6vCtHcJF7"
Packit Service 9bfd13
        "rVBFhvw/KZwc7G54ez3khyOtsg82fzpyOc8/mq+/+C5TMKO7DDjMF0k5emWKCsa"
Packit Service 9bfd13
        "3ZfAAAAFQCjA/+dKkMu4/CWjJPtfl7YNaStNQAAAIEA7uX1BVVtJKjLmWrpw62+"
Packit Service 9bfd13
        "l/xSXA5rr7MHBuWjiCYV3VHBfXJaQDyRDtGuEJKDwdzqYgacpGApGWL/cuBtJ9n"
Packit Service 9bfd13
        "ShsUl6GRG0Ra03g+Hx9VR5LviJBsjAVB4qVgciU1NGga0Bt2Lecd1X4EGQRBzVX"
Packit Service 9bfd13
        "euOpiqGM6jP/I2yDMs0Pboet0AAACBAOdXpyfmobEBaOqZAuvgj1P0uhjG2P31U"
Packit Service 9bfd13
        "furv22FWPBU3A9qrkxbOXwE0LwvjCvrsQV/lrYhJz/tiys40VeahulWZE5SAHMX"
Packit Service 9bfd13
        "GIf95LiLSgaXMjko7joot+LK84ltLymwZ4QMnYjnZSSclf1UuyQMcUtb34+I0u9"
Packit Service 9bfd13
        "Ycnyhp2mSFsQt"
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ssh-ed25519-cert-v01@openssh.com': (
Packit Service 9bfd13
        "AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIIxzuxl4z3u"
Packit Service 9bfd13
        "wAIslne8Huft+1n1IhHAlNbWZkQyyECCGAAAAIFOG6kY7Rf4UtCFvPwKgo/BztX"
Packit Service 9bfd13
        "ck2xC4a2WyA34XtIwZAAAAAAAAAAgAAAACAAAABmp1bGl1cwAAABIAAAAFaG9zd"
Packit Service 9bfd13
        "DEAAAAFaG9zdDIAAAAANowB8AAAAABNHmBwAAAAAAAAAAAAAAAAAAAAMwAAAAtz"
Packit Service 9bfd13
        "c2gtZWQyNTUxOQAAACBThupGO0X+FLQhbz8CoKPwc7V3JNsQuGtlsgN+F7SMGQA"
Packit Service 9bfd13
        "AAFMAAAALc3NoLWVkMjU1MTkAAABABGTn+Bmz86Ajk+iqKCSdP5NClsYzn4alJd"
Packit Service 9bfd13
        "0V5bizhP0Kumc/HbqQfSt684J1WdSzih+EjvnTgBhK9jTBKb90AQ=="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ssh-ed25519': (
Packit Service 9bfd13
        "AAAAC3NzaC1lZDI1NTE5AAAAIFOG6kY7Rf4UtCFvPwKgo/BztXck2xC4a2WyA34"
Packit Service 9bfd13
        "XtIwZ"
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ssh-rsa-cert-v01@openssh.com': (
Packit Service 9bfd13
        "AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAg98LhS2EHxLOWCLo"
Packit Service 9bfd13
        "pZPwHdg/RJXusnkOqQXSc9R7aITkAAAADAQABAAAAgQDLV5lUTt7FrADseB/CGh"
Packit Service 9bfd13
        "EZzpoojjEW5y8+ePvLppmK3MmMI18ud6vxzpK3bwZLYkVSyfJYI0HmIuGhdu7yM"
Packit Service 9bfd13
        "rW6wb84gbq8C31Xoe9EORcIUuGSvDKdNSM1SjlhDquRblDFB8kToqXyx1lqrXec"
Packit Service 9bfd13
        "XylxIUOL0jE+u0rU1967pDJx+wAAAAAAAAAFAAAAAgAAAAZqdWxpdXMAAAASAAA"
Packit Service 9bfd13
        "ABWhvc3QxAAAABWhvc3QyAAAAADaMAfAAAAAATR5gcAAAAAAAAAAAAAAAAAAAAD"
Packit Service 9bfd13
        "MAAAALc3NoLWVkMjU1MTkAAAAgU4bqRjtF/hS0IW8/AqCj8HO1dyTbELhrZbIDf"
Packit Service 9bfd13
        "he0jBkAAABTAAAAC3NzaC1lZDI1NTE5AAAAQI3QGlUCzC07KorupxpDkkGy6tni"
Packit Service 9bfd13
        "aZ8EvBflzvv+itXWNchGvfUeHmVT6aX0sRqehdz/lR+GmXRoZBhofwh0qAM="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ssh-rsa': (
Packit Service 9bfd13
        "AAAAB3NzaC1yc2EAAAADAQABAAAAgQDLV5lUTt7FrADseB/CGhEZzpoojjEW5y8"
Packit Service 9bfd13
        "+ePvLppmK3MmMI18ud6vxzpK3bwZLYkVSyfJYI0HmIuGhdu7yMrW6wb84gbq8C3"
Packit Service 9bfd13
        "1Xoe9EORcIUuGSvDKdNSM1SjlhDquRblDFB8kToqXyx1lqrXecXylxIUOL0jE+u"
Packit Service 9bfd13
        "0rU1967pDJx+w=="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ssh-xmss-cert-v01@openssh.com': (
Packit Service 9bfd13
        "AAAAHXNzaC14bXNzLWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIM2UD0IH+Igsekq"
Packit Service 9bfd13
        "xjTO5f36exX4WGRMCtDGPjwfbXblxAAAAFVhNU1NfU0hBMi0yNTZfVzE2X0gxMA"
Packit Service 9bfd13
        "AAAEDI83/K5JMOy0BMJgQypRdz35ApAnoQinMJ8ZMoZPaEJF8Z4rANQlfzaAXum"
Packit Service 9bfd13
        "N3RDU5CGIUGGw+WJ904G/wwEq9CAAAAAAAAAAAAAAABAAAACWtleXMveG1zcwAA"
Packit Service 9bfd13
        "AAAAAAAAAAAAAP//////////AAAAAAAAAIIAAAAVcGVybWl0LVgxMS1mb3J3YXJ"
Packit Service 9bfd13
        "kaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybW"
Packit Service 9bfd13
        "l0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVyb"
Packit Service 9bfd13
        "Wl0LXVzZXItcmMAAAAAAAAAAAAAAHUAAAAUc3NoLXhtc3NAb3BlbnNzaC5jb20A"
Packit Service 9bfd13
        "AAAVWE1TU19TSEEyLTI1Nl9XMTZfSDEwAAAAQA+irIyT2kaOd07YWZT/QItzNBZ"
Packit Service 9bfd13
        "kUYwnqZJihQ7BxuyiDP4HEFbnfYnnIZXx9Asyi7vDyZRvi+AMSOzmMSq4JnkAAA"
Packit Service 9bfd13
        "ngAAAAFHNzaC14bXNzQG9wZW5zc2guY29tAAAJxAAAAAAFjaKTDc+7Hu2uFGIab"
Packit Service 9bfd13
        "3NAku8HbbGtrq/uGXOxmqxu4RaLqmwofl5iXk3nMwWEhQAb99vAc9D9ZFtfxJO4"
Packit Service 9bfd13
        "STYUTjbj4BxToov/uvbYfE5VeO6sMvkGglgh9YHkCTAItsG8EmGT1SIPfKYzLlN"
Packit Service 9bfd13
        "jvUlbcv0PaPFMJ0wzS9mNfuRf+KUhf3dxQ6zaMrBH3KEJ8Me2kNjhnh6rNPROeI"
Packit Service 9bfd13
        "N+IcStSKsydYuiySGKS/orsH38XysuK5QqLizbHJY3cqLbkW9LsIijb+pfEJh4Y"
Packit Service 9bfd13
        "bOoAbraWAv9ySnWCyRhvw2x8uJ0ZM+p5WSRiZfB3JxCpOhHgiKa9TdmdjnAtnED"
Packit Service 9bfd13
        "zqKOj/gM7y9mesn5ydQI0bENOGymlw0ThUGKbXMxn87Hc9dDPURUBmoO3NGjPDf"
Packit Service 9bfd13
        "7meS39A1ZEGtCe/pbZU9iwxqGx4wJYvB4lutRP2tYC1pA6hjQCcHibvxl5iqj+1"
Packit Service 9bfd13
        "jRjwPr8dbTm4PdETW/7JDSVQXKjxOT0kRLHLelJNeviGx5zSHR5PtnUP3nOBMme"
Packit Service 9bfd13
        "hk9DwcQW9vfKeWSnu9CMnF8xvYJxoPKQwmz0TKo+YVOUnc9/Ma+Ykseof9/W+rk"
Packit Service 9bfd13
        "USQGELc4x7XE5XBKYZZP2PmtxirQ3qTWFw+CeTX2Oa+jPYkzOa7jgmHJ3Fi9Xqw"
Packit Service 9bfd13
        "3L844vRl97e28GmwS0M1SXH+ohES0mO4EcrGh5OLyXBaRTV5QMo+4Bg6FH/HwEn"
Packit Service 9bfd13
        "gG1mdEOAqvctK2QC70c4lHGzfexqwQ2U6WUADPcd/BLOE8Noj1EiXYwZrSA1okZ"
Packit Service 9bfd13
        "FYnS/b89Uo51D2FE4A33V4gcxAglGzVNtrPulkguNT9B4jjNgdIwkTBL9k3ujkG"
Packit Service 9bfd13
        "og6pyYjZ0J5Jp5XPBn+y0LqrpOdZijzrc1OJbX59tTeIbDkM7Fw8As4a03hQPDU"
Packit Service 9bfd13
        "FTOdyMHgLnuLhLXOcqIjvW5axZL/Kx3UET8wrSHizPoa6NErCG4v5mC2M4kBSOW"
Packit Service 9bfd13
        "In1QV27QMaHkL/ZAa3mPsW5iFZtOVEGzw2BW4MZs0qOrcloCENZzOHiMBroKEkH"
Packit Service 9bfd13
        "AbzX6D1FLwml2JpXq4JXlCrdIiFm4+co5ygnWPqb4QGzMlcbjW/x/A16TthNuok"
Packit Service 9bfd13
        "wwlmK5ndKZ76LahyGKEwx2Nv0D+0xilEC1EldtiYRdBNlcGbU/A5EhH5bQ9KVIH"
Packit Service 9bfd13
        "wjWm35pRPLl5224//nqvQKhwFCn9otsR35XHXev3IQ0or3HmQxIvSDOwir1l66z"
Packit Service 9bfd13
        "FFrkyHMWexoucbTBxw1MN3hLb247lcVYJ5+hspJgyoYbfR5RkQVDzhpzskogP7l"
Packit Service 9bfd13
        "K5t0bphu+f+hpvrca7DAiiIZkcR4R1UUQoRnJPRXyXOxlxwS10b51cP9p9jzvZj"
Packit Service 9bfd13
        "d2LUs8yx1KXWSxNHo6WmtYONNaUfdX2OB5+QCvPULfLfFeBrqpX6Yp5wQMM5Cup"
Packit Service 9bfd13
        "k8FEfV07eEgQkVE9nDGKHglWo3kUdOF+XCqWAnXn0b/2bNS9/SSAz6gB1GTFcN/"
Packit Service 9bfd13
        "QsFGlC0QgbCJbQ7LQM6hilRWupWvN5zZ/+HJyyRHuSs5VnQnKiGbIa6AIhx7mP7"
Packit Service 9bfd13
        "8T82gKjU3mHLJWMGKcT3cY8R958Gs+w4OT71VJRMw3kK6qk02WCbD5OtbFeC6ib"
Packit Service 9bfd13
        "KRJKdLK3BzjVs/Fzu3mHVucVby3jpvG1Z8HKspKFhvV7gjFEPu8qHKi4MdAlif/"
Packit Service 9bfd13
        "KakyPk8yZB/dMfaxh7Kv/WpJuSwWNs7RNh29e+ZG+POxqRPWiHqiVw7P17a4dN7"
Packit Service 9bfd13
        "nkVOawdBEyxI4NAY+4zW+0r0bAy6zNBitBvkq3IXfr3De6Upex52sPHvK04PXoV"
Packit Service 9bfd13
        "RI6gjnpPSbLLjpSpcHPKgB7DWefLfhd63BUQbc57D8zm8Jd6qtmzcSKn+wz5/zT"
Packit Service 9bfd13
        "0I6v9I4a+DOjjyqpPpzzNU76pt+Y8SuBgHzMm1vcAdNWlbQrqtScvm0T9AkYni6"
Packit Service 9bfd13
        "47vSh77uwRZKDtMCMSU151tVUavXhtLYLZ6/ll5NhMXkkx8//i7pk1OBjN5LHVQ"
Packit Service 9bfd13
        "0QeimRmavlXU1dJ2rwsFAV+9dDdJXUNOq3VLTo9FrbOzZiWtzzjkJpVJAFREnBn"
Packit Service 9bfd13
        "yIDBK5AXtXE1RzfzaBHzbI2e2kO3t+CSNLWYMFYHBDqaeICYQ9+I9aO/8hnzVSo"
Packit Service 9bfd13
        "fp+8IfWO8iJhppqynUniicW2oCzrn4oczzYNEjImt8CGY7g90GxWfX+ZgXMJfy/"
Packit Service 9bfd13
        "bQiFQL3dZvVypDHEbFoIGz+sxkL83xrP4MZV1V9Wwa64lDXYv01Kp4kQXmmnAZY"
Packit Service 9bfd13
        "KlxBoWqYDXLeLLguSOZxDSCIDpd+YPm39wQ3wOysHW2fmsWtp6FPPlQRUYjsGIP"
Packit Service 9bfd13
        "lfrkJzpoeaPKDtF1m+mOULfEh9kvTKCmKRi385T9ON39D97eWqaM4CCfUGImvdR"
Packit Service 9bfd13
        "DlZLXvjmaAh5BVJ8VJxk75OkP14vWFFlTMv0/k4BYLDKsrNqCREC/G9nQBGcD2D"
Packit Service 9bfd13
        "CLwC2zPNaX2Y9dnyDs2csjN1ibsYttUMnXMgBcnCOkIkVS496Bpc0jQMf35GUgb"
Packit Service 9bfd13
        "PSyliwqCoXjEBP/2eyq0VLFKQ0fXGsHWvElT+Y/7RYNTiYVWttFMxN5H/2EGcgn"
Packit Service 9bfd13
        "lfNHLpQvXH9u/3YminS9GX30hQ7jFhpHXxkK8gZ1mpHL9K3pfKS3lG6EF9wQ23O"
Packit Service 9bfd13
        "qS8m995SG3dp3MzmywxXen/ukXx6bDiEl5VaOvdRUcbhr5Eb3exVDfdWiaJdTYF"
Packit Service 9bfd13
        "WfIfJOWx88drB3J9vFwjmuaoNEOjFsoNAMYthYOxXraXaJblvmUKz6tJ3T8/G7x"
Packit Service 9bfd13
        "B9QGYNBsOqBolKoKHBtsWCosLdWhEZr9VFFh2AJrOW1fx24CIkHnvfTtwYORvQq"
Packit Service 9bfd13
        "Ckuq2bZS1EOdsFkU/X5gwPl6gSUTNhV3IooXkBFL3iBEbfZ6JpQHVVyIuNWjIyN"
Packit Service 9bfd13
        "b2liCn9Nn0VHeNMMRLl7uyw4eKlOX2ogom8SLvihYxcJoqlCwtehpLsKsU4iwME"
Packit Service 9bfd13
        "PmDteW5GBGf4GbnqPFkpIT5ed1jGhdZt/dpsp+v6QhYH1uX4pPxdkdnuc84/yb9"
Packit Service 9bfd13
        "k4SQdKBJ+l3KZkfIxApNWOZqicJfz/eWwS/15hiamRKRuiiUV2zS1V+l8bV7g9O"
Packit Service 9bfd13
        "gy5scPBMONxtfFlGEKikZKurFmzboCOGQKRBEUCpsY44IAp443h59pQdVIb0YAS"
Packit Service 9bfd13
        "kfp2xKHwYij6ELRNdH5MrlFa3bNTskGO4k5XDR4cl/Sma2SXgBKb5XjTtlNmCQG"
Packit Service 9bfd13
        "Gv6lOW7pGXNhs5wfd8K9Ukm6KeLTIlYn1iiKM37YQpa+4JQYljCYhumbqNCkPTZ"
Packit Service 9bfd13
        "rNYClh8fQEQ8XuOCDpomMWu58YOTfbZNMDWs/Ou7RfCjX+VNwjPShDK9joMwWKc"
Packit Service 9bfd13
        "Jy3QalZbaoWtcyyvXxR2sqhVR9F7Cmasq4="
Packit Service 9bfd13
    ),
Packit Service 9bfd13
    'ssh-xmss@openssh.com': (
Packit Service 9bfd13
        "AAAAFHNzaC14bXNzQG9wZW5zc2guY29tAAAAFVhNU1NfU0hBMi0yNTZfVzE2X0g"
Packit Service 9bfd13
        "xMAAAAECqptWnK94d+Sj2xcdTu8gz+75lawZoLSZFqC5IhbYuT/Z3oBZCim6yt+"
Packit Service 9bfd13
        "HAmk6MKldl3Fg+74v4sR/SII0I0Jv/"
Packit Service a04d08
    ),
Packit Service a04d08
}
Packit Service a04d08
Packit Service 9bfd13
KEY_TYPES = list(VALID_CONTENT.keys())
Packit Service 9bfd13
Packit Service a04d08
TEST_OPTIONS = (
Packit Service a04d08
    "no-port-forwarding,no-agent-forwarding,no-X11-forwarding,"
Packit Service a04d08
    'command="echo \'Please login as the user \"ubuntu\" rather than the'
Packit Service a04d08
    'user \"root\".\';echo;sleep 10"')
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class TestAuthKeyLineParser(test_helpers.CiTestCase):
Packit Service a04d08
Packit Service a04d08
    def test_simple_parse(self):
Packit Service a04d08
        # test key line with common 3 fields (keytype, base64, comment)
Packit Service a04d08
        parser = ssh_util.AuthKeyLineParser()
Packit Service 9bfd13
        for ktype in KEY_TYPES:
Packit Service a04d08
            content = VALID_CONTENT[ktype]
Packit Service a04d08
            comment = 'user-%s@host' % ktype
Packit Service a04d08
            line = ' '.join((ktype, content, comment,))
Packit Service a04d08
            key = parser.parse(line)
Packit Service a04d08
Packit Service a04d08
            self.assertEqual(key.base64, content)
Packit Service a04d08
            self.assertFalse(key.options)
Packit Service a04d08
            self.assertEqual(key.comment, comment)
Packit Service a04d08
            self.assertEqual(key.keytype, ktype)
Packit Service a04d08
Packit Service a04d08
    def test_parse_no_comment(self):
Packit Service a04d08
        # test key line with key type and base64 only
Packit Service a04d08
        parser = ssh_util.AuthKeyLineParser()
Packit Service 9bfd13
        for ktype in KEY_TYPES:
Packit Service a04d08
            content = VALID_CONTENT[ktype]
Packit Service a04d08
            line = ' '.join((ktype, content,))
Packit Service a04d08
            key = parser.parse(line)
Packit Service a04d08
Packit Service a04d08
            self.assertEqual(key.base64, content)
Packit Service a04d08
            self.assertFalse(key.options)
Packit Service a04d08
            self.assertFalse(key.comment)
Packit Service a04d08
            self.assertEqual(key.keytype, ktype)
Packit Service a04d08
Packit Service a04d08
    def test_parse_with_keyoptions(self):
Packit Service a04d08
        # test key line with options in it
Packit Service a04d08
        parser = ssh_util.AuthKeyLineParser()
Packit Service a04d08
        options = TEST_OPTIONS
Packit Service 9bfd13
        for ktype in KEY_TYPES:
Packit Service a04d08
            content = VALID_CONTENT[ktype]
Packit Service a04d08
            comment = 'user-%s@host' % ktype
Packit Service a04d08
            line = ' '.join((options, ktype, content, comment,))
Packit Service a04d08
            key = parser.parse(line)
Packit Service a04d08
Packit Service a04d08
            self.assertEqual(key.base64, content)
Packit Service a04d08
            self.assertEqual(key.options, options)
Packit Service a04d08
            self.assertEqual(key.comment, comment)
Packit Service a04d08
            self.assertEqual(key.keytype, ktype)
Packit Service a04d08
Packit Service a04d08
    def test_parse_with_options_passed_in(self):
Packit Service a04d08
        # test key line with key type and base64 only
Packit Service a04d08
        parser = ssh_util.AuthKeyLineParser()
Packit Service a04d08
Packit Service a04d08
        baseline = ' '.join(("rsa", VALID_CONTENT['rsa'], "user@host"))
Packit Service a04d08
        myopts = "no-port-forwarding,no-agent-forwarding"
Packit Service a04d08
Packit Service a04d08
        key = parser.parse("allowedopt" + " " + baseline)
Packit Service a04d08
        self.assertEqual(key.options, "allowedopt")
Packit Service a04d08
Packit Service a04d08
        key = parser.parse("overridden_opt " + baseline, options=myopts)
Packit Service a04d08
        self.assertEqual(key.options, myopts)
Packit Service a04d08
Packit Service a04d08
    def test_parse_invalid_keytype(self):
Packit Service a04d08
        parser = ssh_util.AuthKeyLineParser()
Packit Service a04d08
        key = parser.parse(' '.join(["badkeytype", VALID_CONTENT['rsa']]))
Packit Service a04d08
Packit Service a04d08
        self.assertFalse(key.valid())
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class TestUpdateAuthorizedKeys(test_helpers.CiTestCase):
Packit Service a04d08
Packit Service a04d08
    def test_new_keys_replace(self):
Packit Service a04d08
        """new entries with the same base64 should replace old."""
Packit Service a04d08
        orig_entries = [
Packit Service a04d08
            ' '.join(('rsa', VALID_CONTENT['rsa'], 'orig_comment1')),
Packit Service a04d08
            ' '.join(('dsa', VALID_CONTENT['dsa'], 'orig_comment2'))]
Packit Service a04d08
Packit Service a04d08
        new_entries = [
Packit Service a04d08
            ' '.join(('rsa', VALID_CONTENT['rsa'], 'new_comment1')), ]
Packit Service a04d08
Packit Service a04d08
        expected = '\n'.join([new_entries[0], orig_entries[1]]) + '\n'
Packit Service a04d08
Packit Service a04d08
        parser = ssh_util.AuthKeyLineParser()
Packit Service a04d08
        found = ssh_util.update_authorized_keys(
Packit Service a04d08
            [parser.parse(p) for p in orig_entries],
Packit Service a04d08
            [parser.parse(p) for p in new_entries])
Packit Service a04d08
Packit Service a04d08
        self.assertEqual(expected, found)
Packit Service a04d08
Packit Service a04d08
    def test_new_invalid_keys_are_ignored(self):
Packit Service a04d08
        """new entries that are invalid should be skipped."""
Packit Service a04d08
        orig_entries = [
Packit Service a04d08
            ' '.join(('rsa', VALID_CONTENT['rsa'], 'orig_comment1')),
Packit Service a04d08
            ' '.join(('dsa', VALID_CONTENT['dsa'], 'orig_comment2'))]
Packit Service a04d08
Packit Service a04d08
        new_entries = [
Packit Service a04d08
            ' '.join(('rsa', VALID_CONTENT['rsa'], 'new_comment1')),
Packit Service a04d08
            'xxx-invalid-thing1',
Packit Service a04d08
            'xxx-invalid-blob2'
Packit Service a04d08
        ]
Packit Service a04d08
Packit Service a04d08
        expected = '\n'.join([new_entries[0], orig_entries[1]]) + '\n'
Packit Service a04d08
Packit Service a04d08
        parser = ssh_util.AuthKeyLineParser()
Packit Service a04d08
        found = ssh_util.update_authorized_keys(
Packit Service a04d08
            [parser.parse(p) for p in orig_entries],
Packit Service a04d08
            [parser.parse(p) for p in new_entries])
Packit Service a04d08
Packit Service a04d08
        self.assertEqual(expected, found)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class TestParseSSHConfig(test_helpers.CiTestCase):
Packit Service a04d08
Packit Service a04d08
    def setUp(self):
Packit Service a04d08
        self.load_file_patch = patch('cloudinit.ssh_util.util.load_file')
Packit Service a04d08
        self.load_file = self.load_file_patch.start()
Packit Service a04d08
        self.isfile_patch = patch('cloudinit.ssh_util.os.path.isfile')
Packit Service a04d08
        self.isfile = self.isfile_patch.start()
Packit Service a04d08
        self.isfile.return_value = True
Packit Service a04d08
Packit Service a04d08
    def tearDown(self):
Packit Service a04d08
        self.load_file_patch.stop()
Packit Service a04d08
        self.isfile_patch.stop()
Packit Service a04d08
Packit Service a04d08
    def test_not_a_file(self):
Packit Service a04d08
        self.isfile.return_value = False
Packit Service a04d08
        self.load_file.side_effect = IOError
Packit Service a04d08
        ret = ssh_util.parse_ssh_config('not a real file')
Packit Service a04d08
        self.assertEqual([], ret)
Packit Service a04d08
Packit Service a04d08
    def test_empty_file(self):
Packit Service a04d08
        self.load_file.return_value = ''
Packit Service a04d08
        ret = ssh_util.parse_ssh_config('some real file')
Packit Service a04d08
        self.assertEqual([], ret)
Packit Service a04d08
Packit Service a04d08
    def test_comment_line(self):
Packit Service a04d08
        comment_line = '# This is a comment'
Packit Service a04d08
        self.load_file.return_value = comment_line
Packit Service a04d08
        ret = ssh_util.parse_ssh_config('some real file')
Packit Service a04d08
        self.assertEqual(1, len(ret))
Packit Service a04d08
        self.assertEqual(comment_line, ret[0].line)
Packit Service a04d08
Packit Service a04d08
    def test_blank_lines(self):
Packit Service a04d08
        lines = ['', '\t', ' ']
Packit Service a04d08
        self.load_file.return_value = '\n'.join(lines)
Packit Service a04d08
        ret = ssh_util.parse_ssh_config('some real file')
Packit Service a04d08
        self.assertEqual(len(lines), len(ret))
Packit Service a04d08
        for line in ret:
Packit Service a04d08
            self.assertEqual('', line.line)
Packit Service a04d08
Packit Service a04d08
    def test_lower_case_config(self):
Packit Service a04d08
        self.load_file.return_value = 'foo bar'
Packit Service a04d08
        ret = ssh_util.parse_ssh_config('some real file')
Packit Service a04d08
        self.assertEqual(1, len(ret))
Packit Service a04d08
        self.assertEqual('foo', ret[0].key)
Packit Service a04d08
        self.assertEqual('bar', ret[0].value)
Packit Service a04d08
Packit Service a04d08
    def test_upper_case_config(self):
Packit Service a04d08
        self.load_file.return_value = 'Foo Bar'
Packit Service a04d08
        ret = ssh_util.parse_ssh_config('some real file')
Packit Service a04d08
        self.assertEqual(1, len(ret))
Packit Service a04d08
        self.assertEqual('foo', ret[0].key)
Packit Service a04d08
        self.assertEqual('Bar', ret[0].value)
Packit Service a04d08
Packit Service a04d08
    def test_lower_case_with_equals(self):
Packit Service a04d08
        self.load_file.return_value = 'foo=bar'
Packit Service a04d08
        ret = ssh_util.parse_ssh_config('some real file')
Packit Service a04d08
        self.assertEqual(1, len(ret))
Packit Service a04d08
        self.assertEqual('foo', ret[0].key)
Packit Service a04d08
        self.assertEqual('bar', ret[0].value)
Packit Service a04d08
Packit Service a04d08
    def test_upper_case_with_equals(self):
Packit Service a04d08
        self.load_file.return_value = 'Foo=bar'
Packit Service a04d08
        ret = ssh_util.parse_ssh_config('some real file')
Packit Service a04d08
        self.assertEqual(1, len(ret))
Packit Service a04d08
        self.assertEqual('foo', ret[0].key)
Packit Service a04d08
        self.assertEqual('bar', ret[0].value)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class TestUpdateSshConfigLines(test_helpers.CiTestCase):
Packit Service a04d08
    """Test the update_ssh_config_lines method."""
Packit Service a04d08
    exlines = [
Packit Service a04d08
        "#PasswordAuthentication yes",
Packit Service a04d08
        "UsePAM yes",
Packit Service a04d08
        "# Comment line",
Packit Service a04d08
        "AcceptEnv LANG LC_*",
Packit Service a04d08
        "X11Forwarding no",
Packit Service a04d08
    ]
Packit Service a04d08
    pwauth = "PasswordAuthentication"
Packit Service a04d08
Packit Service a04d08
    def check_line(self, line, opt, val):
Packit Service a04d08
        self.assertEqual(line.key, opt.lower())
Packit Service a04d08
        self.assertEqual(line.value, val)
Packit Service a04d08
        self.assertIn(opt, str(line))
Packit Service a04d08
        self.assertIn(val, str(line))
Packit Service a04d08
Packit Service a04d08
    def test_new_option_added(self):
Packit Service a04d08
        """A single update of non-existing option."""
Packit Service a04d08
        lines = ssh_util.parse_ssh_config_lines(list(self.exlines))
Packit Service a04d08
        result = ssh_util.update_ssh_config_lines(lines, {'MyKey': 'MyVal'})
Packit Service a04d08
        self.assertEqual(['MyKey'], result)
Packit Service a04d08
        self.check_line(lines[-1], "MyKey", "MyVal")
Packit Service a04d08
Packit Service a04d08
    def test_commented_out_not_updated_but_appended(self):
Packit Service a04d08
        """Implementation does not un-comment and update lines."""
Packit Service a04d08
        lines = ssh_util.parse_ssh_config_lines(list(self.exlines))
Packit Service a04d08
        result = ssh_util.update_ssh_config_lines(lines, {self.pwauth: "no"})
Packit Service a04d08
        self.assertEqual([self.pwauth], result)
Packit Service a04d08
        self.check_line(lines[-1], self.pwauth, "no")
Packit Service a04d08
Packit Service a04d08
    def test_single_option_updated(self):
Packit Service a04d08
        """A single update should have change made and line updated."""
Packit Service a04d08
        opt, val = ("UsePAM", "no")
Packit Service a04d08
        lines = ssh_util.parse_ssh_config_lines(list(self.exlines))
Packit Service a04d08
        result = ssh_util.update_ssh_config_lines(lines, {opt: val})
Packit Service a04d08
        self.assertEqual([opt], result)
Packit Service a04d08
        self.check_line(lines[1], opt, val)
Packit Service a04d08
Packit Service a04d08
    def test_multiple_updates_with_add(self):
Packit Service a04d08
        """Verify multiple updates some added some changed, some not."""
Packit Service a04d08
        updates = {"UsePAM": "no", "X11Forwarding": "no", "NewOpt": "newval",
Packit Service a04d08
                   "AcceptEnv": "LANG ADD LC_*"}
Packit Service a04d08
        lines = ssh_util.parse_ssh_config_lines(list(self.exlines))
Packit Service a04d08
        result = ssh_util.update_ssh_config_lines(lines, updates)
Packit Service a04d08
        self.assertEqual(set(["UsePAM", "NewOpt", "AcceptEnv"]), set(result))
Packit Service a04d08
        self.check_line(lines[3], "AcceptEnv", updates["AcceptEnv"])
Packit Service a04d08
Packit Service a04d08
    def test_return_empty_if_no_changes(self):
Packit Service a04d08
        """If there are no changes, then return should be empty list."""
Packit Service a04d08
        updates = {"UsePAM": "yes"}
Packit Service a04d08
        lines = ssh_util.parse_ssh_config_lines(list(self.exlines))
Packit Service a04d08
        result = ssh_util.update_ssh_config_lines(lines, updates)
Packit Service a04d08
        self.assertEqual([], result)
Packit Service 9bfd13
        self.assertEqual(self.exlines, [str(line) for line in lines])
Packit Service a04d08
Packit Service a04d08
    def test_keycase_not_modified(self):
Packit Service a04d08
        """Original case of key should not be changed on update.
Packit Service a04d08
        This behavior is to keep original config as much intact as can be."""
Packit Service a04d08
        updates = {"usepam": "no"}
Packit Service a04d08
        lines = ssh_util.parse_ssh_config_lines(list(self.exlines))
Packit Service a04d08
        result = ssh_util.update_ssh_config_lines(lines, updates)
Packit Service a04d08
        self.assertEqual(["usepam"], result)
Packit Service a04d08
        self.assertEqual("UsePAM no", str(lines[1]))
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class TestUpdateSshConfig(test_helpers.CiTestCase):
Packit Service a04d08
    cfgdata = '\n'.join(["#Option val", "MyKey ORIG_VAL", ""])
Packit Service a04d08
Packit Service a04d08
    def test_modified(self):
Packit Service a04d08
        mycfg = self.tmp_path("ssh_config_1")
Packit Service a04d08
        util.write_file(mycfg, self.cfgdata)
Packit Service a04d08
        ret = ssh_util.update_ssh_config({"MyKey": "NEW_VAL"}, mycfg)
Packit Service a04d08
        self.assertTrue(ret)
Packit Service a04d08
        found = util.load_file(mycfg)
Packit Service a04d08
        self.assertEqual(self.cfgdata.replace("ORIG_VAL", "NEW_VAL"), found)
Packit Service a04d08
        # assert there is a newline at end of file (LP: #1677205)
Packit Service a04d08
        self.assertEqual('\n', found[-1])
Packit Service a04d08
Packit Service a04d08
    def test_not_modified(self):
Packit Service a04d08
        mycfg = self.tmp_path("ssh_config_2")
Packit Service a04d08
        util.write_file(mycfg, self.cfgdata)
Packit Service a04d08
        with patch("cloudinit.ssh_util.util.write_file") as m_write_file:
Packit Service a04d08
            ret = ssh_util.update_ssh_config({"MyKey": "ORIG_VAL"}, mycfg)
Packit Service a04d08
        self.assertFalse(ret)
Packit Service a04d08
        self.assertEqual(self.cfgdata, util.load_file(mycfg))
Packit Service a04d08
        m_write_file.assert_not_called()
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class TestBasicAuthorizedKeyParse(test_helpers.CiTestCase):
Packit Service a04d08
    def test_user(self):
Packit Service a04d08
        self.assertEqual(
Packit Service a04d08
            ["/opt/bobby/keys"],
Packit Service a04d08
            ssh_util.render_authorizedkeysfile_paths(
Packit Service a04d08
                "/opt/%u/keys", "/home/bobby", "bobby"))
Packit Service a04d08
Packit Service a04d08
    def test_multiple(self):
Packit Service a04d08
        self.assertEqual(
Packit Service a04d08
            ["/keys/path1", "/keys/path2"],
Packit Service a04d08
            ssh_util.render_authorizedkeysfile_paths(
Packit Service a04d08
                "/keys/path1 /keys/path2", "/home/bobby", "bobby"))
Packit Service a04d08
Packit Service a04d08
    def test_relative(self):
Packit Service a04d08
        self.assertEqual(
Packit Service a04d08
            ["/home/bobby/.secret/keys"],
Packit Service a04d08
            ssh_util.render_authorizedkeysfile_paths(
Packit Service a04d08
                ".secret/keys", "/home/bobby", "bobby"))
Packit Service a04d08
Packit Service a04d08
    def test_home(self):
Packit Service a04d08
        self.assertEqual(
Packit Service a04d08
            ["/homedirs/bobby/.keys"],
Packit Service a04d08
            ssh_util.render_authorizedkeysfile_paths(
Packit Service a04d08
                "%h/.keys", "/homedirs/bobby", "bobby"))
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class TestMultipleSshAuthorizedKeysFile(test_helpers.CiTestCase):
Packit Service a04d08
Packit Service a04d08
    @patch("cloudinit.ssh_util.pwd.getpwnam")
Packit Service a04d08
    def test_multiple_authorizedkeys_file_order1(self, m_getpwnam):
Packit Service a04d08
        fpw = FakePwEnt(pw_name='bobby', pw_dir='/home2/bobby')
Packit Service a04d08
        m_getpwnam.return_value = fpw
Packit Service a04d08
        authorized_keys = self.tmp_path('authorized_keys')
Packit Service a04d08
        util.write_file(authorized_keys, VALID_CONTENT['rsa'])
Packit Service a04d08
Packit Service a04d08
        user_keys = self.tmp_path('user_keys')
Packit Service a04d08
        util.write_file(user_keys, VALID_CONTENT['dsa'])
Packit Service a04d08
Packit Service a04d08
        sshd_config = self.tmp_path('sshd_config')
Packit Service a04d08
        util.write_file(
Packit Service 9bfd13
            sshd_config,
Packit Service 9bfd13
            "AuthorizedKeysFile %s %s" % (authorized_keys, user_keys)
Packit Service 9bfd13
        )
Packit Service a04d08
Packit Service a04d08
        (auth_key_fn, auth_key_entries) = ssh_util.extract_authorized_keys(
Packit Service 9bfd13
            fpw.pw_name, sshd_config)
Packit Service 9bfd13
        content = ssh_util.update_authorized_keys(auth_key_entries, [])
Packit Service a04d08
Packit Service 51236f
        self.assertEqual("%s/.ssh/authorized_keys" % fpw.pw_dir, auth_key_fn)
Packit Service a04d08
        self.assertTrue(VALID_CONTENT['rsa'] in content)
Packit Service a04d08
        self.assertTrue(VALID_CONTENT['dsa'] in content)
Packit Service a04d08
Packit Service a04d08
    @patch("cloudinit.ssh_util.pwd.getpwnam")
Packit Service a04d08
    def test_multiple_authorizedkeys_file_order2(self, m_getpwnam):
Packit Service a04d08
        fpw = FakePwEnt(pw_name='suzie', pw_dir='/home/suzie')
Packit Service a04d08
        m_getpwnam.return_value = fpw
Packit Service a04d08
        authorized_keys = self.tmp_path('authorized_keys')
Packit Service a04d08
        util.write_file(authorized_keys, VALID_CONTENT['rsa'])
Packit Service a04d08
Packit Service a04d08
        user_keys = self.tmp_path('user_keys')
Packit Service a04d08
        util.write_file(user_keys, VALID_CONTENT['dsa'])
Packit Service a04d08
Packit Service a04d08
        sshd_config = self.tmp_path('sshd_config')
Packit Service a04d08
        util.write_file(
Packit Service 9bfd13
            sshd_config,
Packit Service 51236f
            "AuthorizedKeysFile %s %s" % (authorized_keys, user_keys)
Packit Service 9bfd13
        )
Packit Service a04d08
Packit Service a04d08
        (auth_key_fn, auth_key_entries) = ssh_util.extract_authorized_keys(
Packit Service 9bfd13
            fpw.pw_name, sshd_config
Packit Service 9bfd13
        )
Packit Service a04d08
        content = ssh_util.update_authorized_keys(auth_key_entries, [])
Packit Service a04d08
Packit Service 51236f
        self.assertEqual("%s/.ssh/authorized_keys" % fpw.pw_dir, auth_key_fn)
Packit Service a04d08
        self.assertTrue(VALID_CONTENT['rsa'] in content)
Packit Service a04d08
        self.assertTrue(VALID_CONTENT['dsa'] in content)
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab